Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400242.doc
Скачиваний:
10
Добавлен:
30.04.2022
Размер:
14.24 Mб
Скачать

4.4. Запись команд

Подпрограммы как атомы. AutoLISP имеет два вида объектов: атомы и списки. Каждый объект в AutoLISP - один или другой. Пустой список nil () - определяет и том и список, и единственый объект в AutoLISP который также может быть.

Атомы имеют большое количество различных типов данных. Один из этих типов данных - SUBR, или подпрограмма. Подпрограммы - имена для внутренних функции AutoLISP.

Функции, сначала в формах. Когда сложное выражение создается для оценки, оно состоит из списка с подпрограммой ( или внутренней функцией ) как первым элементом. Такое выражение также известно как форма.

Пример формы: ( setq x 10 )

Определяемые пользователем функции. Кроме большого количества подпрограмм, AutoLISP позволяет создвать определяее пользователем функции, т.е. функций чьи системы команд и имена определились пользователем.

Рассмотрим процесс оценки типичной формы которая использует под-программу. ( setq x 10 )

AutoLISP оценивает первый элемент, где он ожидает найти функцию. Здесь он находит подпрограмму SETQ, и отыскивает связывание SETQ. Связывание SETQ (фактически, связывание любой подпрограммы) - набор команд по которому должна проходить обработка. Затем, AutoLISP оценивает параметры к SETQ по порядку, и в заключение применяет связывание SETQ ( обработку команд ) со значением параметров.

Результат в этом случае - значение 10 для выражения, и побочный эффект - переменная X связывается с 10.

SETQ - подпрограмма, и ее команды были предопределены в AutoLISP; пользователь не может изменять их. Однако, можно создавать полностью новые функции которые выполняют любые команды обработки по желанию пользователя.

Новые функциональные связывания создаются используя подпрограмму DEFUN, имя которой расшифровывается как DEfine FUNction.

Как использовать DEFUN.

Синтаксис DEFUN является несколько отличным от других функций которые вы использовали в этом руководстве, но результат тот же самый.

(Defun <имя функции > <список аргументов / список локальных переменных > <выражение> ... )

DEFUN берет два требуемых параметра, и переменное число парамет-

ров после первых двух.

Параметры к DEFUN. Первый требуемый параметр к DEFUN должен быть имя новой функции которую вы хотите определить. Никогда не используйте имя встроенной функции или символ как <имя функции>, так как это будет делать встроенную функцию недоступной. Используйте новое имя, предпочтительно то которое описывает действия функции. Использование в имени функции шести или меньше символов будет сохранять место в памяти ( больше про это в последующих уроках ).

В этом примере, первый аргумент DEFUN - слово MYFUN, который становится именем определяемой пользователем функции.

( Defun MYFUN <список аргументов / список локальных переменных >... )

Второй необходимый аргумент DEFUN должен быть список требуемых параметров и(или) локальных переменных. Этот аргумент будет обсуждаться подробно позже в этом уроке. Теперь, достаточно использовать пустой список, то-есть список без требуемых аргументов или локальных переменных.

Предыдущий пример расширим, чтобы включить список требуемых аргументов и (или) локальных переменных.

( Defun MYFUN() <выражение>... )

Параметры после списка требуемых параметров - выражения которые нужно оценить когда определяемая пользователем функция выполняется. Они - команды обработки которые будут выполняться когда функция вызывается.

Пример простого определения функции. В следующих нескольких примерах выражения будут добавляться к телу MYFUN. Различные наборы выражений будут давать различное значение MYFUN.

В этом примере, команды MYFUN сообщают чтобы были запрошены у пользователя две точки, и затем было отображено расстояние между этими двумя точками. Используется подпрограмма AutoLISP DISTANCE.

DISTANCE берет две точки как параметры, и вычисляет 3-D расстояние между ним.

(defun MYFUN ()

(setq pt1 (getpoint "\nFrom point: "))

(setq pt2 (getpoint pt1 "\nTo point: "))

(distance pt1 pt2)

)

