Введение

Программа nanoCAD СПДС предназначена для оформления проектно-конструкторской документации в соответствии со стандартами СПДС. Но это не единственная возможность программы. Благодаря мощному функционалу создания собственных параметрических объектов пользовательской базы данных, маркеров и шаблонов таблиц можно добиться значительной автоматизации в процессе разработки чертежей. Одной из наиболее широко распространенных задач в строительном проектировании является специфицирование объектов и отслеживание соответствия таблиц чертежу в процессе изменения последнего. Приведем алгоритм создания экспликации полов как пример подобной автоматизации. Уверен, что подобный опыт может быть с успехом использован для решения аналогичных задач. Статья написана таким образом, что приведенный материал можно использовать в качестве руководства по созданию подобных экспликаций. Изложенный в статье материал предполагает, что читатель уверенно владеет функционалом nanoCAD СПДС или СПДС GraphiCS (аналогичным приложением к AutoCAD), поэтому простейшие формулировки и операции мы сознательно опускаем.

Постановка задачи

Одним из наших активных пользователей была поставлена интересная задача автоматизации составления экспликации полов. Вначале она сводилась к группировке данных и подсчету суммарной площади по определенным признакам. Но потом, когда возникла необходимость автоматически помещать эскиз схемы пола в таблицу, пришлось обратиться за консультацией к разработчикам. Разработчики nanoCAD СПДС любезно предоставили целый алгоритм составления экспликации полов. Пример формы экспликации полов приведен на рис. 1.

Рис. 1. Экспликации полов Рис. 1. Экспликации полов

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

Общий подход к решению задачи

Общий алгоритм решения задачи выглядит следующим образом. Данные по номеру помещения, типу пола и площади будем брать из стандартного элемента оформления nanoCAD СПДС «Форма помещения». Когда пользователь маркирует помещения, он назначает им номер и тип пола, площадь вычисляется автоматически в зависимости от указанных условий подсчета площади. Остальные свойства помещения нас в настоящий момент не интересуют. Диалоговое окно объекта «Форма помещения» показано на рис. 2.

Рис. 2. Диалоговое окно элемента «Форма помещения» Рис. 2. Диалоговое окно элемента «Форма помещения»

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

Создание универсального маркера

Создание маркера начинается с определения его геометрии. Создадим с помощью однострочного текста надпись «$FloorNumber\FloorNumber\1» и добавим полилинию в виде прямоугольника. Надпись означает, что нас интересует свойство «FloorNumber» (тип пола в нашем случае) некоторого объекта на чертеже. Через слеш идет описание этого свойства (оставим его на английском) и значение по умолчанию (его можно опустить). Прямоугольник представляет собой рамку, куда вписывается будущее значение типа пола. Получается следующий эскиз маркера, показанный на рис. 3.

Рис. 3. Первоначальный эскиз универсального маркера Рис. 3. Первоначальный эскиз универсального маркера

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

На вкладке таблицы свойств маркера добавим другие дополнительные свойства. Для свойства «MarkerType» укажем наименование маркера, например, «Свойства пола». Добавляем остальные свойства и даем к ним пояснения:

  • FloorArea — площадь пола;
  • AreaNumber — номер помещения;
  • Cover1 … Cover6 — данные элементов пола для 6 слоев;
  • H1 … H6 — толщина каждого из элементов пола для 6 слоев;
  • mcImplementation — переменная, в которой определяется эскиз схемы пола, по умолчанию хранит эскиз маркера;
  • mcFormName — переменная для хранения имени формы (диалогового окна) для маркера, в данном случае выполняет служебные функции и не меняется.

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

Рис. 4. Переменные универсального маркера Рис. 4. Переменные универсального маркера

Теперь добавим графическое представление для схемы пола, которое будет вставляться в экспликацию. Предварительно средствами NanoCAD создадим необходимое количество чертежей. Обратите внимание, что чертежи делаются в масштабе 1:1, так как затем они масштабируются вместе с таблицей. Примеры показаны на рис. 5.

