Обновляется ли база данных свойств при загрузке нескольких моделей в одном средстве просмотра? - PullRequest
0 голосов
/ 08 мая 2019

Мне удалось загрузить несколько моделей в одно средство просмотра, и теперь я пытаюсь извлечь свойства и значения элементов каждой модели; однако, когда я использую getPropertyDb() и executeUserFunction(), я получаю обратно только свойства исходной модели.

Я начал с кода из этого репо и использовал эту статью , чтобы понять, как загрузить несколько моделей.

Первая модель загружается после перенаправления с сервера.

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 голосов
/ 09 мая 2019

Попробуйте получить доступ к определенной базе данных через объект модели:

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