Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
METHOD / Основы САПР / AutoLISP2006.doc
Скачиваний:
85
Добавлен:
05.03.2016
Размер:
1.04 Mб
Скачать

14. Определение функции

Следует отметить, что любая программа на Автолиспе является функцией определён-ной пользователем функцией. Служебное слово DEFUN (DEfine FUNction - определить функцию) определяет функцию посредством создания структурированного списка операторов программы. Определенная таким образом функция создает свою собственную замкнутую область переменных.

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

Пример задания функции.

С помощью текстового в файл exp.lsp (расширение .lsp - обязательно) запишем текст программы из одной функции - explane (в файле может быть и несколько функций.)

(defun explane ()

(setq p1 (getpoint “\Enter first point”))

(setq p2 (getpoint “\Enter second point”))

(command “line” p1 p2 “”)

)

После создания или редактирования текста программы необходимо выполнить ее инициализацию, для чего с командной строке вводим: (load “имя файла содержащего Lisp программу без расширения .lsp”) и нажимаем кл. ENTER. Например: (load “exp”). При успешной инициализации функции, в командной строке появиться имя функции - explane (если в файле несколько функций то имя последней). Если в тексте программы допущена ошибка то инициализация будет прервана с сообщением в командной строке - *Cancel*.

Для выполнения программы в командной строке набираем: (explane) и нажимаем кл. ENTER. Далее последует запрос ввода первой (Enter first point) и второй (Enter second point) точек по которым будет построен отрезок прямой.

С командной строки можно просмотреть значение всех глобальных переменных - например: !р1. Если мы хотим объявить действующие переменные как локальные (в этом случае команда ! к ним не применима) то их необхо-димо записать в скобках после имени функции.

Например: (defun explane (/ p1 p2)

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

Внимание! Все что записано в строке программного файла после символа ; (точка с запятой) является комментариями и компилятором языка AutoLisp не обрабатывается. Например в текстовом файле exp1.lsp записаны функции:

(defun explane1 (/ p1 p2 p3 p4)

(setq p1 (getpoint “\Enter first point line1”))

(setq p2 (getpoint “\Enter second point line1”))

(setq p3 (getpoint “\Enter first point line2”))

(setq p4 (getpoint “\Enter second point line2”))

(setq c_p (inters p1 p2 p3 p4)) ; с_р - точка пересечения двух отрезков,

) ; глобальная переменная

(defun explane2 (/ p1 p2)

(setq p1 (getpoint “\Enter first point line_R”))

(setq p2 (getpoint “\Enter second point line_R”))

(setq r (distance p1 p2)) ; r - радиус окружности

(command “circle” c_p r)

)

(defun explane_all ()

(explane1)

(explane2)

)

Инициализируем функции - (load “exp1”) - в командной строке остается имя последней по тексту проинициализированной функции explane_all. Выполнение функции (explane_all), будет проходить в следующей последовательности.

Функция explane1 задается с локальными переменными р1..р4 и глобальной с_р, определяющей точку пересечения отрезков прямых. Функция explape2 задается с локальными переменными р1..р4, далее определяется радиус r, как расстояние между двумя точками и строится окружность с центром точке с_р.

Можно передавать значение переменным функции через параметры. Например:

(defun fun (n m)

(setq c_p nil row nil col nil)

(setq c_p (getpoint"Enter center point\n")) ; точка центра окружности

(setq row (getdist"Enter dictance between row\n")) ; расстояние между рядами

(setq col (getdist"Enter distance between column\n")) ;расстояние между кол-ми

(command "circle" c_p 10)

(command "array" pause "" "r" n m row col)

)

В этом примере функция fun содержит формальные параметры n и m, которые при ее выполнении необходимо заменить фактическим. Можно проверить функцию fun с командной строки вызвав ее с фактическими параметрами, например: (fun 3 2). После ввода точки центра окружности (с_р), расстояний между рядами (row) и колонками (col), функция fun построит прямоугольный (“r”) массив окружностей (32), радиуса 10 если при приостановки (pause) выполнения команды ARRAY, указать эту окружность в ответ на запрос “Select object”.

Следует обратить внимание что в первой строке программы одна функция setq присваивает значение nil нескольким переменным (хотя такая форма записи затрудняет “чтение” программы при редактировании) с целью исключить случайные величины аргументов функций. Необходимо учитывать также тот факт, что AutoLisp после отработки функции оставляет в памяти значения глобальных переменных, а функция setq в первой строке программы “уничтожает” их, делает их значения равными nil.

Определенные языком AutoLisp функции можно задавать как команды п. AutoCAD (без скобок). Для этого имя функции объявляется с С:.

Например: defun с:explane_all ()

Примеры программ даны в Приложении В.

Соседние файлы в папке Основы САПР