我无法使 Revit 中这些对象的 ElementID 与 Revit 文件中的对象匹配的原因是什么?
What would be the reason that I can't make the ElementIDs of these objects in Revit match ones in a Revit file?
我正在创建一个插件,它使用文件的外部服务器版本中从 BCFier 到 select 元素可用的代码,并在 Revit 视图中突出显示它们,除了元素是显然在 Revit 中找不到,因为所有图元都出现并且 none 突出显示。我使用的具体代码是:
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);
}
}
哪个部分应该过滤列表,它会在生成如下所示的 ID 时执行此操作:
3GB5RcUGnAzQe9amE4i4IN
3GB5RcUGnAzQe9amE4i4Ib
3GB5RcUGnAzQe9amE4i4J6
3GB5RcUGnAzQe9amE4i4JH
3GB5RcUGnAzQe9amE4i4Ji
3GB5RcUGnAzQe9amE4i4J$
3GB5RcUGnAzQe9amE4i4GD
3GB5RcUGnAzQe9amE4i4Gy
3GB5RcUGnAzQe9amE4i4HM
3GB5RcUGnAzQe9amE4i4HX
3GB5RcUGnAzQe9amE4i4Hf
068MKId$X7hf9uMEB2S_no
问题是,将它与我们从中导入它的 IFC 文件中的 ID 列表进行比较,发现这些 ID 没有出现在 IFC 文件中,在 Revit 中查看它我发现 none Revit 中的 Guids 也不在出现的列表中。几乎所有的对象也都匹配 ID 的相同主要部分,我没有足够的经验知道这种可能性有多大。
所以我的问题是,这段代码中有什么问题吗?
IFC GUID 基于 Revit UniqueId
但不完全相同。请阅读 Element Identifiers in RVT, IFC, NW and Forge 以了解它们的连接方式。
我正在创建一个插件,它使用文件的外部服务器版本中从 BCFier 到 select 元素可用的代码,并在 Revit 视图中突出显示它们,除了元素是显然在 Revit 中找不到,因为所有图元都出现并且 none 突出显示。我使用的具体代码是:
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);
}
}
哪个部分应该过滤列表,它会在生成如下所示的 ID 时执行此操作: 3GB5RcUGnAzQe9amE4i4IN 3GB5RcUGnAzQe9amE4i4Ib 3GB5RcUGnAzQe9amE4i4J6 3GB5RcUGnAzQe9amE4i4JH 3GB5RcUGnAzQe9amE4i4Ji 3GB5RcUGnAzQe9amE4i4J$ 3GB5RcUGnAzQe9amE4i4GD 3GB5RcUGnAzQe9amE4i4Gy 3GB5RcUGnAzQe9amE4i4HM 3GB5RcUGnAzQe9amE4i4HX 3GB5RcUGnAzQe9amE4i4Hf 068MKId$X7hf9uMEB2S_no
问题是,将它与我们从中导入它的 IFC 文件中的 ID 列表进行比较,发现这些 ID 没有出现在 IFC 文件中,在 Revit 中查看它我发现 none Revit 中的 Guids 也不在出现的列表中。几乎所有的对象也都匹配 ID 的相同主要部分,我没有足够的经验知道这种可能性有多大。
所以我的问题是,这段代码中有什么问题吗?
IFC GUID 基于 Revit UniqueId
但不完全相同。请阅读 Element Identifiers in RVT, IFC, NW and Forge 以了解它们的连接方式。