如何在Revit绘图中选择多个元素

时间:2016-12-07 23:13:44

标签: c# revit-api revit

  • 我试图创建一个" Multi-Select" Revit(2016/2017)中的方法,用户可以选择图形中包含的实例的特定参数(如标称直径管道类型等),以及将根据选择选择图形中的所有实例。首先,屏幕截图:

enter image description here

让我们根据图形内容动态创建此窗口这一事实来预测这一点。除非图中的元素包含/满足一个或多个这些参数,否则不会放入此窗口。

因此,理想情况下,当我单击 DO IT!按钮时,我希望选择图形中满足任何这些参数的所有元素。我可以通过此窗口过滤并找到我的所有选择 - 现在我只是不知道如何处理这些选择。

我查看了Revit.chm和源代码,找到了Selection命名空间和类。有以下功能:

PickObject(ObjectType objectType);
似乎他们会成为我想要的东西,但我不知道它是否真的是我需要的东西。此外,如果那是我实际上正在寻找的东西,我就不知道如何使用它的语法。

一个小代码:

我有一种方法可以收集所有用户'选择:

private List<CheckBox> GetUserFilterPrefs()
{
    //CYCLES THROUGH ALL THE PANELS AND BOXES IN THE WINDOW

    return lstCheckBox;
}

现在我要为EventHandler创建btnDoIt_Click ... 我开始了,但我在这一部分的黑暗中行走。

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;
    } 

我显然会四处寻找;但如果有人知道某种方式,或者能指出我正确的方向,那将会非常有帮助!

感谢!!!

2 个答案:

答案 0 :(得分:1)

您找到的PickObject函数是要求用户选择模型中的对象的函数。根据您的描述,这不是您想要的。

您需要的功能是:

SetElementIds(ICollection<ElementId> elementIds)

它也是Selection类的一部分。这将突出显示模型中的所需元素。要清除模型中的选择,请传递一个空List作为参数。传递null将导致抛出异常。

要关注元素,您需要以下功能:

UIDocument.ShowElements

此功能有许多重载。请注意,如果元素位于当前打开的视图中,则无,Revit将尝试为您找到最佳视图,如果模型中有许多视图,则该任务通常执行得非常差。

答案 1 :(得分:1)

PickElement会提示用户选择交互式元素,这不是您所追求的。

以编程方式访问Revit数据库中元素的唯一方法是使用过滤后的元素收集器:

http://thebuildingcoder.typepad.com/blog/about-the-author.html#5.9