Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба 4 / Лабораторная работа №4

.pdf
Скачиваний:
0
Добавлен:
27.11.2023
Размер:
280.89 Кб
Скачать

Методические указания к выполнению лабораторных работ

по курсу

Программное обеспечение географических информационных систем

Таганрог 2019

Гордиенко Л.В. Методические указания к выполнению лабораторных работ по курсу «Программное обеспечение географических информационных систем».

©Южный федеральный университет, 2019

©Гордиенко Л.В. 2019

Лабораторная работа № 4

«Расширенные данные»

Цель работы: освоение работы с дополнительными данными примитива, их назначение, добавление, изменение и удаление.

Описание используемых функций

(regapp <приложение>) - заносит имя приложения в таблицу APPID.

Параметр <приложение> должен быть текстовой строкой (по возможности нужно выбирать имя приложения таким, чтобы оно не могло совпадать с именами приложений других разработчиков— иначе это приведет к неправильной работе с расширенными данными).

Функцияия regapp возвращает имя приложения (или nil в случае ошибки). Значение nil возвращается также, если приложение с таким именем уже регистрировалось.

Пример:

(regapp “SHIPDESIGN”) возвращает “SHIPDESIGN”

Методические указания

К примитивам и неграфическим объектам рисунка можно добавлять расширенные данные, т. е. текстовые или числовые данные, которые желательно хранить вместе с объектом (например, марки материалов,

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

Объем расширенных данных одного объекта ограничен.

Если расширенные данные присоединены к примитиву (или неграфическому объекту), то в базе рисунка они следуют за обычными данными (DXF-коды этих данных находятся в диапазоне от -2 до 239). Извлечь расширенные данные можно с помощью функции entget, при обращении к ней нужно указывать имя приложения, с которым они связаны. В списке,

возвращаемом функцией entget, расширенные данные находятся в подсписке,

начинающемся с DXF-кода -3 (признак наличия расширенных данных, в

котором далее располагаются точечная пара с кодом 1001 (начало расширенных данных и имя приложения, с которым они связываются) и

точечные пары с DXF-кодами 1000, 1002—1071.

Расширенные данные связываются с именем конкретного приложения.

Имена приложений хранятся в рисунке в символьной таблице APPID. Чтобы занести имя приложения в эту таблицу, следует пользоваться функцией regapp.

Функция entmake может создать примитив и сразу присоединить к нему расширенные данные. С помощью функции entmod можно добавить расширенные данные к существующему графическому объекту.

Предположим в качестве примера, что к последнему существующему примитиву рисунка (пусть им является отрезок) нужно добавить расширенные данные, связанные с приложением "LAUNCH01".

Пример присоединения расширенных данных

; Регистрация приложения LAUNCH01

(regapp "LAUNCH01")

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

(setq le (entget (entlast)))

; Формирование подсписка расширенных данных

(setq edata (list (list -3 (list "LAUNCH01"

(cons 1000 "Ступень") (cons 1070 121)))))

; Включение в список расширенных данных

(setq le2 (append le edata))

; Присоединение расширенных данных к примитиву

; (обновление примитива)

(entmod le2)

; Проверка данных примитива

(entget (entlast) '("LAUNCH01"))

Вначале необходимо зарегистрировать имя приложения LAUNCH01, с

которым связываются присоединяемые расширенные данные. Повторная регистрация системой не выполняется, но и ошибки не вызывает.

В переменной le сохраняется список данных последнего примитива рисунка (перед выполнением программы у него нет расширенных данных).

Затем создается список edata, который имеет структуру расширенных данных:

(setq edata (list (list -3 (list "LAUNCH01" (cons 1000 "Ступень") (cons 1070

121)))))

Здесь DXF-код -3 задает начало расширенных данных, в которые входят строка в именем приложения и две точечные пары: с кодом 1000 (строка) и с кодом 1071 (целое число).

Далее с помощью функции append формируется список lе2, который является объединением списков lе и edata. Примерный вид этого списка таков:

((-1 . <Entity name: 7ef7f240>) (0 . "LINE") (330 . <Entity name: 7ef66cf8> (5 . "138") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 -402.145 0.0 591.48)

(11 291.58 0.0 81.7246) (210 0.0 -1.0 0.0) (-3 ("LAUNCH01" (1000 .

"Ступень") (1070 . 121))))

Непосредственное присоединение расширенных данных к примитиву осуществляется путем обновления этого примитива с помощью функции entmod и списка le.

Размер расширенных данных любого примитива не должен превышать

16 Кбайт -1 (16 383 байта). Поэтому по мере добавления таких данных их размер нужно контролировать. Этой цели служат функции xdsize и xdroom.

Перед записью в зону примитива новой порции расширенных данных следует проверить, достаточно ли для них места.

Удаление расширенных данных

; Удаление расширенных данных из примитива

(defun clean_xdata (ent app / le le1)

(if (and (= (type ent) 'ENAME) (= (type app) 'STR)) (progn

;Читаем список данных с расширенными данными приложения app

(setq le (entget ent (list "*")))

;Удаляем расширенные данные приложения app, заменяя их на частично пустой список

(setq le1 (subst (cons -3 (list (list app))) (assoc -3 le) le))

;Обновляем примитив

(entmod le1)

);progn

(princ "\nНеверен тип аргументов. ")

);if

(princ)

);clean_xdata

Функция clean_xdata имеет два аргумента:

ent — примитив;

арр— строка с именем приложения, расширенные данные которого необходимо удалить.

Сначала с помощью функции entget получается полный список данных примитива (с расширенными данными всех приложений):

(setq le (entget ent (list "*")))

Сами расширенные данные сосредоточены в подсписке с DXF-кодом -3,

например:

(-3 ("МуЛрр" (1000 . "Yt") (1040 . 45.8))

("MyAppl" (1070 . 123) (1000 . "Zttl")))

Если составить такой же подсписок с DXF-кодом -3, но в нем расширенные данные приложения будут состоять только из имени приложения (например, (-3, ("MyAppl"))), то при обновлении функцией entmod с помощью списка, в котором к основным данным примитива добавлен приведенный подсписок, из примитива будут удалены расширенные данные приложения MyApp1.

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

; Регистрируем приложения MyApp и MyApp1

(regapp "MyApp") (regapp "MyApp1")

; Создаем примитив CIRCLE с расширенными данными обоих приложений

(setq e0 (entmakex (list '(0 . "CIRCLE") '(10 200.0 50.0 0.0) '(40 . 100.0) '(-3 ("MyApp" (1000 . "Yt")(1040 . 45.8))

("MyApp1" (1070 . 123)(1000 . "Ztt1"))))))

; Список, возвращаемый выражением (entget e0 '("*"))

;((-1 . <Entity name: 7ef65e48>) (0 . "CIRCLE")

;(330 . <Entity name: 7ef65d18>) (5 . "49") (100 . "AcDbEntity") ;(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle")

;(10 200.0 50.0 0.0) (40 . 100.0) (210 0.0 0.0 1.0) ;(-3 ("MyApp" (1000 . "Yt") (1040 . 45.8)) ;("MyApp1" (1070 . 123) (1000 . "Ztt1"))))

; Очищаем данные приложения MyApp1

(clean_xdata e0 "MyApp1")

; Список данных примитива

;((-1 . <Entity name: 7ef65e48>) (0 . "CIRCLE")

;(330 . <Entity name: 7ef65d18>)

;(5 . "49") (100 . "AcDbEntity") (67 . 0)

;(410 . "Model") (8 . "0") (100 . "AcDbCircle") ;(10 200.0 50.0 0.0) (40 . 100.0) (210 0.0 0.0 1.0) ;(-3 ("MyApp" (1000 . "Yt") (1040 . 45.8))))

; Очищаем данные приложения MyApp

(clean_xdata e0 "MyApp")

;Список данных примитива

;((-1 . <Entity name: 7ef65e48>) (0 . "CIRCLE")

;(330 . <Entity name: 7ef65d18>) (5 . "49") (100 . "AcDbEntity") ;(67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle")

;(10 200.0 50.0 0.0) (40 . 100.0) (210 0.0 0.0 1.0))

Для удаления расширенных данных также можно использовать функцию reverse.

Извлечение расширенных данных

Для извлечения сначала необходимо использовать функцию get (в

аргументах указать имя приложения, затем assoc с кодом -3, и затем комбинации car и cdr.

Задание

1.Создать чертеж, можно с 1 примитивом

2.Добавить, удалить и вывести расширенные данные примитива.

Содержание отчета

1.Постановка задачи.

2.Описание функций, используемых в программе.

3.Описание хода решения (с пояснениями и примерами).

4.Листинг программы.

5.Выводы и результаты.

Контрольные вопросы

1.Для чего служит функция regapp?

2.Что такое расширенные данные?

3.Что является признаком наличия расширенных данных?

4.В чем заключается принцип работы функции reverse?

5.В чем заключается особенность использования функции entget при работе с расширенными данными?

6.С чего начинается работа с расширенными данными?

7.Какие DXF-коды используются для работы с расширенными данными?

8.Какая функция объединяет списки?

9.Какие функции позволяют контролировать размер расширенных данных?

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

примитива?

Соседние файлы в папке Лаба 4