#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, которые могут быстро устареть в более новых версиях программы просмотра.