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

#revit-api #ifc #bcftools

#revit-api #ifc #bcftools

Вопрос:

Я создаю плагин, который использует код, доступный из 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 amp;amp;
          v.Components.Visibility.DefaultVisibility amp;amp;
          v.Components.Visibility.Exceptions.Any());
        bool canSetSelection = (v.Components.Selection != null amp;amp; 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, я обнаружил, что ни один из идентификаторов Guid в Revit также не был в появившемся списке. Почти все объекты также соответствовали одной и той же основной части идентификаторов, и я недостаточно опытен, чтобы знать, насколько это вероятно.

Итак, мой вопрос в том, является ли что-то в этом коде проблемой?

Ответ №1:

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

Комментарии:

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

2. Возможно, вы можете связать файл IFC вместо его импорта. Возможно, это позволит сохранить существующие идентификаторы элементов при обновлении файла? Я бы предложил сначала изучить это вручную в пользовательском интерфейсе. Вы также можете обсудить лучшие практики на дискуссионном форуме IFC с открытым исходным кодом: sourceforge.net/p/ifcexporter/discussion/general