Рис. 5. Примеры схем полов Рис. 5. Примеры схем полов

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

Остается создать графические представления для каждой из заготовленных схем пола. Находясь в режиме редактирования маркера, откройте выпадающий список установки новой геометрии и добавьте новое исполнение, выбрав одноименную команду. В качестве нового имени используйте префикс «Section», в дальнейшем он используется в формулах экспликации. Укажите на чертеже эскиз и потом выберите точку вставки эскиза примерно по его геометрическому центру. Это позволит корректно вписать эскиз в таблицу при условии его центрирования внутри ячейки. Количество эскизов должно совпадать с предполагаемым количеством типов полов. В нашем примере их будет десять. На рис. 6 показано выпадающее меню работы с графическими исполнениями маркера. Под исполнением «Main» хранится однострочный текст и прямоугольник, который мы рисовали ранее.

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

Рис. 6. Меню назначения графических исполнений Рис. 6. Меню назначения графических исполнений

Остается еще одна важная задача — создание пользовательской формы диалогового окна. Это окно используется при вставке маркера в чертеж для определения необходимых значений переменных. Для открытия Редактора форм, находясь в режиме редактирования маркера, выберите кнопку редактирования формы из нижней панели инструментов. Так как переменные уже определены, мы можем приступить к созданию элементов управления диалога. Редактор форм состоит из трех окон — это сам редактор, окно переменных и окно свойств переменных. Необходимо последовательно выбрать из окна переменных нужные позиции. Если при перетаскивании в окно диалога удерживать клавишу CTRL, то после размещения на поле можно выбрать тип элемента управления из появляющегося списка. Рассмотрим итоговую форму для нашего маркера на рис. 7.

Рис. 7. Редактор форм для универсального маркера Рис. 7. Редактор форм для универсального маркера

Элементы управления, присутствующие на форме, будут трех типов. Самый простой тип — текстовые подписи. Снизу и справа размещаются поля ввода, а по центру — шесть выпадающих списков. По надписям видно, что тип покрытия выбирается из выпадающих списков, а для значений толщин соответствующих слоев используются поля ввода напротив них. Поля ввода также используются для определения номера помещения, типа пола и площади. Так как наш маркер будет связан с элементом оформления, эти данные будут браться из него. Можно заблокировать указанные три поля от случайного редактирования или оставить их открытыми. Но в любом случае каждый элемент управления назначен соответствующей переменной. На рис. 7 видно, что отмеченное поле ввода для номера помещения связано с переменной «AreaNumber», указанной в окне свойств.

Более сложный случай определения выпадающего списка рассмотрим подробнее. Списки закрепляются за переменными «Cover1» … «Cover6». Данные, которые назначаются этим переменным, задаются в окне свойств выпадающих списков в одноименной позиции. Каждую строку данных надо писать в кавычках, отделяя строки между собой пробелом. В таком случае каждая введенная строка будет представлять собой позицию выпадающего списка. На рис. 8 показано заполнение выпадающего списка.

Рис. 8. Формирование выпадающего списка для элементов пола Рис. 8. Формирование выпадающего списка для элементов пола

На приведенном примере список раскрыт, и можно увидеть введенные значения. Обратите внимание на первую строку, куда вводятся позиции в кавычках и через пробел. Чтобы не повторять эту операцию шесть раз, можно скопировать оформленный список и назначить ему следующую переменную.

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

Начертите любой замкнутый контур, например прямоугольник. Разместите на чертеже элемент оформления «Форма помещения» из меню Площади nanoCAD СПДС. Для этого укажите внутрь прямоугольника, в диалоге введите произвольные значения для определения помещения. Теперь разместите маркер на чертеже и войдите в режим его редактирования. Нам предстоит связать маркер с данным типом объекта. Укажите мышью строку переменной «FloorNumber» в столбце Свойства атрибута. Справа появляется кнопка выбора прикрепляемого объекта для извлечения свойства для данной переменной. Нажмите эту кнопку и выберите позицию добавления свойства из объекта. Укажите размещенный ранее объект «Форма помещения». В списке свойств объекта для нашей переменной выбираем позицию Тип пола. Аналогично для переменной «FloorArea» выбираем свойство Площадь и для «AreaNumber» — Номер. Результаты должны быть аналогичны тем, что представлены на рис. 4. После этого изменения маркера необходимо сохранить в БД.

