11 - 2021

Программирование в модуле «СПДС» для инженеров: инструмент Универсальный маркер


Татьяна Васькина, технический специалист по Платформе nanoCAD, ООО «Нанософт разработка»

Универсальный маркер — инструмент модуля «СПДС» Платформы nanoCAD, с которым каждый инженер может почувствовать себя программистом и создать объект для автоматизации процесса проектирования.

Самая любимая часть моей работы — общение с инженерами, которые уже работают в Платформе nanoCAD. Как правило, таким пользователям недостаточно работы с примитивами и блоками, и они ищут возможности для автоматизации своей работы и повышения скорости и качества выпускаемых чертежей. Они часто задают вопросы типа: «А есть ли функционал для…?», «А можно ли в nanoCAD сделать так, чтобы…?» и важнейший вопрос: «Как можно автоматизировать свою работу?»

Мой ответ на последний вопрос в отношении Платформы nanoCAD состоит из двух частей. Первая часть — о классических инструментах автоматизации САПР­среды: загрузка приложений, технология полей и т.д. Вторая часть — о средствах автоматизации, которые есть только в nanoCAD: автоматическое извлечение свойств объектов в таблицу nanoCAD (создание отчета), создание взаимосвязи между выноской nanoCAD и данными с объекта.

Если у пользователя nanoCAD активирован модуль «СПДС», то мой ответ, касающийся средств автоматизации, дополняется описанием Мастера объектов и Универсального маркера. Мастер объектов — замысловатый инструмент для создания объектов с «интеллектуальностью». Чтобы его освоить, потребуются навыки программирования. Более доступным и достаточно эффективным для этих целей является инструмент Универсальный маркер.

Чтобы создать свой маркер, навыков программирования не требуется, а конечный результат очень похож на запрограммированный объект, который автоматизирует работу. Освоить Универсальный маркер может каждый пользователь. Основные возможности этого инструмента рассмотрим в данной статье на примере создания маркера помещений для обозначения категории пожаробезопасности.

Наш маркер будет уметь «брать» и «преобразовывать (вычислять)» свойства с другого объекта (СПДС_ПОМЕЩЕНИЕ), у него будет несколько графических представлений (исполнений) и собственное диалоговое окно (пользовательская форма). Мы добавим в него управление с помощью Мастера объектов. Дополнительно создадим таблицу­отчет nanoCAD, в которую автоматически будут попадать данные из нашего маркера. Таким образом, мы всесторонне рассмотрим автоматизацию в среде nanoCAD c модулем «СПДС» (рис. 1).

Рис. 1

Рис. 1

Подготовка к созданию маркера

Для того чтобы комфортно работать в диалоговом окне создания Универсального маркера, необходимо отключить опцию Автоматически переключать раскладку клавиатуры в локальный язык в настройках объектов (рис. 2).

Рис. 2

Рис. 2

Когда эта опция включена, в диалоговых окнах «СПДС» ввод текста автоматически происходит на языке, который установлен в ОС и не зависит от значений на языковой панели.

Будущий маркер будет брать свойства из объекта «СПДС_ПОМЕЩЕНИЕ», поэтому нам необходимо заранее разместить этот объект на чертеже (рис. 3).

Рис. 3

Рис. 3

Создание маркера

Отрисуем в чертеже три графических исполнения маркеров, состоящих из примитивов nanoCAD: отрезков, текстов (рис. 4).

Рис. 4

Рис. 4

Текст, который начинается с символа «$», при распознавании геометрии Универсального маркера автоматически будет распознан как Атрибут Универсального маркера, доступный для редактирования в диалоговых окнах Создание маркера и Редактор форм.

Вызовем команду SPCREATEUMARKER или нажмем на кнопку Создать маркер (рис. 5).

Рис. 5

Рис. 5

Выберем объекты (тексты и примитивы) на чертеже и укажем точку вставки на середине диагональной линии (рис. 6).

Рис. 6

Рис. 6

Откроется диалог Создание маркера (рис. 7).

Рис. 7

Рис. 7

В строке MarkerType зададим осмысленное имя, которое потом будет отображаться в Базе элементов и на панели Свойства, и описание для всех распознанных атрибутов (текстов с символом $) — рис. 8.

Рис. 8

Рис. 8

Сохраним маркер в Базу элементов (рис. 9).

Рис. 9

Рис. 9

Теперь Универсальный маркер доступен для коллективной работы.

Добавление исполнений маркера

