ЭТАПЫ ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ



2.1. Изучите функции для ввода и вывода данных через внешние файлы.

2.2. Изучите программу 8.

2.3. Сформируйте произвольный текстовый файл.

2.4. Разработайте ЛИСП-программу чтения текста из файла и размещения его внутри изображения.

2.5. В среде AutoCAD проведите отладку своей программы.

2.6. Распечатайте полученные данные и программу.

ПЛАН ОТЧЕТА

1. Титульный лист.

2. Цель работы.

3. Задание.

4. Описание программы.

5. Полученные распечатки.

ЛАБОРАТОРНАЯ РАБОТА 8

ПРОГРАММИРОВАНИЕ ПАРАМЕТРИЗОВАННЫХ ИЗОБРАЖЕНИЙ

Цель работы: освоение принципов программирования параметризованных изображений в ЛИСП-программах.

 

ТЕОРЕТИЧЕСКИЙ МАТЕРИАЛ

1.1. Специфика языка AutoLISP как части системы AutoCAD

Помимо возможностей AutoLISP, свойственных и другим языкам программирования, а также возможностей по обработке списков, двойственных версиям языка ЛИСП, в AutoLISP имеются и специфические возможности, связанные с тем, что программа на AutoLISP работает в среде, созданной системой AutoCAD. Эта среда характеризуется:

определенными параметрами (системными переменными AutoCAD);

определенной организацией экрана (графического или текстового);

наличием изображения (чертежа), построенного на графическом экране и состоящего из примитивов и блоков;

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

Программа на AutoLISP может воспринимать особенности этой среды и оказывать влияние на нее. [1, 2, 5, 6]

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

(OSNAP < точка > < режим >).

Предполагается, что на чертеже имеется объект, проходящий через заданную < точку >.

Аргумент < режим > ‒ это строка текста, характеризующая режим привязки точно так же, как для команды OSNAP. Например:

CEN” ‒ центр окружности или дуги;

BND” ‒ конечная точка отрезка, дуги;

INS” ‒ базовая точка блока и др.

Если точка, соответствующая заданному режиму, не найдена, то возвращается NIL. [1, 2, 5, 6]

 

1.2. Работа с системными переменными и символьными таблицами.

Функции GETVAR и SETVAR

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

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

(SETVAR < имя переменной > < значение переменной >).

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

Следует иметь в виду, что некоторые системные переменные определены только для «гения». Такие переменные нельзя переустановить.

Примеры:

Для функции (SETQ A (GETVAR “ANOBASE”)) возвращается и записывается в А действительное число, определяющее направление угла 0 в этом чертеже.

Для функции (SETVAR “CMDECHO” 0) задается значение 0 для переменной CMDECHO, что приведет к исчезновению «эха» выполняемых команд.

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

В ходе работы с редактором ACAD создаются также символьные таблицы LNTYPE, LAYER и другие, определяющие типы линий, слои, виды, блоки, гарнитуры шрифтов. Данные из этих таблиц могут быть прочитаны с помощью функций TBLNEXT,TBLSEARCH. [1, 2, 5, 6]

 

1.3. Формирование и анализ наборов примитивов. Функции типа SS

 

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

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

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

Графические объекты могут быть «введены в программу», т.е. возможно именование этих объектов с помощью имен переменных, так же как именование чисел, строк текстов, точек. После этого можно оперировать с этими объектами, обращаясь к ним по именам. В том числе можно анализировать и изменять характеристики этих объектов, что приводит к изменению изображения на экране. [1, 2, 5, 6]

Для лучшего представления о том, как происходит работа с примитивами и наборами, полезно понять следующее. При выделении каким-либо способом примитива или набора из базы данных AutoLISP формирует внутрипрограммное имя этого объекта (примитива или набора). На самом деле ‒ это не имя, а ссылка на объект, но для программиста это не имеет значения. Программист поступает следующим образом: он записывает это «имя» в какую-либо переменную с помощью SETQ. Затем эта переменная может быть использована для любого указания на объект. Например, она может быть подставлена в качестве аргумента в команду, требующую указания примитива или группы примитивов. Далее такая технология будет проиллюстрирована на примере.

