Регистрация lisp-функции как команды
Регистрация lisp-функции как команды
Существует несколько способов вызвать созданную lisp-функцию как обычную команду AutoCAD. Первый способ самый простой - определить команду кодом наподобие
- (defun test-for-cmd1 (/ str int)
- (setq str (getstring "\nВведите строку :" t)
- int (getint "\nВведите целое число : ")
- ) ;_ end of setq
- (alert (strcat "Строка: \"" str "\"\n" "Число : " (itoa int)))
- (princ)
- ) ;_ end of defun
- (defun c:cmd1 () (test-for-cmd1))
Этот метод достаточно хорош своей простотой. А также тем, что если lisp-функция имеет какие-либо параметры, их можно задавать прямо в ее вызове. Но есть у него и минусы. В частности, не срабатывает попытка вызова конструкции типа
- (command "c:cmd1")
Дальше, если надо задавать имя команде как универсальное (то есть английское), так и локализованное, то придется создавать две команды. Также нельзя создать таким образом команду, которая будет работать в "прозрачном" режиме.
Если же у lisp-функции параметров нет, то можно использовать другой вариант:
- (vl-load-com)
- (defun test (/ str int)
- (setq int (getint "\nВведите целое число : ")
- str (getstring "\nВведите строку :" t)
- ) ;_ end of setq
- (alert (strcat "Строка: \"" str "\"\n" "Число : " (itoa int)))
- (princ)
- ) ;_ end of defun
- (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. В первом варианте используется конструкция вида- (setq c:cmd1 nil)
- (vlax-remove-cmd "testf")
В таком случае попытка вызова testf как команды приведет лишь к появлению в командной строке сообщения "Команда неопределена". Тоже ошибка, конечно, но уже не настолько критичная.
На основе материала Register Lisp defined function for use with 'command' function
Перевод и дополнения: Алексей Кулик
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 30.05.2016