Лаба 4 / Лабораторная №4
.docxЦель работы: освоение работы с дополнительными данными примитива, их назначение, добавление, изменение и удаление.
Ход работы
1)Задание: создать чертеж, можно с 1 примитивом. Добавить, удалить и вывести расширенные данные примитива.
2) Описание используемых функции
(regapp <приложение>) - заносит имя приложения в таблицу APPID.
Функцияия regapp возвращает имя приложения (или nil в случае ошибки). Значение nil возвращается также, если приложение с таким именем уже регистрировалось.
Функция entmake может создать примитив и сразу присоединить к нему расширенные данные.
С помощью функции entmod можно добавить расширенные данные к существующему графическому объекту.
3) Присоединения расширенных данных.
Зарегистрировали имя приложения LAUNCH01, с которым связываются присоединяемые расширенные данные.
В переменной le сохраняется список данных последнего примитива рисунка.
Затем создается список edata, который имеет структуру расширенных данных:
(setq edata (list (list -3 (list "LAUNCH01" (cons 1000 "Ступень") (cons 1070 121)))))
Далее с помощью функции append формируется список lе2, который является объединением списков lе и edata:
((-1 . <Entity name: 178bb402cf0>) (0 . "LINE") (330 . <Entity name: 178bb4019f0>) (5 . "2A7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1199.4 1214.63 0.0) (11 2411.97 1888.17 0.0) (210 0.0 0.0 1.0))
Спомощью функции entmod и списка le присоединили расширенные данные к примитиву.
Удаление расширенных данных
Сначала с помощью функции entget получается полный список данных примитива (с расширенными данными всех приложений):
(setq le (entget ent (list "*")))
Сами расширенные данные сосредоточены в подсписке с DXF-кодом -3.
Извлечение расширенных данных
Для извлечения сначала необходимо использовать функцию get (в аргументах указать имя приложения, затем assoc с кодом -3, и затем комбинации car и cdr.
4) Листинг программы
;Присоединения расширенных данных
; Регистрация приложения LAUNCH01
(regapp "LAUNCH01")
; Получение списка данных последнего примитива
(setq le (entget (entlast)))
; Формирование подсписка расширенных данных
(setq edata (list (list -3 (list "LAUNCH01"
(cons 1000 "Stypeni") (cons 1070 121)))))
; Включение в список расширенных данных
(setq le2 (append le edata))
; Присоединение расширенных данных к примитиву
; (обновление примитива)
(entmod le2)
; Проверка данных примитива
(entget (entlast) '("LAUNCH01"))
;Удаление расширенных данных
; Удаление расширенных данных из примитива
(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
Вывод: написали программу, которая присоединяет расширенные данные и удаляет расширенные данные.
Ответы на контрольные вопросы:
1. Для чего служит функция regapp?
Ответ: заносит имя приложения в таблицу APPID. Функция regapp возвращает имя приложения (или nil в случае ошибки).
2. Что такое расширенные данные?
Ответ: текстовые или числовые данные, которые желательно хранить вместе с объектом
3. Что является признаком наличия расширенных данных?
Ответ: (признак наличия расширенных данных, в котором далее располагаются точечная пара с кодом 1001 (начало расширенных данных и имя приложения, с которым они связываются) и точечные пары с DXF-кодами 1000, 1002—1071.
4. В чем заключается принцип работы функции reverse?
Ответ: reverse — переворот списка;
5. В чем заключается особенность использования функции entget при работе с расширенными данными?
Ответ: В списке, возвращаемом функцией entget, расширенные данные находятся в подсписке, начинающемся с DXF-кода -3.
6. С чего начинается работа с расширенными данными?
Ответ: С регистрации приложения
7. Какие DXF-коды используются для работы с расширенными данными?
Ответ: DXF-коды в диапазоне от -2 до 239
8. Какая функция объединяет списки?
Ответ: функция append
9. Какие функции позволяют контролировать размер расширенных данных?
Ответ: функции xdsize и xdroom
10. С каким количеством приложений могут быть связаны данные примитива?
Ответ: Имена приложений хранятся в рисунке в таблице символов "APPID"