无法在伪造查看器中完全隐藏模型

Posted

技术标签:

【中文标题】无法在伪造查看器中完全隐藏模型【英文标题】:Not able to completely hide model in forge viewer 【发布时间】:2019-02-06 06:02:26 【问题描述】:

我试图在 forge-viewer 中隐藏完整的模型,为此我正在调用 forge 可见性 API,如下所示:

viewer.impl.visibilityManager.setNodeOff(viewer.model.getModelId(),true)

其中 viewer 是 GUIViewer3D 的对象。

但这并没有隐藏完整的模型,模型中的一些组件仍然可见。

我认为这是 forge-viewer 中的一个错误,因为如果我将模型的根节点传递给 setNodeOff() API,它必须隐藏整个模型。我确信我的查看器会话中只加载了一个模型。

Refer this image 用于调用viewer.impl.visibilityManager.setNodeOff(viewer.model.getModelId(),true)后仍然可见的元素

【问题讨论】:

【参考方案1】:

getModelId() 返回模型 ID,可见性 API 需要 节点 ID。为了隐藏整个模型,请考虑以下几点:

viewer.hide(model.getRootId());

【讨论】:

我尝试了建议的解决方案,但没有看到效果。元素(如图所示)仍然可见。 viewer.model.getModelId()viewer.model.getRootId() 返回相同的值(在我的情况下)。 几个问题:(1)您使用的是什么版本的查看器? (2) 你的应用程序是否公开运行? (3) 你能用其他模型重现这个问题,还是只用这个特定的模型? 1.我正在使用 forge-viewer 4.2.* 2. 不,该应用程序正在开发中,目前尚未公开运行。 3. 是的,其他一些模型(revit 模型)存在问题。 我试图一个一个地隐藏每个元素,如下所示:var instanceTree=viewer.model.getInstanceTree(); Object.keys(instanceTree.nodeAccess.dbIdToIndex).forEach(dbId => viewer.impl.visibilityManager.setNodeOff(instanceTree.nodeAccess.dbIdToIndex[dbId],true); ); 但我没有得到dbId 对于附加图像中可见的元素,这就是为什么我无法隐藏他们或让他们离开。 感谢@PraviNShinde 提供的信息,这听起来像是从 RVT 文件转换为内部查看格式的问题。您是否有机会通过电子邮件与我分享其中一个有问题的 Revit 文件? forge.help [at] autodesk.com.【参考方案2】:

你能帮我试一试吗...

您能否在转换 .RVT 文件时尝试将标头 'x-ads-force':'true' 添加到 POST 作业请求?

这是有关 API 请求的文档... https://forge.autodesk.com/en/docs/model-derivative/v2/reference/http/job-POST/#headers

然后,像以前一样检索 URN 并将其提供给 Forge 查看器,如下例所示: https://forge.autodesk.com/en/docs/model-derivative/v2/reference/http/urn-manifest-GET/#example

.

那么...发生了什么事?

当您将 RVT 转换为 SVF(用于 Forge 查看器)时,它会生成一组随机 DBId。

当您调用 GetProperties API 时,它会使用缓存的 SVF 来拉取 DBId 并为您提供结果。

早在 8 月,GetProperty API 引擎就进行了更新。与旧的转换后的 SVF 相比,它产生的 DBId 顺序不同。

由于旧的SVF被缓存,即使你提交一个新的作业,它也会使用旧的SVF。

为了避免旧的 SVF,我们需要“强制转换”RVT 到 SVF 的转换,以刷新该缓存,以便新的 SVF 可见并且 Forge Viewer 可以检索它。

一旦 Forge Viewer 可以看到新的 SVF,它应该与 GetProperties API 的 DBId 匹配。

很复杂吧?

如果这能解决问题,请告诉我。

【讨论】:

感谢您为调查问题所做的努力,我理解您要解释的内容。我尝试在将模型转换为svf 格式时添加'x-ads-force':'true' 标头,但问题仍然存在,更改后没有效果。【参考方案3】:

由于我的目标是对查看器完全隐藏模型,因此我通过以下方式实现了这一目标:

viewer.clearSelection(); viewer.model.setAllVisibility(0); viewer.impl.toggleGhosting(false); viewer.impl.toggleGroundShadow(false);

这给了我所需的行为。我无法隐藏的元素现在通过这种方法隐藏了。

【讨论】:

OIC... 您在 Forge-Viewer 中寻找渲染首选项。我认为这与 Forge Viewer(缓存的 SVF)和 GET 属性 API 调用之间的 DBID 不匹配有关。我的错! 是的,dbIds 仍然存在问题,但我通过一些不同的方法实现了我的要求。如果我调用viewer.impl.visibilityManager.setNodeOff(viewer.model.getModelId(),true),那么很明显有些元素没有分配给它们的dbId,因此我无法关闭/隐藏。甚至无法选择或隔离它们(如附图所示的元素)。 顺便说一句。 @PravinShinde,您可能不需要太久的解决方法,开发团队已修复 dbID 暂存问题,并将很快将其部署到生产中。 太棒了..!! @PetrBroz,一旦将其部署到生产环境,您能否给我发邮件或发帖?谢谢。 会做@PravinShinde。干杯!【参考方案4】:

要完全隐藏模型,您可以隔离一个空列表,这将显示整个模型重影,然后您可以全局关闭重影

viewer.isolate([]);
viewer.setGhosting(false);

【讨论】:

以上是关于无法在伪造查看器中完全隐藏模型的主要内容,如果未能解决你的问题,请参考以下文章

模型伪造查看器中缺少 Autodesk.AEC.ModelData

在伪造查看器中仅呈现模型的少数元素

伪造查看器中未显示文件

在伪造查看器中恢复 sectionBox

在伪造查看器中保存和检索

隐藏除选定 Autodesk-Forge 查看器之外的所有查看器