Лаба 2 / Laboratornaya_rabota_2
.pdfМетодические указания к выполнению лабораторных работ
по курсу
Программное обеспечение географических информационных систем
Таганрог 2019
Гордиенко Л.В. Методические указания к выполнению лабораторных работ по курсу «Программное обеспечение географических информационных систем».
©Южный федеральный университет, 2019
©Гордиенко Л.В. 2019
Лабораторная работа № 2 «Перемещение графических примитивов»
Цель работы: освоить работу с характеристиками графических примитивов.
Описание используемых функции
(list <элемент1> <элемент2> … <элементN>) – объединяет элементы в список. Это основная функция, позволяющая создать список. Например:
(list 6.5 8.52 7.1) – возвращает (6.5 8.52 7.1).
(append <список1> <список1> … <списокN>) – выполняет слияние списков в один. Например:
(append ‘(5 12) ‘(–7 10)) – возвращает (5 12 –7 10).
(car <список>) – возвращает первый элемент списка или точечной пары.
Например:
(car ‘(5 0 8 2)) – возвращает 5.
(cdr <список>) – возвращает список, в который включены все элементы,
кроме первого. Например:
(cdr ‘(9 12 16.74)) – возвращает (12 16.74).
(nth <номер> <список>) – извлекает из списка элемент по порядковому номеру. Нумерация элементов начинается с нуля.
(subst <новый элемент> <старый элемент> <список>) – отыскивает в списке старый элемент и возвращает список, в котором старый элемент (все вхождения) заменен на новый. Например:
(subst 15 71 ‘(45 71 16 92)) – возвращает (45 15 16 92).
(cons <аргумент1> <аргумент2>) – добавляет к списку первый элемент или создает точечную пару. Если <аргумент 2> является списком, то функция cons добавляет в него <аргумент1> в качестве нового первого элемента.
Если <аргумент2> является атомом (т.е. не списком), то функция cons
создает точечную пару вида (<аргумент1> . <аргумент2>). Например:
(cons 7 ‘(6 3 5)) – возвращает (7 6 3 5 );
(cons 60 1) – возвращает (60 . 1).
(assoc <код> <список>) – применяется к сложному списку, в котором элементами являются списки или точечные пары, и выбирает из этих элементов (внутренних списков и точечных пар) тот, у которого первый элемент имеет заданное значение. Функция assoc – основной инструмент в операции, когда из списка с данными примитива AutoCad нужно выбрать тот элемент, который содержит точечную пару с нужным DXF-кодом свойства
(цвета, слоя и т.д.). Например:
(assoc 8 ‘ (8 . “Buildings”) (62 . 5)) – возвращает (8 . “Buildings”).
(entlast) – возвращает имя последнего неудаленного основного примитива рисунка.
(entnext [<примитив>]) – если эта функция вызывается без аргументов,
то она возвращает имя первого неудаленного примитива на базе рисунка. Если функция вызывается с аргументом – именем примитива <примитив>, то она возвращает имя первого неудаленного примитива, следующего за примитивом, описанным аргументом <примитив>.
(entsel [<запрос>]) – предлагает пользователю указать один объект,
выдавая запрос, текст которого задан в качестве аргумента. Возвращаемое значение – список, состоящий из двух элементов: имени выбранного примитива и точки, которой пользователь указал объект.
(entget <примитив> [<приложения>]) – получает список с характеристиками примитива и является основным инструментом извлечения информации о геометрии и свойствах.
Аргумент <примитив> – это имя примитива для получения его данных,
аргумент <приложения> – это список с именами приложений, с помощью которых к примитиву привязаны расширенные данные.
Предположим, в рисунке первым объектом является отрезок (примитив
- "LINE"). Тогда выражение
(setq pr (entget(entnext)))
возвращает такой список:
((–1 . <Entity name: 7ef03558>) (0 . "LINE") (330 . <Entity name: 7ef01cf8>) (5 . "223") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1025.63 977.25 0.0) (11 2767.91 1607.64 0.0) (210 0.0 0.0 1.0))
Вэтом списке элементами являются точечные пары и списки, причем и
втех, и в других первыми элементами выступают целые числа, называемые
DXF-кодами. Под соответствующим кодом в точечных парах и списках находятся данные определенного типа:
код –1 указывает имя примитива (<Entity name: 7ef03558>);
код 0 – тип примитива ("LINE");
код 5 – метку (внутренний номер примитива в рисунке);
код 8 – имя слоя ("0");
код 10 – координаты начальной точки (1025.63 977.25 0.0);
код 11 – координаты конечной точки (2767.91 1607.64 0.0);
код 210 – направление вектора нормали к плоскости, в которой создан примитив.
Методические указания
Алгоритм перемещения объекта вправо:
1)Создать чертеж с несколькими линейными примитивами.
2)Извлечь последний примитив (entlast).
3)Извлечь характеристики этого примитива (entget).
4)Из характеристик извлечь список с координатами начала (assoc, DXF-
код 10) – например, (assoc 10 pr1).
5)Из списка с координатами необходимо извлечь координату х (для этого используем функцию car, которая извлекает из списка первый элемент).
6)Теперь x увеличиваем на некоторое число (50, 100, 150, можно свое) (+ pr3 100).
7)То же самое сделать с конечными координатами: (assoc, DXF-код 11) –
например, (assoc 11 pr1); тоже car.
8)Конечный х тоже увеличиваем на такое же число.
9)Затем извлечь координаты у (начальную и конечную), использую комбинации функций car и cdr. (car(cdr )).
10)То же самое проделать с координатой z (car(cdr(cdr))).
11)Теперь необходимо сформировать новый список с новой начальной координатой х, старой начальной координатой у и z = 0.0 (list pr6 a 0.0).
12)Добавить к этому списку DXF-код 10 (cons 10 (list pr6 a 0.0)).
13)То же самое проделать с конечными координатами.
14)В списке с характеристиками примитива заменить подсписки с новыми координатами (subst (cons 10 (list pr6 a 0.0)) pr2 pr1).
15)(subst (cons 11 (list pr7 b 0.0)) pr4 sl)).
16)Обновить файл чертежа (entmod sl).
Задание: создать пользовательские функции, позволяющие перемещать примитивы
1)вправо (влево);
2)вверх (вниз);
3)по диагонали.
Содержание отчета
1.Постановка задачи.
2.Описание функций, используемых в программе.
3.Описание хода решения (с пояснениями и примерами, начальное положение примитива, конечное положение).
4.Листинг программы.
5.Выводы и результаты.
Контрольные вопросы
1.Что такое точечная пара?
2.Какую координату необходимо изменить, чтобы переместить примитив вниз?
3.С помощью каких функций можно создать список?
4.Что такое DXF-код?
5.С помощью какой функции можно извлечь характеристики примитива?
6.Какие аргументы включает в себя функция subst?
7.В чем заключается принцип работы функции assocc?
8.Что возвращает функция car?
9.Для чего используются комбинации функций car и cdr?
10.Что означает DXF-код 10?