如何以最快的方式使用 dbIds 为大量项目着色?

How to colorizing larg number of items using dbIds in fastest way?

我需要根据特殊类别对一个巨大的模型进行着色,其中每个类别涉及大约 1000 个 dbId。我知道如果我给父节点上色,所有子节点都会很快上色。但是,我拥有的每个类别中的 dbId 大多没有相同的父级,我必须 运行 viewer.setThemingColor(dbId, color);分别为每个 dbId,这需要很长时间来处理。 在这种情况下,有没有更快的方法来为模型着色?

我在下图中说明了我自定义的模型分类树及其与默认 Forge 模型浏览器树的关系。

Left side is default Forge Model browser - Right side is my customized model navigation tree

您可以通过翻转递归标志递​​归地设置节点下所有子节点的颜色:

NOP_VIEWER.setThemingColor(dbid, THREE.Vector4, null, true)

当将颜色应用于大量对象时,我们可能会以可察觉的性能损失告终,因此这里介绍了如何延迟这些颜色的渲染,直到对象的所有代码都已完成,然后一起渲染它们,而不是重新渲染它们。每次为每个单独的对象渲染:

model.setThemingColor(dbid1, THREE.Vector4); //calling setThemingColor on the model object only marks the object for coloring w/o triggering rendering immediately
model.setThemingColor(dbid2, THREE.Vector4);
//...
NOP_VIEWER.impl.invalidate(true)   //trigger rendering afterwards

查看更多here

我所做的是隐藏整个模型。然后在模型隐藏时着色。

$('.spinner').show();
this.viewerComponent.viewer.setGhosting(false);
this.viewerComponent.viewer.hide(this.viewerComponent.viewer.model.getRootId());
this.viewerComponent.viewer.search(name, (idArray) => {
 this.viewerComponent.viewer.setThemingColor(idArray[0], color, 
 this.viewerComponent.viewer.model, true);
   iterator += 1;
   // Wenn iterator gleich die Länge ist dass alle Objekte wieder zeigen
   // Korrektion für coloredElements.length !== this.inputs.length
   if (iterator === this.inputs.length - 50) {
     $('.spinner').hide();
     this.viewerComponent.viewer.showAll();
     }
   }, (err) => {
     this.messageService.add({ key: 'warning', severity: 'error', summary: 'Error', 
     detail: 'Something with COLORING went wrong: ' + err });
   }, ['name']);

最佳,