我需要在查看器中的模型树面板中隐藏(使其完全消失)。
我已经尝试了从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;
};
是否可以从查看器端进行此操作?我的意思是要从模型树中删除一个项目?
如果更可行,则从场景中完全删除对象也是一种有效的选择。但是我无法在发送给模型导数之前将其从模型中删除,必须在打开查看器时或在打开“树模型”面板之前完成。
答案 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类和方法则更稳定且面向未来。