Как получить dbId только видимых объектов в Viewer? - PullRequest
0 голосов
/ 13 марта 2019

Я могу получить dbId всех элементов в средстве просмотра через

const tree = viewerApp.myCurrentViewer.model.getData().instanceTree;
const dbIndices = Object.values(tree.nodeAccess.dbIdToIndex).slice(1);

Но для моделей, импортированных из Revit, их число намного больше, чем реально видимых объектов в средстве просмотра (например, для проекта, состоящего только из трех стен, это число составляет приблизительно 3500). Как получить dbId только видимых объектов?

1 Ответ

1 голос
/ 13 марта 2019

По умолчанию все узлы (ресурсы для рендеринга для Viewer) видны при загрузке модели. Каждый узел может быть уникально идентифицирован уникальным dbid в дополнение к его externalId, который соответствует UniqueID компонента Revit.

Таким образом, дополнительные dbids, которые вы наблюдали, на самом деле являются родительскими узлами. Чтобы изолировать их, см. здесь , чтобы просмотреть все конечные узлы (то есть узлы, представляющие отдельные видимые компоненты):

function getAllLeafComponents(viewer, callback) {
    var cbCount = 0; // count pending callbacks
    var components = []; // store the results
    var tree; // the instance tree

    function getLeafComponentsRec(parent) {
        cbCount++;
        if (tree.getChildCount(parent) != 0) {
            tree.enumNodeChildren(parent, function (children) {
                getLeafComponentsRec(children);
            }, false);
        } else {
            components.push(parent);
        }
        if (--cbCount == 0) callback(components);
    }
    viewer.getObjectTree(function (objectTree) {
        tree = objectTree;
        var allLeafComponents = getLeafComponentsRec(tree.getRootId());
    });
}
...