AutoCAD. Макросы команд. Часть 2: Синтаксис макросов

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

Макросы в AutoCAD часть 2

[Синтаксис макросов]

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

^C^C Имитирует двойное нажатие на клавишу ESC (т.к. перед выполнением команды желательно убедиться, что в данный момент не выполняется другая команда) – это стандартное начало любого макроса. Символы С вводятся строго в англ. раскладке!
^Q Подавление всех запросов и подсказок в командной строке — «тихий» режим работы макроса.
* Звездочка перед началом макроса запускает его циклический повтор. Макрос будет выполняться снова и снова до тех пор, пока не будет вызвана другая команда или не будет нажат Esc.
— Дефис перед именем команды подавляет открытие диалоговых окон. Например, команда СЛОЙ открывает палитру Диспетчера свойств слоев, а запись -СЛОЙ запустит команду в текстовом режиме с возможностью выбора опций в командной строке.
_ Нижнее подчеркивание указывает на то, что будет использоваться глобальное, а не локализованное имя команды. Подчеркивание необходимо использовать перед названием любой команды и опции на английском языке, если вы работаете в локализованной версии AutoCAD. Имя команды на русском языке, например: КРУГ (вместо _circle), подчеркивания не требует.
. Точка — это указание того, что выполняемая команда будет использовать встроенное определение команды, а не повторное определение команды. Применяется для вызова именно «родной» команды AutoCAD в ситуациях, когда есть риск, что пользователь создал свою команду (обычно через LISP) с тем же именем, т.е. переопределил команду.
; Точка с запятой имитирует нажатие клавиши Enter (Ввод). «Пробел» в тексте макроса делает тоже самое (поэтому не ставьте пробелы в тексте макроса просто так), но точка с запятой нагляднее, когда требуется имитировать несколько нажатий Enter подряд — эти символы видны и легче посчитать.
\ Обратная косая черта — это символ, который формирует в макросе паузу для ввода данных пользователем (например, указание точки на экране или ввод числа в командной строке)
@ Данный символ вставляется, если нужно ввести относительные координаты точки. Координаты вводят в последовательности X,Y,Z через запятую, например @10,20 — это смещение на 10 по оси X и на 20 по оси Y относительно предыдущей указанной точки (если Z=0, его не указывают). Тогда как абсолютные координаты, например: 10,20 отсчитываются от нуля системы координат.
_p Используется внутри какой-либо команды для выбора предыдущей группы выделения.
_l Используется внтури какой-либо команды для выбора последнего созданного объекта.
 _single  Переключает команду в режим выбора одного объекта: после указания объекта на экране с помощью клика мыши или рамки выделения, команда переходит к исполнению, не требуя подтверждения выбора.

Этот список далеко не полный. Более подробную информацию вы можете найти в старой, но неустаревающей и очень интересной книге В. Света «AutoCAD. Язык макрокоманд и создание кнопок»,  а также в справке по программе. 

[Общий принцип создания макросов]

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

По сути, опытный пользователь программы отличается от новичка именно тем, что наизусть знает основные опции (ветвления) команд, с которыми работает, и пробегается по тем или иным «маршрутам» не задумываясь.

Нажмем на иконку прямоугольника в ленте и перенесем свой взгляд в командную строку:

AutoCAD. Командная строка

Глобальное имя команды _rectang отображается сверху, а в строке ниже отображается локализованное ПРЯМОУГОЛЬНИК. Дальше идет запрос на указание точки первого угла и доступные опции — они отображаются в квадратных скобках [ ].

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

Ключ команды

Если какие-то запросы имеют значения по умолчанию, то они отображаются в командной строке в треугольных скобках, например <50> или <выбрать все>. Согласиться со значением по умолчанию можно просто нажав Enter без введения каких-либо данных.

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

[Несколько примеров]

Как мы выяснили выше, работа с любой командой в Автокаде — это своего рода маршрут из точки A (запуск команды) в точку Б (получение результата), с развилками в виде опций команды. Давайте разберем несколько примеров, чтобы лучше прочувствовать эту концепцию.

ПОСТРОЕНИЕ ПРЯМОУГОЛЬНИКА ПО РАЗМЕРАМ

Например, для команды прямоугольник последовательности могут быть следующие:

AutoCAD алгоритмы работы с командой Прямоугольник

Мы вызвали команду, сделали первый шаг, а дальше пошло ветвление. Запишем «нижний маршрут» в виде макроса. Для наглядности и лучшего понимания сделаем это двумя способами: с использованием глобальных имен (первая строка) и локализованных (вторая):

^C^C_.rectang;\_d;\\@1,1;
^C^Cпрямоугольник;\р;\\@1,1;

Скопируйте любую из этих строк в кнопку на палитру и посмотрите, как работает данный макрос. Если вы работаете в русскоязычной версии программы, то макросы удобнее писать на русском языке, но если есть желание, можете делать это и на английском — такие макросы будут работать в любой версии программы. Но желательно избегать «смешанного» языка в пределах конкретного макроса — остановитесь на чем-то одном, чтобы не путаться.

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

