Читаем Введение в Автолисп онлайн бесплатно


Введение в Автолисп

Излагаются основы Автолиспа - языка программирования графических объектов, служащего основным языком программирования в среде AutoCAD. Рассматриваются вопросы, связанные с синтаксисом языка, типами используемых данных, математическими вычислениями, описанием графических объектов и их наборов, работой с базой данных чертежа и внешними файлами. Для студентов, изучающих основы автоматизированного конструирования и проектирования на базе пакетов AutoCAD. Пособие может быть полезно проектировщикам, делающим первые шаги в области программирования графических изображений.

Роман Клавдиевич Рыжиков

Компьютеры и Интернет / Программирование, программы, базы данных
<p>P.K. Рыжиков</p><p>Введение в Автолисп</p><p>ПРЕДИСЛОВИЕ</p>

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

В то же время использование блоков для импортирования в чертеж, например, изображений стандартных болтов требует создания в качестве отдельного блока чертежа каждого типоразмера болта, что влечет за собой разрастание графической базы данных до неприемлемых размеров и усложняет технику ее использования. Поэтому конструкторская практика послужила поводом для разработки пакетов приложений, позволяющих, с одной стороны, выполнять некоторые типовые расчеты, с другой - осуществлять автоматический перенос результатов расчета в чертеж. Такие пакеты могут как встраиваться в Автокад (например, AutoCAD Мар), так и опираться на собственную графическую среду (например, программный продукт КОМПАС, разработанный АО ACKOH).

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

Основной средой программирования в Автокаде служит функциональный язык Автолисп (AutoLISP), в основу которого положен язык программирования LISP, разработанный в 1961 году. Возможности программной поддержки Автокада чрезвычайно широки как в части автоматизации процесса создания чертежа, так и в части управления интерфейсом среды.

В настоящем пособии рассматриваются вопросы, связанные лишь с первой задачей, что же касается управления интерфейсом, то с описанием этих методов можно подробно ознакомиться, привлекая соответствующую литературу [1, 3, 5].

Описание языка основывается на Автолиспе, сопровождающем тринадцатую и более поздние версии Автокада. Развитие языка происходило главным образом за счет расширения его возможностей. В 14-й версии заметно обновлена идеология графической среды, особенно в части описания полилиний, что позволило существенно уменьшить размер графических файлов. Кроме того создана интегрированная среда Visual LISP, обладающая собственным развитым интерфейсом и многими функциональными компонентами, позволяющими производить создание и отладку программ без обращения непосредственно к Автокаду. Описание среды Visual LISP в пособие не включено, так как ему посвящена вышедшая из печати специальная книга [1].

Предлагаемое читателю пособие основано на цикле лекций и практических занятий по курсу “Основы автоматизированного конструирования” и иллюстрировано некоторыми программами (или извлечениями из них), используемыми в учебном процессе. На эти иллюстрации наложила отпечаток последовательность изучения материала, в связи с чем на некоторых этапах создания программ избраны не лучшие их варианты (например, это касается программы, где впервые используются операции обработки наборов), однако далее в программы вносятся рациональные изменения.

Разумеется, в кратком пособии трудно описать все возможности Автолиспа и даже возможности отдельных функций (в частности, это касается функций создания и обработки примитивов). Поэтому во многих случаях автор ограничивается лишь описанием формата функций Автолиспа и примерами, заимствованными из других источников. Главными такими источниками (например [5]) являются тома сопроводительной документации к пакетам лицензионных версий Автокада.

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

<p>1. ОБЩИЕ СВЕДЕНИЯ</p>

Современный Автолисп является мощным функциональным языком, позволяющим работать с глубоко структурированными программными объектами. В отличие от операторных языков программирования, таких как Фортран, Паскаль и т.п., основой Автолиспа являются не операторы, а встроенные или внешние функции.

Автолисп хорошо взаимодействует с базами числовых и графических данных. В качестве числовых баз данных могут использоваться продукты многих СУБД (например, dBASE), таблицы, файлы результатов, полученные в результате выполнения других программ. Последнее обстоятельство очень важно, поскольку позволяет связать с Автолиспом любые операторные программы, достаточно лишь создать выходные файлы этих программ в формате, поддающемся чтению средствами Автолиспа. Что касается графических баз данных, то, рассматривая чертеж как такую базу, пользователь может извлекать из нее отдельные примитивы и их наборы и осуществлять над ними программным путем любые операции, доступные Автолиспу. Кроме того, возможно создание программ, которые, руководствуясь введенными параметрами, способны вычерчивать сколь угодно сложные графические объекты. Несколько подобных программ (разумеется, достаточно простых) описаны в настоящем пособии.

С целью облегчения ориентирования в тексте пособия служебные слова, выполняющие различные функции, выделяются разными шрифтами. В табл. 1 приведены гарнитуры шрифтов, используемые в дальнейшем для выделения отдельных элементов программ. Эти гарнитуры используются только в тексте пособия, полные тексты программ на Автолиспе и отдельные извлечения из них, используемые в качестве примеров, выполняются гарнитурой Arial.

