Автор: Кулик Алексей aka kpblc | Дата: 27 Июнь 2014

Известно, что в AutoCAD можно не только создать свои функции и команды, но и переопределить штатные. А также прописать дополнительные шаги, предпринимаемые при выполнении команды.

Кое-что об этом и хотелось бы рассказать.

Рассмотрим все варианты на примере команды LINE (ОТРЕЗОК).

Если посмотреть на файл адаптации AutoCAD, то мы увидим, что на кнопке рисования отрезка “висит” макрос

Код:

^C^C_line;

Подробности макроязыка я расписывать не буду – Владимир Свет в свое время выпустил прекрасную книгу “Autocad. Язык макрокоманд и создание кнопок” (по ссылке доступна бесплатная электронная версия). Важно сейчас другое: перед английским именем команды LINE следует символ подчеркивания. Зачем – понятно, я расписывал это в статье “Локализация и команды”.

Теперь переопределим команду LINE так, чтобы она рисовала, к примеру, окружность. Ну вот так “пошутим”.

Код:

Command: UNDEFINE
Enter command name: line
Command: line Unknown command “LINE”. Press F1 for help.
Command: _line Unknown command “LINE”. Press F1 for help.

Теперь создадим определение собственной команды line:

Код:

(defun c:line ()
(command “_.circle”)
) ;_ end of defun

Теперь при выполнении line, или _line будет рисоваться окружность. Понятно, что можно внутрь кода засунуть безумное количество действий, но сам принцип это не изменит.
А вот если выполнить _.line, то строиться будет именно отрезок. Обратите внимание на символ точки (.) внутри вызова: именно он сообщает AutoCAD’у, что надо использовать “непереопределенную” команду.

В русском AutoCAD ситуация будет иной:

Код:

Команда: _.UNDEFINE
Имя команды: line
Неизвестная команда.
Команда: _.UNDEFINE
Имя команды: отрезок
Команда: отрезок
Неизвестная команда “ОТРЕЗОК”. Для вызова справки нажмите F1.
Команда: _line
Неизвестная команда “LINE”. Для вызова справки нажмите F1.

Создаем определение команды line в русском AutoCAD:

Код:

(defun c:line ()
(command “_.circle”)
) ;_ end of defun

И проверяем: команда _line действительно строит нормальную окружность, как мы и ожидали. А вот в ответ на русскую ОТРЕЗОК AutoCAD выдает:

Неизвестная команда “ОТРЕЗОК”. Для вызова справки нажмите F1.

Значит, надо заодно еще и команду ОТРЕЗОК определить:

Код:

(defun c:отрезок ()
(command “_line”)
) ;_ end of defun

Этот код срабатывает, если предварительно будет загружено определение новой команды line. Смотрите внимательно: здесь уже точки в вызове команды нет.

Мы переопределили команду. А можно ли ее обратно вернуть?

Конечно, можно!

Код:

Command: _redefine
Enter command name: line

В русском AutoCAD:

Код:

Команда: _.REDEFINE
Имя команды: отрезок

Все, теперь вызов _line, отрезок или _.line приведет к одному и тому же – рисованию отрезка.

Легкость переопределения, а также тот факт, что в подавляющем большинстве случаев вызываются команды именно без точки, и определила в свое время такое дикое распространение “вирусов” под AutoCAD.

Так что, если не хотите наступить на такие “грабли”, вызывайте английскую команду с точкой.
Saved from: http://autolisp.ru/2014/06/27/command-redefine/#more-2295

Advertisements