Краткое описание возможностей языка программирования AutoLISP. Переменные: системные переменные AutoCAD; переменные AutoLISP; тип данных AutoLISP; выражения AutoLISP. Функции присвоения

 

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

- использовать переменные и выражения при ответах на запросы команд AutoCAD;

- создавать различные функции и новые команды AutoCAD, настраивая и расширяя, таким образом, графические возможности системы;

- осуществлять программный доступ (считывание и изменение) к данным, относящимся к объектам рисунка, а также таблицам AutoCAD, в которых хранится информация о блоках, слоях, видах, стилях и типах линий;

- осуществлять программное управление графическим экраном AutoCAD и вводом/выводом с различных устройств.

Программа, написанная на языке AutoLisp, представляет собой файл с расширением .LSP. Для создания файла и работы с ним применяется текстовой реактор Блокнот, который содержится в стандартной поставке системы Window. Для запуска текстового редактора необходимо обратиться к клавише Пуск системы Window (левый нижний угол экрана), затем выбрать пункт меню Программы „, далее пункт меню Стандартные „ и в появившемся меню найти программу Блокнот. При сохранении файла необходимо обязательно задать расширение файла (см. рисунок 6.1). При открытии уже имеющегося файла необходимо в графе Тип файла выбрать вариант Все файлы (*.*).

 

 

Рисунок 9.1. Диалоговое меню Сохранение текстового редактора Блокнот.

 

При работе с AutoCAD 2000 и выше удобнее писать программу используя Visual LISP Editor, который находится в главном меню Tools подменю AutoLISP. Внешний вид редактора показан на рисунке 6.2. Данный редактор удобен тем, что различные составляющие языка программирования выделяются цветом. Таким образом, удобно следить за пунктуацией и правильностью написания слов, что сокращает количество ошибок при написании программы.

 

Рисунок 6.2. Внешний вид Visual AutoLisp Editor.

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

Простые переменные - это переменные, которые не могут быть расчленены на составные части. Такие переменные называются Атомами. К атомам относятся:

- строковые переменные, т.е. совокупность букв и/или символов, заключенных в кавычки; кавычки говорят о том, что данную совокупность символов следует рассматривать как текстовую константу;

- целые переменные - это положительные или отрицательные целые числа (без дробей и десятичной точки);

- действительные переменные - это положительные или отрицательные числа с десятичной точкой;

- дескрипторы файла - переменные, в которых хранится описание открытого файла;

- символы - переменные, в которых хранятся не значения, а ссылки на другие переменные;

- встроенные функции - переменные, посредством которых осуществляется обращение к стандартной библиотеке функций AutoLisp;

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

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

 

(12.6 45.7 77.8)

("CAT" "MOUSE" "DOG")

(1 (12.6 6.78) ("Пример списка"))

(* 2 5)