При простановке готового маркера на чертеж его каждый раз необходимо привязывать к каждому назначенному элементу формы помещения. Делается это следующим образом. Предварительно включается объектная привязка с опцией «Ближайшая». Маркер при размещении подводим к элементу оформления, пока последний не подсветится зеленым светом. Чтобы не сработала привязка, нажимаем и удерживаем клавишу SHIFT. После этого можно проставить маркер в любом удобном месте, чтобы он не накладывался на элемент оформления. Каждое помещение необходимо маркировать отдельным маркером, чтобы взять из элемента оформления «Форма помещения» три его свойства. В процессе маркирования в диалоговом окне на вкладке Вид маркера показывается созданная нами пользовательская форма, где мы назначаем маркеру ряд дополнительных свойств. Пример такого диалога показан на рис. 9.

Рис. 9. Назначение дополнительных свойств при простановке маркера Рис. 9. Назначение дополнительных свойств при простановке маркера

Теперь нам остается сформировать саму табличную форму экспликации.

Создание экспликации

Сначала с помощью Редактора таблиц создаем структуру таблицы, аналогичную той, что показана на рис. 1. Далее необходимо связать таблицу с объектами на чертеже. В нашем случае это будет, конечно, созданный универсальный маркер. Для осуществления связи таблицы и маркера добавляем раздел отчета через меню Разделы Редактора таблиц. Теперь по гиперссылке Свойства раздела вызовем первую команду Фильтр объектов. В диалоге Быстрый выбор из списка объектов необходимо выбрать универсальный маркер. Перед выполнением этой операции убедитесь, что на чертеже действительно присутствует данный тип объектов. В противном случае закройте Редактор таблиц и проставьте хотя бы один созданный универсальный маркер. Остальные опции выбора оставьте как есть. Фильтр должен выбрать все присутствующие маркеры на чертеже. Чтобы исключить все остальные маркеры, установите для переменной Имя значение, равное значению Свойства пола из списка. На рис. 10 показано, что из восьми маркеров фильтр отобрал только шесть маркеров нашего типа.

Рис. 10. Фильтр быстрого выбора прикрепляемых к таблице объектов Рис. 10. Фильтр быстрого выбора прикрепляемых к таблице объектов

После прикрепления объекта к таблице появляется возможность назначить каждому столбцу определенные свойства, которые необходимо вывести в таблице. Назначение свойств объектов осуществляется в шаблоне отчета. По контекстному меню правой кнопки мыши при указании на ячейку шаблона отчета можно выбрать свойство и назначить его данной ячейке шаблона (столбцу таблицы). Перечень свойств объектов начинается с префикса «Object». Но в нашем случае все гораздо сложнее и в шаблоне будут содержаться не просто свойства, а довольно сложные формулы. Посмотрим на общую структуру экспликации, а затем последовательно разберем все формулы для каждого столбца. Окончательный вариант экспликации приведен на рис. 11. Так она выглядит в Редакторе таблиц. Зеленый фон означает, что в ячейках заложена формула. Само тело отчета формируется автоматически, его редактировать нельзя.

Рис. 11. Экспликация в Редакторе таблиц Рис. 11. Экспликация в Редакторе таблиц

Чтобы посмотреть формулу ячейки шаблона отчета, необходимо вызвать контекстное меню и выбрать позицию Выражение. После этой команды мы попадаем в построитель выражений nanoCAD СПДС.

Сначала разберем простейшие поля.

Для столбца «B» просто указываем тип пола. Выражение представляет собой вид:

