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

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

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