Как сохранить состояние программы просмотра Autodesk Forge с несколькими моделями и восстановить его?

#autodesk-forge #autodesk-viewer

#autodesk-forge #autodesk-viewer

Вопрос:

Я загрузил несколько моделей в одну сцену и хочу сохранить состояние просмотра фрагментов и восстановить позже. Это работает с одной моделью, но не работает с несколькими моделями.

Ответ №1:

К сожалению, на данный момент вы можете восстановить состояние только для 1 модели. Но я довел это до наших инженеров, и они добавили это в качестве запроса на улучшение.

Комментарии:

1. Спасибо @jaime, вы знаете временные рамки для этого?

2. Пока нет ETA. Сообщу вам, как только увижу прогресс по запросу. Поскольку это улучшение необходимо будет расставить приоритеты со всеми другими улучшениями и исправлениями ошибок, которые они имеют в своем sprint.

3. Спасибо @jaime-rosales

Ответ №2:

Решение для сохранения и восстановления состояния программы просмотра из нескольких моделей заключается в изменении способа работы seedUrn на ViewerState.js .

Проблема в том, что seedUrn, как простая строка, не может точно идентифицировать модели. Решение работает путем изменения его на объект, содержащий urn модели и уникальный ключ (установленный в качестве параметра загрузки во время загрузки модели). Когда ViewerState необходимо найти модель, он ищет как urn, так и загруженный ключ, который, если он уникален, способен обрабатывать даже несколько идентичных моделей, если ключ уникален (возможно, urn не нужен, но я не буду заниматься этим сейчас).

Это код, который изменяет два метода ViewerState, относящиеся к генерации и сравнению seedUrn:

     NOP_VIEWER.viewerState.getSeedUrn = function (model) {
        model = model || viewer.model;
        if (model === null) {
            return {
                urn: "",
                uniqueKey: undefined
            };
        } else {
            return {
                urn: model.getSeedUrn(),
                uniqueKey: model.myData.loadOptions.uniqueKey
            };
        }
    };

    NOP_VIEWER.viewerState.getVisibleModel = function (seedUrn) {
        const visibleModels = viewer.getVisibleModels();
        for (let i = 0; i < visibleModels.length;   i) {
            const modelSeedUrn = this.getSeedUrn(visibleModels[i]);
            if (modelSeedUrn.urn === seedUrn.urn amp;amp; modelSeedUrn.uniqueKey === seedUrn.uniqueKey) {
                return visibleModels[i];
            }
        }
    };
  

При загрузке модели в программу просмотра передайте uniqueKey в качестве параметра загрузки:

 viewer.loadDocumentNode(obj.doc, obj.geometry, {
    ...
    uniqueKey: 'a unique identifier',
    ...
})
  

Например, если вам необходимо сохранить состояние в базе данных, убедитесь, что вы также сохранили уникальный ключ для модели, поскольку он должен быть загружен с тем же ключом, содержащимся в state JSON.

Обратите внимание, что это решение не обрабатывает плоскости разреза, которые по-прежнему зависят от viewer.model. Для решения этой проблемы потребуется полностью перезаписать функции getState и restoreState, которые могут быстро устареть в более новых версиях программы просмотра.