Если Автолисп подключен к Автокаду, любая функция Автолиспа, введенная в командную строку, обрабатывается, а результат обработки возвращается в поле сообщений. Это очень удобно как при отладке программ, так и при проверке правильности записи функций. Если во время сеанса активизирована программа, написанная с ошибками, Автолисп прекращает ее обработку, сообщает об ошибке и производит обратную трассировку программы, указывая то место, где она совершена.

Tаблица 1. Гарнитуры шрифтов, используемые в пособии

ГарнитураОбласть использованияПримеры
Times New Roman CyrИмена примитивовArc, Line, Donut
To же, полужирныйКоманды Автокадаsave, copy, line
To же, курсивИмена файлов, сообщения командной строкиc:\acad\bolt.lsp From point:_
ArialТексты программ, имена переменныхsetq pt (1 2)) bolt, file1
To же, полужирныйИмена функций Автолиспаsetq, getdist
Arial полужирный курсивАргументы функцийstring [mode]
<p>1.1. Типы данных в Автолиспе</p>

Автолисп может оперировать следующими типами данных:

• Идентификаторы (Symbols) или переменные (Variables)

• Целые числа (Integers)

• Вещественные числа (Real numbers)

• Строки (Strings)

• Списки (Lists)

• Дескрипторы файлов (File descriptors)

• Имена примитивов Автокада (AutoCAD entity names)

• Наборы примитивов Автокада (AutoCAD selection sets)

• Встроенные (Subrs) и внешние (External Subrs) функции

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

В качестве примера приводится установка переменной pt1, рассматриваемой как точка в поле чертежа:

(setq pt1 ‘(1 2)).

Здесь встроенная функция присвоения setq устанавливает имя переменной pt1 и идентифицирует ее с точкой, имеющей координаты х=1, у=2.

Три переменные Автолиспа определены заранее, и их значения не рекомендуется изменять. К ним относятся:

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

pi - переменная определена как константа π, оцениваемая приблизительно в 3.1415926;

T - переменная определена как константа T и имеет тот смысл, что ее значение - не nil.

Целые числа. Автолисп обменивается с Автокадом целыми числами, не превышающими 16 бит. Таким образом, могут быть введены целые числа в интервале от -32768 до +32767.

Вещественные числа. К вещественным относятся числа, содержащие символ десятичной точки. Числа, лежащие в интервале -1...+1 должны обязательно сопровождаться предваряющим нулем. Вещественные числа, не имеющие десятичных долей, должны содержать ноль после десятичной точки. Вследствие этого правильным является представление 0.245 и 34.0, а записи .245 и 34. не всегда будут приняты Автолиспом. Точность вычислений Автолиспа - 14 значащих цифр, хотя в поле командной строки выводится не более 6 знаков.

Строки. Любая последовательность символов, заключенная в кавычки, рассматривается Автолиспом как строковая переменная. Длина одной строки не должна превышать 132 символов, однако использование функции strcat позволяет объединить несколько строк в одну.

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

(3.62 4.12 2.85).

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

Дескрипторы файлов являются строковыми метками, присваиваемыми файлам, открываемым Автолиспом. В следующем примере открывается файл mycalc.res, он становится доступным для чтения функциями Автолиспа, и значение дескриптора файла присваивается переменной file1:

(setq file1 (open “mycalc.res” “r”)).

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

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

В следующем примере имени примитива, введенного в чертеж последним, присваивается идентификатор e1:

(setq e1 (entlast)).

Ввод этого выражения в командную строку возвращает имя примитива в следующей форме:

.

Наборы (группы) примитивов. Средства Автолиспа позволяют аналогично идентифицировать группу примитивов для дальнейшей обработки их программными средствами Выбранной группе присваивается метка. В приводимом ниже примере идентификатор ss2 присваивается группе примитивов, определенных предпоследним выбором:

(setq ss2 (ssget “р”)).

Встроенные и внешние функции - это функции, посредством которых осуществляется обработка данных. Встроенные функции являются средствами самого Автолиспа, внешние представляют собой программы, определенные приложениями.

<p>1.2. Лексические соглашения</p>

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

• Имена переменных могут содержать любые символы, за исключением (, ) - левой и правой скобок, . - точки, ' - апострофа, “ - кавычек, ; - точки с запятой.

• Следующие символы заканчивают имя переменной или цифровую константу: (, ), ‘, ; , space (cимвoл пpoбeлa), end of file (символ конца файла).

• Выражение может занимать несколько строк.

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

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

• Целочисленные константы могут начинаться со знаков плюс или минус. Автолисп оперирует 32-битовыми числами, т.е. ему доступны целые числа от -2 147 483 648 до +2 147 483 647. Однако, как упоминалось выше, обмен с Автокадом возможен лишь на 16-битовом уровне.

• Вещественные константы также могут начинаться со знаков плюс или минус и должны обязательно содержать цифры, предшествующие десятичной точке и следующие за ней. Вещественные константы могут записываться в экспоненциальной форме. Например, записи 0.00032 и З.2е-4 являются идентичными.

• Текст программ может содержать строки комментариев, предваряемых точкой с запятой (;), например:

     ; переход в слой CENTER.

• Если комментарий включается в строку программы, он должен выделяться символами ;|....|; .

     (setq omode ;| здесь начинается комментарий,

     здесь он продолжается,

     здесь заканчивается |; (getvar “osmode”))

Похожие книги