在同一查看器中加载多个模型时,属性数据库是否正在更新?

时间:2019-05-08 13:49:19

标签: autodesk-forge autodesk-viewer

我设法将多个模型加载到同一查看器中,现在我试图提取每个模型元素的属性和值;但是,当我使用getPropertyDb()executeUserFunction()时,我只会获得初始模型的属性。

我从此repo的代码开始,并使用此article来了解如何加载多个模型。

从服务器重定向后加载第一个模型。

function onDocumentLoadSuccess(doc) {
    const geometries = doc.getRoot().search({ type: 'geometry' });
    if (geometries.length === 0) {
        console.error('Document contains no viewables.');
        return;
    }
    const initViewable = geometries[0];
    const svfUrl = doc.getViewablePath(initViewable);
    const mat = new THREE.Matrix4();
    const modelOptions = {
        placementTransform: mat,
        globalOffset: { x: 0, y: 0, z: 0 },
        sharedPropertyDbPath: doc.getPropertyDbPath()
    };

    const viewerDiv = document.getElementById('MyViewerDiv');
    const config = {
        extensions: myExtensions
    };
    viewer = new Autodesk.Viewing.Private.GuiViewer3D(viewerDiv, config);
    viewer.start(svfUrl, modelOptions, onLoadModelSuccess, onLoadModelError);
}

在加载每个模型的几何图形之后,扩展程序会执行一些操作。

function MyExtension(viewer, options) {
    Autodesk.Viewing.Extension.call(this, viewer, options);
}

MyExtension.prototype = Object.create(Autodesk.Viewing.Extension.prototype);
MyExtension.prototype.constructor = MyExtension;

MyExtension.prototype.onGeometryLoadEvent = function(event) {
    const myPromise = this.viewer.model
        .getPropertyDb()
        .executeUserFunction(userFunction);

    myPromise
        .then(function(retValue) {
            if (!retValue) {
                console.log('Model doesn\'t contain valid elemens.');
            }
            // do stuff...
        })
        .catch(err => console.log(err));
};

MyExtension.prototype.load = function() {
    this.onGeometryLoadBinded = this.onGeometryLoadEvent.bind(this);
    this.viewer.addEventListener(
        Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
        this.onGeometryLoadBinded
    );
    return true;
};

MyExtension.prototype.unload = function() {
    this.viewer.removeEventListener(
        Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
        this.onGeometryLoadBinded
    );
    this.onGeometryLoadBinded = null;
    return true;
};

Autodesk.Viewing.theExtensionManager.registerExtension(
    'MyExtension',
    MyExtension
);

function userFunction(pdb) {
    // get properties of the elements
}

新模型也使用扩展程序加载到同一查看器中。

MyOtherExtension.prototype.onDocumentLoadSuccess = function(doc) {
    // get the svfUrl of the initial geometry and set the loading options

    this.viewer.loadModel(
        svfUrl,
        loaderOptions,
        this.onLoadModelSuccessBinded,
        this.onLoadModelErrorBinded
    );
};

如何更新属性数据库以获取当前加载到查看器中的所有模型的属性和值?

1 个答案:

答案 0 :(得分:0)

尝试通过模型对象访问特定的数据库:

viewer.impl.modelQueue().getModels()[index].getPropertyDb()