От автора: Уверен, что решаемая в статье задача в том же виде никогда не возникнет ни у одного из читателей, но приемы, описанные в ней, обязательно когда-нибудь придут на помощь при решении нетривиальных задач проектирования.
Глава 1. «Постановка задачи – половина результата»
Разумеется, этой статьи не было бы, обойдись вопрос одним поперечником. В процессе последующей беседы выяснилось, что это не просто поперечный профиль дороги, а профиль пешеходного перехода, который, помимо отметок, должен содержать информацию обо всех пересекаемых коммуникациях, всех проектируемых ТСОДД (технические средства организации дорожного движения), тротуарах и т. д. И все это – с высотными отметками, снятыми с топопланов!
Говоря языком современной молодежи – хороший челлендж. Ну что ж, вызов принят!
Глава 2. «Взлетит – не взлетит»
«Взлетит – не взлетит?» – локальный мем «Суровых технарей»*. Суть его – оценить, являются ли жизнеспособными какая-либо принципиальная схема, механизм или идея.*Суровый технарь – крупнейшее сообщество инженеров всех направлений в социальной сети Вконтакте, в свое время давшее старт развитию моего канала.
Как и в любом новом деле, тут очень и очень важно было выбрать на старте, какой инструмент использовать для достижения нужного результата в обозначенные сроки. Требовалось спрогнозировать, не заведет ли выбранная методика в тупик, что, в свою очередь, приведет к срыву сроков и всего проекта.
Быть может, для этой задачи и существует какой-то подходящий супер САПР, но я, к сожалению, о его существовании не знаю. Поэтому пришлось выбирать из того, что было в наличии.
На чашах весов расположились два принципиально разных подхода к решению задачи – BIM и графоаналитика (кульман+калькулятор).
В качестве BIM-инструмента на первой чаше весов расположилась САПР для проектирования автомобильных дорог Topomatic Robur (то, к чему на тот момент имелся доступ и с чем у меня был опыт работы), на другой – уже полюбившаяся связка AutoCAD + Excel.
Но теперь, трезво посмотрев на техническое задание и исходные данные, начинаем накидывать противовесы в чашу графоаналитики:
а) имеющиеся топопланы представляют собой разрозненные участки. Поэтому строить цифровую модель рельефа придется ровно столько раз, сколько участков в файлах (порядка ста раз). А это весьма небыстрый процесс, учитывая то, что примерно в половине планов точки рельефа не подняты по оси Z в отметку.
б) генерируемый профиль требует ручного доведения поперечника в AutoCAD до требований оформления заказчика в немалом объеме. Помимо этого, он будет содержать ненужные отметки переломов в местах пересечения со структурными линиями, то есть чертеж будет перегружен ненужной информацией.
в) далеко не все коммуникации и проектируемые сооружения можно задать и настроить для корректного отображения их пересечения на профиле, следовательно, это еще целый пласт ручной работы в AutoCAD.
И вот уже преимущества использования САПР при ближайшем рассмотрении нивелируются, и выбор становится не столь очевидным...
Несмотря на активно пропагандируемое мнение, что «AutoCAD – это рудимент, будущее за BIM», я все же решил прислушаться к внутреннему голосу и пойти по пути графоаналитики, оставив САПР до лучших времен. Хотя, честно говоря, на тот момент я до конца не был уверен – «взлетит – не взлетит», не имел четкого представления о том, как в теории должен работать сценарий, и главное, позволит ли выбранный метод обеспечить требуемую скорость построения чертежей. Тем не менее, в моем арсенале был ряд штатных средств автоматизации работы в AutoCAD, природная смекалка и чувство ответственности за данное обещание.
Глава 3. «Война план покажет»
Прокрутив в голове несколько вариантов построения профиля, проведя ряд экспериментов, попробовав и отвергнув несколько интересных, но низкоэффективных приемов, я сформировал общую концепцию выполняемых операций, позволяющих получить желаемый результат. Схема казалась рабочей и принципиально осуществимой, но вот при фактическом исполнении пришлось изрядно пошевелить извилинами...Начался самый сложный и нервозный период – реализация принципиальной схемы. Настройка извлечений, формирование пользовательских палитр, написание и отладка сценария, создание набора блоков, постоянная оптимизация и донастройка – в общем, создание единой «экосистемы». Первый осязаемый результат я получил, наверное, только через неделю. Согласен, «запрягать» пришлось долго, но по-другому «быстро ехать» не получится. Впоследствии каждое звено усложнялось и оптимизировалось. Один только основной сценарий трижды переписывался, с каждым разом значительно сокращая объем ручной работы и теряемое впустую время.
Финальная итерация принципиальной схемы построения поперечного профиля, по которой и выполнялась поставленная задача, выглядит следующим образом:
1. На плане наносятся объекты (отрезки и точки), позволяющие снять данные о высотных отметках и расстояниях от оси дороги в характерных точках рельефа, объектах обустройства и пересекаемых коммуникациях. Также посредством цветовой индикации извлекается информация о типе пересекаемой коммуникации или изображаемого ТСОДД.
2. С помощью автоматизированного извлечения данных полученная информация извлекается во временный Excel-файл, из которого подтягивается в таблицу скрипта. В ней на базе этих данных формируется сценарий на построение поперечного профиля и нанесение коммуникаций.
3. В новом чертеже в определенном порядке предварительно размещаются блоки рамок с основной надписью и таблицы профиля.
4. Макросом кнопки на палитре запускается сценарий, который пошагово:
- отрисовывает линию профиля;
- заполняет таблицу отметок и расстояний;
- расставляет специально разработанные блоки коммуникаций и ТСОД;
- заполняет атрибуты высотных отметок пересечений, заложений фундаментов и адрес профиля.
6. Заполнение основных надписей экспортом/импортом атрибутов.
Схема сформирована, отработана, отлажена… Но это только направление, впереди еще долгий трудоемкий путь к намеченной цели.
Ну а теперь самое интересное – тонкие технические подробности того, как этот путь можно сократить и максимально облегчить.
Глава 4. Спецпалитры
Несмотря на всю автоматизацию, общий объем работы все равно очень и очень большой, хотя и достаточно однотипный. По этой причине везде, где можно было хоть что-то автоматизировать, я непременно это делал. Образно говоря, если вместо трех кликов можно делать один клик по кнопке на палитре, эти три клика должны быть собраны в один макрос, ибо суммарно-интегрально секунды сложатся в минуты, минуты в часы, а часы жизни нам никто не вернет.В одном из своих видео, где я рассказывал про палитры, я говорил, что они могут быть созданы под конкретную производственную задачу. Это как раз тот случай, так как кнопок под эту задачу было создано несколько десятков, разнесенных на три отдельных палитры.
^C^C-СЛОЙ;С;"_Постр.сущ.";Ч;Н;;Ц П 255,255,255;;^C^C-СЛОЙ;С;"_Постр.ПП и ИДН";Ч;Н;;Ц;3;;^C^C-СЛОЙ;С;"_Постр.СИП";Ч;Н;;Ц;С;;;PDMODE 35 PDSIZE 0.7
Создавать слои можно разными способами, но все же один клик – это один клик!
^C^COSMODE 0 ПСК \\1,1 ПЛАН Т;Показать р -40,-20 40,20;ВРГ;
Первая задача (не основная) поворачивает вид чертежа по указанным для команды ПСК точкам, масштабирует вид до оптимального для работы и регенерирует чертеж. На данном этапе это просто удобство.В чем незаменимый функционал этой кнопки – расскажу чуть позже.
3. Первостепенная информация, которую нужно снять с планов для построения разреза, – высотные отметки. Первым шагом для решения этой задачи станет построение отрезков, концы которых будут соединять в пространстве смежные точки съемки. По сути – аналог структурных линий цифровой модели местности или ребер триангуляции поверхности рельефа. Но учитывая тот момент, что в половине планов точки съемки были опущены на плоскость XY, привязываться отрезками к точкам съемки напрямую чревато ошибками. Поэтому предварительно создаются нужные для построения сечения точки в специальном слое, поднимаются на отметку, указанную текстом, а затем уже к этим точкам подвязываются отрезки. Для этих операций используются две следующие кнопки:
*^C^C-СЛОЙ;У;"_Построения сущ.";;-цвет ПоСлою;OSMODE 0;Точка;
– устанавливается текущим нужный слой, цвет, отключается привязка и запускается непосредственно команда вставки точки. Отметка уже забивается ручками в свойствах точки. Тут уже от механического труда ни спрятаться, ни скрыться.
*^C^C-СЛОЙ;У;"_Построения сущ.";;OSMODE 9;-цвет ПоСлою;отрезок;
Макрос построения отрезков отличается лишь тем, что включает привязку «Узел» и запускает команду отрезок.
Разумеется, для корректного построения профиля хаотично соединять точки нельзя. Сначала отрезками сопрягаются характерные точки конструкции дороги (ось, кромки, бровки, подошвы, тротуары), затем уже достраиваются линии рельефа.
Таким образом, каким бы ни были текущий слой и цвет, при запуске команд с палитры всегда будет обеспечен порядок в слоях и защита от случайных некорректных привязок.
*^C^C-СЛОЙ;У;"_Построения ПП и ИДН";;OSMODE 512;-цвет ПоСлою;Точка;
Этот макрос меняет слой на специально созданный, так как с этим слоем придется работать отдельно. Затем устанавливает единственную привязку «Ближняя», так как только она позволит накалывать точки на пространственные отрезки в произвольном месте. Вот вам кстати и:
[Лайфхак №1] Еще со времен уроков географии в школе ненавидел интерполировать отметки по правилам и всегда принимал отметку «глазометрическим» способом. Благо сейчас мне на помощь пришел AutoCAD, позволяющий снимать отметки с высочайшей точностью в два клика. Размещение точки с привязкой «ближайшая» на привязанном к точкам съемки отрезке позволяет забыть правила интерполяции пропорцией как страшный сон (можно, конечно, использовать 3D-полилинию, сути это не меняет).
Быстренько накалываем характерные точки рельефа в непосредственной близости с прямой, обозначающей сечение, получая тем самым интерполированные отметки характерных точек рельефа. И вот уже в нашем распоряжении данные, достаточные для построения поперечного профиля рельефа. Но уходить с таким количеством информации в построение профиля – небывалое расточительство возможностей и времени. Ведь нужно еще снять информацию об остальных объектах, изображаемых на профиле.
Для этого при помощи следующей кнопки строим отрезки, соединяющие только что созданные точки. Тем самым получаем профиль сечения, на который мы смотрим сверху. Интереса ради, конечно, можно покрутить пространство, но пользы от этого немного, максимум – можно увидеть, не привязались ли мы случайно к объекту нулевого уровня.
С высотными отметками и расстояниями все понятно – по аналогии подвязываем точки к отрезкам сечения с «ближайшей» привязкой. А вот как передать в сценарий информацию о том, что именно мы пересекаем, а также попадают ли сооружения в сечение или проецируются на сечение?
Самое очевидное и простое решение – задействовать свойство точки «Цвет». Просмотрев и проанализировав топопланы, собираем полный перечень изображаемых на профиле объектов в таблицу цветовой индикации.
При помощи кнопок получившейся палитры можно построить объекты, необходимые для построения сечений по ИДН и ПП, так как эти сечения параллельны друг другу и разделять их по отдельным слоям нет смысла. А вот сечение по СИП (самонесущий изолированный провод) будет пересекать вышеуказанные сечения, что может замедлить выбор точек под извлечение. Поэтому для сечений СИП нужен второй набор точно таких же кнопок, макрос которых отличается от первого лишь названием слоя. Чтобы не тратить время на корректировку макроса каждой кнопки, нам на помощь приходит:
[Лайфхак №2] Экспортированный файл палитры является текстовым файлом с расширением *.xtp, содержащим служебную информацию о путях к иконкам, а самое главное – Макросы команд. Таким образом, переписав расширение файла на «txt», можно открыть файл палитры Блокнотом и вносить коррективы в текст макросов палитры через «Поиск и замену». Например, если у вас изменился путь к файлу шаблона с блоками, то реанимировать разом всю палитру блоков можно, заменив текст пути к шаблону поиском и заменой в тексте файла палитры.
В данном же конкретном случае «Поиском и заменой» меняется название слоя, восстанавливается расширение файла таблицы и загружается обратно в программу. Теперь точки разного типа сечений можно легко дифференцировать друг от друга изоляцией слоев перед извлечением данных.
^C^COSMODE 0 ПСК \\1,1 ПЛАН Т;Показать р -40,-20 40,20;ВРГ;
Так вот, для придания какого-то смысла извлекаемым данным о положении точек, нужно выставить систему координат так, чтобы координаты точек относительно нее можно было использовать при написании сценария. Думаю, все уже поняли, что расстояние от оси до характерной точки на поперечном профиле проще всего получить как расстояние по одной из осей ПСК. Вот для этого я и вывел команду смены «ПСК» (с отключенной привязкой, чтобы случайно не привязаться к какому-либо объекту по координате Z и тем самым свести на нет весь предшествующий труд) на отдельную кнопку. Ну и смена плана под текущую ПСК тут тоже неспроста – помимо визуальной составляющей, выделение точек под извлечение данных куда удобнее, когда точки расположены горизонтально и их можно выбрать одной рамкой, чем если они будут расположены по диагонали экрана.
И вот тут, думаю, многие читатели уже готовы закончить чтиво – ведь написание сценария, который и строит поперечник, вставляет блоки, и рассчитывает отметки и заполняет атрибуты, кажется просто чем-то на грани фантастики.
Спокойствие, друзья, только спокойствие!
Я и сам далеко не сразу пришел даже к идее такого скрипта, тем более реализации. Как я уже писал ранее – сценарий трижды переписывался, усложнялся и оптимизировался. Дабы не грузить читателя поисками своего Грааля, я и покажу уже конечный вариант решения задачи.
Глава называется «ГексаСкрипт» как раз потому, что конечный сценарий состоит из шести блоков, которые выполняются один за одним. По факту, это шесть разных сценариев, которые пишутся в одном шаблоне на базе одних извлеченных данных, просто соединенных в один текстовый файл. Таким образом, разбив сложную задачу на несколько простых, мы можем без особого труда написать один «суперскрипт».
Итак, приступаем:
Первое, что нам нужно, – оформить исходные данные. При помощи формул связи формируем столбцы исходных извлеченных данных: положение относительно оси, высотная отметка, код типа объекта (цвет). Вручную (желтые значения) указываем номер надземного пешеходного перехода (НПП), номер сечения и номер этапа. Исходя из этой информации функция ВПР подтягивает координаты начала построения, адрес и тип сечения, а также путь к файлу построения чертежа из специально заготовленной таблицы исходных данных. Так как на период отладки сценария постоянно приходилось добавлять технические столбцы, номера столбцов с ячейками, содержащими текст сценария, были вынесены в специальные ячейки. Это освобождает от бесконечных корректировок макроса на создание скрипта.
Script №1 – построение профиля рельефа. Что может быть проще? Запускаем сценарием команду «ПОЛИЛИНИЯ». В качестве координаты X принимаем значения из извлечений, в качестве координаты Y берем координату Y шапки таблицы и прибавляем к ней разницу извлеченной координаты Z точек на плане и «условной отметки шапки» (ср. значение отметок минус 5 см). Линия профиля готова.
Script №2 – заполнение данных строки высотных отметок в таблице профиля. Задача еще проще – команда «ТЕКСТ» с координатой положения X из извлечения и фиксированной высотой по Y. В качестве значений для текста выступят значения высоты точек из извлечения. Угол поворота текста на 90 градусов прописывается в тексте формулы сценария как ответ на стандартный запрос.
Script №3 – нанесение вертикальных отрезков от профиля до таблицы доверим одноименной команде «ОТРЕЗОК». X и Y начала отрезков позаимствуем из первого сценария, Y конца отрезка также является измеряемой константой. Приписка «ЦВЕТ 251 ВЕСЛИН 0.05 отрезок» к первой строке сценария придаст эстетики создаваемому чертежу без каких-либо дополнительных затрат времени.
Script №4 – расстояние между характерными точками профиля тоже доверим команде «ТЕКСТ». Отличие лишь в том, что координату положения текста нужно вычислить как среднее положение между двумя точками, сложенное с расстоянием до ближней к оси точки. В качестве значения для текста выступит эта самая разница.
Script №5 – упрощенная версия третьего скрипта с фиксированными Y и форматированием отрезка под стиль таблицы.
Пять первых скриптов может написать человек с базовыми знаниями Excel и опытом написания сценариев уровня «прочитал статью на isicad». Но тем не менее, результат уже довольно впечатляющий, и даже если на большее фантазии уже не хватит, то, накидывая оставшиеся блоки с палитры, можно добиться хорошей производительности труда. Но мы останавливаться не намерены.
Нет смысла расписывать каждую формулу. Думаю, каждый сможет получить устраивающий его результат, разница будет лишь в количестве вспомогательных столбцов. В любом случае, скрыв подраскрывающиеся списки, можно получить аккуратную табличку подготовки скриптов, ничуть не хуже окон настройки какого-либо модуля в любом САПР.
Таблица профиля тоже динамическая, подрезаемая параметром растяжения. Также в нее инъецированы ось профиля (так как на каждом листе она будет менять свое положение) и границы профиля с атрибутом, содержащим «Границы кадастрового квартала», для тех профилей, на которых она пересекается.
Запускаем созданный сценарий кнопкой на палитре быстрого доступа и просто не верим своим глазам – в «голом» AutoCAD, без использования каких-либо модулей, надстроек и плагинов строится поперечный профиль!
Теперь самое неприятное – ручное доведение поперечника до идеала. Тут из «улучшайзинга» можно предложить только использование давно всеми забытого инструмента «Мультилиния» для отрисовки покрытия, тротуаров и укреплений обочины. Он позволяет закрашивать линию по одну сторону от указываемых точек. Настраиваем расстояния между линиями согласно ТЗ, устанавливаем заполнение между ними сплошной штриховкой и вешаем запуск начертания этой чудо-линии на кнопку на палитре с предварительной установкой соответствующего слоя.
^C^CСЛОЙ У "ПРОЕКТНЫЙ ПРОФИЛЬ" ^C^CМЛИНИЯ С ПЧ
Хоть руками и нужно немного поработать, но, тем не менее, покликать пару минут не так страшно, как если бы, например, пытаться построить поперечник без использования сценария. С учетом грамотно настроенной динамики выносок блоков и вынесенных на палитру стилей мультилиний на каждое условное обозначение, оформление профиля до читаемости занимает не более пары минут.
Профиль готов. Теперь все сначала – накалывание точек, извлечение, заполнение данных и генерация скрипта, построение профиля и доведение вручную. И так профиль за профилем, переход за переходом…
Примерная прикидка по времени показала следующие результаты:
Чтобы вносить какие-либо данные в основные надписи, прежде нужно эти данные надлежащим образом подготовить. Опять-таки, придется поработать ручками – пооткрывать все используемые в работе DWG-файлы и заполнить столбец с названиями улиц, а также пикетажное положение и тип каждого из сечений. Согласен, дело небыстрое, нудное и зависящее от внимательности (вот поэтому я его с удовольствием и делегировал своему помощнику, в то время как сам писал сценарий). Формулами собираем нужные формулировки под каждый атрибут блока рамки листа. И вот уже в дело вступает старый дедовский экспорт/импорт атрибутов из комплекта Express Tools.
[Лайфхак №3]. Первым делом при установке AutoCAD обязательно нужно ставить галочку инсталяции Express Tools, которую разработчики припрятали под выпадающий список. Но если вдруг вы забыли ее поставить – просто заново запускаем установку и ищем заветную галочку, полностью AutoCAD переустанавливать нет необходимости.
Думаю, те, кто часто пользуется экспортом/импортом атрибутов, знают, что определенной проблемой является упорядочивание строк извлечений с целью последующего корректного заполнения таблицы атрибутов.
Тут поможет еще один вид автоматизации работы – подключаемые модули. В частности, совершенно бесплатно распространяемый в магазине приложений Autodesk модуль «Increment» от французского разработчика Gilles Chanteau (Жиль Шанто).
Честно говоря, из бесчисленного множества (в том числе бесплатных) приложений Increment – единственный модуль, прижившийся у меня и прекрасно дополняющий базовый функционал программы. Настроив порядок автоматической нумерации по убыванию координаты Y, а при наличии блоков с одинаковой координатой Y – по возрастанию координаты X – получаем пронумерованные по порядку атрибуты листа, всего лишь выделив одной рамкой все блоки.
Оставим за скобками замечания заказчика, незначительные корректировки и особенности взаимодействия при передаче готового материала. В общем и целом, весь проект завершился удачно, сроки выдержаны, а документация принята.
Отдельно хочу отметить, что описанная методика в значительной мере исключает человеческий фактор и сводит к минимуму количество опечаток и арифметических ошибок. Например, если бы вычисления отметок производились в уме, а внесение их осуществлялось вручную, то, думаю, ошибки и опечатки случались бы в каждом десятом-двадцатом значении, что для проектной документации недопустимо.
Вероятно, это не самая сложная задача, которую я когда-либо выполнял в AutoCAD. Но в ней наиболее наглядно показан эффект синергии от нескольких простых средств автоматизации, в совокупности дающий, без лишней скромности, весьма впечатляющий результат.
Безусловно, нужно отдавать себе отчет, что никакая синергия от всех способов автоматизации никогда даже близко не приблизится к тому, что может дать САПР в случаях, когда поставленная задача совпадает с назначением САПР. Не стоит пытаться переписать с нуля функционал условного «Civil 3D» на базе AutoCAD, этот велосипед уже давно изобретен и прекрасно эксплуатируется.
Лишь в тех случаях, когда задача является весьма нетривиальной – стоит хорошенько подумать и внимательно взвесить, какой инструмент будет уместен и наиболее эффективен. И чем больше таких инструментов будет в вашем арсенале, тем более изощренные задачи будут вам по плечу.
С огромным уважением,
Глава 5. Извлечение
Про извлечение данных я достаточно подробно рассказал в своей первой статье. Тут ничего нового, все по старой схеме – кнопка на палитре, файлы извлечения, буферный чертеж и генерируемый Excel в новом файле. Куда более интересно, какую прелюдию нужно произвести, прежде чем запустить извлечение.
Глава 6. «HexaScript»
Дальнейшее накручивание извлекаемых данных и файла сценария приведет к значительному усложнению всей экосистемы. Поэтому решение о том, что для каждого профиля будет делаться отдельное извлечение и писаться отдельный сценарий на его построение – определенная золотая середина между сложными многосоставными скриптами и многотысячными кликами мышью. Пакетное создание профилей – это уже удел САПР, а для системы, сделанной на коленке из «экселя и палок», и такой расклад весьма неплох.
Глава 7. Come back to AutoCAD
Возвращаемся в AutoCAD, но уже в чертеж, в котором будут строиться поперечные профили. Тут нас ждут специально заготовленные блоки обозначений объектов ТСОДД и пересекаемых коммуникаций, заряженные динамикой (для быстрого и удобного оформления чертежа, естественно) и блок рамки листа с набором атрибутов для заполнения основной надписи и таблица профиля.
Разумеется, данные результаты получены при финальной настройке всей «экосистемы». Тем не менее, на создание только цифровой модели местности по подготовленному чертежу плана у меня ушло порядка 35-40 мин, при этом генерируемый по ней чертеж профиля требовал едва ли не полной переработки. Быть может, в процессе работы с помощью САПР и можно было бы что-то автоматизировать и настроить, но очень и очень сомневаюсь, что удалось бы хоть немного приблизиться к вышеуказанным показателям.
Глава 8. Атрибутика
Долго ли, коротко ли, но всё-таки наступает тот приятный момент, когда вся графика первого из этапов проектирования готова. Теперь приходит черед приятных хлопот – заполнение основных надписей, названий дорог и километража сечений. Разумеется, наполнить несколько сот атрибутов вручную – это не наш метод. На помощь вновь приходит Excel.
Глава 9. «Листопад»
Заключительной операцией, которой, к сожалению, пренебрегает непозволительно большое число проектировщиков, является разбивка на листы. Тут все предельно банально. Расписанная в двух предыдущих статьях методика отрабатывает превосходно: извлечение данных о положении блоков, генерация сценария на разбивку в Excel, запуск сценария в AutoCAD. Пару минут наблюдаем, как выполняются сотни команд, вводятся тысячи значений и строка состояния наполняется сотнями аккуратно пронумерованных вкладок.
Заключение
автор YouTube–канала «AutoCAD imho» Александр Савилов