Набор – это временное множество, в которое входят имена основных примитивов рисунка (они собираются по какому-то условию или признаку-фильтру). Неосновные примитивы (составные части блока или вершины полилинии) не могут входить в набор. Имя набора обычно сохраняется в какой-то переменной, чтобы затем можно было извлечь из набора нужные примитивы для анализа или операций редактирования. Наборы уничтожаются при закрытии рисунка. Количество одновременно открытых наборов в рисунке не должно превышать 128. Для того чтобы закрыть ненужный набор, переменной, в которой хранится имя этого набора, следует присвоить значение NIL. [5]

Основное средство определения наборов примитивов есть функция (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 . “SLI”)))

вернет набор, включающий все примитивы, находящиеся на слое, именованном как “SLI”;

(SSGET “X” ‘((0. “LINE”) (62 .1)))

вернет набор, состоящий из всех линий красного цвета (1 ‒ номер красного цвета).

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

( SETQ sdel ( SSGET “ X ” ‘((6 . “ CENTER ”))))

(COMMAND “ERASE” sdel)

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

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

Функция (SSLENGTH < набор >) возвращает целую величину, представляющую число примитивов в наборе. Таким образом, программа может «узнать», сколько объектов было выделено пользователем. По известному числу примитивов можно организовать цикл по обработке последовательно каждого примитива.

Здесь и далее < набор > ‒ это имя переменной набора, т.е. переменной, определенной ранее следующим образом:

(SETQ < набор > (SSGET...))

(SSNAME < набор > < номер >).

Функция SSNAME возвращает внутрипрограммное имя примитива из < набора >, идущего под соответствующим номером.

Здесь < номер > ‒ целая величина. Первый по порядку примитив имеет номер 0. Если < номер > меньше 0 или больше максимального номера примитива в наборе, то возвращается NIL. Таким образом, конструкция вида

(SETQ < переменная > (SSNAME < набор > <номер>))

позволяет выделить примитив из < набора >, записав его имя в < переменную >.

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

Здесь и далее < примитив > ‒ имя переменной, значение которой записано с помощью SETQ, например, путем применения функции SSNAME.

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

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

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

Пример работы с набором:

(SETQ SS (SSGET))

; Здесь образуется пауза, в ходе которой пользователь

; укажет несколько объектов на экране (примитивов).

; После нажатия <ENTER> программа определяет

; набор. Формируется внутрипрограммное имя

;этого набора, которое возвращается функцией SSGET в переменную SS

;Теперь в программе данный набор можно обозначить как SS.

(SETQ L (SSLENGTH SS))

;Определено количество примитивов в наборе SS и записано в L.

(SETQ SL (SSNAME SS (1-L)))

;Выделен последний примитив в наборе SS, его внутрипрограммное

;имя возвращено функцией SSNAME в переменную SL

(SETQ SN (SSADD SL))

;Создан новый набор, содержащий последний

;примитив из набора SS. Имя нового набора записано в переменную SN.

(SETQ SS (SSDEL SL SS))

;Из SS удален последний элемент. Получавшийся в результате набор будет ;также назван SS.

(COMMAND "ERASE" SS)

;Набор SS удаляется с экрана, т.е. стираются все примитивы, ранее ; помеченные пользователем, кроме последнего (SL).

1.4. Функции доступа к примитивам AutoCAD

