#Revit二次开发# 创建能够循环执行的窗口功能(四)

接上一篇

https://blog.csdn.net/qq_29143307/article/details/116237803

一个功能可能需要支持不同的选择模式,比如简单的点选,框选,或者不需要选择(选择了全部)集成在一个功能界面。

比如:

循环体改写如下,实现三种状态:

 while (true)
                {
                    try
                    {
                        var config = dlg.config;
                        switch (config.eSelectionType)
                        {
                            case Data.ESelectionType.ePoint:
                                {
                                    var refter = Selection.PickObject(ObjectType.Element, filter, "请点选!");
                                    var wall = doc.GetElement(refter);
                                    dlg.selectData.Add(wall);
                                }
                                break;
                            case Data.ESelectionType.eRect:
                                {
                                    var eles = Selection.PickElementsByRectangle(filter, "请框选!");
                                    eles.ToList().ForEach(wall =>
                                    {
                                        dlg.selectData.Add(wall);
                                    });
                                }
                                break;
                            case Data.ESelectionType.eAll:
                                {
                                    Selection.PickObject(ObjectType.Nothing, "当前视图!");
                                }
                                break;
                        }
                        dlg.selectData.eSelectState = ESelectState.eContinue;
                    }
                    catch (Exception ex)
                    {
                    }

但有个问题,当你的功能已经卡在一个选择的API时,比如点选,此时点击功能界面框选,界面可以调整提示语句变成框选,但实际选择模式还是点选。

此时就要借助触发revit的选择异常来结束掉当前选中状态,再进入选择时,根据界面设置进入对应状态。

首先,需要使用到win32的消息接口:


        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern bool PostMessage(IntPtr hWnd, uint msg, uint wParam, uint lParam);

实现向revit发送退出消息:

 /// <summary>
        /// 向revit 发送退出消息
        /// </summary>
        public static void PressESCToRevit()
        {
            //使触发选择异常
            PostMessage(RevitWindowHandler.revitHandle.Handle, (uint)Press.KEYBOARD_MSG.WM_KEYDOWN, (uint)Keys.Escape, 0);
        }

当切换选择模式后:Press.PressESCToRevit();即可退出当前选择,进入对应选择模式

效果:

下一篇介绍选择完成如何触发功能执行,实现 选择->功能执行->再选择的功能闭环

 

欢迎加入我的QQ群,一起探讨Revit二次开发技术!

QQ群:631436766

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值