=Object.FloorNumber

Для столбца «F» прописываем суммарную площадь всех объединенных в строку помещений данного типа:

=Sum (Object.FloorArea)

Для столбца «E» по каждой строке элементов пола мы вписываем его толщину:

=Object.HN, где N — порядковый номер подстроки от 1 до 6.

Изображение схемы пола в столбце «С» определяется следующим выражением:

=Geometry (Object;"mcImplementation";"Section"+Object.FloorNumber)

Оно представляет собой функцию «Geometry», в качестве параметров которой указывается свойство маркера переменной «mcImplementation». Переменная приобретает значение имени одного из исполнений, соответствующее типу пола по переменной «FloorNumber». Иными словами, в зависимости от типа пола «mcImplementation» приобретает значение имени одного из эскизов схемы пола и передает его в данную ячейку.

Теперь обратимся к самому сложному фрагменту — столбцу «D». Как видно из рис. 11, столбец представлен шестью строками по максимальному количеству значений по данным элементов пола. Их количество в каждом конкретном случае может варьироваться, и этот факт надо учесть, чтобы не нарушилась целостность экспликации. Универсальная формула по каждой из шести строк имеет вид:

=iff (Object.CoverN==""; (««;setheight (0)); («N. «+ Object. CoverN;setheight (8)))

Обратите внимание, что формула указана в общем виде. Здесь вместо «N» необходимо установить порядковый номер строки от 1 до 6 соответственно.

Формула читается следующим образом. Если переменная «Object.CoverN» имеет пустое значение, в ячейку ничего не заносится и высота строки обнуляется. В случае, если значение не пустое, к нему спереди приписывается порядковый номер списка и высота строки устанавливается в 8 единиц. Так формируется список элементов пола, если соответствующие данные есть в переменных маркера.

Перед тем как рассмотреть формулу для столбца «A», познакомимся с порядком группировки данных в экспликации и решением проблем нижних границ в столбцах «D» и «E».

Напомним, что по постановке задачи нам необходимо объединить в одной строке все помещения по данному типу пола. В столбце «D» будут перечислены элементы пола, которые для каждого типа подразумеваются идентичными. Столбец «E» синхронно отражает толщину каждого элемента. В Редакторе таблиц есть возможность управлять группировкой, объединением и сортировкой данных. Перед выполнением этой обязательной процедуры добавим служебный столбец «G». Этот столбец будет аналогом «D», чтобы не зависеть от текстового содержимого в «D» и упростить работу программы. Для столбца «G» необходимо не забыть проставить атрибут «скрытый», чтобы он не выводился на лист и на печать. В каждой ячейке для столбца «G» проставим порядковый номер подстроки в виде формул «=1», «=2» и т.д. Это и будет неким упрощением подсписка элементов пола для упрощения сортировки подстрок столбца «D».

Теперь можно вызвать команду группировки и объединения данных. Она вызывается через меню Свойства раздела в шаблоне отчета Редактора таблиц. По нажатию на гипертекст Свойства раздела выбираем команду Группировка и объединение… В новом окне необходимо указать условия обработки данных таблицы. Пример условий сортировки и группировки для нашей экспликации приведен на рис. 12.

Рис. 12. Условия сортировки и группировки Рис. 12. Условия сортировки и группировки

Для начала мы должны сортировать данные по столбцу «A», а именно по номерам помещений, располагая их по возрастанию порядковых номеров. На втором этапе обработки мы группируем, в данном случае, соединяем в одну строку все строки с идентичным типом пола (столбец «B») и подстроки данных элементов пола (столбец «G»). Все это мы также сортируем по возрастанию, чтобы не перепутались подстроки столбца «G». Напомним, что служебный столбец «G» является аналогом столбца «D». В итоге такой двухуровневой обработки данных мы получаем в единой строке все строки с идентичным типом пола, синхронным распределением по порядку подстрок элементов пола и сортировкой по возрастанию номеров помещений для этих типов полов.

