ADN Open CIS
Сообщество программистов Autodesk в СНГ

28/03/2019

Добавление пользовательских свойств на панель свойств


Добавление пользовательских свойств - регулярно повторяющаяся тема, впервые описанная в этой статье (не будет работать  на новых версиях Forge Viewer из-за изменений в CSS в v4), затем вновь в этой статье мы добавили новую кнопку (эта версия - рабочая), но при этом мы не заменяли существующую панель свойств.

Так как же полностью заменить существующую панель свойств Forge Viewer-а собственным компонентом?

Фактически, в фреймворке Forge Viewer-а есть метод viewer.setPropertyPanel, принимающий аргументом объект ViewerPropertyPanel - встроенную панель свойств. Таким образом реализация собственной панели свойств, заменяющей стандартную, может просто задать наследуемый от ViewerPropertyPanel класс, в которой будет переопределяться реализация метода setProperties. Чтобы добавить немного больше информации, давайте так же переопределим метод setNodeProperties, чтобы получить dbId:

Код - JavaScript: [Выделить]
  1. function CustomPropertyPanel(viewer, options) {
  2.     this.viewer = viewer;
  3.     this.options = options;
  4.     this.nodeId = -1; // dbId теущего объекта
  5.     Autodesk.Viewing.Extensions.ViewerPropertyPanel.call(this, this.viewer);
  6. }
  7. CustomPropertyPanel.prototype = Object.create(Autodesk.Viewing.Extensions.ViewerPropertyPanel.prototype);
  8. CustomPropertyPanel.prototype.constructor = CustomPropertyPanel;
  9.  
  10. CustomPropertyPanel.prototype.setProperties = function (properties, options) {
  11.     Autodesk.Viewing.Extensions.ViewerPropertyPanel.prototype.setProperties.call(this, properties, options);
  12.  
  13.     // здесь добавляем пользовательские свойств
  14.     // dbId и externalId
  15.     var _this = this;
  16.     // dbId берем из this.nodeId
  17.     this.addProperty('dbId', this.nodeId, 'Custom Properties');
  18.     // externalId есть в свойствах, получаем его по this.nodeId!
  19.     this.viewer.getProperties(this.nodeId, function(props){
  20.         _this.addProperty('externalId', props.externalId, 'Custom Properties');
  21.     })
  22. }
  23.  
  24. CustomPropertyPanel.prototype.setNodeProperties = function (nodeId) {
  25.     Autodesk.Viewing.Extensions.ViewerPropertyPanel.prototype.setNodeProperties.call(this, nodeId);
  26.     this.nodeId = nodeId; // сохраняем dbId!
  27. };

Чтобы было проще использовать созданный механизм, давайте создадим свой Extension. В этой статье описывается структура extension-ов с собственным toolbar-ом и панелью. Воспользуемся той частью кода, где определяется сам extension (без toolbar-а и панели). Код ниже использует созданную нами реализацию панели свойств и связывает её с объектом viewer-а используя метод setPropertyPanel:

Код - JavaScript: [Выделить]
  1. function CustomPropertyPanelExtension(viewer, options) {
  2.     Autodesk.Viewing.Extension.call(this, viewer, options);
  3.  
  4.     this.viewer = viewer;
  5.     this.options = options;
  6.     this.panel = null;
  7. }
  8.  
  9. CustomPropertyPanelExtension.prototype = Object.create(Autodesk.Viewing.Extension.prototype);
  10. CustomPropertyPanelExtension.prototype.constructor = CustomPropertyPanelExtension;
  11.  
  12. CustomPropertyPanelExtension.prototype.load = function () {
  13.     this.panel = new CustomPropertyPanel(this.viewer, this.options);
  14.     this.viewer.setPropertyPanel(this.panel);
  15.     return true;
  16. };
  17.  
  18. CustomPropertyPanelExtension.prototype.unload = function () {
  19.     this.viewer.setPropertyPanel(null);
  20.     this.panel = null;
  21.     return true;
  22. };
  23.  
  24. Autodesk.Viewing.theExtensionManager.registerExtension('CustomPropertyPanelExtension', CustomPropertyPanelExtension);

Теперь почти всё готово! Осталось только загрузить созданный нами extension. Если Вы в своём приложении использовали этот пример создания приложения, то Ваше приложение будет содержать примерно следующую строку кода:

Код - JavaScript: [Выделить]
  1. viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Private.GuiViewer3D, { extensions: ['CustomPropertyPanelExtension'] });

Источник: https://forge.autodesk.com/blog/adding-custom-properties-property-panel

Автор перевода: Александр Игнатович

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 28.03.2019