В диалоговом окне по созданию Универсального маркера нажмем на пиктограмму Добавить исполнение (рис. 10).

Рис. 10

Рис. 10

Зададим имя исполнения (рис. 11).

Рис. 11

Рис. 11

Выберем графику и назначим точку вставки второго исполнения Универсального маркера (рис. 12).

Рис. 12

Рис. 12

Аналогичным способом добавим Исп. 3. Теперь наш маркер имеет три исполнения, содержащих разный набор примитивов и атрибутов на чертеже (рис. 13).

Рис. 13

Рис. 13

С помощью мыши разместим атрибуты маркера в нужном порядке (рис. 14).

Рис. 14

Рис. 14

Удалить атрибут можно с помощью клавиши Delete на клавиатуре.

Для добавления атрибутов необходимо установить курсор в строку и нажать на клавиатуре клавишу Insert (рис. 15).

Рис. 15

Рис. 15

Заимствование свойства объекта

Наш маркер будет связан с объектом СПДС_ПОМЕЩЕНИЕ. Для заимствования свойств этого объекта создадим дополнительные поля в маркере: rNumber (Номер помещения), rArea (Площадь помещения с учетом отделки), sVPO (Взрывопожарная и пожарная опасность, ВПО). Новым атрибутам назначим тип — Добавить свойство с объекта.

Связь между атрибутом маркера и свойством объекта может быть четырех видов:

односторонняя связь изменение значения в свойстве объекта влияет на значение в атрибуте маркера
двусторонняя связь изменение значения в атрибуте маркера влияет на значение свойства объекта, и наоборот
базовая связь свойство объекта можно изменить только из маркера
односторонняя связь значение атрибута маркера берется из свойств объекта и не может быть заменено на другой вид связи

Приступаем к заимствованию свойств

Добавим строку с новым атрибутом и присвоим имя атрибуту rNumber (Номер помещения), далее нажмем на пиктограмму   и выберем Добавить свойство с объекта (рис. 16).

Укажем на объект СПДС_ПОМЕЩЕНИЕ и выберем из списка свойство Номер, по умолчанию связь — односторонняя  (рис. 17).

Добавим атрибут rArea (Площадь помещения с учетом отделки, м2) и укажем свойство Округленная площадь с учетом отделки, м2  объекта СПДС_ПОМЕЩЕНИЕ, связь оставляем односторонней .

Для атрибута sVPO (ВПО) назначим свойство Категория  объекта СПДС_ПОМЕЩЕНИЕ, связь изменим на двустороннюю  (рис. 18).

Рис. 16

Рис. 16

Рис. 17

Рис. 17

Рис. 18

Рис. 18

Сохраним Универсальный маркер в базу.

Важно! Для пользователей, не имеющих достаточного опыта в создании и редактировании Универсальных маркеров, полезно сохранять промежуточные результаты работы на диск путем экспорта из БД в формате *.mcdi (рис. 19). «Откатить» изменения после сохранения в БД нельзя.

Рис. 19

Рис. 19

Вычисляемые поля в атрибутах

Для того чтобы работать с вычисляемыми полями в Универсальном маркере, необходимы знания несложного синтаксиса конкатенации. Основные символы в вычисляемых полях маркера следующие:

  • {} — начало и конец вычисления;
  • + — прибавление параметра, атрибута;
  • «» — в кавычки заключается текстовый (строковый) параметр;
  • Function() (функция / аргумент) — в Универсальном маркере используются те же функции, что и в построителе выражений таблиц nanoCAD; аргументами функций могут быть атрибуты, определенные в маркере.

На примере атрибутов sTr (Температурный режим) и sVr (Влажностный режим) рассмотрим простейшее применение вычисляемых атрибутов (рис. 20).

Рис. 20

Рис. 20

Для ускорения и оптимизации процесса создадим промежуточные атрибуты sTrField (Температурный режим поля) и sVrField (Влажностный режим поля), которые впоследствии будут заполняться в диалоговом окне маркера и передавать свои данные в поля sTr и sVr, отображаемые в исполнении маркера.

Атрибутам sTr (Температурный режим) и sVr (Влажностный режим)назначим тип Установить в вычисляемое поле (рис. 21).

Рис. 21

Рис. 21

В столбце Значение для атрибута sTr введем {string(sTrField)+”° С”}, для атрибута sVr — {string(sVrField)+”%”}.

Теперь при вводе в дополнительные поля sTrField, sVrField простых числовых данных в полях, отображаемых на чертеже, мы получим 18° С и 60% (рис. 22).

