====== Создание пользовательских элементов информационной модели ====== В программном комплексе Топоматик Робур 3D-модели связываются с элементами информационной модели (ИМ). Элементы ИМ содержат в себе семантическую информацию об объекте, например, размер, материал, форма, код классификатора и т.д. Элементы ИМ описываются в текстовых файлах с расширением «**.smdx**». Для описания используется разметка **JSON**. Файлы с описанием хранятся в директории «**C:\ProgramData\Topomatic\Robur \16.0\Support\Smdx\**». Каждый элемент должен содержать родительский элемент. Базовым родительским элементом всех элементов ИМ является тип «**SmdxElement**». Элемент ИМ описывается следующими парами ключ/значение: * **id** – уникальный строковый идентификатор элемента * **name** – имя элемента * **parent** – строковый идентификатор родительского элемента * **properties** – массив свойств элемента Каждое свойство массива properties должно содержать пары ключ/значение: * **tag** – идентификатор свойства * **name** – имя свойства Также свойства могут содержать следующие пары ключ/значение: * **value** – значение свойства * **info** – объект описания типа свойства Пары ключ/значение объекта info: * **type** – тип свойства. Может принимать значения: bool, string. int, float, enum или идентификатор элемента ИМ * **units** – единицы измерения для типов int или float * **values** – перечисление вариантов для типа enum. Варианты описываются парой идентификатор/значение ==== Пользовательская библиотека элементов информационной модели ==== Создадим библиотеку элементов ИМ, которая будет содержать в себе следующие элементы: * **SmdxCustomElement** – пользовательский элемент, наследник от базового класса **SmdxElement**. В нём определено свойство **caption** и задано его значение. * **SmdxCustomVolumeElement** – элемент, имеющий форму. Наследник от **SmdxCustomElement**. В нём переопределено значение свойства **caption** и добавлено новое свойство **shape** типа **enum**. * **SmdxCustomCylinderElement** –элемент цилиндрической формы, наследник от **SmdxCustomVolumeElement**. В нём переопределено значение свойств **caption** и **shape**. Значения этих свойств установлены фиксированными, чтобы их нельзя было изменить через инспектор свойств. Также добавлено свойство **diameter** типа **double** и единицей изменения **m** (метр). * **SmdxCustomCubeElement** – элемент кубической формы, наследник от **SmdxCustomVolumeElement**. В нём переопределено значение свойств **caption** и **shape**. Значения этих свойств установлены фиксированными, чтобы их нельзя было изменить через инспектор свойств. Также добавлено свойство **width** типа **double** и единицей изменения **m** (метр). * Элементы **SmdxCustomCylinder_0,5**, **SmdxCustomCylinder_1,0**, **SmdxCustomCube_0,5**, **SmdxCustomCube_1,0** – конкретные реализации цилиндрических и кубических элементов с соответствующими значениями свойств диаметра и ширины соответственно. График наследования для **SmdxCustomCylinder_0,5** будет выглядеть так: * SmdxCustomCylinder_0,5 * SmdxCustomCylinderElement * SmdxCustomVolumeElement * SmdxCustomElement * SmdxElement Создайте текстовый файл **customtypes.smdx** и поместите его в директорию\\ «**C:\ProgramData\Topomatic\Robur \16.0\Support\Smdx\**». Заполните файл следующим образом: [ { "id": "SmdxCustomElement", "name": "Пользовательский элемент", "parent": "SmdxElement", "properties": [ { "tag": "caption", "name": "Описание", "value": "Пользовательский элемент" } ] }, { "id": "SmdxCustomVolumeElement", "name": "Пользовательский объёмный элемент", "parent": "SmdxCustomElement", "properties": [ { "tag": "caption", "value": "Пользовательский объёмный элемент" }, { "tag": "shape", "name": "Форма", "info": { "type": "enum", "values": { "Cube": "Куб", "Cylinder": "Цилиндр" } } } ] }, { "id": "SmdxCustomCylinderElement", "name": "Пользовательский цилиндрический элемент", "parent": "SmdxCustomVolumeElement", "properties": [ { "tag": "caption", "fixed": true, "value": "Пользовательский цилиндрический элемент" }, { "tag": "shape", "fixed": true, "value": "Cylinder" }, { "tag": "diameter", "name": "Диаметр", "info": { "type": "float", "units": "m" } } ] }, { "id": "SmdxCustomCylinder_0,5", "name": "Пользовательский цилиндр 0,5м", "parent": "SmdxCustomCylinderElement", "properties": [ { "tag": "diameter", "fixed": true, "value": 0.5 } ] }, { "id": "SmdxCustomCylinder_1,0", "name": "Пользовательский цилиндр 1,0м", "parent": "SmdxCustomCylinderElement", "properties": [ { "tag": "diameter", "fixed": true, "value": 1 } ] }, { "id": "SmdxCustomCubeElement", "name": "Пользовательский кубический элемент", "parent": "SmdxCustomVolumeElement", "properties": [ { "tag": "caption", "fixed": true, "value": "Пользовательский кубический элемент" }, { "tag": "shape", "fixed": true, "value": "Cube" }, { "tag": "width", "name": "Ширина", "info": { "type": "float", "units": "m" } } ] }, { "id": "SmdxCustomCube_0,5", "name": "Пользовательский куб 0,5м", "parent": "SmdxCustomCubeElement", "properties": [ { "tag": "width", "fixed": true, "value": 0.5 } ] }, { "id": "SmdxCustomCube_1,0", "name": "Пользовательский куб 1,0м", "parent": "SmdxCustomCubeElement", "properties": [ { "tag": "width", "fixed": true, "value": 1 } ] } ] Откроем менеджер структуры Smdx и убедимся, что описанные выше типы появились в библиотеке. {{ :developers:tutorial:smdx:tut_smdx_lib_1.png?nolink |}} {{ :developers:tutorial:smdx:tut_smdx_lib_2.png?nolink |}}