#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