Рисунок в системе AutoCAD имеет организацию, аналогичную организации базы данных, в которой элементы (графические примитивы и неграфические объекты) имеют списковую структуру. Каждый примитив обладает своим типом. Перечислим эти типы примитивов в алфавитном порядке: 3 DFACE , 3 DSOLID , ACAD _ PROXY _ ENTITY , ACAD _ TABLE , ARC , ARCALIGNEDTEXT , ARC _ DIMENSION , ATTDEF , ATTRIB , BODY , CIRCLE , DIMENSION , ELLIPSE , HATCH , IMAGE , INSERT , LARGE _ RADIAL _ DIMENSION , LEADER , LINE , LWPOLYLINE , MLINE , MTEXT , OLE 2 FRAME , POINT , POLYLINE , RAY , REGION , RTEXT , SEQEND , SHAPE , SOLID , SPLINE , TEXT , TOLERANCE , TRACE , VERTEX , VIEWPORT , WIPEOUT , XLINE .

Чаще всего наименование типа совпадает с английским именем команды системы AutoCAD, которая создает графический объект. [5]

Рассматриваемые далее функции работают с примитивами рисунка, обращаясь непосредственно к их внутренней структуре. AutoLISP имеет средства выбора графических объектов как по их порядковому номеру, так и по определенным признакам (цвету, слою, типу линии и т.п.). [5]

 

Выбор примитивов

Примитивы в ACAD могут быть простыми (линия, окружность, строки текста,...) или составными (полилинии, вставки блоков). Составные примитивы делятся на субпримитивы.

Например, для полилинии субпримитивами являются вершины, для вставки блоков ‒ атрибуты. С помощью функций типа SS, рассмотренных в п.1.3 данной лабораторной работы, могут быть получены либо наборы примитивов, либо примитивы (простые или составные), но не субпримитивы. Функции, рассматриваемые в данном параграфе, позволяют работать с примитивами и субпримитивами.

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

Приведем пример доступа к вершинам примитива типа POLYLINE с помощью функции ENTNEXT. [5]

Пример:

; Выбираем последний примитив

; в предположении, что им является POLYLINE

( SETQ EELA ( ENTLAST ))

( SETQ V 1 ( ENTNEXT EELA ))

; V 1 ‒ примитив VERTEX , являющийся первой вершиной POLYLINE

( SETQ V 2 ( ENTNEXT V 1))

; V 2 ‒ примитив VERTEX , являющийся второй вершиной POLYLINE

Функция (ENTLAST) возвращает внутрипрограммное имя последнего примитива на чертеже (неудаленного). Субпримитив с помощью EN T LAST не выделяется. Функция (ENTLAST) возвращает NIL, если в рисунке нет неудаленных примитивов (например, когда только что создан новый рисунок). [5] Иначе возвращается последний основной примитив в следующем виде: < Entity name : 7 ef 8 bf 68> (<Имя объекта: 7 ef 8 bf 68>). Фактически полученное имя примитива определяет адрес в базе данных рисунка, по которому начинается информация о примитиве. Полученное значение следует сохранить в переменной для дальнейшего использования, например:

( SETQ EELA ( ENTLAST )) . [5]

Функция (ENTSEL [ < подсказка > ]) создает паузу и может вывести текст < подсказки >. Пользователь в ответ должен указать примитив на экране.

Функция возвращает результат в виде списка из двух элементов:

первый элемент ‒ внутрипрограммное имя примитива;

второй элемент ‒ точка, в которой было проведено указание, эта точка возвращается в виде списка координат.

Возвращаемый результат может быть «записан в переменную» с помощью SETQ. Эта переменная впоследствии может быть задана в ответ на любую команду ACAD (в функции COMMAND), требующую выбрать объект и учитывающую точку указания. Кроме того, результат, записанный в данную переменную, может быть «разложен .на составные части»: (CAR < переменная >) возвращает имя примитива, (CADR < переменная >) вернет точку указания. Например, функция ( SETQ ES 1 ( ENTSEL “Выберите объект: “)) возвращает < Entity name : 7 ef 66 fa 0> (475.13 248.759 0.0)) [1, 2, 5, 6].


Дата добавления: 2019-09-13; просмотров: 231; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!