AutoCAD. Макросы команд. Часть 3: Примеры полезных макросов

Надеюсь, вы уже ознакомились с первой и второй частями моего рассказа о макросах в AutoCAD (если нет, то лучше сделать это перед прочтением данной статьи). Мы научились создавать свои кнопки и понимать синтаксис макрокоманд. В заключительной третьей части я приведу еще несколько примеров макросов, которые часто использую в своей работе. С одной стороны, эти примеры полезны сами по себе, а с другой — мы еще раз потренируемся, чтобы вы лучше усвоили тему. Поехали!

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

[Выноска с фиксированным содержимым]

Если вам довольно часто приходится расставлять выноски с одинаковым содержимым (например, подписывать оборудование или какие-то повторяющиеся объекты на чертежах), обратите внимание на данный макрос. Пользователю нужно будет указать только местоположение стрелки и местоположение начала текста, а содержимое выноски задано в самом теле макроса:

*^C^C_mleader;\\Ваш текст;
*^C^Cмвыноска;\\Ваш текст;

Сначала мы вызвали команду, после чего идут два пользовательских ввода — первый для указания положения стрелки и второй для указания положения текста, а далее написан сам текст. Как обычно — вы сами вольны выбирать какой из вариантов из вариантов использовать: русско- или англо- язычный. Вместо Ваш текст можно поместить любое нужное слово или фразу. Можно создать любое количество таких макросов с разным содержимым в виде кнопок на палитре. У меня таких сделано 6.

Обратите внимание на звездочку * в начале кода — ее наличие заставляется макрос работать в цикле, то есть повторяться до тех пор, пока пользователь не нажмет Esc. Выглядит это вот так:

Выноска с фиксированным содержимым

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

Подробности для энтузиастов:

Слой созданной выноски можно было бы задать в свойствах инструмента палитры. Но тут в Автокаде обнаружилась недоработка: если макрос работает в цикле, то первый объект будет создаваться в слое, указанном в свойствах инструмента палитры, а вот последующие уже в текущем слое, что довольно странно и неудобно. Возможно, такой баг есть именно в моей версии и в будущем его исправят. При желании, обойти это можно немного усложнив наш макрос. Для этого используем команду _change (ИЗМЕНИТЬ), и с ее помощью будем изменять слой последнего созданного объекта (это как раз наша выноска) на нужный. В примере целевой слой — это Примечание. Вот что получилось:

*^C^C_mleader;\\Ваш текст;_change;_l;;_p;_la;Примечание;;

Вне зависимости от того, какой слой выбран текущим, выноска сразу после создания будет перенесена в слой Примечание. Разберемся как это работает:

  • сначала создается выноска (она создается в текущем слое)
  • вызываем команду Изменить _change;
  • команда запрашивает объекты для изменения, мы указываем ключ _l; (от слова last — «последний») — будет выбран последний созданный объект и завершаем запрос выбора еще одной точкой с запятой ;
  • дальше мы указываем, что хотим работать со свойствами объекта - ключ _p; (от слова properties — «свойства»)
  • изменить нужно слой - ключ _la; (от layer — «слой»)
  • указываем имя нужного слоя и подтверждаем его Примечание; (для корректной работы макроса, указанный слой должен существовать в вашем чертеже)
  • ставим еще одну точку с запятой, чтобы завершить работу команды ;

Русский вариант я писать не буду. Если хотите, попробуйте сделать это самостоятельно. Запустите команду Изменить и внимательно отвечайте на запросы, записывая в блокноте нужные ключи команд и ответы — так пишется любой макрос.

Единственное, что у меня так и не получилось сделать, это поместить в такой макрос двухстрочный текст для выноски. Если у вас такое получится, дайте знать, как вы этого добились? Управляющие коды \p или \n (которые работают в Мтексте) здесь просто прерывают макрос. Для себя я подобную задачу решил через LISP. 

[Текст вперед - штриховки назад]

Здесь речь пойдет о порядке прорисовки. Возможно, у вас случались ситуации, когда штриховка вдруг «перепрыгивала» на передний план, а текст, выноска или размер вдруг «проваливались» под нее, оказываясь на заднем плане. Иногда порядок прорисовки слетает временно, и чтобы все пришло в норму, достаточно просто сделать регенерацию. Если же это не помогает, можно изменить порядок прорисовки руками — выделить объект(ы) и затем отправить его(их) на передний или задний план через контекстное меню:

AutoCAD порядок прорисовки

Обычно этот способ применяют для одиночных объектов — например, если нужно перенести на передний план Маскировку.

Но если объектов сотни, то вручную оправлять все штриховки на задний план, а тексты на передний — дело хлопотное. Более опытные пользователи используют для этой цели Быстрый выбор, но есть более удобный способ: разработчики позаботились о нас и добавили 2 специальные команды! Итак, встречайте:

_TEXTTOFRONT (ТЕКСТПЕРПЛАН) — команда позволяет перенести на передний план объекты определенного типа (тексты, размеры или выноски), либо вообще все текстовые объекты, о чем выводится соответствующий запрос:

Команда Текстперплан _texttoftont

Обратите внимание, что опция <вСе> расположена в треугольных скобках — это значит, что она является значением по умолчанию. Поэтому в макросе ключ с нам не пригодится, мы просто добавим еще одну ; (ввод) после вызова команды. Получится _texttofront;;

_HATCHTOBACK (русского аналога я не нашел) — команда переносит все штриховки в документе на задний план. Опций у данной команды нет.

Из этих команд можно «состряпать» замечательный макрос:

