Как удалить или скрыть объект на панели дерева моделей в Forge Viewer? - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно скрыть (сделать так, чтобы оно полностью ушло) из панели дерева моделей в 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;
};

Есть ли способ сделать это со стороны средства просмотра?Я имею в виду, удалить элемент из дерева модели?

Если это более жизнеспособно, удаление объекта со сцены также является допустимым вариантом.Но я не могу удалить его из модели перед отправкой в ​​производную модели, это нужно сделать при открытии Viewer или перед открытием панели Tree Model.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Ответ Брайана дал мне идею, которая пока работает:

Каждый элемент на панели дерева имеет атрибут 'lmv-nodeid' с dbId объекта. Поэтому я искал его и добавил атрибут «скрытый» в div:

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

Однако его ответ еще лучше, потому что нет гарантии, что атрибут останется в более новых версиях Viewer, тогда как классы и методы Viewer более стабильны и пригодны для будущего.

0 голосов
/ 08 апреля 2019

Лично проще всего получить доступ к элементу узла через 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
...