Рис. 22

Рис. 22

Важно! Если в столбце Значение вычисляемого атрибута мы введем число, то оно будет числом до тех пор, пока мы не преобразуем его в строку (функция — string).

Добавим еще один вычисляемый атрибут rAreaInt (Окр. площадь помещения с учетом отделки, м2). Этот атрибут нам необходим в последующем для формирования таблицы­отчета nanoCAD. Выполним округление замеренной площади, полученной из объекта СПДС_ПОМЕЩЕНИЕ в атрибуте маркера rAria: в столбце Значение вводим {int(rArea*100)/100}{”, м2”}, где int — это функция, которая обрезает число до целых; *100/100 — арифметические операции, которые позволяют «вернуть» два числа после запятой (рис. 23).

Рис. 23

Рис. 24

Рис. 24

Есть два способа красиво отобразить размерность площади м2:

скопировать (Ctrl+C) специальный символ из спецсимволов (рис. 24), вставить (Ctrl+V) его в поле —
{int(rArea*100)/100}{”, м□”} и получить в результате

использовать функцию форматирования текста и управление индексом символов. Этот вариант подходит не только для вставки символов (например, метр квадратный или сантиметр кубический), но и для управления индексом строк целиком. В этом случае достаточно записать выражение вида {FmtText(“м”,FmtSuper(“2”))}, после чего мы получим результат, аналогичный первому варианту.

Для завершения работы с атрибутами Универсального маркера клавишей Insert добавим атрибут mcDefLayer, который определяет слой, на который будет устанавливаться наш маркер. В диспетчере слоев создадим слой Категория пожароопасности и назначим этому слою атрибут mcDefLayer. Так как свойства Цвет и Тип линии у нас заданы по слою, то при установке Универсального маркера из базы они будут брать свойства с этого слоя. Если такого слоя в файле нет, то после вставки маркера следует определить эти значения с нужными свойствами или иметь слой из атрибута mcDefLayer в шаблоне файла.

Создание диалогового окна маркера (пользовательская форма)

Инструмент Универсальный маркер позволяет создать диалоговое окно, которое в мире программистов называется «Пользовательская форма». В редакторе форм атрибутам маркера можно присвоить различные формы ввода значений и классы элементов управления:

  • таблицы, встроенные в редактор маркера;
  • таблицы из других универсальных маркеров и параметрических объектов;
  • флажок (checkBox);
  • переключатель (radioButton);
  • поля ввода (editBox);
  • Списки и Списки из базы (listBox);
  • Поля со списком и Поля со списком из базы (comboBox).

Пользовательская форма — это опциональный инструмент; в большинстве случаев можно обойтись без него, особенно тогда, когда Универсальный маркер берет всю информацию с объекта, проводит нужные вычисления внутри себя, а в чертеж уже попадает нужное графическое обозначение. Однако, как показывает практика, управлять атрибутами Универсального маркера удобнее через диалоговое окно или пользовательскую форму.

Редактор форм — простой и удобный инструмент, доступный проектировщику, не обладающему навыками программирования.

Создадим пользовательскую форму. Для этого перейдем в режим редактирования Универсального маркера и нажмем на кнопку Показать редактор форм (рис. 25).

Рис. 25

Рис. 25

В пункте меню Вид удостоверимся, что нам доступны панели Свойства и Переменные (рис. 26).

Рис. 26

Рис. 26

В первую очередь разместим в Пользовательской форме элементы управления для атрибутов, которые отображаются на чертежах: sVPO (ВПО), sTr (Температурный режим), sVr (Влажностный режим), sClass (Класс пожароопасности).

Из панели Переменные перетащим нужные атрибуты на поле формы.

Обратите внимание на подсказку (рис. 27).

Рис. 27

Рис. 27

На панели Переменные выделим ВПО (sVPO) и, удерживая клавишу Сtrl, перенесем на поле формы (рис. 28).

Рис. 28

Рис. 28

Редактируем подпись поля: панель Свойства -> Вид -> Текст (рис. 29).

Рис. 29

Рис. 29

Далее на панели Свойства -> Основные -> Данные нажмем на пиктограмму с тремя точками   и введем список значений в выпадающий список. По окончании ввода нажмем Ctrl+Enter (рис. 30).

Рис. 30

Рис. 30

Подобным образом создадим элемент управления для переменной sClass (рис. 31).

Рис. 31

Рис. 31

