如何在Forge Viewer中的模型树面板上删除或隐藏对象?

时间:2019-04-05 17:25:07

标签: autodesk-forge autodesk-viewer

我需要在查看器中的模型树面板中隐藏(使其完全消失)。

我已经尝试了从Viewer重写方法(通过这种方法完成了其他工作),但是与Tree相关的方法和对象无法进行扩展。搞乱instanceTree数据似乎也很危险,例如从节点列表中删除dbId。

我正在运行最新的Viewer代码(6.5.3),并编写了纯JavaScript扩展。

例如,我尝试覆盖此函数,该函数在内部用于确定是否应显示节点。它不起作用,也不会在ModelStructureTreeDelegate上重写相同的功能:

Autodesk.Viewing.UI.TreeDelegate.prototype.shouldCreateTreeNode = function (dbId)
{
    // original code on the viewer.js is:
    // return true;

    let itGo = true;

    // _objectsHiddenInTree is populated with dbIds of objects to be hidden right after initializing the viewer
    _objectsHiddenInTree.forEach(x => {
        if (x == dbId){
            itGo = false;
        }
    });

    // return false; doesn't work either

    return itGo;
};

是否可以从查看器端进行此操作?我的意思是要从模型树中删除一个项目?

如果更可行,则从场景中完全删除对象也是一种有效的选择。但是我无法在发送给模型导数之前将其从模型中删除,必须在打开查看器时或在打开“树模型”面板之前完成。

2 个答案:

答案 0 :(得分:0)

个人最简单的方法是通过viewer.modelstructure访问节点元素并使用样式隐藏节点:

<style>
.yourHiddenNodeClass{display:none!important}
</style>
...
<script>
let modelStructureControl = viewer.modelstructure;
modelStructureControl.createUI(); //initialize the panel if it hasn't
let treeViewControl = modelStructureControl.tree;
let modelDelegate = treeViewControl.getDelegate(model.id);
treeViewControl.addClass(modelDelegate, dbid, "yourHiddenNodeClass", false) //hide a node - last boolean to toggle recursiveness
...
treeViewControl.removeClass(modelDeleagate, dbid, "yourHiddenNodeClass", false) //remove your custom class
</script>

并完全隐藏节点:

model.visibilityManager.setNodeOff(dbid, true) // true=hide, false=show

答案 1 :(得分:0)

Bryan的回答给了我一个似乎目前可行的想法:

树面板上的每个元素都有一个属性“ lmv-nodeid”,带有对象的dbId。所以我寻找了它,并在div中添加了“ hidden”属性:

document.querySelectorAll('[lmv-nodeid="' + objectDbId + '"]')[0].hidden = true;

尽管如此,他的回答仍然更好,因为无法保证该属性将保留在新版本的Viewer上,而Viewer类和方法则更稳定且面向未来。