Теперь решим проблему границ нижних ячеек. Дело в том, что все ячейки столбцов «D» и «E», которые описывают элементы пола и их толщины, не должны иметь нижней границы, чтобы не было промежуточных разделителей. Количество подстрок элементов пола, как мы помним, может варьироваться от 1 до 6, но между строками разных типов полов граница все-таки быть должна. Эту проблему решаем с помощью фиктивной строки. Добавим две ячейки в шаблон отчета в столбцы «D» и «E» соответственно. Они будут минимальной толщины в 1 мм. Эти ячейки будут всегда видны и будут иметь нижнюю границу. Теперь независимо от количества подстрок нижняя граница будет определена. Но добавленную подстроку необходимо также учесть при группировке, поэтому в служебном столбце «G» в добавленной строке укажем порядковый номер «7» с помощью формулы «=7».

После этого можно переходить к рассмотрению формулы для столбца «A». Чтобы наглядно представить работу формулы, приведем вид построителя выражений для столбца «A» на рис. 13.

Рис. 13. Построитель выражений столбца «A» Рис. 13. Построитель выражений столбца «A»

Познакомимся с вложенными функциями, входящими в формулу.

  • Index () — индекс текущей строки в группированном блоке строк. Принимает значения от 1 до Count ().
  • Count () — количество строк, занятых текущей ячейкой.
  • Str () — преобразует аргумент к строковому значению.

Напомним, что задача формулы сформировать список номеров помещений для указанного типа пола, которые попали в строку путем группировки. Компоненты списка разделяются запятыми. Формула работает следующим образом. Числовое значение номера помещения преобразуется в строку. К нему прибавляется запятая до последнего значения. Это условие проверяется по текущему порядковому номеру помещения в объединенной группе для данного типа пола. Для каждого помещения в общем виде происходит объединение группы из семи подстрок. Это видно из шаблона отчета. Общее число этих подстрок (функция Count ()) делится на 7 подстрок, получаем общее количество помещений в подгруппе для типа пола. Мы добавляем запятую до тех пор, пока текущий порядковый номер помещения в подгруппе (функция Index ()) строго меньше, чем количество этих помещений. В противном случае (для последнего номера помещения) ничего не добавляется. Например, пусть у нас в подгруппе 6 помещений. В первую очередь программа считает количество объединенных подстрок — 42. Соответственно после деления на 7 мы получаем количество помещений равное 6. Для номеров помещений в группе будет проставляться запятая, пока не дойдем до 6-го помещения по порядку, так как у нас строгое неравенство, которое выполняется до 5-го помещения включительно.

После выполнения всех операций нам остается только сохранить экспликацию в базе данных. Для этого в Редакторе таблиц вызовите соответствующую команду из меню Файл и укажите раздел (папку) из структуры базы и имя объекта, например «Экспликация полов». Для приведения в соответствие содержимого Менеджера объектов и БД после любых изменений объектов и их сохранения нажимайте кнопку обновления в панели инструментов Менеджера.

Решение задачи экспликации помещений на практике

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

После этих замечаний переходим к решению нашей задачи, а именно автоматическому формированию экспликации помещений.

Рис. 14. Обозначения форм помещений из функционала nanoCAD СПДС Рис. 14. Обозначения форм помещений из функционала nanoCAD СПДС

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

Выводы

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

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

Надеюсь, что эта статья послужит руководством к действию и побудит вас автоматизировать наиболее трудоемкие задачи, с которыми вы встречаетесь ежедневно в своей работе. Приведенные выше методики можно с успехом использовать для решения огромного класса подобных задач, так как эти приемы работы являются унифицированными. Затратив некоторое время на разработку собственных элементов, можно существенно выиграть в производительности и трудозатратах в будущем, а приобретенные навыки позволят вам решать еще более сложные задачи.

Алексей Цветков
ЗАО «Нанософт»
Тел.: (495) 645−8626
E-mail: Tsvetkov@nanocad.ru