Переопределение команд в AutoCAD
Известно, что в AutoCAD можно не только создать свои функции и команды, но и переопределить штатные. А также прописать дополнительные шаги, предпринимаемые при выполнении команды.
Кое-что об этом и хотелось бы рассказать.
Рассмотрим все варианты на примере команды LINE (ОТРЕЗОК).
Если посмотреть на файл адаптации AutoCAD, то мы увидим, что на кнопке рисования отрезка "висит" макрос
1 | ^C^C_line; |
Подробности макроязыка я расписывать не буду - Владимир Свет в свое время выпустил прекрасную книгу "Autocad. Язык макрокоманд и создание кнопок" (по ссылке доступна бесплатная электронная версия). Важно сейчас другое: перед английским именем команды LINE следует символ подчеркивания. Зачем - понятно, я расписывал это в статье "Локализация и команды".
Теперь переопределим команду LINE так, чтобы она рисовала, к примеру, окружность. Ну вот так "пошутим".
1 2 3 4 | 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:
1 2 3 | (defun c:line () (command "_.circle") ) ;_ end of defun |
Теперь при выполнении line, или _line будет рисоваться окружность. Понятно, что можно внутрь кода засунуть безумное количество действий, но сам принцип это не изменит.
А вот если выполнить _.line, то строиться будет именно отрезок. Обратите внимание на символ точки (.) внутри вызова: именно он сообщает AutoCAD'у, что надо использовать "непереопределенную" команду.
В русском AutoCAD ситуация будет иной:
1 2 3 4 5 6 7 8 9 | Команда: _.UNDEFINE Имя команды: line Неизвестная команда. Команда: _.UNDEFINE Имя команды: отрезок Команда: отрезок Неизвестная команда "ОТРЕЗОК". Для вызова справки нажмите F1. Команда: _line Неизвестная команда "LINE". Для вызова справки нажмите F1. |
Создаем определение команды line в русском AutoCAD:
1 2 3 | (defun c:line () (command "_.circle") ) ;_ end of defun |
И проверяем: команда _line действительно строит нормальную окружность, как мы и ожидали. А вот в ответ на русскую ОТРЕЗОК AutoCAD выдает:
Неизвестная команда "ОТРЕЗОК". Для вызова справки нажмите F1.
Значит, надо заодно еще и команду ОТРЕЗОК определить:
1 2 3 | (defun c:отрезок () (command "_line") ) ;_ end of defun |
Этот код срабатывает, если предварительно будет загружено определение новой команды line. Смотрите внимательно: здесь уже точки в вызове команды нет.
Мы переопределили команду. А можно ли ее обратно вернуть?
Конечно, можно!
1 2 | Command: _redefine Enter command name: line |
В русском AutoCAD:
1 2 | Команда: _.REDEFINE Имя команды: отрезок |
Все, теперь вызов _line, отрезок или _.line приведет к одному и тому же - рисованию отрезка.
Легкость переопределения, а также тот факт, что в подавляющем большинстве случаев вызываются команды именно без точки, и определила в свое время такое дикое распространение "вирусов" под AutoCAD.
Так что, если не хотите наступить на такие "грабли", вызывайте английскую команду с точкой.
Про командные реакторы как-нибудь в другой раз
2
3
4
5
6
7
8
9
10
11
12
13
14
"_.Dim1"
"_VERT"
c2
c0
(mapcar '+ c1 (list (* temp 2) 0))
""
"_HOR"
c3
c1
(mapcar '- c0 (list 0 (* temp 2)))
""
"Exit"
)
Есть такой код. В старых версиях работал. При переходе на 2014 начал писать ошибки.
Неизвестная команда _HOR
Неизвестная команда Exit
Изменил Exit на .Exit , а вместо _HOR использовал _DIMHORIZONTAL
после этого перестал ругаться.
Пытался переопределить _HOR на _DIMHORIZONTAL как написано в статье, но ничего не вышло
пишет неизвестная команда.((
Если посмотреть на команду _.dim1, то видно, что _hor, равно как и _exit - всего лишь опции команды. Так что менять надо exit не на
, а на
Попробовал _exit не прошло.
А какая команда переопределяется? И хотелось бы посмотреть на полный код.
Автокад 2014 русская версия. пока демо. попросили скрипты подправить.
также было _Dim заменил на _Dim1 т.к. писало команда не может быть выполнена прозрачно
А команда-то какая переопределяется? Версия, локализация и все остальное - на данный момент побоку.
извиняюсь пропустил точки _.Dim на _.Dim1
Честно говоря я не знаток лиспа. Попросили на заводе из конструкторского отдела после перехода на новую версию перестали отрабатывать некоторые команды. Вот методом тыка и чтения форумов. вроде все заработало, но во внутренности я не вникал. Исправлял те ошибки что возникали по ходу.
ИМХО есть несколько вариантов: либо на профессиональные форумы (adn-cis.org, dwg.ru), либо искать программиста и ставить ему задачу. Я сильно подозреваю, что проблема совсем в другом месте (или вообще в алгоритме).
Хорошо. Спасибо за участие. Будем разбираться.