Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРОГРАММНЫЕ СРЕДСТВА САПР.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.15 Mб
Скачать

Функции работы со списками в языке AutoLisp

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

(LIST <элемент> ...) – функция формирует список из любого числа элементов (атомов или списков) и возвращает список.

(CONS <элемент> <список>) – функция добавляет <элемент> (атом или список) в качестве первого элемента к уже существующему списку и возвращает обновленный список.

(APPEND <список>...) – функция соединяет несколько списков в один общий список.

(REVERSE <список>) – функция возвращает список с элементами, расставленными в обратном порядке.

Пример

(SETQ A '(1.0 2.0))

(SETQ В '(С D Е))

(SETQ F (LIST А В)) создает в F список ((1.0 2.0)(С D Е)).

Выделение элементов списков

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

(CAR <список>) – функция возвращает первый элемент списка. Если список пуст, то возвращается NIL.

(CDR <список>) – функция возвращает новый список, отличающийся отсутствием первого элемента. Если список пуст, возвращается NIL. Если <список> представлен как точечная пара, то CDR возвращает второй элемент как атом, а не как список.

В AutoLISPе определены функции, обеспечивающие последовательное выполнение CAR и (или) CDR вплоть до четырех уровней вложенности: CAAR, CADR, CDDR, CADAR и т.д.

Пример

(CAAR X) эквивалентно записи (CAR (CAR X));

(CDAR X) эквивалентно записи (CDR (CAR X));

(CADAR X) эквивалентно записи (CAR (CDR (CAR X))) и т.п.

Функции типа CAR и CDR часто используются для выделения координат точек.

(LAST <список>) – функция возвращает последний элемент <списка>, который может быть атомом либо списком.

(MEMBER <элемент> <список>) – функция просматривает <список> и ищет в нем заданный <элемент>. Если <элемент> найден, то возвращается список от <элемента> до конца исходного <списка>. Иначе возвращается NIL.

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

(ASSOC <элемент> <список>) – функция обеспечивает "ассоциативный поиск" в структурированном списке, т.е. в списке, элементы которого сами являются списками. Эти списки построены по схеме:

(< ключевой элемент > < значение > ...)

Поиск проводится по совпадению <элемента>, заданного в функции ASSOC, с <ключевым элементом> в <списке>, заданного в ASSOC. Если поиск удался, то возвращается найденный список, иначе – NIL. Таким образом, осуществляется поиск данных по ключу в сложной структуре данных.

Пример

(SETQ DETAL '((КОД 123456) (КОДМ 001234) (М 1.45)));

(ASSOC 'КОДМ DETAL) возвращает (КОДМ 001234).

(SUBST <новый элемент> <старый элемент> <список>) – функция SUBST дополняет функцию ASSOC, позволяя заменять элементы в списке. Производится просмотр списка, и каждый найденный <старый элемент> заменяется на <новый элемент>. Возвращается обновленный список.

Формирование, анализ и редактирование наборов примитивов

Программы на AutoLISPе могут работать с графическими объектами. К таким объектам относятся:

  • примитивы ACAD, имеющиеся на экране в процессе работы программы;

  • совокупности примитивов, называемые в AutoLISPе наборами.

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

В языке AutoLISP существуют следующие функции для формирования и анализа наборов примитивов.

(SSGET [<режим>] [<точка1> [<точка2>]]) – функция возвращает внутрипрограммное имя выбранного примитива или совокупности примитивов, которое может быть записано в переменную AutoLISPа с помощью SETQ. Если аргумент <режим> отсутствует, то создается набор, выбранный средствами графического редактора (указание на объекты, захват в рамку и т.п.). Возможны следующие значения режима: «Р» – выбирается текущий набор; «L» – выбирается последний сформированный на чертеже примитив; «W» < точка1 > <точка2> – выбираются примитивы, попавшие в рамку с углами в < точке1 > и <точке2>; «С» <точка1> <точка2> – выбираются примитивы, пересекаемые рамкой.

(SSGET <точка>) – выбираются примитивы, проходящие через <точку>.

(SSGET "х" <фильтр>). Здесь <фильтр> это список, элементами которого являются одна или несколько точечных пар. Каждая точечная пара строится по следующей форме: (< код >.< значение >). Здесь <код> одно из принятых в AutoLISPе чисел, показывающих, по какому признаку выбираются примитивы:

  • 0 – примитивы одного типа;

  • 2 – примитивы, входящие в один блок (INSERT);

  • 6 – по типу линии;

  • 7 – по гарнитуре шрифта;

  • 8 – по имени слоя;

  • 62 – по цвету и др.

Например, (SSGET "X" '((8 . "SL1"))) вернет набор, включающий все примитивы, находящиеся на слое, именованном как "SL1";

Выполнение последовательности функций:

(SETQ sdel (SSGET "X" '((6 . "CENTER"))))

(COMMAND "ERASE" sdel)

приведет к стиранию всех примитивов, изображенных осевыми линиями.

(SSLENGTH <набор>) – функция возвращает целую величину, представляющую число примитивов в наборе.

(SSNAME <набор> <номер>)функция возвращает внутрипрог-раммное имя примитива, идущего под соответствующим номером в <наборе>. Первый по порядку примитив имеет номер 0.

(SSMEMB <примитив> <набор>)функция проверяет, входит ли <примитив> в <набор>. Если <примитив> входит в <набор>, то возвращается имя примитива, если не входит, то результат равен NIL.

(SSADD [<примитив> [<набор>]])функция без аргументов создает новый пустой набор. SSADD с аргументом <примитив> создает новый набор, содержащий только указанный примитив. Если указаны оба аргумента, то функция добавляет указанный примитив в набор. Если этот примитив в наборе уже имеется, то ничего не изменится. Функция возвращает имя набора.

(SSDEL <примитив> <набор>) функция удаляет <примитив> из <набора>, если он там присутствовал. В противном случае ничего не меняется. Возвращается имя набора.

(ENTNEXT [<примитив>]) – функция возвращает внутрипрограммное имя примитива или субпримитива. Если <примитив> не указан, то возвращается первый из примитивов чертежа. Если указан простой примитив, то ENTNEXT возвращает примитив, следующий за указанным. Если указан составной примитив, то ENTNEXT возвращает первый субпримитив указанного примитива.

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

(ENTSEL [<подсказка>]) – функция создает паузу и может вывести текст <подсказки>. Пользователь в ответ должен указать примитив на экране. Функция возвращает результат в виде списка из двух элементов: внутрипрограммное имя примитива и точку, в которой было проведено указание. Точка возвращается в виде списка координат.

(ENTDEL <примитив>) – функции удаляет примитив из чертежа. Субпримитивы таким способом не удаляются.

(REDRAW <примитив>) – функция возобновляет изображение примитива после очистки экрана функцией GRCLEAR.

(ENTGET <примитив>)позволяет выбирать <примитив> из базы данных. Функция возвращает список, который состоит из параметров, определяющих этот примитив. Такой список состоит из двух частей. Первая часть включает в себя код DXF (флаг), а вторая − данные. Конкретные данные о примитиве могут быть извлечены из этого списка с помощью функции ASSOC. При необходимости эти данные могут быть изменены.

Ветвления и циклы в языке AutoLISP

В любом языке программирования есть средства для создания ветвлений и циклов в программах. Такие средства есть и в AutoLISPе.

Ветвления в программе организуются с помощью функции:

(IF <условие> <функция1> [<функция2>]).

Функция IF соответствует управляющей структуре псевдокода ЕСЛИ-ТО-ИНАЧЕ. Здесь <условие> – это такое выражение языка AutoLISP, которое среди прочих значений может в какой-то ситуации получить значение NIL. Функция IF вычисляет значение условия и, если оно не NIL, то выполняет <функцию1>, иначе выполняет <функцию2>, если она присутствует. Функция IF возвращает результат выполнения функции.

Для записи условий используются следующие логические функции: =(равно), <(меньше), >(больше), /=(не равно), <=(меньше или равно), >=(больше или равно), которые позволяют выполнять сравнение чисел или текстов. Также используются функции AND, OR, NOT, обеспечивающие возможность строить сложные условия на основе простых.

Все эти функции могут возвращать одно из двух значений: NIL ("нет", условие не выполняется) или Т ("да", условие выполняется).

Примеры

Пусть имеются следующие значения: А=5, С=NIL.

Тогда

( = А 5) возвращает Т;

(NOT С) возвращает Т;

(OR (= A 5) (= A 1O)) возвращает T.

Цикл в AutoLISPе организуется с помощью функции:

(WHILE <условие> < выражение >...).

Функция WHILE соответствует структуре псевдокода ПОКА-ЦИКЛ. Здесь <условие> – это выражение, которое в некоторых ситуациях может принимать значение NIL. Функция WHILE вычисляет значение условия и, если оно не NIL, вычисляет выражения, затем снова условие и т.д. Это продолжается, пока условие не станет равно NIL. Затем WHILE возвращает последнее значение последнего выражения.

Задание к лабораторной работе

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