1

我正在创建一个插件,该插件利用BCFier提供的代码从文件的外部服务器版本中选择元素并在 Revit 视图中突出显示它们,除非在 Revit 中明显找不到元素,因为所有元素都出现并且没有突出显示. 我正在使用的具体代码是:

private void SelectElements(Viewpoint v)
    {
        var elementsToSelect = new List<ElementId>();
        var elementsToHide = new List<ElementId>();
        var elementsToShow = new List<ElementId>();

        var visibleElems = new FilteredElementCollector(OpenPlugin.doc, OpenPlugin.doc.ActiveView.Id)
        .WhereElementIsNotElementType()
        .WhereElementIsViewIndependent()
        .ToElementIds()
        .Where(e => OpenPlugin.doc.GetElement(e).CanBeHidden(OpenPlugin.doc.ActiveView)); //might affect performance, but it's necessary


        bool canSetVisibility = (v.Components.Visibility != null &&
          v.Components.Visibility.DefaultVisibility &&
          v.Components.Visibility.Exceptions.Any());
        bool canSetSelection = (v.Components.Selection != null && v.Components.Selection.Any());



        //loop elements
        foreach (var e in visibleElems)
        {
            //string guid = ExportUtils.GetExportId(OpenPlugin.doc, e).ToString();
            var guid = IfcGuid.ToIfcGuid(ExportUtils.GetExportId(OpenPlugin.doc, e));

            Trace.WriteLine(guid.ToString());

            if (canSetVisibility)
            {
                if (v.Components.Visibility.DefaultVisibility)
                {
                    if (v.Components.Visibility.Exceptions.Any(x => x.IfcGuid == guid))
                        elementsToHide.Add(e);
                }
                else
                {
                    if (v.Components.Visibility.Exceptions.Any(x => x.IfcGuid == guid))
                        elementsToShow.Add(e);
                }
            }

            if (canSetSelection)
            {
                if (v.Components.Selection.Any(x => x.IfcGuid == guid))
                    elementsToSelect.Add(e);
            }
        }
        try
        {
            OpenPlugin.HandlerSelect.elementsToSelect = elementsToSelect;
            OpenPlugin.HandlerSelect.elementsToHide = elementsToHide;
            OpenPlugin.HandlerSelect.elementsToShow = elementsToShow;
            OpenPlugin.selectEvent.Raise();
        } catch (System.Exception ex)
        {
            TaskDialog.Show("Exception", ex.Message);
        }
    }

Which is the section that should filter the lists, which it does do as it produces IDs that look like this: 3GB5RcUGnAzQe9amE4i4IN 3GB5RcUGnAzQe9amE4i4Ib 3GB5RcUGnAzQe9amE4i4J6 3GB5RcUGnAzQe9amE4i4JH 3GB5RcUGnAzQe9amE4i4Ji 3GB5RcUGnAzQe9amE4i4J$ 3GB5RcUGnAzQe9amE4i4GD 3GB5RcUGnAzQe9amE4i4Gy 3GB5RcUGnAzQe9amE4i4HM 3GB5RcUGnAzQe9amE4i4HX 3GB5RcUGnAzQe9amE4i4Hf 068MKId$X7hf9uMEB2S_no

这样做的问题是,将它与我们从中导入它的 IFC 文件中的 ID 列表进行比较,发现这些 ID 没有出现在 IFC 文件中,并且在 Revit 中查看它我发现 Revit 中没有任何 Guid '不在出现的列表中。几乎所有对象也与 ID 的相同主要部分匹配,我没有足够的经验知道这有多大可能。

所以我的问题是,这段代码中有什么问题吗?

4

1 回答 1

0

IFC GUID 基于 Revit UniqueId,但并不完全相同。请阅读RVT、IFC、NW 和 Forge中的元素标识符,了解它们是如何连接的。

于 2020-11-19T11:48:12.450 回答