Добавим нужные поля ввода для переменных sTrField, sVrField и объединим их в Группу   (рис. 32).

Рис. 32

Рис. 32

Не забываем сохранять Универсальный маркер и проверять работу маркера в чертеже (рис. 33).

Рис. 33

Рис. 33

Теперь об управлении исполнениями Универсального маркера в пользовательской форме. Для изменения переменной mcImplementation (Исполнение) на чертеже мы будем использовать элемент управления Переключатель (radioButton).

Нажмем на Переключатель и разместим его в нужном месте поля формы (рис. 34).

Рис. 34

Рис. 34

Присвоим ему переменную mcImplementation (панель Свойства -> Основное -> Переменная), зададим нужную подпись Категории (панель Свойства -> Вид -> Текст) и присвоим Переключателю значение Исп.3 (панель Свойства -> Основные -> Значение), соответствующее данному типу исполнения маркера (рис. 35).

Рис. 35

Рис. 35

Далее можно просто скопировать Переключатель и, оставив значение переменной mcImplementation, задать нужные значения для подписи (Текст) и исполнения (Значение) — рис. 36.

Рис. 36

Рис. 36

Сохраняем. Проверяем работу маркера. При изменении Переключателя должны меняться исполнения, а при изменении значений в текстовых полях формы — значения на чертеже.

Теперь рассмотрим использование Рисунков в пользовательской форме.

Рисунки в диалоге могут быть как статичными (простой иллюстрацией с изображением графики и размеров), так и меняющимися в зависимости от выбора того или иного параметра.

Для размещения рисунка в диалоговом окне маркера нужно заранее заготовить картинку в растровом формате: JPG, GIF (формат PNG не поддерживается).

Нажмем на пиктограмму Рисунок и разместим его эскиз на поле формы. Укажем на пиктограмму с тремя точками  (панель Свойства -> Вид -> Данные) и найдем рисунок на диске компьютера (рис. 37).

Рис. 37

Рис. 37

Так как у нас три исполнения маркера категории пожаробезопасности, то нам нужны три рисунка. Разместим их на поле формы и, выбрав одновременно все три, снимем флажок с параметра Растягивать (рис. 38).

Рис. 38

Рис. 38

Дополнительно разместим поля ввода для атрибутов, заимствованных с объекта СПДС_ПОМЕЩЕНИЕ, — rNomer (Номер помещения) и rAreaInt (Окр. площадь помещения с учетом отделки, м2). Они носят справочный характер, поэтому запретим их редактирование, сняв флажок с параметра Разрешен (панель Свойства -> Вид -> Разрешен) — рис. 39.

Рис. 39

Рис. 39

Теперь нам нужно навести порядок, выровняв элементы управления (кроме рисунков) в пользовательской форме. Далее мы перейдем к управлению видимостью рисунков и возможностью редактирования (enabled) полей ввода — Класс пожароопасности, Влажностный режим, Температурный режим.

Использование Мастера объектов для управления Универсальным маркером

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

Найдем наш маркер в дереве Базы элементов и из контекстного меню выберем опцию Открыть в Мастере объектов (рис. 40).

Рис. 40

Рис. 40

В меню дерева найдем раздел Методы, подраздел Пользовательские функции, в контекстном меню выберем опцию Добавить пользовательскую функцию (рис. 41).

Рис. 41

Рис. 41

Назовем ее onImpl. Внутри фигурных скобок разместим нашу функцию (рис. 42).

Рис. 42

Рис. 42

Воспользуемся готовым кодом из другого объекта (Ctrl+C и Ctrl+V).

Код для копирования:

function onImpl ()

{

if mcImplementation == «Main» {

            Form.editbox1.Enabled= TRUE;// Разрешён

            Form.editbox.Enabled= TRUE; // Разрешён

            Form.combobox1.Enabled= TRUE; // Разрешён

            Form.image.Visible= TRUE; // Видим

            Form.image1.Visible= FALSE; // Скрыт

            Form.image2.Visible= FALSE; // Скрыт

            }

if mcImplementation == «Исп. 2» {

            Form.editbox1.Enabled= TRUE; // Разрешён

            Form.editbox.Enabled= TRUE; // Разрешён

            Form.combobox1.Enabled= FALSE;

            Form.image.Visible= FALSE; // Скрыт

            Form.image1.Visible= TRUE; // Видим

            Form.image2.Visible= FALSE; // Скрыт

            }

if mcImplementation == «Исп. 3» {

            Form.editbox1.Enabled= FALSE; // Запрещён

            Form.editbox.Enabled= FALSE; // Запрещён

            Form.combobox1.Enabled= FALSE; // Запрещён

            Form.image.Visible= FALSE; // Скрыт

            Form.image1.Visible= FALSE; // Скрыт

            Form.image2.Visible= TRUE; // Видим

            }

}

