如何 select Revit 绘图中的多个元素
How to select multiple elements in a Revit drawing
我正在尝试在 Revit(2016/2017)中创建一个 "Multi-Select" 方法,用户可以在其中 select 绘图中包含的实例的特定参数(例如公称直径、管道类型 等等),它将 select 绘图中的所有实例基于它们的 select离子。一、截图:
让我们假设这个 window 是根据绘图的内容动态创建的。除非绘图中有一个元素 contains/meets 这些参数中的一个或多个,否则不会在此 window 中添加任何内容。
因此,理想情况下,当我 单击 DO IT!
按钮时,我希望它 select 绘图中所有符合的元素这些参数中的任何一个。我可以过滤这个 window 并找到我所有的 select 离子 - 现在我只是不知道如何处理 select 离子。
我查看了 Revit.chm 和源代码,找到了 Selection
命名空间和 class。有这样的功能:
PickObject(ObjectType objectType);
看起来它们就是我想要的,但我不知道它是否真的是我需要的。此外,如果这实际上是我要找的东西,我不知道如何使用它的语法。
一点代码:
我有一个方法可以收集所有用户的 select离子:
private List<CheckBox> GetUserFilterPrefs()
{
//CYCLES THROUGH ALL THE PANELS AND BOXES IN THE WINDOW
return lstCheckBox;
}
现在我想为 btnDoIt_Click
创建我的 EventHandler
...
我开始了,但这部分我在黑暗中行走。
private void btnDoIt_Click(object sender, RoutedEventArgs e)
{
int itr = 0;
GetUserFilterPrefs();
List<Reference> lstRefs = new List<Reference>();
foreach (CheckBox cb in lstCheckBox)
{
if (lstElts[itr].Name == cb.Name)
{
//HOW DO I SELECT ALL ITEMS LIKE THE GIVEN ELEMENT
//THAT ARE RELATED TO THE CHECKBOX SELECTION??
}
itr +=1;
}
我显然会继续四处寻找;但是,如果有人知道一种方法,或者可以指出正确的方向,那将非常有帮助!
谢谢!!!
您找到的 PickObject 函数要求用户 select 模型中的对象。根据您的描述,这不是您要找的。
您需要的功能是:
SetElementIds(ICollection<ElementId> elementIds)
它也是选择的一部分 class。这将突出显示模型中所需的元素。要清除模型中的 selection,请传递一个空列表作为参数。传递 null 将导致抛出异常。
要关注元素,您需要函数:
UIDocument.ShowElements
这个函数有很多重载。请注意,none 如果元素在当前打开的视图中,Revit 将尝试为您找到最佳视图,如果模型中有很多视图,它通常执行的任务很差。
PickElement 提示用户进行交互式元素选择,这不是您想要的。
以编程方式访问 Revit 数据库中元素的唯一方法是使用过滤元素收集器:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.9
我正在尝试在 Revit(2016/2017)中创建一个 "Multi-Select" 方法,用户可以在其中 select 绘图中包含的实例的特定参数(例如公称直径、管道类型 等等),它将 select 绘图中的所有实例基于它们的 select离子。一、截图:
让我们假设这个 window 是根据绘图的内容动态创建的。除非绘图中有一个元素 contains/meets 这些参数中的一个或多个,否则不会在此 window 中添加任何内容。
因此,理想情况下,当我 单击 DO IT!
按钮时,我希望它 select 绘图中所有符合的元素这些参数中的任何一个。我可以过滤这个 window 并找到我所有的 select 离子 - 现在我只是不知道如何处理 select 离子。
我查看了 Revit.chm 和源代码,找到了 Selection
命名空间和 class。有这样的功能:
PickObject(ObjectType objectType);
看起来它们就是我想要的,但我不知道它是否真的是我需要的。此外,如果这实际上是我要找的东西,我不知道如何使用它的语法。
一点代码:
我有一个方法可以收集所有用户的 select离子:
private List<CheckBox> GetUserFilterPrefs()
{
//CYCLES THROUGH ALL THE PANELS AND BOXES IN THE WINDOW
return lstCheckBox;
}
现在我想为 btnDoIt_Click
创建我的 EventHandler
...
我开始了,但这部分我在黑暗中行走。
private void btnDoIt_Click(object sender, RoutedEventArgs e)
{
int itr = 0;
GetUserFilterPrefs();
List<Reference> lstRefs = new List<Reference>();
foreach (CheckBox cb in lstCheckBox)
{
if (lstElts[itr].Name == cb.Name)
{
//HOW DO I SELECT ALL ITEMS LIKE THE GIVEN ELEMENT
//THAT ARE RELATED TO THE CHECKBOX SELECTION??
}
itr +=1;
}
我显然会继续四处寻找;但是,如果有人知道一种方法,或者可以指出正确的方向,那将非常有帮助!
谢谢!!!
您找到的 PickObject 函数要求用户 select 模型中的对象。根据您的描述,这不是您要找的。
您需要的功能是:
SetElementIds(ICollection<ElementId> elementIds)
它也是选择的一部分 class。这将突出显示模型中所需的元素。要清除模型中的 selection,请传递一个空列表作为参数。传递 null 将导致抛出异常。
要关注元素,您需要函数:
UIDocument.ShowElements
这个函数有很多重载。请注意,none 如果元素在当前打开的视图中,Revit 将尝试为您找到最佳视图,如果模型中有很多视图,它通常执行的任务很差。
PickElement 提示用户进行交互式元素选择,这不是您想要的。
以编程方式访问 Revit 数据库中元素的唯一方法是使用过滤元素收集器:
http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.9