^C^C_hatchtoback;_texttofront;;_regenall

Обычно я запускаю его по завершении работы над проектом. Регенерация в конце добавлена на всякий случай. В командной строке выводится отчет о работе макроса (если он вам не нужен, добавьте в начало макроса ключ ^Q):

Отчет о работе макроса

Напомню, что порядок прорисовки никак не связан со списком слоев — слои автоматически сортируются в алфавитном порядке.

[Горизонтальная и вертикальная прямая]

Ну и под конец, совсем простенький макрос для быстрого рисования прямых — горизонтальной и вертикальной. Команда _xline (ПРЯМАЯ) обычно запрашивает первую точку, после чего проводит через эту точку бесконечную прямую, которая будет вращаться до тех пор, пока не указана вторая точка. Кнопка вызова данной команды находится здесь:

AutoCAD команда прямая

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

^C^C_xline;_h;
^C^C_xline;_v;

Макрос с ключом _h запускает отрисовку горизонтальной прямой, а макрос с ключом _v — вертикальной. Русский вариант макроса будет таким:

^C^Cпрямая;г;
^C^Cпрямая;в;

Кстати, вот так выглядит моя основная рабочая палитра:

AutoCAD. Инструментальная палитра

На ней размещены макросы, динамические блоки и кнопки запуска LISP-приложений. Все «авторские» иконки — это .png изображения размером 64×64 пикселя (их можно нарисовать в Paint или в Фотошопе).


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

P.S. Как обычно, распространение ссылки на данный материал очень приветствуется. Буду очень рад вашим комментариям!

Комментарии приветствуются! Уже 7 :)

  1. Юрий:

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

    • Михаил Царев:

      Удобнее и быстрее Пробел, а не Enter — в Enter еще попасть надо, а Пробел большой и тоже повторяет команду.

      В таком случае, лучше делать через LISP с определением новой команды. Например, так:

      (defun c:pua ()

      (repeat 3

      (command «_purge» «_a» «*» «_n»)

      ) ;_ end of repeat

      (command «_audit» «_y»)

      ) ;_ end of defun

      Только кавычки в коде другие должны быть, при вставке кода сюда они почему-то заменяются на неправильные. Должны быть такие ", а с треугольными работать не будет. Если будете пробовать этот код — замените.

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

  2. Василий:

    Добрый день. Никак не могу сообразить как объединить 2 макроса, копировать и повернуть сразу.

    Пробовал так:

    *^C^C_copy;;_l;_rotate;

    Но видимо я что тто не так делаю. Может быть подскажете в чем я ошибся?

    • Михаил Царев:

      Для объединения делать особо ничего не нужно — просто последовательно пишете команды. Но у Вас тут просто как-то не правильно почти все :)))

      Всегда проговаривайте все шаги, которые происходят во время выполнения команды, так будет проще.

      Выбрали объекты, вызвали команду «Копирование». Но дальше-то ей нужны — 1) базовая точка 2) конечная точка копирования, а у Вас там два ввода (считай просто Enter нажали 2 раза)... А должно быть два пользовательских ввода \\.

      Тут все уже пошло не так, но для понимания разберем, что дальше. Ключ _l нельзя использовать сам по себе, только внутри команды. Получается сначала _rotate, потом _l; потом еще одна ; т.к. выбор идет в цикле, пока не закончишь. Но, кстати, _l — это только последний созданный объект, только один, я не знаю, подходит ли это Вам... Если объектов несколько, работать будет неправильно.

      Дальше нужна базовая точка поворота и угол поворота. Соотв. либо \\, либо можно сделать ось вращения финальной точкой копирования — мы же ее уже указали ранее, соотв. можно вписать @0,0; (собака — это для указания относительных координат от последней введенной точки).

      В итоге имеем:

      1) Вариант где все вводит пользователь:

      ^C^C_copy;\\_rotate;_l;;\\

      2) Вариант, где вращение использует ту же точку, что мы указали в копировании, а угол поворота — 90 градусов:

      ^C^C_copy;\\_rotate;_l;;@0,0;90;

      Эти макросы в цикле работать не будут, т.к. предполагается, что пользователь сначала выбрал объекты для копирования, а потом вызвал макрос. Чтобы работало в цикле у меня сделать не получилось. Да и этот макрос работает только с 1 объектом. Теоретически, можно прописать, что из выбранных объектов создается блок, после копирования он разрушается, а затем еще база файла подчищается от этого блока, но довольно муторно выйдет — целая история выходит. И это будет происходить каждый раз при запуске файла.

      • Василий:

        Спасибо Вам огромное. 1 вариант это как раз то что я искал. Точнее хотел сделать)))

  3. Влад:

    Я что-то не понял логику последовательности, не получается написать макрос для отзеркаливания.

    Хочу, чтобы после выбора объектов и запроса оси отражения автоматически подтверждалось удаление исходных объектов.

    ^C^C_mirror;/Д;

    или

    ^C^C_mirror;///Д;

    не срабатывают, всё равно идёт запрос опции Да/Нет.

    В чём моя ошибка?

    • Михаил Царев:

      На всякий случай продублирую ответ еще и здесь:

      Вас подвела невнимательность — косая черта не в ту сторону, ну и количество косых черт неверное. Дело в том, что для указания оси отражения программа выдает два запроса — «первая точка», а затем «вторая точка».

      Правильная версия макроса:

      ^C^C_mirror;\\д;

      Работать будет при условии, что сначала выбрали объекты, а затем запустили макрос.