Forge Viewerでの断面図表示

Extensionなどのコードを読んでやりたいことの実現方法を調べた結果をまとめています。 どこまでが公式に保証されている動作かは把握できていないので、今後のバージョンで動く保証はできないです。

前提条件

予め断面図を設定しておいたRevitモデルをForge Viewerで表示することとします。

断面図の一覧取得方法

表示できるViewのうち、条件にあうViewを取得するのは以下のコードで実現できます。 ただし、表示できないものもピックアップしてしまう可能性はあります。 なので、predicateにノードの名称(断面図の名前)でフィルタリングできるようにはしています。

function collectCrossSectionViews(model: Autodesk.Viewing.Model, predicate: (name: string) => boolean) {
    const docNode = model.getDocumentNode();
    const rootNode = docNode.getRootNode();

    const nodes: Autodesk.Viewing.BubbleNode[] = [];
    seachNode(nodes, rootNode, predicate);
    return nodes;
}

function seachNode(nodes: Autodesk.Viewing.BubbleNode[], node: Autodesk.Viewing.BubbleNode, predicate: (name: string) => boolean) {
    const name = node.name();
    if (predicate == null || predicate(name)) {
        nodes.push(node);
    }
    if (!node.children) {
        return;
    }
    node.children.forEach(child => seachNode(nodes, child, predicate));
}

collectCrossSectionViewsで断面図のノードのリストを取得できます。 取得したリストから、表示する断面図を選択するUIなどを構築する場合には、各値をviewNodeとすると、viewNode.name()で、断面図の名称が取得できます。

断面図の表示方法

実際にForge Viewerに断面図を表示する場合は、以下のようにloadすればOKです。

function changeView(viewer: Autodesk.Viewing.GuiViewer3D, node: Autodesk.Viewing.BubbleNode) {
    viewer.loadDocumentNode(node.getRootNode().getDocument(), node);
}

使い方の例は以下です。

const nodes = collectCrossSectionViews(viewer.model, name => name.indexOf('断面') >= 0);
if (nodes.length > 0) {
    const node = nodes[0];
    changeView(viewer, node);
}