(setq point '(1.0 5.0 6.7))

 

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

Каким же образом AutoLisp отличает управляющие конструкции (объект, который оперирует с данными) от самих данных? Любая управляющая конструкция содержит объекты специального типа - функции. Функции могут быть встроенными или определенными пользователем. Встроенная функция AutoLisp - это тип данных, являющийся ссылкой на некую подпрограмму, которая выполняет над передаваемыми параметрами какие-то действия. Функция, определенная пользователем, - это обычный список, который все равно содержит встроенные функции. Для того чтобы AutoLispу было проще искать среди элементов списка функции, их принято писать на первом месте.

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

Любая программа на AutoLisp состоит из выражений, и сама является выражением. Основные свойства выражений следующие:

- Каждая открывающая круглая скобка должна иметь закрывающую.

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

- Следующие за именем функции аргументы функции отделены от имени функции и друг от друга, по крайней мере, одним пробелом.

- Каждое выражение вычисляется (выполняется), и результат возвращается. Результатом может быть нуль (nil) или результат вычисления последнего подвыражения.

Выражение AutoLisp имеет следующий вид:

 

(функция аргумент1 аргумент2 . . . аргументN),

 

где функция – имя операции, которая должна быть выполнена (к операциям относятся, в том числе и арифметические операции, а также операции присвоения); аргументы – средство передачи значений функции (могут быть переменные, константы или выражения), количество аргументов может быть больше двух.

Аргумент может быть обязательным и необязательным. Если при создании функции было определено, что ее аргументы являются обязательными, то AutoLisp выдаст ошибку при попытке вызвать функцию без указания этого аргумента. Однако аргументы могут быть и необязательными, в этом случае их при вызове функции можно не передавать. Следует также внимательно следить за типом аргументов: если функция производит операции над целыми числами, то ей нельзя передать строку, или наоборот.

Все переменные AutoLisp – динамические, т.е., присваивая значение символу, вы автоматически создаете переменную. Перед созданием переменной AutoLisp автоматически определяет, какого она будет типа.

Само присвоение переменным значений осуществляется в AutoLisp не так, как в других языках программирования. Для присвоения переменным значений в AutoLisp имеется специальная функция SETQ, которая присваивает переменной нужное нам значение, т.е. заносит указанное нами значение в ячейку с именем переменной. Алгебраическая запись присвоения – Х = 3. В AutoLisp то же действие записывается как

(setq Х 3)

Это связано с тем, что AutoLisp – функциональный язык и в нем нет операторов, а есть функции, производящие определенные действия над своими переменными. Функция SETQ является мнемоническим сокращением английского словосочетания “Set by Quote” – «присвоить по ссылке».

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

Как уже говорилось выше, любая программа на AutoLisp является просто определенной пользователем функцией. Для определения функции (задания имени создаваемой команде) используется функция DEFUN, что является сокращением от английского DEfine FUNction – определить функцию. Данный оператор определяет функцию посредством создания структурированного списка операторов программы. Определенная таким образом функция создает свою собственную замкнутую область локальных переменных. При вызове функции в эту замкнутую область передаются данные, выполняются операторы программы, после чего осуществляется передача данных обратно в среду AutoCAD – AutoLisp.

Формат функции DEFUN следующий:

 

(defun C:имя (аргументы / локальные переменные)

тело функции (программа)

)

 

Имя команды, создаваемой в AutoLisp не должно совпадать с именем команды AutoCAD (в противном случае команда AutoCAD будет заменена на новую команду и к ней нельзя будет обратиться) и может состоять из любых печатных символов (в том числе и цифр), однако не должно включать в себя следующие символы:   . ` “ ; ( ) пробел - * = > < + / ? ‘ ! \  .

При запуске графического редактора AutoCAD загружается файл acad.lsp (если он существует). В этот файл можно внести определения наиболее часто используемых функций, и они будут загружаться автоматически при вызове графического редактора.

 

5.2 Математические функции AutoLISP. Работа со строками; функции преобразования; проверка типов данных. Логические функции AutoLISPa. Использование функций GET для ввода данных. Ввод данных в командную строку.

 

Математические функции AutoLisp. Аргументами математических функций являются числа, которые могут быть как целыми, так и вещественными. Если все аргументы - целые числа, то результат операции также будет целым числом, а любая дробная часть будет опущена. Если хотя бы один аргумент – вещественное число, то результат операции будет вещественным числом. При записи в программе математических формул удобно разбить большую формулу на несколько маленьких. Например, при записи уравнения для нахождения X можно выделить некоторый параметр Z = L2 + R12, а затем Z1 = Z – R2 и т.д. Это позволит записывать в программе функции с меньшим количеством вложенных функций, что сократит количество открытых и закрытых скобок в одной строке. К математическим функциям относятся:

(+ число1 число2 . . . )

Возвращает сумму всех аргументов.

(- число1 число2 . . . )

Вычитает число 2 из числа 1 и возвращает разность. Если задано более двух аргументов, то из первого аргумента вычитается сумма всех остальных. Если задан один аргумент, то он вычитается из нуля (меняет знак).

(* число1 число2 . . . )

Возвращается произведение всех чисел.

(/ число1 число2 . . . )

Делит число1 на число2 и возвращает частное. Если задано более двух аргументов, то первое число делится на произведение всех остальных.

(1+ число)

Увеличение целого или действительного числа на единицу.

(1- число)

Уменьшение целого или действительного числа на единицу.

( atan число1 [число2])

Если не задано число 2, то возвращает арктангенс переменной число1 в радианах, область допустимых значений – [pi, -pi] радиан. Если заданы оба числа, то возвращается арктангенс переменной число1/число2 в радианах.

( abs число)

Вычисление абсолютного значения действительного или целого числа.

( cos число)

Возвращает значение косинуса угла, заданного аргументом в радианах.

( exp степень)

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

( expt основание степень)

Вычисляет значение экспоненциальной функции с указанным основанием и степенью.

 ( log число)

Возвращает натуральный логарифм аргумента.

( gcd число1 число2 . . . )

Возвращает наибольший общий делитель указанных аргументов.

( min число1 число2 . . . )

Возвращает наименьший аргумент. Не изменяет типов чисел.

( max число1 число2 . . . )

Возвращает наибольший аргумент. Не изменяет типов чисел.

( sin число)

Возвращает значение синуса угла, заданного аргументом в радианах.

( sqrt число)

Извлекает квадратный корень из аргумента. Возвращаемый результат всегда вещественный.

Для ввода данных всех основных типов используется семейство сходных между собой функций GET …. Все аргументы функций этого семейства необязательны. В качестве первого аргумента иногда выступает необязательная двумерная точка в текущей пользовательской системе координат (ПСК). Все функции GET могут иметь в качестве аргумента произвольную строковую константу, в которой может содержаться текст запроса или какая-то подсказка, выводимая при запросе пользователю ввести какие-то данные. Все функции GET ожидают ответа пользователя, т.е. приостанавливают выполнение программы до тех пор, пока не будет осуществлен ввод (нажата клавиша  ENTER ). Ввод может быть осуществлен как с клавиатуры, так и при помощи устройства указания «мышь». При написании секции ввода данных необходимо представлять имеющиеся возможности и выбирать максимально понятный и схожий с интерфейсом AutoCAD способ указания. Желательно везде, где это допустимо, предоставлять возможность пользователю выбрать способ указания. Кроме того, следует стремиться к тому, чтобы подсказки были понятны человеку, который не знаком с программой. Для того чтобы каждая подсказка программы выводилась в командной строке AutoCAD на отдельной строке, необходимо перед текстом подсказки написать следующее сочетание символов - \n. Чтобы программа оставляла у пользователя приятное впечатление, хорошо так же начинать запрос с заглавной буквы и заканчивать его двоеточием и пробелом.

Наиболее часто используемые функции семейства GET:

( getangle точка «текст запроса-подсказки»)

Возвращает угол в радианах между задаваемым пользователем вектором и положительным направлением оси Х в текущей плоскости построений. Функция всегда возвращает угол в радианах вне зависимости от текущей установки переменных. Начальная точка вектора может быть определена первым аргументом функции. Вторую точку вектора можно указать на экране «мышью», при этом AutoCAD нарисует «резиновую» линию от точки, указанной первым аргументом, до текущего положения курсора. Если первый аргумент опущен, AutoCAD потребует ввода двух точек.

( getdist точка «текст запроса-подсказки»)

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

( getint «текст запроса-подсказки»)

Ввод целого числа. Ввод может быть осуществлен только с клавиатуры.

( getpoint точка «текст запроса-подсказки»)

Позволяет ввести точку. Если первый аргумент присутствует, AutoCAD рисует «резиновую» линию от точки, определяемой первым аргументом.

( getreal «текст запроса-подсказки»)

Позволяет вводить действительное число. Ввод может быть осуществлен только с клавиатуры.

Для того чтобы использовать далее команды отрисовки AutoCAD необходимо определить геометрическое положение точек, по которым будет производиться построение. Точка, так же как расстояние и угол, относится к геометрическому описанию объекта. При работе с геометрическим описанием объектов все используемые углы измеряются в радианах. В AutoLisp угол равный p записывается как pi. Соответственно углы равные различным частям p, например p/2 или 3p/4, записываются при помощи математических функций AutoLisp.

Функции для работы с геометрическим описанием объектов:

( osnap точка режим)

Возвращает точку, которая является результатом применения объектной привязки, задаваемой в строке режим для указанной точки. Режим – строковая константа, состоящая из одного или более идентификаторов объектной привязки, как, например, “MIDpoint”, “CENter” и т.д., разделенных запятыми.

( polar точка угол расстояние)

Возвращает точку в пользовательской системе координат, находящуюся под заданным углом и расстоянием от заданной точки, угол измеряется в радианах в направлении против часовой стрелки от оси Х.

( angle точка1 точка2)

Возвращает угол (в радианах) вектора, определяемого точками 1 и 2. Угол измеряется против часовой стрелки.

( distance точка1 точка2)

Эта функция возвращает расстояние между двумя точками.

Последним шагом является отрисовка. Отрисовка детали будет осуществляться при помощи команд AutoCAD. Для обращения к командам используется функция AutoLisp COMMAND. Формат данной функции следующий:

 

(command аргумент1 аргумент2 . . . )

 

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

На использование этой функции налагаются некоторые ограничения:

- функции семейства GET … не могут быть вложены в функцию COMMAND, поэтому следует присваивать все необходимые значения переменным заранее;

- с помощью функции COMMAND нельзя работать с такими командами AutoCAD, как DTEXT(ДТЕКСТ), SKETCH (ЭСКИЗ), PLOT (ПЕЧАТАЙ);

- нельзя использовать восклицательный знак для указания команде AutoCAD значения переменной.

Если в качестве аргумента команды указывается слово pause, то функция COMMAND приостановит свое действие, чтобы пользователь непосредственно ввел значение (или произвел отслеживание). В этот момент можно выполнить прозрачную команду (например, ZOOM (ПОКАЖИ), PAN (ПАН) и др.), после чего выполнение функции возобновиться.

Если в качестве ответа на подсказку команды AutoCAD необходимо нажать клавишу ENTER, то аргумент будет записан в виде двух кавычек, не разделенных пробелом: “”.

В AutoCAD любое обращение к команде прочитывается из меню и система "проигрывает" за пользователя нажатие соответствующих клавиш. Например, при обращении к команде PLINE, система "проигрывает" нажатие клавиш  P ,  L ,  I ,  N ,  E  и  Enter , вызывая соответствующую команду. Поэтому перед тем как начать записывать функцию COMMAND, попробуйте воспроизвести все действия, которые необходимо осуществить при обращении к команде, работая только с клавиатурой. Фиксируйте на бумаге все нажимаемые клавиши, ничего не опуская "по умолчанию". Точки, необходимые для отрисовки можно указывать при помощи "мыши" на экране, но при этом на бумаге запишите имя точки, которое ей присвоено в секции определения точек отрисовки. Затем, глядя только на свои записи, попытайтесь воспроизвести последовательность еще раз. Только в том случае, если вы записали все правильно, переходите к следующему шагу - записи функции COMMAND в AutoLisp.

В качестве примера рассмотрим команду отрисовки многоугольника POLYGON. При выполнении данной команды в AutoCAD в командной строке произойдет следующий диалог:

Command: POLYGON

Polygon Number of sides: 3

Edge /< Center of polygon >: C (точка центра - указывается на экране)

Inscribed in circle/Circumscribed about circle (I/C): I

Radius of circle : Величина радиуса            (в программе D1/2)

Обращаясь к данной команде в AutoLisp необходимо все ответы записать в качестве аргументов функции COMMAND. Все ответы, которые являются комбинацией букв, набранных с клавиатуры (название команды, обращение к опции команды и т.д.) записываются в кавычках. Если буква или сочетание букв или цифр являются параметром, который был определен (присвоен) в программе, то они записываются без кавычек. В результате получим следующую строчку:

(command "POLYGON" 3 C "I" (/ D1 2))

Если команда AutoCAD требует выбрать объекты, например, для редактирования, то удобнее использовать функцию SSGET. Данная функция позволяет выбрать объекты, используя различные методы AutoCAD: '(X Y) - выбрать объект, проходящий через точку с координатами X,Y; "L" - выбрать последний отрисованный объект; "W" '(X1 Y1) '(X2 Y2) - выбрать объекты окном, которое задано двумя точками; "C" '(X1 Y1) '(X2 Y2) - выбрать объекты секущим окном, которое задано двумя точками; "P" - выбрать предыдущий набор объектов; "A" - выбрать все объекты, имеющиеся на чертеже.

 

Написание программы на AutoLISPе: этапы создания программы; постановка задачи; выбор средств AutoCADа. Структура программы: секция ввода данных; секция вычисления промежуточных и вспомогательных параметров; секция отрисовки детали.

 

Любая программа на AutoLisp имеет три самостоятельных этапа:

- ввод технологических параметров пользователем;

- числовые и геометрические расчеты, в процессе которых определяются значения вспомогательных переменных;

- работа с графической базой данных чертежа либо напрямую (редактирование объектов), либо через систему команд AutoCAD (отрисовка и редактирование объектов).

Конечно, не в любой программе возможно жесткое разделение этих этапов: возможно, что одни технологические параметры объекта определяются на основе других. И все же, по крайней мере, логически, такое деление оправданно, поскольку позволяет четко спланировать программу.

Первым и самым ответственным этапом написания программы является постановка задачи и написание алгоритма ее решения. Взявшись за создание своей собственной команды, прежде всего, следует:

- выделить технологические параметры (то, что должен задавать конструктор при работе с командой);

- определить технологию отрисовки (редактирования, работы с изображением) объекта;

- выделить геометрические и числовые параметры, нужные для реализации отрисовки объекта выбранным способом.

Технологические параметры детали перечислены в задании. Как лучше всего отрисовать данную деталь? Ясно, что способов отрисовки такой детали может быть несколько. Сразу бросаются в глаза, по крайней мере, два варианта. Можно отрисовать внешний контур детали отрезками и дугами, а можно единой полилинией. В нашем конкретном случае ясно, что отрисовка внешнего контура детали отрезками и дугами не является оптимальной. Во-первых, для этого потребуется больше вспомогательных точек, во-вторых, при этом мы не можем назначить толщину основной линии и, в-третьих, отрисованный объект не является одним примитивом (что неудобно при использовании многих команд редактирования). Кроме того, при отрисовке внешнего контура детали полилинией мы обращаемся всего лишь к одной команде AutoCAD, в то время как при отрисовке отрезками и дугами – к шести. В более сложных случаях выбор средств отрисовки часто бывает не так очевиден, однако при их выборе следует стремиться к следующему:

- количество вспомогательных точек и параметров должно быть минимальным (это облегчит расчеты);

- количество используемых команд AutoCAD должно быть минимально (это уменьшит вероятность ошибки и увеличит быстродействие программы);

- примитивы должны быть максимально «укрупненными» (т.е. там, где можно использовать полилинию, блок или сеть, следует использовать именно их: расчленить проще, чем объединить).

 

Дата: 2019-04-22, просмотров: 3.