В чем причина того, что я не могу сопоставить идентификаторы элементов этих объектов в 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 не был нет в появившемся списке. Почти все объекты также соответствуют одной и той же основной части идентификаторов, и у меня недостаточно опыта, чтобы знать, насколько это вероятно.
Итак, мой вопрос: есть ли проблема в этом коде?
1 ответ
GUID IFC основан на Revit.
UniqueId
но не идентичны. Прочтите об идентификаторах элементов в RVT, IFC, NW и Forge, чтобы узнать, как они связаны.