Наберите этот пример. AutoLISP будет возвращать имя функции которая была определена; в этом случае, MYFUN. Вызовите MYFUN как Вы бы вызвали любую подпрограмму.

Command: (MYFUN)

From point: <pick>

To point: <pick>

<возвратить расстояние как вещественное число >

Значения возвращенные определяемыми пользователем функциями. Любая функция, созданная DEFUN будет возвращать значение когда она вызывается, точно также как любая подпрограмма возвращает значение. Значение возвращенное определяемой пользователем функцией будет значение последнего выражения в теле выражений которые включают команды обработки.

Например, в предыдущем примере значение выражения (myfun) будет значение выражения ( distance pt1 pt2 ).

(Myfun) < ----- форма вызывающая определяемую пользователем функцию

(defun MYFUN ()

(setq pt1 (getpoint "\nFrom point: "))

(setq pt2 (getpoint pt1 "\nTo point: "))

(distance pt1 pt2 ) < ----- значение последнего выражения

) становится значением формы

Сохранение определенных функций на диске. Хотя можно создавать определяемые пользователем функции набирая соответствующий коде в командной строке, вероятно что лучшая идея - использовать текстовый редактор по вашему выбору и записать этот текст в новый файл с расширением .LSP; Затем загрузите файл в AutoCAD функцией AutoLISP LOAD.

Функция LOAD берет в качестве аргумента строку, которая должна содержать имя .LSP файла для загрузки.

(load "<имя файла>" )

Не забудьте что команда Load AutoCAD - совершенно другая вещь от функции LOAD AutoLISP.

Например, если Вы добавляете код предыдущего примера в файл MYFUN.LSP, тогда Вы можете загружать файл в AutoCAD следующим образом:

Используйте текстовый редактор чтобы создать текстовый файл названный MYFUN.LSP и включить код который создает эту определяемую пользователем функцию. Затем загрузите файл в AutoCAD.

Command: (load "MYFUN")

MYFUN

AutoLISP будет искать этот файл в текущем каталоге, и в других каталогах определенных в пути к библиотекам AutoCAD. Если это файл будет найден, он будет загружен в редактор.

Если AutoLISP генерирует сообщение об ошибке при загрузке файла, Вы должны отредактировать файл и устранить проблему.

Вызов команды AutoCAD ИЗ AUTOLISP. Очень популярная подпрограмма AutoLISP для определяемых пользователем функций может создавать сокращенные имена для команд AutoCAD, и объединять две или больше команд ( или команду и опции ) в одиночную команду.

Функция COMMAND вызывает команды AutoCAD непосредственно из AutoLISP. COMMAND берет строковый аргумент который должен быть именем команды AutoCAD и любых ее параметров, которые должны быть переданы в командную строку AutoCAD.

Например, эта форма вызывает команду Line и чертит линию от 1,1 до 5,5. Форма возвращает нуль, потому что функция COMMAND всегда возвращает нуль. Вообще, побочный эффект формы COMMAND еще более интересен чем значение.

Command: (command "LINE" "1,1" "5,5" "")

nil

Нулевой параметр строки в конце списка параметров обрабатывается как возврат каретки командой Line ( или любой командой ). Кроме строковых аргументов для опций к командам, COMMAND будет принимать вещественные или целые числа в соответствующих местах, наряду с списками двух или трех вещественных чисел как точек. COMMAND также принимает переменные с соответствующими значениями. Ниже другой способ начертания линии от 1,1 до 5,5.

(command "LINE" (quote (1.0 1.0)) (quote (5.0 5.0)) "")

В примере ниже, три формы используются чтобы начертить круг с центральной точкой, выбранной пользователем и радиусом в 1.5.

Первые две формы используются чтобы собрать и сохранить данные, а последняя - чтобы вызвать команду Circle и использовать предварительно сохраненные переменные как параметры к функции COMMAND.

Command: (setq pt1 (getpoint "\nCenter: "))

Center: <pick>

