接上一篇
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
&spm=1001.2101.3001.5002&articleId=116238456&d=1&t=3&u=50f4fe1ad23748a89550bd44ddd216a6)
1946

被折叠的 条评论
为什么被折叠?



