Самая любимая часть моей работы — общение с инженерами, которые уже работают в Платформе 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).

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

Рис. 7 Рис. 7
Рис. 8 Рис. 8

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

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

Рис. 9 Рис. 9

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

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

Рис. 10 Рис. 10

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

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

Рис. 11 Рис. 11
Рис. 12 Рис. 12

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

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

Рис. 13 Рис. 13
Рис. 14 Рис. 14

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

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

Рис. 15 Рис. 15

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

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

Связь между атрибутом маркера и свойством объекта может быть четырех видов (см. табл. 1).

Таблица 1. Связь между атрибутом маркера и свойством объекта

Односторонняя связь

Изменение значения в свойстве объекта влияет на значение в атрибуте маркера

Двусторонняя связь

Изменение значения в атрибуте маркера влияет на значение свойства объекта, и наоборот

Базовая связь

Свойство объекта можно изменить только из маркера

Односторонняя связь

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

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

Добавим строку с новым атрибутом и присвоим имя атрибуту 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

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

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

Рис. 23 Рис. 23

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

  • скопировать (Ctrl+C) из спецсимволов специальный символ (рис. 24), вставить (Ctrl+V) его в поле — {int (rArea*100)/100}{", м□"} и получить в результате ;
  • использовать функцию форматирования текста и управление индексом символов. Этот вариант подходит не только для вставки символов (например, метр квадратный или сантиметр кубический), но и для управления индексом строк целиком. В этом случае достаточно записать выражение вида {FmtText («м», FmtSuper («2»))}, после чего мы получим результат, аналогичный первому варианту.
Рис. 24 Рис. 24

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

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

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

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

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

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

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

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

Рис. 25 Рис. 25
Рис. 26 Рис. 26

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

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

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

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

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

Рис. 27 Рис. 27 Рис. 28 Рис. 28 Рис. 29 Рис. 29

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

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

Рис. 30 Рис. 30
Рис. 31 Рис. 31

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

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

Рис. 32 Рис. 32
Рис. 33 Рис. 33

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

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

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

Рис. 34 Рис. 34
Рис. 35 Рис. 35

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

Рис. 36 Рис. 36

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

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

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

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

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

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

Рис. 37 Рис. 37 Рис. 38 Рис. 38

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

Рис. 39 Рис. 39

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

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

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

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

Рис. 40 Рис. 40

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

Рис. 41 Рис. 41
Рис. 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) запрещены для редактирования.

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

Рис./Поле

Имя класса
элемента управления

image

image1

image2

comboBox1

editBox

editBox1

Рис. 43
Рис. 44 Рис. 44

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

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

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

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

Рис. 45 Рис. 45 Рис. 46 Рис. 46 Рис. 47 Рис. 47

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

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

Рис. 48

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

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

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

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

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

Рис. 49 Рис. 49

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

Рис. 50 Рис. 50

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

Рис. 51 Рис. 51

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

Рис. 52 Рис. 52

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

Примечания

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

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

Рис. 53 Рис. 53 Рис. 54 Рис. 54

Заключение

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

Татьяна Васькина,
технический специалист
по Платформе nanoCAD,
ООО «Нанософт разработка»
E-mail: vaskina@nanocad.ru