Приведенный код позволит диалоговому окну Универсального маркера — Категории пожаробезопасности помещений (рис. 43) выполнять следующие условия:

  • для исполнения Main — отображается рисунок image, доступны для редактирования (enabled) все поля формы;
  • для исполнения Исп. 2 — отображается рисунок image1, запрещено для редактирования поле со списком Класс пожаробезопасности (ComboBox1);
  • для исполнения Исп. 3 — отображается рисунок image2, поля ввода Класс пожаробезопасности (ComboBox1), Влажностный режим (editBox) и Температурный режим (editBox1) запрещены для редактирования.

Рис. 43

Рис. 43

Далее в Мастере объектов выполним редактирование пользовательской формы (рис. 44).

Рис. 44

Рис. 44

Выберем три Переключателя (radioButton), управляющих исполнениями Универсального маркера и переменной mcImplementation, назначим им нашу функцию onImpl на событие нажатия (панель Свойства -> События) — рис. 45.

Рис. 45

Рис. 45

Диалог Форма1 — на событие открытия (панель Свойства -> События) — рис. 46.

Рис. 46

Рис. 46

Выровняем рисунки в диалоговом окне.

Выберем рисунок image2 и запомним значения для левой верхней точки (рис. 47).

Рис. 47

Рис. 47

Теперь выберем все три рисунка и введем для левой границы общее значение 300, для верхней границы — 32. Остается только мышкой задать ширину и высоту рисунков и размер диалогового окна (пользовательской формы).

Проверяем работу Универсального маркера (рис. 48).

Рис. 48

Рис. 48

Рис. 48

 

Если вы внимательно следовали инструкции, то всё должно работать.

Маркер и таблица nanoCAD

Все атрибуты, которые мы ввели в Универсальный маркер, можно вывести в таблицу­отчет nanoCAD. Такая таблица будет автоматически собирать все проставленные маркеры Категории пожаробезопасности помещений с чертежа и позволит управлять атрибутами маркера из ячейки. Приступим к получению автоматически формируемой таблицы.

Замаркируем несколько помещений (необходим объект СПДС_ПОМЕЩЕНИЕ) нашим маркером.

Создадим таблицу nanoCAD нестандартного размера, назовем ее Ведомость помещений по категории пожаробезопасности (рис. 49).

Рис. 49

Рис. 49

Вставим в таблицу раздел отчета (Редактор таблиц -> Разделы -> Вставить раздел отчета) и в фильтре объектов выберем универсальный маркер с именем Категории пожаробезопасности помещений (рис. 50).

Рис. 50

Рис. 50

В строке Шаблон отчета выделим ячейку и нажмем правую кнопку мыши, в выпадающем списке отобразятся свойства маркера и его атрибуты. Выберем только те атрибуты, которые необходимы для таблицы (рис. 51).

Рис. 51

Рис. 51

Сформируем нехитрое правило группировки и объединения данных в таблице — Объединить строки по А и сортировать по возрастанию (рис. 52).

Рис. 52

Рис. 52

Таблица­отчет nanoCAD Ведомость помещений по категории пожаробезопасности сформирована.

Примечания

  • Редактировать атрибуты Универсального маркера можно как в диалоге маркера, так и на панели Свойства (рис. 53).
  • Каждый Универсальный маркер хранит свою геометрию и свойства. Для обновления всех одинаковых маркеров на чертеже нужно зайти в режим редактирования и нажать Применить изменения для всех вставленных маркеров данного типа (рис. 54).

Рис. 53

Рис. 53

Рис. 54

Рис. 54

РS. Созданный маркер является учебным примером и, скорее всего, не отвечает нормам и стандартам проектирования.

Заключение

Надеюсь, в этой статье получилось продемонстрировать, что Универсальный маркер — это инструмент автоматизации процесса проектирования в среде nanoCAD с модулем «СПДС», доступный каждому пользователю. Зная несложный синтаксис конкатенации в вычисляемых полях, инженер­проектировщик сможет самостоятельно создать и запрограммировать свой умный объект. В комплексе с таблицей nanoCAD Универсальный маркер позволит ускорить процесс составления различных ведомостей и спецификаций.