ADN Open CIS
Сообщество программистов Autodesk в СНГ

30/05/2016

Регистрация lisp-функции как команды

Регистрация lisp-функции как команды

Существует несколько способов вызвать созданную lisp-функцию как обычную команду AutoCAD. Первый способ самый простой - определить команду кодом наподобие

Код - Auto/Visual LISP: [Выделить]
  1. (defun test-for-cmd1 (/ str int)
  2.   (setq str (getstring "\nВведите строку :" t)
  3.         int (getint "\nВведите целое число : ")
  4.         ) ;_ end of setq
  5.   (alert (strcat "Строка: \"" str "\"\n" "Число : " (itoa int)))
  6.   (princ)
  7.   ) ;_ end of defun
  8.  
  9. (defun c:cmd1 () (test-for-cmd1))
  10.  

Этот метод достаточно хорош своей простотой. А также тем, что если lisp-функция имеет какие-либо параметры, их можно задавать прямо в ее вызове. Но есть у него и минусы. В частности, не срабатывает попытка вызова конструкции типа

Дальше, если надо задавать имя команде как универсальное (то есть английское), так и локализованное, то придется создавать две команды. Также нельзя создать таким образом команду, которая будет работать в "прозрачном" режиме.

Если же у lisp-функции параметров нет, то можно использовать другой вариант:

Код - Auto/Visual LISP: [Выделить]
  1. (vl-load-com)
  2. (defun test (/ str int)
  3.   (setq int (getint "\nВведите целое число : ")
  4.         str (getstring "\nВведите строку :" t)
  5.         ) ;_ end of setq
  6.   (alert (strcat "Строка: \"" str "\"\n" "Число : " (itoa int)))
  7.   (princ)
  8.   ) ;_ end of defun
  9.  
  10. (vlax-add-cmd "testf" 'test)

Здесь приведен самый простой вариант использования vlax-add-cmd: приводится имя (глобальное, универсальное имя) команды, и имя вызываемой lisp-функции. Тем не менее можно добавить еще кое-что:

1. Локальное имя. Если оно не указано, используется глобальное. То есть можно создать одновременно две команды, например, ScheduleTable и СоздатьСпецификацию - и все это одной строкой.

2. Дополнительные флаги команды. Это целое число, принимающее значение суммы битов:

- ACRX_CMD_MODAL (0): команда не может быть вызвана, если активна какая-либо другая команда

- ACRX_CMD_TRANSPARENT (1): команда может быть вызвана в "прозрачном" режиме (по аналогии с командой '_pan)

Это были так называемые первичные флаги. Далее идут "второстепенные":

- ACRX_CMD_USEPICKSET (2): команда использует предварительно выбранные объекты. Такой набор очищается. При этом команда не сможет "подсветить" набор объектов (по аналогии с sssetfirst)

- ACRX_CMD_REDRAW (4): Предварительный набор не очищается. Команда может выполнять "подсветку" объектов.

Если никакие флаги принудительно не указаны, считается, что установлены ACRX_CMD_MODAL + ACRX_CMD_REDRAW

Если одновременно установлены флаги ACRX_CMD_USEPICKSET и ACRX_CMD_REDRAW, поведение созданной команды будет аналогичным тому, как если бы был установлен только флаг ACRX_CMD_REDRAW. За более полной информацией следует обратиться к документации ObjectARX.

Следует учитывать, что при использовании команды, определенной через vlax-add-cmd как прозрачная, запрещено использовать командные методы. Это может привести к краху AutoCAD. Ограничение, честно говоря, очень напоминает ограничение на использование команд в командных реакторах.

Еще одно ограничение vlax-add-cmd - то, что (мягко говоря) не стоит определять в них объекты реакторов или обработчики реакторов. Насколько я понял, не стоит этого делать для реакторов любого класса - командные, базы данных, объектные и т.п.

Команды, созданные разными методами, можно сделать "недоступными" для AutoCAD. В первом варианте используется конструкция вида Правда, при попытке вызова cmd1 Вы получите ошибку (что, в общем-то, предсказуемо). Во втором

В таком случае попытка вызова testf как команды приведет лишь к появлению в командной строке сообщения "Команда неопределена". Тоже ошибка, конечно, но уже не настолько критичная.

На основе материала Register Lisp defined function for use with 'command' function

Перевод и дополнения: Алексей Кулик

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 30.05.2016