Command: (setq rad (getdist pt1 "\nRadius: "))

Radius: <pick>

Command: (command "CIRCLE" pt1 rad)

nil

Определение новых команд. Создадим простую и полезную функцию, которая бы объединяла команду Zoom с опцией Window. В этом примере, специальное ключевое слово AutoLISP pause используется как аргумент для функции COMMAND. pause останавливает оценку выражения и позволяет пользователю ответить на текущее приглашение в командной строке. Наберите этот код в новом текстовом файле, назвав его ZW.LSP, а затем загрузите файл в AutoCAD.

( Defun ZW()

(command "ZOOM" "Window" pause pause)

)

Command: (load "ZW")

ZW

Command: (zw)

First corner: <pick>

Other corner: <pick>

nil

Недостаток этой функции - некоторое неудобство при вызове ее как формы, т. е. надо набрать ее имя в круглых скобках и вызывать ее как функцию AutoLISP. Это требование означает дополнительный набор на клавиатуре конечным пользователем, и потребность помнить, какие команды заключены в круглые скобки и какие нет. AutoLISP позволяет создавать определяемые пользователем функции, которые могут вызываться из командной строки без того, чтобы передавать их как формы, то-есть без того, чтобы включать имя функции в круглые скобки. Перед именем функции должен быть префикс C:, как иллюстрируется ниже. Добавьте этот код к новому текстовому файлу назвав его ZW.LSP. Загрузите файл.

(defun C:ZW ()

(command "ZOOM" "Window" pause pause)

)

Command: (load "zw")

C:ZW

Command: ZW

or

Command: (C:ZW)

Ниже пример новой команды AutoCAD названной CD. CD чертит окружности по центральной точке и диаметру. Добавьте этот код к новому текстовому файлу названному CD.LSP. Загрузите файл.

(defun C:CD ()

(command "CIRCLE" pause "Diameter" pause)

)

Command: (load "cd")

C:CD

Command: CD

or

Command: (C:CD)

Подавление значения возвращенного определяемой пользователем командой. Значение последнего выражения в теле выражений после списка требуемых параметров и локальных переменных в функциональном определении всегда возвращается как значение функции. В большинстве случаев, лучше не разрешать AutoLISP выводить это значение на дисплей после того, как функция завершается. Подпрограмма AutoLISP PRIN1 будет выводить пустую строку на дисплей если PRIN1 - последнее выражение в определении функции. Например, эта модифицированная версия команды CD не печатает "nil" в командной строке после завершения выполнения.

(defun C:CD ()

(command "CIRCLE" pause "Diameter" pause)

(prin1)

)

Требуемые аргументы к функции. Некоторые функции не берут никаких аргументов; некоторые требуют одного или больше, или переменное число аргументов. Функция SETQ, например, требует по крайней мере два параметра.

Параметры могут требоваться во время обращения к функции если они включены в ее определение. Значения параметров будут отображаться в выражениях после указания в списке требуемых параметров везде, где использовались переменные с теми же самыми именами как и определенные в списке требуемых параметров.

Рассмотрим функциональное определение, которое не требует Никаких параметров. Оно запрашивает у пользователя вещественное числа, обрабатывает его как десятичное число, и возвращает значение числа преобразованное в радианы.

(defun dtr ()

(setq degree (getreal "\nDegrees: "))

(/ (* degree pi) 180.0)

)

Эта функция должна вызываться с только одним объектом в форме - самой функцией.

Command: (dtr)

Degrees: 180

3.14159

Можно создать эквивалентное выражение, которое бы требовало численное значения как аргумент для формы, которая содержит функцию.

(defun dtr (degree)

(/ (* degree pi) 180.0)

)

В этом случае, функция должна вызываться с параметром.

Command: (dtr 180)

3.14159

Значение параметра 180 в предыдущей форме становится значением требуемого параметра для DEGREE и AutoLISP впоследствии будет использовать значение 180 где-нибудь в выражениях после списка требуемых параметров где используется переменная DEGREE.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]