Формирование и анализ работы с примитивами.


Формирование списка данных примитива:
(ENTGET <имя примитива> [<список>])
функция формирует и возвращает список, содержащий данные о примитиве, который задан <именем примитива>. Аргумент <список> позволяет задать имена зарегистрированных приложений. При этом будут возвращены расширенные данные, связанные с именем примитива. Структура списка зависит от типа примитива и подчиняется следующим правилам:
1) Каждый элемент списка является списком;
2) Большинство субсписков имеют вид точечных пар, кроме тех, что описывают точки;
3) Первый элемент каждого субсписка – это код данных, 2-ой и последний элементы – его значения.
4) Первый субсписок имеет вид:
(-1.<имя примитива>)
2-ой имеет вид:
(0. <имя примитива>)
3-ий:
(8. <имя слоя>)
5) Затем указываются только те атрибуты примитива, значения которых отличаются от установленных по умолчанию.
6) Указываются характеристики примитива, состав которых зависит от его типа.
Например, для отрезка прямой:
Тип “LINE”
(10. <коорд. начальной точки>)
(11. <коорд. конечной точки>)
Тип “CIRCLE”
(10. <коорд. центра>)
(40. <радиус>)
Тип “ARC”
(10. <коорд. центра>)
(40. <радиус>)
(50. <нач. угол>)
(51. <конеч. угол>)

Пример:
(COMMAND “LINE” “5,10” “20,40” “ ”)
(SETQ E1 (ENTGET (ENTLAST)))
Результат: в переменную E1 будут занесены данные о последнем примитиве:
(<-1. Entry name: ***>) *** – имя примитива
(0. “LINE”)
(8. “0”)
(10 5.00 10.00)
(11 22.00 40.00)
Модификация данных о примитиве
(ENTMOD <список>) изменяет параметры примитива в графической БД чертежа
Механизм обновления данных:
– извлечение информации с помощью ENTGET;
– изменение списка, описывающего примитив с помощью SUBST;
обновление информации в БД чертежа с помощью ENTMOD
(SETQ ENAME (ENTNEXT))
;занести в переменную ENAME следующий примитив
(SETQ EINF (ENTGET ENAME))
;занести в переменную EINF информацию о примитиве ENAME
(SETQ EINF ; модификация переменной EINF
(SUBST (CONS 8 “1”) ; путем создания списка для слоя
(ASSOC 8 EINF) ; (добавив) и выполнив
EINF)
)
(ENTMOD EINF)
На функцию ENTMOD накладывается ряд ограничений:
1) Не может быть изменен тип примитива (это можно сделать, если предварительно удалить его с помощью ENTDEL, а затем создать с помощью COMMAND).
2) Объекты, на которых ссылается список примитива, должны быть к данному моменту определены (за исключением имени слоя).
3) Слой м.б. задан и новый, который в данный момент отсутствовал.

Функция ENTMOD может выполняться над примитивом и субпримитивом. Если объекты являются субпримитивами, то видимого изменения не произойдет.

Функция обновления изображения примитива
(ENTUPD <имя примитива>)
Пример, позволяющий осуществить перенос примитива с одного слоя на другой. На псевдокоде алгоритм выглядит так:
– Установить переменную found в NIL
– Ввести с клавиатуры и запомнить имена старого и нового слоев
– Выдать сообщение о том, что поиск начался
– Занести в переменную entn имя первого примитива чертежа
– Цикл: пока существует переменная entn, необходимо получить в ent список, содержащий значения entn. Если имя слоя в списке ent совпадает с именем старого слоя, то изменить слой примитива на новый, установить значение переменной found в T.
– Записать в переменную entn имя очередного примитива
– Закончить цикл
– Если found=NIL (примитив отсутствует), то выдать сообщение об отсутствии примитива в данном слое.

(DEFUN C:CNDLAY (/ cmd entn ent)
(SETVAR “CMDECHO” 0)
(SETQ FOUND NIL)
(SETQ OLDLAYER (CTRCASE (GETSTRING “nInput old name”))
(NEWLAYER (STRCASE (GETSTRING “nInput new name”))
(PRINC “nFinding entities on the layer…”)
(SETQ entn (ENTNEXT))
(WHILE (/=entn nil)
(SETQ ent (ENTGET entn))
(IF (= (CDR (ASSAC 8 ent) OLDLAYER)
(PROGN
(COMMAND “CHANGE” entn “ ” ”p” “LA” NEWLAYER)
(SETQ FOUND T)
) ; end progn
) ; end if
(SETQ entn (ENTNEXT ent))
) ; end while
(IF (NOT FOUND)
(PRINC (STRCAT “n Have no entities on the layer”))
) ; end if
(SETVAR “CMDECHO” 1)
) ; end defun