背景:
我使用Forge可视化IFC模型。我上传的一些模型有IfcOpeningElements,默认情况下似乎隐藏在Forge中,至少在通过viewer.setGhosting(false)
将鬼影设置为false时。我也有功能隐藏正常元素在查看器(viewer.hide(dbIds, model)
),并显示/隐藏所有元素(model.setAllVisibility(show)
)。
我遇到的问题是,我希望能够显示/隐藏IfcOpeningElements
无论显示和隐藏"正常">
元素。我尝试的方法,这不是很好地工作是调用model.visibilityManager.getHiddenNodes()
。这种方法的问题是,即使对于具有IfcOpeningElements的模型,getHiddenNodes
也只在~15秒后返回一个非空数组(可能随模型的大小而变化)。与此同时,如果用户做任何事情,使应用程序调用model.setAllVisibility(true)
,我不再能够检测原来隐藏的IfcOpeningElements。此外,在加载模型后的任意等待期后调用getHiddenNodes
时,我不确定它是否返回空数组,因为模型不是"就绪"的;来检测IfcOpeningElements中的隐藏元素,或者模型中根本没有IfcOpeningElements。
那么,有没有什么好的方法来检测一个模型是否有任何"默认值"呢?隐藏的元素,而不必等待很长时间后,模型加载?或者也许有一种方法可以调用改变整个模型的可见性,而不改变IfcOpeningElements的可见性?
我知道有可能监听HIDE_EVENT
事件,但因为我不确定它是否会触发(因为我不确定模型是否有任何IfcOpeningElements),我不能阻止应用程序调用model.setAllVisibility(true)
,这反过来会使getHiddenNodes()
返回一个空数组,即使有隐藏的元素开始。
如何跳过加载IfcOpeningElements的几何图形?为此,将skipHiddenFragments: true
传递给Viewer3D#loadDocumentNode
viewer.loadDocumentNode(
doc,
viewable,
{
skipHiddenFragments: true
}
);
这种方法将跳过加载IfcOpeningElements的网格,但是你仍然可以在模型结构面板上选择IfcOpeningElements时看到它们的属性。另一方面,你不能用这种方法访问它们的边界框和几何图形。
关于如何检查默认隐藏元素,尝试在加载所有几何图形后调用此代码。hiddenDbIds
是默认隐藏的元素。
let model = viewer.getAllModels()[0]; //!<< Check the first model just for demo
let fragList = model.getFragmentList();
let hiddenDbIds = Object.keys( fragList.vizflags ).filter(fragId => !fragList.isFragVisible( fragId )).map(fragId => fragList.getDbIds( fragId ) );
// hiddenDbIds.forEach(dbId => viewer.getProperties(dbId, console.log))
。在改变对象的可见性之后,可见标志也会被改变。因此,请确保在更改可见性之前运行上述操作。