- •Утверждено
- •Программирование на языке AutoLisp
- •1. Переменные языка AutoLisp
- •1.1 Системные переменные пакета AutoCad
- •1.2 Переменные языка AutoLisp определенные пользователем
- •2. Типы данных языка AutoLisp
- •3. Функции присвоения
- •4.2 Работа со строками, функции преобразования, проверки типов данных.
- •4.3 Логические функции Автолиспа.
- •5. Работа со списками
- •6. Использование функции get для ввода данных.
- •7. Работа с геометрическими описаниями объектов
- •8. Условное ветвление программ
- •9. Организация циклов
- •10. Вызов команд Автокада из программы на языке AutoLisp
- •11. Управление отображением
- •12. Вывод данных в командную строку
- •13. Файловый ввод - вывод
- •14. Определение функции
- •15. Отладка программы.
- •16. Доступ к примитивам и средствам Автокада
- •Функции AutoLisp Математические функции
- •Логические функции Автолиспа.
- •Работа со списками
- •Использование функции get для ввода данных.
- •Работа с геометрическими описаниями объектов
- •Условное ветвление программ
- •Организация циклов
- •Вызов команд Автокада из программы на языке AutoLisp
- •Управление отображением
- •Вывод данных в командную строку
- •Файловый ввод - вывод
- •Доступ к примитивам и средствам Автокада
- •Insert (block)
- •Vertex (pline)
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 ()
Примеры программ даны в Приложении В.