缩放到 Autodesk forge 中的特定 Revit 模型对象

Zoom to a specific Revit model object in Autodesk forge

我在 Autodesk 中加载了一个 Revit 模型。我想知道如何在加载视图时缩放到模型的特定对象。可以使用 API 吗?

我已经测试成功函数 selectItemById。使用函数 viewer.bubble.search(av.BubbleNode.MODEL_NODE); 获取主对象的 ID。我不知道如何获取模型中每个元素的Id,然后放大它。

这是我用来加载模型的代码:

var viewer;
var options = {
    env: 'AutodeskProduction',

    accessToken: 'aaaaaaaaaaaaaaaaaaa'
};

var documentId = 'urn:bbbbbbbbbbbbbbbbbbbbbbbbbb';
Autodesk.Viewing.Initializer(options, function onInitialized(){
    Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
});

/**
 * Autodesk.Viewing.Document.load() success callback.
 * Proceeds with model initialization.
 */
function onDocumentLoadSuccess(doc) {

    // A document contains references to 3D and 2D viewables.
    var viewables = Autodesk.Viewing.Document.getSubItemsWithProperties(doc.getRootItem(), {'type':'geometry'}, true);
    if (viewables.length === 0) {
        console.error('Document contains no viewables.');
        return;
    }

    // Choose any of the avialble viewables
    var initialViewable = viewables[0];
    var svfUrl = doc.getViewablePath(initialViewable);
    var modelOptions = {
        sharedPropertyDbPath: doc.getPropertyDbPath()
    };

    viewer = new Autodesk.Viewing.ViewingApplication('MyViewerDiv');
    viewer.registerViewer(viewer.k3D, Autodesk.Viewing.Private.GuiViewer3D);
    viewer.loadDocument(documentId, onDocumentLoaded);


    var style3D = "height: 60%; width: 65%; overflow: hidden;";
    $('.adsk-viewing-viewer').attr('style', style3D);

}

/**
 * Autodesk.Viewing.Document.load() failuire callback.
 */
function onDocumentLoadFailure(viewerErrorCode) {
    console.error('onDocumentLoadFailure() - errorCode:' + viewerErrorCode);
}



function onDocumentLoaded(lmvDoc) {
    var modelNodes = viewer.bubble.search(av.BubbleNode.MODEL_NODE); // 3D designs
    var sheetNodes = viewer.bubble.search(av.BubbleNode.SHEET_NODE); // 2D designs
    var allNodes = modelNodes.concat(sheetNodes);

}

我使用以下脚本解决了获取对象的 dbId 的问题:

var _viewer = viewer.getCurrentViewer();

$(_viewer.container).bind("click", onMouseClick);

function onMouseClick(e) {
    var screenPoint = {
        x: event.clientX,
        y: event.clientY
    };

    var n = normalize(screenPoint);
    var dbId = getHitDbId(n.x, n.y);

    if (dbId == null) return;

};

function getHitDbId(x, y) {
    y = 1.0 - y;
    x = x * 2.0 - 1.0;
    y = y * 2.0 - 1.0;

    var vpVec = new THREE.Vector3(x, y, 1);

    var result = _viewer.impl.hitTestViewport(vpVec, false);
    return result ? result.dbId : null;
};

function normalize(screenPoint) {
    var viewport = _viewer.navigation.getScreenViewport();
    var n = {
        x: (screenPoint.x - viewport.left) / viewport.width,
        y: (screenPoint.y - viewport.top) / viewport.height
    };
    return n;
}

一旦我有了dbid。我使用以下脚本来缩放和隔离对象:

_viewer.impl.selector.setSelection([dbId], _viewer.model);
_viewer.fitToView(dbId);
_viewer.isolateById(dbId);