По какой причине я не могу сопоставить идентификаторы элементов этих объектов в Revit с идентификаторами в файле Revit?

Я создаю плагин, который использует код, доступный на 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);
        }
    }

Какой раздел, который следует фильтровать списки, которые он действительно делает, как он производит идентификаторы, которые выглядят так: 3GB5RcUGnAzQe9amE4i4IN 3GB5RcUGnAzQe9amE4i4Ib 3GB5RcUGnAzQe9amE4i4J6 3GB5RcUGnAzQe9amE4i4JH 3GB5RcUGnAzQe9amE4i4Ji 3GB5RcUGnAzQe9amE4i4J $ 3GB5RcUGnAzQe9amE4i4GD 3GB5RcUGnAzQe9amE4i4Gy 3GB5RcUGnAzQe9amE4i4HM 3GB5RcUGnAzQe9amE4i4HX 3GB5RcUGnAzQe9amE4i4Hf 068MKId $ X7hf9uMEB2S_no

Проблема в том, что сравнение его со списком идентификаторов в файле IFC, из которого мы его импортировали, показывает, что эти идентификаторы не отображаются в файле IFC, и, просмотрев его в Revit, я обнаружил, что ни один из руководств в Revit не был нет и в появившемся списке. Почти все объекты также соответствуют одной и той же основной части идентификаторов, и я недостаточно опытен, чтобы знать, насколько это вероятно.

Итак, мой вопрос: есть ли проблема в этом коде?


person Tom Paganuzzi    schedule 18.11.2020    source источник


Ответы (1)


GUID IFC основан на Revit UniqueId, но не идентичен. Прочтите об идентификаторах элементов в RVT, IFC, NW и Forge узнать, как они связаны.

person Jeremy Tammik    schedule 19.11.2020
comment
Прочитав ваши статьи, я понял, что основная проблема моей проблемы заключалась в том, что при импорте файла IFC Revit присваивает ему новые идентификаторы, когда создает проект Revit из файла ifc, проблема заключалась в том, что файл IFC, который мы использовали для Создание проблем было создано до импорта в Revit, поэтому оно не имело реального отношения к файлу Revit. - person Tom Paganuzzi; 20.11.2020
comment
Возможно, вы можете связать файл IFC вместо его импорта. Возможно, это позволит сохранить существующие идентификаторы элементов при обновлении файла? Я бы посоветовал сначала изучить это вручную в пользовательском интерфейсе. Вы также можете обсудить передовой опыт на дискуссионном форуме IFC с открытым исходным кодом: sourceforge.net/p/ifcexporter/ обсуждение / общее - person Jeremy Tammik; 21.11.2020