^C^C Стандартное начало любого макроса, которое прерывает выполнение любой другой команды, что эквивалентно двойному нажатию ESC
_.rectang Вызываем глобальное не переопределенное имя команды. В русской версии макроса тут просто указано имя команды прямоугольник
; Имитируем нажатие Enter после ввода имени команды
\ Ставим макрос на паузу, чтобы пользователь указал точку для первого угла прямоугольника
_d Ключ для выбора опции _d на английском (т.к опция называется Dimensions) или р (опция Размеры) на русском
\\ Два пользовательских ввода подряд, т.к. команда запросит сначала длину, а затем ширину нашего прямоугольника
@1,1 Указание точки в относительных координатах. Добавлено для того, чтобы прямоугольник строился вверх и вправо относительно первого угла; по аналогии @-1, -1 — ориентация прямоугольника вниз и влево
; Подтверждение завершения ввода координат

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

ПРОВЕРКА ФАЙЛА НА ОШИБКИ

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

^C^C_.audit;_y;

  • сначала мы вызываем команду _.audit
  • подтверждаем ее вызов ;
  • после чего на запрос «Исправить все обнаруженные ошибки?» отвечаем ключом _y (от английского yes — «да»)
  • подтверждаем ключ, поставив после него ;

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

Русская версия данного макроса выглядит так: ^C^Спроверить;д;

СОЗДАНИЕ НОВОГО СЛОЯ

Для создания слоя нам нужно воспользоваться командой СЛОЙ, но если просто ввести имя данной команды в командную строку, откроется окно Диспетчера свойств слоев. А это нам не подходит, т.к. нажимать какие-либо кнопки в окнах через макросы не получится. Нам нужны опции команд и их ключи. Для этого поставим перед именем команды дефис, получится -СЛОЙ и нажмем Enter, теперь команда запустится в текстовом режиме:

AutoCAD запуск команды -СЛОЙ

Макрос создания слоя с именем Примечание будет таким:

^C^C-слой;с;Примечание;;

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

Мы просто создали слой, не указывая каких-либо его параметров, кроме имени. Теперь давайте немного усложним данный макрос: укажем цвет слоя и сделаем макрос «тихим», чтобы в процессе работы макроса в командой строке не выводилась никакая информация:

^C^C^Q-слой;с;Примечание;ц;30;;;

Начало у макроса точно такое же, мы разобрали его выше. Но появилось одно отличие: перед вызовом команды стоит префикс ^Q  — так мы отключаем вывод запросов в командной строке. Советую сначала отладить макрос, а уже потом переводить его в тихий режим, т.к оповещения командной строки помогают отлавливать свои ошибки.

  • далее мы выбираем опцию Цвет — ц;
  • указываем номер цвета — 30;
  • после чего еще раз ставим ; (чтобы согласиться с тем, что это будет цвет именно нашего слоя, т.к. для запроса «Список имен слоев для присвоения цвета» имя нашего слоя предлагается в треугольных скобках как значение по умолчанию)
  • чтобы завершить работу команды, добавляем еще одну ;

Поэкспериментируйте с этой и другими опциями, и вы довольно быстро поймете общую логику. Главное, не допускайте опечаток и будьте внимательны!

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

А пока попрактикуйтесь с этими примерами и попробуйте написать что-то свое. Успехов!

Отзывы и комментарии приветствуются! Уже 4:

  1. Инна:

    Добрый день. Создала макрос «копировать и редактировать одновременно текст». Задала цикличность звездочкой. Но эта цикличность не работает. В чем подвох?

    Вот сам макрос:

    *^C^CКОПИРОВАТЬ;\;@;\ТЕКСТРЕД;ПОСЛЕДНИЙ;; -На русском или

    *^C^С_Copy;\;@;\_textedit;_Last;; — на англ.

  2. Елена:

    Макрос (прямоугольник) работает только при нажатии на кнопку. При вводе псевдонима все осталось по-прежнему. Как решить?

    • nikkomp:

      Псевдонимы на acad.pgp не поддерживают макросы. Это надо создавать через lisp функцию.

  3. Алексей:

    Здравствуйте. Ломаю голову как соединить 2 макроса(создать программу)

    На чертеже много прямоугольников.

    Задача выделить фрагмент, скопировать, создать новый чертеж , перенести туда выбранный фрагмент, вставить его 2 раза через определенное расстояние, разбить и сохранить в определенном формате.

    Выполняю 2мя макросами.

    Выделяю вручную: Нажимаю макрос-

    Копировать в буфер

    ^C^C_.copyclip БСОЗДАТЬ

    Фрагмент копируется и создается новый чертеж.

    Нажимаю 2рой макрос

    Вставить из буфера

    ^C^CВСТБУФЕР 0,0 ВСТБУФЕР 694,0 _xplode;все;;в;р +СОХРАНИТЬКАК F 2013dxf

    По окончании выводится окно о месте и названии сохранения чертежа.

    Как это все соединить в одну программу? что бы не жать много кнопок?