Я пытаюсь удалить кнопки панели инструментов в новой версии 7 Autodesk Forge Viewer.
Пожалуйста, обратитесь к моему коду ниже:
viewer.addEventListener(Autodesk.Viewing.TOOLBAR_CREATED_EVENT, (e) => {
console.info(e);
let modelTools = e.target.toolbar.getControl('modelTools')
console.info(modelTools);
modelTools.removeControl('toolbar-explodeTool');
modelTools.removeControl('toolbar-measurementSubmenuTool');
modelTools.removeControl('toolbar-modelStructureTool');
})
Из нескольких быстрых поисков StackOverflow я смог понять, что мне нужно прослушать событие, а затем получить контроль над расширением и удалить его, я думаю, что пытаюсь сделать то же самое, но это не дает никаких результатов, кнопки не не удалить.
Пожалуйста помоги!
Если вы используете недавно выпущенную версию средства просмотра — v7 — обратите внимание, что создание панели инструментов теперь должно перехватываться с помощью метода обратного вызова вместо подписки на событие. Дополнительные сведения см. в статье руководство по миграции.
Если вы еще не готовы перейти на версию 7, вы можете жестко закодировать версию 6 в своем теге скрипта, например, <script src = "https://developer.api.autodesk.com/modelderivative/v2/viewers/viewer3D.min.js?v=v6.*"></script>
.
Я протестировал код и заметил, что при подписке на Autodesk.Viewing.TOOLBAR_CREATED_EVENT
некоторые кнопки еще не созданы... Я связался с командой разработчиков, чтобы узнать, является ли это регрессией в версии 7. Тем временем вам, возможно, придется обойти проблему, отложив удаление элементов управления до тех пор, пока они не появятся на панели инструментов.
Самый простой способ — скрыть их с помощью переопределения стилей, как показано ниже (см. живую демонстрацию здесь):
.adsk-viewing-viewer #toolbar-modelStructureTool{display:none!important}
.adsk-viewing-viewer #toolbar-explodeTool{display:none!important}
.adsk-viewing-viewer #toolbar-measurementSubmenuTool{display:none!important}
Другим обходным путем может быть подавление автоматической загрузки этих встроенных расширений по умолчанию и загрузка их позже с обратными вызовами, чтобы скрыть их элементы управления, потому что мы были бы уверены, что панель инструментов будет заполнена их элементами управления при запуске обратных вызовов:
new Autodesk.Viewing.Private.GuiViewer3D(document.getElementById('MyViewerDiv'),{disabledExtensions
:{measure:true,explode:true}})
//...
viewer.loadExtension('Autodesk.Explode', viewer.config).then(ext=>{
//...hide the controls
});
viewer.loadExtension('Autodesk.Measure', viewer.config).then(ext=>{
//...hide the controls
});
Спасибо. Есть ли где-нибудь список названий панелей инструментов, таких как measure
и explode
?
@PrageethJayathissa смотрите мой ответ, чтобы получить список
Пожалуйста, попробуй :
(viewer.toolbar.getControl("modelTools") as Autodesk.Viewing.UI.ControlGroup).removeControl('toolbar-explodeTool');
Кнопки на стандартной панели инструментов связаны с загруженными расширениями. Если вы удаляете/скрываете кнопки, вы эффективно отключаете их с помощью соответствующих расширений. Предлагаю вместо удаления кнопок выгрузить расширения. Вы можете попробовать смоделировать это поведение, прежде чем писать код в окне отладки в браузере в интерактивном режиме, используя объект NOP_VIEWER
. Попробуйте эту последовательность:
NOP_VIEWER.getLoadedExtensions()
NOP_VIEWER.unloadExtension('Autodesk.ModelStructure')
Вы должны заметить, что как только вы выгрузите расширение, соответствующая кнопка также исчезнет с панели инструментов. Теперь вам нужно выбрать момент, когда выгрузить расширение. Я предлагаю вам сделать это в функции onSuccessCallback
вызова viewer.start, потому что это когда расширения загружаются следующим образом:
this.viewer.start(null, () => {
console.info('Forge viewer started');
this.viewer.unloadExtension('Autodesk.ModelStructure');
}, (errorCode, errorMessage) => {
console.error(`Forge viewer start error ${errorCode}`, errorMessage);
});
Причина, по которой подход с выгрузкой расширения лучше, заключается в том, что каждое расширение реализует логику очистки при выгрузке, которая должна удалять элементы пользовательского интерфейса, созданные при загрузке. Подробнее здесь https://forge.autodesk.com/en/docs/viewer/v7/developers_guide/viewer_basics/toolbar-button/#step-3-cleanuphttps://forge.autodesk.com/en/docs/viewer/v7/reference/Viewing/Viewer3D/#start-url-options-onsuccesscallback-onerrorcallback-initoptions
Другой способ сделать это заключается в следующем:
// Viewer instance is `viewer`
const toolbarControls = [];
if (var i = 0; i < viewer.toolbar.getNumberOfControls(); i++) {
toolbarControls.push(viewer.toolbar.getControlId(i));
}
// E.g., remove all controls
toolbarControls.forEach(control => viewer.toolbar.removeControl(control));
не могли бы вы поделиться примером? это было бы очень полезно для меня, чтобы понять, спасибо!