Переопределение команд в 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.

Так что, если не хотите наступить на такие "грабли", вызывайте английскую команду с точкой.

Про командные реакторы как-нибудь в другой раз :)



Комментарии

Есть 12 коммент. к “Переопределение команд в AutoCAD”
  1. Alex пишет:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     (command
      "_.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 как написано в статье, но ничего не вышло
    пишет неизвестная команда.((

  2. Кулик Алексей aka kpblc пишет:

    Если посмотреть на команду _.dim1, то видно, что _hor, равно как и _exit - всего лишь опции команды. Так что менять надо exit не на

    1
    .exit

    , а на

    1
    _exit
  3. Alex пишет:

    Попробовал _exit не прошло.

  4. Кулик Алексей aka kpblc пишет:

    А какая команда переопределяется? И хотелось бы посмотреть на полный код.

  5. Alex пишет:

    Автокад 2014 русская версия. пока демо. попросили скрипты подправить.

  6. Alex пишет:

    также было _Dim заменил на _Dim1 т.к. писало команда не может быть выполнена прозрачно

  7. Кулик Алексей aka kpblc пишет:

    А команда-то какая переопределяется? Версия, локализация и все остальное - на данный момент побоку.

  8. Alex пишет:

    извиняюсь пропустил точки _.Dim на _.Dim1

  9. Alex пишет:

    Честно говоря я не знаток лиспа. Попросили на заводе из конструкторского отдела после перехода на новую версию перестали отрабатывать некоторые команды. Вот методом тыка и чтения форумов. вроде все заработало, но во внутренности я не вникал. Исправлял те ошибки что возникали по ходу.

  10. Кулик Алексей aka kpblc пишет:

    ИМХО есть несколько вариантов: либо на профессиональные форумы (adn-cis.org, dwg.ru), либо искать программиста и ставить ему задачу. Я сильно подозреваю, что проблема совсем в другом месте (или вообще в алгоритме).

  11. Alex пишет:

    Хорошо. Спасибо за участие. Будем разбираться.

Трэкбэки

Узнайте, что другие говорят про эту заметку...
  1. […] Про командные реакторы как-нибудь в другой раз :) Saved from: http://autolisp.ru/2014/06/27/command-redefine/#more-2295 […]



Поделитесь своим мнением


Я не робот.