03 Funkcje obsł zbiorów wskazań i tablic


Rozdział 3

Funkcje obsługi zbiorów wskazań,
elementów i tablic symboli

Większość funkcji AutoLISP-u, obsługujących zbiory wskazań i elementy ry-
sunkowe, identyfikuje zbiory wskazań lub elementy poprzez ich nazwę i alfa-
numeryczny kod, nadawany im i pamiętany przez AutoCAD. Zanim pro-
gram użytkowy w AutoLISP-ie będzie mógł operować na zbiorze wskazań
lub elemencie rysunkowym, musi najpierw uzyskać bieżącą nazwę zbioru
wskazań lub elementu rysunkowego, wywołując w tym celu jedną z funkcji
zwracających nazwę zbioru wskazań lub elementu rysunkowego. Przykłady
takich funkcji są podane w dalszych partiach tekstu.

Ważne: Nazwy zbiorów wskazań i elementów rysunkowych są ulotne, są one
niezmienne tylko podczas bieżącej sesji rysunkowej.

Ulotność nazw zbiorów wskazań, obowiązujących tylko w czasie bieżącej se-
sji, nie stanowi problemu. Jest to natomiast problem w przypadku nazw ele-
mentów rysunkowych, zapisywanych w bazie danych rysunkowych. Progra-
my użytkowe, które w różnym czasie muszą odwoływać się do tego samego
elementu rysunkowego w danym rysunku (lub rysunkach), powinny korzy-
stać z identyfikatorów elementów, opisanych w części "Identyfikatory ele-
mentów i ich wykorzystanie" na stronie 57.

Obsługa zbiorów wskazań

Funkcja ssget udostępnia najbardziej ogólną metodę tworzenia zbiorów wskazań.
Może ona utworzyć zbiór wskazań jedną z poniższych metod:

Przez bezpośrednie wskazanie elementów do zbioru przez opcje oStatni, Po-
przedni, Okno, Uchwycony, OWbok, przecięcie, ZWbok lub Krawędź (tak sa-
mo, jak podczas interakcyjnej pracy z AutoCAD-em), lub przez wskazanie
pojedynczego punktu. Można również wybrać całą bazę danych.

Przez zażądanie wybrania elementów przez użytkownika.

Do każdej z powyższych grup opcji można zastosować filtrację. Pozwala to
na określenie listy atrybutów lub warunków, jakie muszą spełniać wybrane
elementy.

Pierwszym argumentem funkcji ssget jest łańcuch tekstowy tryb, określający
opcję wybierania elementów. Dwa następne argumenty, pt 1 i pt2 definiują dwa

punkty dla wybranej opcji (jeśli dla wybranej opcji punkty są niepotrzebne, należy

Obsługa zbiorów wskazań 49

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

je w ogóle pominąć). Przy metodach wybierania elementów przez Wbok (a
więc Krawędź, ZWbok i OWbok) musi być podany argument będący listą
punktów pt-list. Ostatni argument filter-listjest opcjonalny. Jeśli argument filter-list
jest podany, określa on listę wartości pól elementów rysunkowych, wykorzysta-
nych do filtrowania. Bardziej szczegółowy opis filtrów dla zbiorów wskazań jest
podany w części "Filtracja dodatkowych danych elementu" na stronie 57. Podana
dalej tabela zawiera zestawienie dostępnych wartości trybów wybierania i argu-
mentów (filter-list może być wykorzystana jako dodatkowy argument przy każdej
podanej metodzie wybierania):

Tabela 3-1. Opcje wyboru dla funkcji ssget



Tryb Metoda dokonywania wyboru Modele funkcji '
brak Wybór przez użytkownika lub wybór za pomocą jednego punktu (jeśli podany jest punkt-1) (ssget) lub (ssget punkt-1)
"S" "L" Ostatni utworzony element rysunkowy widoczny na ekranie
"P" Poprzednio wybrany zbiór wskazań (ssget"P")
"-' Niejawny zbiór wskazań (poprzedni zbiór wskazań) utworzony przy włączonym trybie PlCKFIRST)
"Q" "^" Wybór oknem (ssget "0" pt1 pt2)
"Z" "C" Wybór oknem przecinającym (ssget "Z" pt1 pt2)
"K" "F" Wybór krawędzią (otwartym wielokątem) (ssget "F" pt-list)
"ZW" "CP" Wybór wielokątem przecinającym (ssget "CP" pt-list)
"ÓW" "WP" Wybór oknem obejmującym w kształcie wielokąta (ssget "WP" pt-list)
"x" Wybór wszystkich elementów w rysunku (ssget"X")

Uwago: Jeśli wybrany jest modę "X" i nie jest podana lista filter-list, ssget wy-
biera wszystkie elementy rysunkowe w bazie danych, włącznie z elementami
w warstwach wyłączonych, zamrożonych i usuniętych z widocznego ekranu.

Przykłady

Poniższe fragmenty kodu programu pokazują kilka reprezentatywnych próbek
wywołania funkcji ssget:

(setq pt1 '(0.0 0.0 0.0)
pt2 '(5.0 5.0 0.0)
pt3'(4.0 1.00.0)
pt4 '(2.0 6.0 0.0)

)

(setq ss1 (ssget))
(setq ss1 (ssget "P"))
(setq ss1 (ssget "S"))

Przypisanie pt1, pt2, pt3

Żądanie wybrania elementów przez użytkownika
i umieszczenie ich w zbiorze wskazań

Tworzenie zbioru wskazań z ostatnio wybranych
elementów

Utworzenie zbioru wskazań z ostatniego widocznego

50 Obsługa zbiorów wskazań

Rozdział 3

na ekranie elementu w bazie danych

(setq ss1 (ssget pt2)) Utworzenie zbioru wskazań z elementu przechodzą-
cego przez punkt (5,5)

(setq ss1 (ssget "O" pt1 pt2)) Utworzenie zbioru wskazań z elementów wewnątrz
okna o wierzchołkach (0,0) i (5,5)

(setq ss1 (ssget "_F" (list pt2 pt3 pt4))) Utworzenie zbioru wskazań z elementów przecinających
krawędź zdefiniowaną przez punkty (5,5), (4,1) i (2,6)

(setq ss1 (ssget "_WP" (list pt1 pt2 pt3))) Utworzenie zbioru wskazań z elementów wewnątrz wie-
loboku zdefiniowanego przez punkty (0,0), (5,5) i (4,1)

(setq ss1 (ssget "X")) Utworzenie zbioru wskazań ze wszystkich elementów
w bazie danych rysunkowych

Istotne jest, by po zakończeniu korzystania ze zbioru wskazań, program
użytkowy usuwał go z pamięci. Można to osiągnąć przez przypisanie mu nil.

(setq ss1 nil)

Ważne: Program użytkowy w AutoLISP-ie nie może mieć jednocześnie
otwartych więcej niż 128 zbiorów wskazań. Granica ta zależy od wielu czyn-
ników i w niektórych systemach może być nieco niższa. Po osiągnięciu tej
granicy AutoCAD przestaje tworzyć zbiory wskazań. Nie jest zalecane dąże-
nie do jednoczesnego utrzymywania wielu zbiorów wskazań. Należy raczej
utrzymywać sensowną ilość zbiorów wskazań otwartych w tym samym cza-
sie, a niepotrzebnym już zbiorom jak najszybciej przypisywać nil. Jeżeli zo-
stała osiągnięta graniczna ilość zbiorów wskazań, konieczne jest wywołanie
funkcji gc (patrz informacje na temat czyszczenia pamięci w części "Obszar
węzłów" w rozdziale 5).

Listy filtrów dla zbiorów wskazań

Lista filtrów elementów rysunkowych jest listą asocjacji, wykorzystującą ko-
dy grup (listę kodów grup podano w dodatku B) w takim samym formacie,
jak listy zwracane przez funkcję entget (opisaną później w tym rozdziale).
Funkcja ssget rozpoznaje wszystkie kody grup, oprócz nazw elementów
(grupa -l), identyfikatorów (grupa 5) i kodów danych dodatkowych elemen-
tów (>=1000) Jeżeli w liście filter-list użyty został niewłaściwy kod grupy,
ssget go ignoruje. W celu znalezienia elementów zawierających dane dodat-
kowe, należy użyć kodu - 3, zgodnie z opisem podanym w części "Filtracja do-
datkowych danych elementu" na stronie 53.

Jeżeli ostatnim podanym argumentem funkcji ssget jest filter-list, przegląda
ona wybrane elementy i tworzy zbiór wskazań, zawierający nazwy wszy-
stkich głównych elementów rysunkowych, spełniających podane kryteria.
Wykorzystując ten mechanizm, można na przykład uzyskać zbiór wskazań
składający się ze wszystkich elementów danego typu, w wybranej warstwie
lub w wybranym kolorze.

filter-list określa, które cechy elementów mają być sprawdzane i jaka ma być ich
wartość.

Obsługa zbiorów wskazań 51

Funkcje obsługi zbiorów wskazań, elementowi tablic symboli

Przykłady

Cztery poniższe przykłady demonstrują metody użycia argumentu filter-list
z różnymi opcjami wyboru tryb.

(setq ss1 (ssget Żąda od użytkownika zwykłego wybrania elementów lecz do

'((O . "TEXT"))) zbioru wskazań dodaje tylko elementy Text (Tekst)
)

(setq ss1 (ssget "P" Utworzenie zbioru wskazań z ostatnio wybranych elementów,

'((O . "LINĘ"))) będących jednocześnie elementami Linę (Linia)
)

(setq ss1 (ssget "O" pt1 pt2 Utworzenie zbioru wskazań ze wszystkich elementów w Ok-

'((8 . "FLOOR9"))) nie, leżących w warstwie FLOOR9
)

(setq ss1 (ssget "X" Utworzenie zbioru wskazań ze wszystkich elementów w bazie

'((O . "CIRCLE"))) danych, będących elementami Circie (Okrąg)
)

Jeżeli znany jest zarówno kod, jak i żądana wartość, lista może być zacyto-
wana w całości, zgodnie z poprzednim przykładem. Jeżeli którykolwiek
składnik listy jest dany w postaci zmiennej, lista musi zostać skonstruowa-
na z wykorzystaniem funkcji list lub cons.

(setq lay_name "FLOOR3")
(setq ss1

(ssget "X" Uwarzenie zbioru wskazań ze wszystkich elementów w bazie

(list (cons 8 lay_name)) danych, leżących w warstwie FLOOR3
}
)

Jeśli lista-filtrów określa więcej niż jedną cechę, element zostaje włączony do
zbioru wskazań tylko wtedy, gdy spełnia wszystkie podane warunki. Na przy-
kład ciąg dalszy poprzedniego przykładu mógłby wyglądać następująco:

(ssget "X" (list (cons O "CIRCLE")(cons 8 lay_name)(cons 62 1)))

Spowodowałby on wybranie elementu rysunkowego Circie (Okrąg) w war-
stwie FLOOR3 i w kolorze czerwonym. Ten rodzaj testu wykonuje logiczną
operację AND. Dodatkowe testy cech elementów rysunkowych są omawiane
w części "Logiczne grupowanie testów filtrujących" na stronie 54.

Funkcja ssget filtruje rysunek przeglądając wybrane elementy i porównując
pola każdego głównego elementu z podaną listą filtrującą. Jeśli cechy elementu
odpowiadają wszystkim polom podanym w liście filtrującej, element zostaje
włączony do zwracanego zbioru wskazań. Funkcja ssget zwraca nil, jeśli żaden
ze wskazanych elementów nie spełnia podanych warunków filtrujących.

Ostrzeżenie: Znaczenie poszczególnych kodów grup może zmieniać się w za-
leżności od elementu rysunkowego, w którym one występują. Ponadto nie we
wszystkich elementach występują wszystkie kody grup. Jeśli jakiś kod grupy
jest podany w filtrze, elementy nie zawierające takiego kodu grupy będą wy-
łączone ze zwracanego przez ssget zbioru wskazań.

Uwaga: Wskutek filtracji rysunku przez funkcję ssget, w utworzonym przez
nią zbiorze wskazań mogą znaleźć się zarówno elementy z obszaru papieru, jak
i z obszaru modelu. Jeśli jednak taki zbiór wskazań zostanie przesłany doAu-

52 Obsługa zbiorów wskazań

Rozdział 3

toCAD-a, wówczas używane są jedynie elementy z aktualnie aktywnego ob-
szaru (obszar, do którego należy element, jest określony przez grupę 67, zgod-
nie z opisem podanym w dodatku B tego podręcznika oraz w rozdziale 11 Au-
toCAD Podręcznik Adaptacyjny).

Znaki uniwersalne w listach filtrujących

Nazwy symboli podane w listach filtrujących: rodzaju elementu (0), nazwy
Bloku (2), stylu wymiarowania DIMSTYLE (3), rodzaju linii (6) i warstwy
(8) mogą zawierać znaki uniwersalne. Znaki uniwersalne rozpoznawane
przez funkcję ssget są takie same, jak znaki dla funkcji wcmatch i zostały
szczegółowo przedstawione w części "Testowanie relacji" na stronie 53 oraz
przy opisie funkcji wcmatch w rozdziale 4.

Ostrzeżenie: Przy filtracji bloku bez nazwy (anonimowego) należy zaznaczyć
znak * za pomocą lewego apostrofu ('), gdyż znak *jest odczytywany przez ssget
jako znak uniwersalny. Na przykład blok anonimowy o nazwie *U2 można od-
czytać za pomocą następującej instrukcji:

(ssget "X" '((2 . '"*U2")))

Filtracja dodatkowych danych elementu

Stosując ssget z argumentem filter-list można wybrać wszystkie elementy za-
wierające dodatkowe dane elementu związane z wybraną aplikacją (patrz
"Uwagi o dodatkowych danych elementów" na stronie 68). Osiąga się to wyko-
rzystując kod grupy -3, tak jak w poniższym przykładzie:

(ssget "X" '((O . "CIRCLE") (-3 ("APPNAME"))))

Powyższa instrukcja spowodowałaby wybranie wszystkich Okręgów (elemen-
tów rysunkowych Circie), zawierających dodatkowe dane związane z aplikacją
"APPNAME". Jeśli na liście grup o kodzie -3 zawartych jest więcej nazw apli-
kacji, wówczas jest to równoważne wykonaniu logicznej operacji AND i nastę-
puje wybranie tylko tych elementów, które zawierają dodatkowe dane dla wszy-
stkich tych aplikacji. Tak więc instrukcja

(ssget "X" '((O . "CIRCLE") (-3 ("APP1") ("APP2"))))

spowodowałaby wybranie wszystkich Okręgów (Circie) z danymi dodatkowymi
jednocześnie dla aplikacji "APP1" i dla "APP2". Stosowanie znaków uniwersal-
nych jest dozwolone tak, że zarówno

(ssget "X" '((O . "CIRCLE") (-3 ("APP[12]"))))

Jak i

(ssget "X" '((O . "CIRCLE") (-3 ("APP1,APP2"))))

spowodowałaby wybranie wszystkich Okręgów (Circie) z danymi dodatkowymi
dla jednej lub jednocześnie dla obu aplikacji "APP1" i "APP2".

Testowanie relacji

Jeśli nie zostanie to określone inaczej, dla każdej pozycji argumentu filter-list
przeprowadzany jest test "równości". Dla grup liczbowych (całkowitych, rzeczy-
wistych, punktów i wektorów) można określić inne rodzaje zależności, podając
specjalny kod grupy -4, określający operator relacji. Wartością grupy -4 jest łań-
cuch tekstowy, wskazujący operator testujący do zastosowania w odniesieniu

Obsługa zbiorów wskazań 53

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

do następnej grupy w liście filter-list. Dalsze informacje na ten temat można
znaleźć w części "Testowanie relacji" na stronie 172.

Przykład

Poniższe wyrażenie powoduje wybranie wszystkich Okręgów o promieniu
(kod grupy 40) większym lub równym 2.0:

(ssget "X" '((O . "CIRCLE") (-4 . ">=") (40 . 2.0)))
Logiczne grupowanie testów filtrujących

Oprócz opisanych poprzednio operatorów logicznych, grupy można testować
za pomocą zagnieżdżanych wyrażeń logicznych, wykorzystujących logiczne
operatory grupowe (przedstawione w rozdziale 4).

Operatory grupowe są określone za pomocą grup -4, podobnie jak operatory
relacji. Są one parowane i aby nie wystąpił błąd działania funkcji ssget mu-
szą być właściwie zrównoważone w liście filtrującej.

Przykład grupowania operatorów w liście filtrów pokazany jest poniżej:

(ssget "X" '((-4 . "(-4 . "(O . "CIRCLE")
(40 . 1.0)
(-4 . "AND>")
(-4 . "(O . "LINĘ")
(8 . "ABC")
(-4 . "AND>")
(-4 . "OR>")
)
)

Taki fragment programu powoduje wybranie wszystkich Okręgów o promieniu
1.0 oraz dodatkowo wszystkich Linii (elementów typu Linę) w warstwie "ABC".

Uwaga: Operatory grupowe nie zwracają uwagi na pisownię dużymi lub małymi
literami. Można używać także ich odpowiedników, pisanych małymi literami.

W samej grupie -3 operatory grupowe nie są dozwolone. Zgodnie z opisem
w części "Filtracja dodatkowych danych elementu", przy podawaniu w gru-
pie -3 wielu nazw aplikacji używany jest operator AND. Jeżeli potrzebne jest
sprawdzenie istnienia dodatkowych danych elementu przy użyciu innych
operatorów grupowych, można to osiągnąć przez podanie oddzielnych grup
-3 i pogrupowanie ich zgodnie z potrzebą. W celu wybrania wszystkich
Okręgów z dodatkowymi- danymi dla aplikacji "APP1" lub dla aplikacji
"APP2" (ale nie dla obu jednocześnie) można wykorzystać następujący kod:

(ssget "X" '((O . "CIRCLE")
(-4 . "(-3 ("APP1"))
(-3 ("APP2"))
(-4 . "XOR>")
)

54 Obsługa zbiorów wskazar

Rozdział 3

Przez podstawienie często wykorzystywanych operatorów grupowych pod
symbol można uprościć kodowanie programów. Poprzedni przykład można
napisać także w poniższy sposób (w przykładzie tym każda lista musi być
bezpośrednio poprzedzona apostrofem):

(setq xor> ' (-4 . "XOR>")

)

(ssget "X" (list' (O . "CIRCLE")
'(-3("APP1"))
' (-3 ("APP2"))
xor>

Jak widać, metoda ta może wydawać się pozbawiona sensu dla krótkich frag-
mentów kodu, jednak przy dużych programach posiada istotne zalety.

Operowanie na zbiorach wskazań

Po utworzeniu zbiorów wskazań do dodawania lub odejmowania elementów
od tych zbiorów można wykorzystywać funkcje ssadd i ssdel, podobne
w działaniu do opcji Dodaj i Usuń, stosowanych jako interakcyjna
odpowiedź na zgłoszenie AutoCAD-a Wskaż obiekty: lub Usuń obiekty: Fun-
kcja ssadd może być także wykorzystana do tworzenia nowych zbiorów
wskazań, co pokazuje poniższy przykład.

Przykład

Podany fragment kodu programu powoduje utworzenie zbioru wskazań, zawie-
rającego dwa elementy: pierwszy i ostatni, z bieżącego rysunku (funkcje
entnext i entlast są opisane w dalszej części tego rozdziału).

(setq fname (entnext)) Odczytanie pierwszego elementu rysunku

(setq Iname (entlast)) Odczytanie ostatniego elementu rysunku
(if (not fname)

(princ "\nNie ma żadnych elementów w rysunku. ")

(progn

(setq ourset (ssadd fname)) Utworzenie zbioru wskazań z pierwszego elementu

(ssadd Iname ourset) Dodanie ostatniego elementu do tego samego zbioru
) wskazań
)

Przykład ten zachowuje się poprawnie nawet wtedy, gdy baza danych zawiera
tylko jeden element rysunkowy (w takim wypadku obie funkcje: entnext
i entlast zwracają tę samą nazwę elementu rysunkowego). Jeśli funkcja ssadd
otrzyma jako argument nazwę elementu już istniejącego w zbiorze wskazań, po
prostu ignoruje żądanie umieszczenia go w zbiorze i nie raportuje błędu.

Poniższe wyrażenie usuwa pierwszy element ze zbioru wskazań utworzonego
w przykładzie poprzednim:

(ssdel fname ourset)
Jeśli w rysunku istnieje więcej, niż jeden element rysunkowy (co oznacza, że

Obsługa zbiorów wskazań 55

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

fname i Iname nie są równoważne), zbiór wskazań ourset zawiera teraz tylko Iname
- ostatni element w rysunku.

Funkcja ssiength zwraca liczbę elementów w zbiorze wskazań, a funkcja
ssmemb sprawdza, czy określony element rysunkowy wchodzi w skład zbioru
wskazań. Funkcja ssname zwraca nazwę określonego elementu w zbiorze
wskazań, wykorzystując indeks wewnątrz zbioru (elementy w zbiorze wskazań
są numerowane od zera).

Przykład

Poniższy fragment programu zawiera kilka wywołań funkcji ssname:

(setq sset (ssget)) Utworzenie zbioru wskazań (przez zażądanie tego od
użytkownika)

(setq ent1 (ssname sset 0)) Odczytanie nazwy pierwszego elementu w zbiorze
wskazań

(setq ent4 (ssname sset 3)) Odczytanie nazwy czwartego elementu w zbiorze
(if (not ent4) wskazań

(princ "\nKonieczne jest wybranie co najmniej czterech elementów.")
)

(setq ilast (ssiength sset)) Znalezienie indeksu ostatniego elementu w zbiorze

wskazań
(setq lastent (ssname sset (1- ilast))) Odczytanie nazwy ostatniego elementu w zbiorze

wskazań

Uwaga: Niezależnie od sposobu dodawania elementów do zbioru wskazań,
zbiór nigdy nie zawiera podwójnych elementów. Jeśli ten sam element jest
dodawany do zbioru wskazań wielokrotnie, wszystkie te operacje (poza pier-
wszą) są po prostu ignorowane. Z tej przyczyny ssiength zwraca dokładną
liczbę różnych elementów w wybranym zbiorze wskazań.

Funkcje operujące na nazwach i danych elementów
rysunkowych

Są dwie kategorie funkcji obsługujących elementy rysunkowe: funkcje odczy-
tujące nazwę wybranego elementu (przez przeszukanie bazy danych lub inter-
akcyjną współpracę z użytkownikiem AutoCAD-a) oraz funkcje odczytujące lub
modyfikujące dane elementów rysunkowych.

Funkcje operujące na nazwach elementów

Aby móc działać na elemencie rysunkowym, program w AutoLISP-ie musi
najpierw odczytać nazwę tego elementu, wykorzystywaną następnie w wy-
wołaniach funkcji operujących na danych elementów lub zbiorach wskazań.
Opisane w tej części dwie funkcje: entsel i nentsel, zwracają nie tylko na-
zwę, ale też dodatkowe informacje na temat elementu, które można później
wykorzystać w programie.

Obie funkcje wymagają, by użytkownik konwersacyjnie wybrał element
przez wskazanie punktu na ekranie graficznym: wszystkie pozostałe funkcje
działające na nazwach elementów mogą odczytywać elementy nawet wtedy,

56 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział 3

gdy nie są one widoczne na ekranie lub znajdują się w warstwie zablokowa-
nej. Funkcja entsel żąda od użytkownika AutoCAD-a wybrania elementu
przez wskazanie punktu na ekranie graficznym; entsel zwraca nazwę ele-
mentu oraz punkt wskazany przy wybieraniu tego elementu. Niektóre ope-
racje na elementach rysunkowych wymagają znajomości punktu, poprzez
który elementy te zostały wybrane. Przykłady takich operacji pochodzące ze
zbioru istniejących poleceń AutoCAD-a to: PRZERWIJ, UTNIJ i WYDŁUŻ.
Funkcja nentseijest szczegółowo omawiana w części "Zawartość elementów
i dane transformacji współrzędnych" w dalszym ciągu niniejszego rozdziału.

Funkcja entnext odczytuje kolejne nazwy elementów. Wywołanie entnext
bez argumentów powoduje zwrócenie przez nią pierwszego elementu rysun-
kowego w bazie danych. Jeśli argumentem jest nazwa elementu w bieżącym
rysunku, entnext zwraca nazwę elementu następnego.

Przykład

Poniższy fragment kodu programu ukazuje sposób wykorzystania funkcji
ssadd w połączeniu z entnext do utworzenia zbioru wskazań i dodania ele-
mentów do zbioru istniejącego.

(setq e1 (entnext))

(if (not e1) Przypisuje symbolowi e1 nazwę pierwszego elementu
(princ "\nNie ma żadnych elementów w rysunku. ")

(progn Przypisanie symbolowi ss pustego zbioru wskazań
(setq ss (ssadd)) Zwrócenie zbioru wskazańss z dodany'm elementem e1
(ssadd e1 ss) Odczytanie elementu występującego po e1
(setq e2 (entnexł e1)) Dodanie e2 do zbioru wskazań ss
(ssadd e2 ss)
)
)

Funkcja entlast odczytuje nazwę ostatniego elementu w bazie danych.
Ostatnim elementem jest ostatni utworzony rysunkowy element główny, tak
więc funkcja entlast może być wywoływana w celu odczytania nazwy ele-
mentu, który właśnie został utworzony przez wywołanie funkcji command.

Możliwe jest podstawianie nazwy elementu, zwracanego przez funkcję entnext,
jako argument dla tej funkcji. Daje to efekt "wędrowania" pojedynczego elementu
przez bazę danych. Na przykład:

(setq one_ent (entnext)) Odczytanie nazwy pierwszego elementu
(while one_ent

Przetwarzanie nowego elementu

(set one_ent (entnext one_ent)) Wartością one_entjest teraz nil
)

Identyfikatory elementów i ich wykorzystanie

Funkcja handent odczytuje nazwę elementu rysunkowego wraz z określonym
identyfikatorem. Identyfikatory elementów muszą być w bieżącym rysunku włą-
czone. Włączyć identyfikatory można albo poleceniem AutoCAD-a IDENT, albo
przez ustawienie zmiennej systemowej HANDLES na l (zmienna HANDLES ma
wartość O, gdy identyfikatory są wyłączone). Podobnie jak nazwy elementów,
identyfikatory elementów są unikalne w ramach rysunku i niezmienne przez ca-

Funkcje operujące na nazwach i danych elementów rysunkowych 57

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

ły czas jego istnienia (zakładając, że polecenie IDENT nie zostanie użyte do
zniszczenia wszystkich identyfikatorów w bazie danych rysunku). Progra-
my użytkowe w AutoLISP-ie, działające na określonych informacjach z bazy
danych, mogą wykorzystywać handent do uzyskania bieżącej nazwy elemen-
tu, który ma być wykorzystany.

Przykład

Poniższy przykład wykorzystuje funkcję handent do uzyskania nazwy ele-
mentu rysunkowego i drukuje tę nazwę:

(if (not (setq e1 (handent "5a2")))

(princ "\nNie ma elementu o podanym identyfikatorze. ")

(princ e1)
)

W jakiejś sesji rysunkowej mógłby pojawić się wydruk:



Podczas innej sesji nad tym samym rysunkiem, powyższy przykład może wy-
drukować zupełnie inną liczbę. Jednak w obu przypadkach przedstawiony frag-
ment programu będzie czytał dane tego samego elementu rysunkowego.

Funkcja handent ma także inne zastosowanie: elementy usunięte z bazy da-
nych (z wykorzystaniem opisanej dalej funkcji entdel) nie są wymazywane
aż do zakończenia sesji rysunkowej. Oznacza to, że handent może wciąż od-
czytywać nazwy usuniętych elementów, które mogą być przywrócone na ry-
sunek podczas następnego wywołania funkcji entdel.

Uwaga: Jeśli identyfikatory w rysunku są włączone, to są one przydzielane
definicjom Bloków, włącznie z elementami składowymi Bloków, a także do-
datkowym danym elementów. Więcej informacji na ten temat zawiera AutoCAD
Podręcznik Użytkownika.

Elementy rysunkowe wywoływane przez ODNOŚNIK Dołącz nie są w rzeczy-
wistości elementami bieżącego rysunku. Ich identyfikatory nie są zmieniane,
lecz nie są dostępne przez handent. Jeśli jednak rysunki są połączone polece-
niem WSTAW, WSTAW*, ODNOŚNIK Ustal lub przez wczytanie częściowego
pliku DXF, istniejące we wczytywanych plikach identyfikatory są tracone (o ile
w ogóle istniały), a wczytywane elementy otrzymują nowe wartości identyfika-
torów. Postępowanie takie gwarantuje, że każdy identyfikator w bieżącym ry-
sunku będzie unikalny.

Uwaga: Opisane w dalszej części tego rozdziału dodatkowe dane elementów
mogą zawierać identyfikatory elementów, w celu zachowania relacyjnych
struktur w rysunku. Czasami identyfikatory te wymagają przetłumaczenia
lub innej szczególnej obsługi. Szczegóły podane są w części "Identyfikatory
w dodatkowych danych elementów" w dalszym ciągu niniejszego rozdziału.

Kontekst elementu i dane transformacji współrzędnych

Funkcje nentsel i nentsełp są podobne do entsel, ale różnią się od niej tym,
że zwracają dwie dodatkowe wartości, które mają znaczenie przy obsłudze
elementów zagnieżdżonych wewnątrz wywołań bloków.

Ważne: Inna różnica pomiędzy tymi funkcjami polega na tym, że gdy użytkow-
nik odpowiada na zgłoszenie funkcji nentsel wskazaniem elementu złożonego,
lub element złożony jest wybrany przez nentsełp, funkcje te zwracają nazwę
wskazanego elementu składowego, bez nagłówka elementu złożonego - inaczej

58 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział 3

niż funkcja entsel. Na przykład po wskazaniu przez użytkownika Polilinii,
nentsel zwraca element składowy Wierzchołek (Vertex), a nie nagłówek Poli-
linii. W celu odczytania nagłówka Polilinii, program musi przejść do elementu
składowego Seqend za pomocą funkcji entnext i odczytać nazwę nagłówka
z grupy -2 elementu składowego Seqend. Te same rozważania odnoszą się do
sytuacji wybierania Atrybutów w zagnieżdżonym wywołaniu Bloku. Ogólnie
mówiąc, bardziej zalecane jest używanie funkcji nentsełp niż nentsel, gdyż ta
pierwsza zwraca macierz transformacji w postaci takiej samej, jak macierz
zwracana przez grvecs.

Pierwszym dodatkowym elementem, zwracanym przez funkcję nentsel, jest
Macierz Transformacji z Układu Modelu do Układu Globalnego. Jest to lista
zawierająca cztery podlisty, z których każda zawiera zestaw współrzędnych.
Macierz ta może być wykorzystana do przetransformowania punktów defi-
niujących element rysunkowy, z wewnętrznego układu współrzędnych nazy-
wanego Układem Współrzędnych Modelu (UWM), do Globalnego Układu
Współrzędnych (GUW). Punkt wstawienia Bloku (dotyczy to także Odnoś-
ników zewnętrznych (Xref)) zawierającego wybrany element rysunkowy de-
finiuje początek UWM. Kierunek osi tego układu jest określony przez osie
układu LUW, obowiązującego podczas tworzenia Bloku.

Drugim dodatkowym elementem jest lista zawierająca nazwę elementu -
Bloku, zawierającego wybrany element rysunkowy. Jeśli wybrany element
jest umieszczony w Bloku zagnieżdżonym (w Bloku wewnątrz innego Blo-
ku), lista zawiera dodatkowo nazwy wszystkich elementów - Bloków, we-
wnątrz których zagnieżdżony jest wybrany element, poczynając od Bloku
najbardziej zagnieżdżonego w stronę "na zewnątrz", aż do napotkania naj-
bardziej zewnętrznego Bloku wstawionego w rysunek.

( Nazwa elementu
(Px Py Pz) Punkt wybierający
{ (X0 YO ZO) Macierz transformacji z układu modelu
(X1 Y1 Z1) do układu globalnego
(X2 Y2 Z2)
(X3 Y3 Z3)

)

( Nazwa najbardziej zagnieżdżonego
bloku zawierającego wybrany element

) Nazwa najbardziej zewnętrznego blo-
) ku zawierającego wybrany element
bloku

Na użytek poniższego przykładu można przyjąć, że bieżącym układem
współrzędnych jest GUW. Można utworzyć Blok o nazwie KWADRAT, na
który składają się cztery Linie:

Polecenie: linia
Od punktu: 1,1
do punktu: 3,1
do punktu: 3,3
do punktu: 1,3
do punktu: z

Polecenie: blok

Nazwa bloku (lub ?): kwadrat

Punkt bazowy wstawienia: 2,2

Wskaż obiekty: Należy wybrać narysowane właśnie cztery linie

Funkcje operujące na nazwach i danych elementów rysunkowych 59

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Wskaż obiekty: Enter

Następnie można wstawić Blok w układzie LUW, obróconym o 45 stopni wo-
kół osi Z:

Polecenie: luw

Poczqtek/Os(z)/3pkt/Element/Widok/X/Y/Z/POPrz/WYWotaj/Za-
pisz/Usuń/?/: z
Kqt obrotu wokół osi Z <0>: 45

Polecenie: wstaw

Nazwa bloku (lub ?); kwadrat

Punkt wstawienia: 7,0

Współczynnik skali X <1> / Narożnik / XYZ; Enter

Współczynnik skali Y (propozycja=X): Enter

Kqt obrotu: Enter

Wykorzystanie nentsel do wybrania lewej dolnej krawędzi kwadratu:

(setq ndata (nentsel))
powoduje przypisanie symbolowi ndata listy podobnej do pokazanej:

(
(6.46616-1.06060.0)
( (0.7071070.7071070.0)

(-0.707107 0.707107 0.0)

(0.0 -0.0 1.0)

(4.94975 4.94975 0.0)

Nazwa elementu

Punkt wybierający

Macierz transformacji układu modelu

na układ globalny

()

Po uzyskaniu nazwy elementu i Macierzy Transformacji Model - GUW, moż-
na dokonać transformacji punktów definiujących element z UWM do GUW.
Do uzyskania tych punktów, wyrażonych w układzie UWM, należy wykorzy-
stać funkcje entget i asssoc w odniesieniu do nazwy elementu. Następnie
trzeba wstawić te punkty i Macierz Transformacji Model - GUW (otrzymaną
w wyniku działania funkcji nentsel) do poniższych wzorów.

Jeżeli wybrany element rysunkowy nie jest zagnieżdżony, macierz transfor-
macji jest po prostu macierzą jednostkową:

100'
010
001
000.

Poniższe równania pokazują sposób transformacji punktu lub wektora:

X' = XMoo + YMw + ZMw + Mso
Y' = XMoi + YMu + ZM2i + Msi
Z' = XMo2 + YMu + ZM22 + Ms2

Współczynniki My, gdzie 0<= i,j<= 2, są składnikami Macierzy Transformacji
Model - GUW, -X", Y i Z są współrzędnymi punktu definiującego element rysun-
kowy we współrzędnych UWM, a X, Y i Z są przetransformowanymi współ-
rzędnymi punktu definiującego element, wyrażonymi we współrzędnych GUW.

Uwaga: Aby dokonać transformacji wektora, a nie punktu, nie należy we
wzorze dopisywać wektora [ Afso Mai Ms2 ] (w czwartej kolumnie macierzy
transformacji).

60 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdziało

Poniższy przykład ukazuje, jak uzyskać punkt początkowy Linii (kod grupy 10)
w układzie UWM, umieszczonej w definicji Bloku. Wyrażenie

(setq edata (assoc 10 (entget (car ndata))))

zachowuje dane elementu (wykorzystując nazwę elementu uzyskaną dzięki
wcześniejszemu zastosowaniu funkcji nentsel) pod symbolem edata i zwra-
ca:

(10-1.0 1.00.0)
Wyrażenie

(setq matrix (caddr ndata))

przechowuje podlistę Macierzy Transformacji Model - GUW pod symbolem matrix
i zwraca:

( (0.707107 0.707107 0.0) transformacja X
(-0.707107 0.707107 0.0) transformacja Y
(0.0 -0.0 1.0) transformacja Z
(4.94975 4.94975 0.0) przemieszczenie od początku GUW

)

Należy teraz zastosować wzór transformacyjny i zamienić współrzędną X
punktu początkowego Linii w UWM we współrzędną-X7 w GUW. Wynik moż-
na przechować pod symbolem answer:

(setq answer
(+ dodanie:

(* (car (nth O matrix)) (cadr edata)) Moo * -X"
(* (car (nth 1 matrix)) (caddr edata)) Afio * Y
(* (car (nth 2 matrix)) (cadddr edata)) M20 * Z
(car (nth 3 matrix)) Mso

)
)

Powyższa sekwencja zwraca liczbę 3.53553, która jest współrzędną-X"punktu
początkowego wybranej Linii, wyrażoną w GUW.

Funkcje operujące na danych elementów rysunkowych

Funkcje opisane w tej części operują na danych elementów rysunkowych i mo-
gą być wykorzystywane do modyfikowania bieżącej bazy danych.

Funkcja entdel usuwa wskazany element rysunkowy. Element nie jest wyma-
zywany z rysunkowej bazy danych aż do zakończenia bieżącej sesji edycyjnej,
więc jeśli program użytkowy wywoła entdel po raz drugi podczas bieżącej sesji,
element zostaje przywrócony (wcześniej opisano funkcję handent, podającą na-
zwy usuniętych elementów rysunkowych).

Uwaga,' Atrybuty i Wierzchołki Polilinii nie mogą być usuwane niezależnie od
ich elementów nadrzędnych, entdel działa wyłącznie na głównych elementach
rysunkowych. W razie konieczności usunięcia Atrybutu lub Wierzchołka Poli-
linii można wykorzystać funkcję command, wywołującą polecenie AutoCAD-a
ATTRED lub EDPLIN.

Funkcje operujące na nazwach i danych elementów rysunkowych 61

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Funkcja entget zwraca dane definiujące wybrany element rysunkowy. Dane te ma-
ją postać listy. Każda pozycja listy jest oznaczona przez kod grupy w standardzie
DXF. Pierwsza pozycja listy zawiera bieżącą nazwę elementu.

Przykład

W poniższym przykładzie zakładamy, że w bieżącym rysunku istnieje następujący
(standardowy) stan:

Warstwą aktualną jest 0.

Aktualnym rodzajem linii jest CONTINUOUS.

Aktualnym poziom wynosi 0.

Identyfikatory elementów nie są przydzielane.

Wykorzystując następującą sekwencję poleceń użytkownik narysował Linię:

Polecenie: linia
Od punktu: 1,2
Do punktu: 6,6
Do punktu: Enter

Wywołana później procedura AutoLISP-u, podana poniżej, może odczytać i wy-
drukować dane definiujące Linię, wykorzystując opisywane w tej części fun-
kcje:

(defun C:DRUKDXF (/ ent enti et)

(setq ent (entlast)) Przypisanie symbolowi ent ostatniego elementu
(setq enti (entget ent)) Przypisanie symbolowi ent1 listy asocjacji ostatniego

elementu
(setq et 0) Ustawienie et (licznika) na O
(textpage) Przełączenie ekranu w tryb tekstowy
(princ "\nWynik zastosowania entget do ostatniego elementu: ")
(repeat (length enti) Powtórzenie tyle razy, ile jest elementów w liście

(print (nth et enti)) Wydrukowanie nowej linii i każdego elementu listy

(setq et (1 + et)) Zwiększenie licznika o l

)
(princ) Niezauważalne zakończenie funkcji

)

Wydruk będzie wyglądał następująco (wartość nazwy elementu będzie się zmieniała):

(-1 . )

(O . "LINĘ")

(8 ."O")

(10 1,02.00.0)

(11 6.0 6,0 0.0)

(2100.00.0 1.0)

Pierwszy składnik listy (o kodzie grupy -l) zawiera nazwę elementu rysun-
kowego, którego dane przedstawia ta lista. Nazwa ta służy opisanej dalej
funkcji entmod do identyfikacji elementu do zmodyfikowania.

Kody składników elementu są kodami standardu DXF, opisanymi w do-
datku B niniejszego podręcznika oraz w rozdziale llAutoCAD Podręcz-
nik Adaptacyjny. Podobnie jak w plikach DXF, pozycje nagłówka ele-
mentu (kolor, rodzaj linii, grubość, znacznik wystąpienia atrybutów
i identyfikator elementu) są zwracane tylko wtedy, gdy ich wartości są
niestandardowe. Inaczej niż w plikach DXF, opcjonalne pola definicji ele-
mentu są zwracane niezależnie od tego, czy ich wartości są zgodne ze stan-

62 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział 3

dardowymi, czy nie. Ma to na celu uproszczenie przetwarzania danych ele-
mentu: program użytkownika może przyjąć, że pola te występują zawsze.
Również inaczej niż w plikach DXF, powiązane ze sobą współrzędne X, Y, Z
są zwracane jako jedna zmienna punktowa, a nie jako oddzielne grupy X(10),
V(20) i Z(30).

Funkcja assoc wyszukuje w liście grupę podanego typu:

(cdr (assoc O ent1))

Takie wyrażenie zwróciłoby typ elementu "LINĘ" (kod grupy 0), odczytany
z listy ent1. Jeśli podany kod grupy DXF nie występuje w liście (lub nie jest
ważnym kodem DXF), assoc zwraca nil.

Funkcja entmod modyfikuje element rysunkowy. Przesyła ona listę tego sa-
mego formatu, jak lista zwracana przez entget, ale (prawdopodobnie) z war-
tościami grup elementu zmodyfikowanymi przez program. Funkcja entmod
jest dopełnieniem funkcji entget; podstawowy mechanizm wprowadzania
zmian bazy danych przez programy użytkowe w AutoLISP-ie polega na wy-
dobyciu elementu za pomocą entget, zmodyfikowaniu listy jego danych i za-
pisanie zmodyfikowanej listy w bazie za pomocą funkcji entmod.

Przykład

Poniższy fragment kodu programu uzyskuje dane definiujące pierwszy element
rysunku i zmienia jego warstwę na MYLAYER:

(setq en (entnext)) Przypisuje en nazwę pierwszego elementu w rysunku
(setq ed (entget en)) Przypisuje ed dane elementu en
(setq ed
(subst (cons 8 "MYLAYER")

(assoc 8 ed) Zmienia grupę warstwy w ed na warstwę MYLAYER

ed )

)
(entmod ed) Modyfikuje w rysunku warstwę elementu en

Zmiany, jakie funkcja entmod może wprowadzać w bazie danych, podlegają pew-
nym ograniczeniom:

entmod nie może zmieniać typu elementu ani jego identyfikatora.

AutoCAD musi rozpoznać wszystkie elementy (poza warstwami), do któ-
rych odwołuje się lista elementu.

Nazwy stylu tekstu, rodzaju linii, kształtu i bloku, występujących w ele-
mencie, muszą być zdefiniowane w bieżącym rysunku zanim lista ele-
mentu zostanie odczytana przez entmod.

Wyjątek: entmod akceptuje nowe nazwy warstw.

Jeśli lista elementu odwołuje się do nazwy niezdefiniowanej dotychczas w bie-
żącym rysunku warstwy, entmod tworzy nową warstwę. Atrybutami tej war-
stwy są standardowe wartości, stosowane przy opcji Nowa polecenia
AutoCAD-a WARSTWA.

entmod nie może zmieniać pól wewnętrznych. Polami wewnętrznymi są
wartości, przypisywane przez AutoCAD pewnym grupom: -2 (odwołanie
do nazwy elementu), -l (nazwa elementu) 5 (identyfikator elementu).

Funkcje operujące na nazwach i danych elementów rysunkowych 63

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Każda próba zmiany pola wewnętrznego, na przykład nazwy głównego
elementu w elemencie składowym Seqend (grupa -2) jest po prostu igno-


rowana.

entmod nie może zmieniać Rzutni (elementów typu Viewport).

Próba zmodyfikowania Rzutni powoduje błąd.

Funkcja entmod może modyfikować elementy składowe, takie jak Wierzchołki
Polilinii i Atrybuty Bloków.

Ostrzeżenie: Użycie entmod w odniesieniu do elementu w definicji Bloku
wpłynie na wszystkie wywołania tego Bloku typu WSTAW i ODNOŚNIK.
Elementy w definicji Bloku nie mogą być usunięte przez entdel.

Posługując się funkcją entmake, program użytkowy może też dodać element do
bazy rysunkowej. Podobnie jak dla entmod, argumentem dla funkcji entmake
jest lista o formacie podobnym do formatu listy, zwracanej przez entget. Nowy
element rysunku, opisywany poprzez listę, jest dodawany do bazy danych ry-
sunku, stając się ostatnim elementem rysunku. Jeśli element ten jest elemen-
tem złożonym (Polilinią lub Blokiem), nie zostanie on dodany do bazy przed jego
całkowitym zdefiniowaniem. Jest to opisane dalej w tej części.

Przykład

Podany kod powoduje utworzenie Okręgu (elementu typu Circie) w war-
stwie MYLAYER.

(entmake '((O . "CIRCLE")
(8 . "mylayer")
(105.07.00.0)
(40 . 1.0)
)

Typ elementu
Warstwa
Środek okręgu
Promień

Ograniczenia dotyczące entmake przypominają ograniczenia związane z funkcją
entmod:

Pierwszy lub drugi składnik listy musi określać typ elementu.
Typ musi być ważnym kodem grupy w standardzie DXF.

Jeśli pierwszy składnik nie określa typu, to może on określać jedynie na-
zwę elementu: grupę -l (nazwa nie jest zapisywana do bazy danych).

AutoCAD musi rozpoznać wszystkie elementy (poza warstwami), do których
odwołuje się lista elementu.

Wyjątek: entmake akceptuje nowe nazwy warstw.

Dowolne pola wewnętrzne, podawane w liście argumentu entmake, są igno-
rowane.

entmake nie może zmieniać Rzutni (elementów typu Viewport).

Obie funkcje: entmod i entmake dokonują takiego samego sprawdzenia spój-
ności podanych im danych elementu, jakiego dokonuje polecenie AutoCAD-a
DXFWE podczas wczytywania plików DXF. Funkcje te przestają działać, jeśli
nie są w stanie utworzyć poprawnych elementów rysunku.

64 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział3

Bloki bez nazwy

Tablica z definicjami istniejących w rysunku Bloków (tablica BŁOCK) może za-
wierać bloki anonimowe. Są to Bloki tworzone w związku z operacjami kresko-
wania obszarów wybranym wzorem oraz wymiarowania zespolonego. Mogą
one być również tworzone przez funkcję entmake, zwykle w związku z potrze-
bami przechowywania elementów, do których użytkownik nie ma bezpośrednie-
go dostępu. Podczas każdego inicjowania sesji rysunkowej wszystkie niewy-
korzystywane definicje Bloków anonimowych są usuwane z tablicy BŁOCK.
Bloki wywołane w rysunku (WSTAWione w rysunek) nie są usuwane. Do utwo-
rzenia wywołania Bloku Bez nazwy (elementu typu INSEKT) można wykorzy-
stać funkcję entmake (Bloku anonimowego nie można umieścić w rysunku po-
leceniem WSTAW); entmake może służyć również do modyfikowania definicji
Bloków anonimowych. Elementy wewnątrz Bloku (ale nie sam Blok) mogą być
modyfikowane za pomocą funkcji entmod.

Nazwą Bloku anonimowego (grupa o kodzie 2), utworzonego przez AutoLISP
lub ADS, jest "Unnn, gdzie nnn jest numerem generowanym przez AutoCAD.
Ponadto najmniej znaczący bit znacznika typu bloku (grupa o kodzie 70) jest
w Bloku anonimowym jedynką. Jeżeli za pomocą funkcji entmake tworzony
jest Blok, którego nazwa rozpoczyna się od znaku * i dla którego ustawiony
jest najmniej znaczący bit w znaczniku typu Bloku, to AutoCAD rozpoznaje
to jako tworzenie Bloku anonimowego i nadaje mu nazwę. Wszelkie dodat-
kowe znaki, występujące po gwiazdce * w łańcuchu określającym nazwę Blo-
ku dla entmake, są ignorowane.

Ostrzeżenie: Chociaż Blok anonimowy, wskazywany wstawionym do rysunku
odnośnikiem, staje się stałym składnikiem rysunku, to jednak jego nazwa może
ulegać zmianie w kolejnych sesjach edycyjnych. Dlatego programy użytkowe
nie mogą zakładać, że nazwy bloków anonimowych są stałe.

Tworzenie elementów złożonych

Element złożony (Polilinia lub Blok) jest tworzony przez wielokrotne wywoływa-
nie funkcji entmake, oddzielne dla każdego elementu składowego. Gdy entmake
otrzyma pierwszy składnik elementu złożonego, zakłada tymczasowy plik dys-
kowy przechowujący dane definiujące (oraz dane dodatkowe, o ile istnieją; patrz
część ("Uwagi o dodatkowych danych elementu", na stronie 68). Przy każdym ko-
lejnym wywołaniu entmake sprawdza ona obecność tego pliku. Jeżeli plik taki ist-
nieje, dodawane są do niego nowe dane. Po zakończeniu definiowania nowego ele-
mentu złożonego (czyli po przesłaniu do entmake odpowiedniego elementu skła-
dowego Seqend lub Endbik), podane dane są ponownie sprawdzane i w przypad-
ku ich poprawności do rysunku dodawany jest nowy element złożony. Plik jest
usuwany po zakończeniu definiowania elementu złożonego, lub po przerwaniu
tworzenia elementu.

Ostrzeżenie: Element nie pojawia się w rysunkowej bazie danych aż do chwili,
gdy ostatni element składowy Seqend lub Endbik nie zostanie przekazany do ent-
make. W szczególności funkcja entlast nie może być wykorzystana do uzyskania
ostatniego utworzonego elementu składowego elementu złożonego, dopóki nie zo-
stanie zakończone tworzenie elementu złożonego.

Z poprzedniego akapitu wynika, że entmake może jednocześnie konstruować
tylko jeden element złożony. Jeżeli podczas tworzenia elementu złożonego fun-
kcja entmake otrzyma niepoprawne dane lub element nie będący właściwym
elementem składowym, wówczas odrzucana jest definicja zarówno tego niewła-

Funkcje operujące na nazwach i danych elementów rysunkowych 65

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

ściwego elementu, jak i całego elementu złożonego.

Poniższy przykład tworzy pojedynczy element złożony (Polilinię) poprzez pięć
wywołań funkcji entmake. Polilinia jest narysowana z użyciem linii rysunko-
wej o nazwie KRESKOWA i koloru NIEBIESKI. Posiada ona trzy wierzchołki
umieszczone w punktach o współrzędnych (1,1,0), (4,6,0) i (3,2,0). Wszystkie
pozostałe opcjonalne dane definicji elementu przyjmuj ą wartości standardowe
(aby przykład działał właściwie musi być wczytana definicja rodzaju linii
KRESKOWA).

(entmake '((O . "POLYLINE") Typ elementu

(62 . 5) Kolor

(6 . "kreskowa") Rodzaj linii

(66 . 1) Będą wierzchołki
)
)
(entmake '((O . "VERTEX") Typ elementu

(10 1.0 1.0 0.0) Punkt początkowy

)
)

(entmake '((O . "VERTEX") Typ elementu
(10 4.0 6.0 0.0) Drugi punkt

)
)

(entmake '((O . "VERTEX") Typ elementu
(10 3.0 2.0 0.0) Trzeci punkt

)
}
(entmake '((O . "SEQEND"))) Koniec sekwencji

Definicja bloku rozpoczyna się elementem Błock i kończy elementem skła-
dowym Endbik. Definicja Bloku nie może być zagnieżdżana, ani nie może wy-
woływać samej siebie. Dopuszczalne jest jednak umieszczanie w definicji
Bloku odwołań do definicji innych Bloków.

Ostrzeżenie: Blok tworzony przez funkcję entmake może zastąpić blok już
istniejący, jako że funkcja entmake nie sprawdza konfliktu nazw w tablicy
definicji Bloków. Dlatego przed użyciem jej do utworzenia Bloku, należy za
pomocą funkcji tbisearch (opisanej w części "Dostęp do tablic symboli" na
stronie 75) sprawdzić, czy nazwa nowego Bloku nie jest już wykorzystana ja-
ko nazwa Bloku istniejącego. Użyteczne może być jednak wykorzystywanie
funkcji entmake do przedefiniowywania bloków anonimowych, opisanych
w następnym podrozdziale.

W przypadku Bloków wstawionych w rysunek (elementy INSERT), może
występować kod grupy 66 (znacznik wystąpienia atrybutów). Jeżeli grupa
taka występuje i ma wartość l, po elemencie Insert spodziewane jest wystą-
pienie ciągu Atrybutów (elementów Attrib). Ciąg Atrybutów jest kończony
przez element składowy Seqend.

Elementy Połyline (Polilinię) zawsze zawierają znacznik wystąpienia wierz-
chołków (także grupa 66). Wartość tej grupy musi wynosić l. Po elemencie
Połyline musi wystąpić ciąg elementów Vertex (Wierzchołek), zakończony
elementem składowym Seqend.

Elementy złożone mogą istnieć albo w obszarze papieru, albo w obszarze
modelu, ale nie w obu obszarach. Jeśli podczas konstruowania elementu zło-

66 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział 3

żonego, wskutek wprowadzenia przez funkcję command polecenia MODEL
lub PAPIER, ulegnie zmianie bieżący obszar, kolejne wywołanie entmake
unieważni cały element złożony. Może to wystąpić także wtedy, gdy element
składowy posiada grupę 67, której wartość nie zgadza się z wartością grupy
67 nagłówka elementu.

Funkcje danych elementu i ekran graficzny

Zmiany wprowadzane przez funkcje operujące na danych elementu zostają
uwidocznione na ekranie graficznym, pod warunkiem jednak, że usuwany,
przywracany, modyfikowany lub tworzony element znajduje się w widocznej
na ekranie części rysunku, w aktualnie widocznej warstwie. Istnieje jednak
jeden wyjątek od tej reguły: jeśli funkcja entmod zostaje użyta do zmodyfi-
kowania elementu składowego, nie następuje zmiana obrazu całego elemen-
tu złożonego. Przyczyna takiego zachowania się powinna być jasna: gdyby na
przykład program użytkowy miał metodą 100 wywołań funkcji entmod zmo-
dyfikować 100 wierzchołków złożonej Polilinii, czas przeliczania i regenero-
wania na ekranie całej Polilinii po zmianie każdego jej wierzchołka byłby nie-
akceptowalnie długi. Aby tego uniknąć, program użytkownika może dokonać
szeregu modyfikacji elementów składowych, a następnie spowodować prze-
rysowanie na ekranie całego elementu za pomocą pojedynczego wywołania
funkcji entupd.

Przykład

Jeżeli pierwszym elementem rysunku jest Polilinia o kilku wierzchołkach.
Poniższy kod modyfikuje drugi Wierzchołek (element składowy Vertex) i re-
generuje obraz na ekranie:

(setq e1 (entnext)) Przypisuje e1 nazwę elementu Polyline
(setq v1 (entnext e1)) Przypisuje v1 pierwszy wierzchołek Polilinii
(setq v2 (entnext v1)) Przypisuje v2 drugi wierzchołek Polilinii
(setq v2d (entget v2)) Przypisuje v2d dane wierzchołka
(setq v2d

(subst'(10 1.02.00.0)

(assoc10v2d) Zmienia położenie wierzchołka w v2d na punkt
v2d (1,2,0)

}
)

(entmod v2d) Przesuwa wierzchołek w rysunku
(entupd e1) Regeneruje element e1 -Polyline

Argumentem funkcji entupd może być zarówno element składowy, jak i element
główny. W obu wypadkach funkcja przerysowuje cały element. Chociaż funkcja
ta, tak jak w powyższym przykładzie, jest przeznaczona przede wszystkim do
użycia w odniesieniu do elementów głównych, to jednak może przerysować każdy
element w rysunku.

Ostrzeżenie: Jeśli modyfikowanym elementem jest definicja Bloku, wów-
czas użycie funkcji entupd nie jest wystarczające. W takich wypadkach, do
zapewnienia przerysowania wszystkich odwołań do tej definicji, konieczne
jest regenerowanie rysunku przez wywołanie polecenia REGEN (poprzez
funkcję command).

Funkcje operujące na nazwach i danych elementów rysunkowych 67

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Uwagi o przetwarzaniu gładkich krzywych sklejanych

Przechodząc kolejno od jednego wierzchołka Polilinii do następnego, przy uży-
ciu funkcji entnext, można napotkać wierzchołki, które nie zostały bezpośrednio
wprowadzone przez użytkownika. Dodatkowe wierzchołki są wstawiane auto-
matycznie przez opcje "Krzywa" i "SPlajn" polecenia EDPLIN. Ponieważ
zmiany dokonywane w odniesieniu do tych wierzchołków i tak tracą waż-
ność w momencie ponownego użycia polecenia EDPLIN w celu przetworze-
nia Polilinii na gładką krzywą sklejaną łukową lub typu B-splajn, to celowe
wydaje się pominięcie tych wierzchołków.

Na podstawie znaczników związanej z Polilinią grupy o kodzie 70 można zo-
rientować się, jaki rodzaj krzywej został utworzony w oparciu o jej wierz-
chołki. W przypadku sklejanych krzywych łukowych (opcja "Krzywa")
stwierdzamy obecność bitu o wartości 2 (drugi). Natomiast w przypadku
krzywej typu splajn niezerowyjest bit 4 (trzeci). Jeżeli oba te bity mają war-
tość zerową, to Polilinią ma wszystkie wierzchołki normalne.

Jeżeli jedynką jest bit odpowiadający krzywej łukowej (2), to wszystkie wie-
rzchołki dodane w procesie jej tworzenia (tzn. co drugi wierzchołek) będą po-
siadały w swoich grupach o kodzie 70 niezerowy bit pierwszy (l). Jeżeli fun-
kcja entmod jest używana w celu zmiany położenia wierzchołków takiej po-
lilinii z intencją ponownego utworzenia gładkiej krzywej łukowej za pomocą
polecenia EDPLIN, to wierzchołki takie należałoby raczej pominąć.

Uwagi o dodatkowych danych elementu

Do obsługi dodatkowych danych elementu, tworzonych przez programy użyt-
kowe napisane w AutoLISP-ie lub ADS, przewidziano kilka funkcji
AutoLISP-u. Dodatkowe dane elementu zostały wprowadzone w AutoCAD
Wydanie 11, w celu wykorzystania ich przez programy pisane przez użyt-
kowników oraz przez interfejs API (Application Programming Interface) pa-
kietu AME (Advanced Modelling Extension). Jeśli element zawiera dane do-
datkowe, to występują one po regularnych definiujących ten element danych.
Jest to pokazane na ilustracji 3-1.

Dane dodatkowe elementu mogą być uzyskane przez wywołanie funkcji
entget. Funkcja entget odczytuje regularne dane definicji elementu oraz
dane dodatkowe dla programów użytkowych, określonych w wywołaniu tej
funkcji.

Uwaga: Gdy dodatkowe dane elementu są odczytywane przez funkcję
entget, początek tych danych jest wskazywany przez kod -3. Kod -3 wystę-
puje w liście poprzedzającej pierwszą grupę 1001. Grupa 1001 zawiera na-
zwę pierwszej odczytanej aplikacji, tak jak pokazano to na ilustracji i opisa-
no w następnych częściach.

68 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział 3

Kod grupy Pole

(-1 ,-2 Nazwa elementu
(0-239 Pola definicji zwykłych danych elementu)

Definicje zwykłych
danych elementu

(-3 Przedrostek danych dodatkowych
(1001 Nazwa 1 zarejestrownej aplikacji)
(1000,
1002-1071 Pola danych dodatkowych

(1001 Nazwa 2 zarejestrownej aplikacji)
(1000,
1002-1071 Pola danych dodatkowych)

Dodatkowe dane
elementu

(1001 Nazwa 3 zarejestrowanej aplikacji)

Struktura dodatkowych danych elementu

Jak widać na ilustracji, dane dodatkowe składają się z jednej lub więcej grup
1001, z których każda rozpoczyna się unikalną nazwą aplikacji.

Grupy dodatkowych danych elementu zwracane przez entget występują po
regularnych danych definiujących element, w takiej kolejności, w jakiej są
zapisane w bazie danych. To także jest schematycznie przedstawione na ilu-
stracji.

Wewnątrz każdej grupy związanej z daną aplikacją, zawartość, znaczenie
i organizacja danych jest zdefiniowana przez tę aplikację. AutoCAD przecho-
wuje te informacje, lecz z nich nie korzysta. Jak widać na ilustracji, kody
grup dla danych dodatkowych zawierają się w przedziale od 1000 do 1071.
Wiele z tych kodów grup przeznaczonych jest do przechowywania danych
znanych typów, zgodnie z poniższym wykazem:

Łańcuch 1000. Wartości typu string w dodatkowych danych elementu
znaków mogą mieć długość do 255 bajtów (z 256-tym bajtem zarezer-
(string) wowanym na znak null).

Funkcje operujące na nazwach i danych elementów rysunkowych 69

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Nazwa 1001 (również 7 wartość typu string. Nazwy programów użyt-
programu kowych (aplikacji) mogą mieć długość do 31 bajtów (32-gi bajt
użytkowego jest zarezerwowany na znak null) i muszą być zgodne z reguła-
mi tworzenia nazw dla tablic symboli (jak nazwy warstw).
Nazwa aplikacji może zawierać litery, cyfry i znaki specjalne $
(znak dolara), - (myślnik) i _ (podkreślenie). Nie może zawierać
znaków odstępu (spacji). Małe litery w nazwie są przekształca-
ne na duże. Sposób użycia nazw programów użytkowych jest
bardziej szczegółowo opisywany dalej w tej części.

Nazwa 1003. Nazwa warstwy powiązanej z dodatkowymi danymi
warstwy elementu.

Identyfikator 1005. Identyfikatory elementów w rysunkowej bazie danych.
w bazie W pewnych warunkach AutoCAD dokonuje ich tłumaczenia,
danych tak jak opisano to w części "Identyfikatory w dodatkowych
danych elementu" na stronie 74.

Punkt 3W 1010. Trzy wartości typu redl, będące współrzędnymi punktu.
Real 1040. Wartość typu redl (liczba rzeczywista).

Integer 1070. 16-bitowa liczba całkowita (typu integer, ze znakiem
lub bez).

Long 1071. 32-bitowa liczba całkowita long (integer). Jeżeli war-
tość, która pojawia siew grupie 1071, jest liczbą całkowitą 16-
bitową short (integer) lub liczbą rzeczywistą (typu real), to jest
ona przekształcana na 32-bitową liczbę całkowitą long (inte-
ger). Jeżeli jest to wartość nieprawidłowa dla grupy 1071 (np.
typu string), to jest ona przekształcana na wartość zero typu
(long integer - OL).

Uwagd: AutoLISP traktuje grupy 1071 jak wartości rzeczy-
wiste. Jeśli do odczytu wartości tej grupy zostanie
wykorzystana funkcja entget, to zwrócona zostanie wartość
rzeczywista (typu real), na przykład:

(1071 , 12.0)

Jeśli z pomocą funkcji entmake lub entmode użytkownik zamierza
utworzyć dla elementu grupę 1071, to możemy użyć zarówno war-
tości rzeczywistej, jak i całkowitej. Na przykład:

(entmake '((...
(entmake '((...
(entmake '((...
(entmake'((...

.. (1071 . 12) ....)))

.. (1071 . 12.0) .... )))

.. (1071 . 65537.0) .... )))

.. (1071 . 65537) .... )))

Mimo to, AutoLISP wciąż będzie zwracał wartości tej grupy jako
rzeczywiste (typu real).

(entmake '((..... (1071 . 65537) ....)))
zwraca

(1071 . 65537.0)

ADS zawsze traktuje grupę 1071jako liczbę całkowitą typu (long integer).
Szereg innych grup zawierających dodatkowe dane elementu ma w tym kontek-

70 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdział 3

śde znaczenie specjalne (jeśli program użytkowy je wykorzystuje):

Łańcuch 1002. Łańcuchem sterującym dodatkowych danych elementu
sterujący może być "{" lub "}". Te nawiasy klamrowe umożliwiają pro-
gramom użytkowym strukturalne zorganizowanie danych
poprzez podzielenie ich na listy (dane typu list). Lewy nawias
rozpoczyna listę, a prawy stanowi zakończenie listy ostatnio
otwartej. Listy mogą być zagnieżdżane.

Podczas odczytywania dodatkowych danych elementu dla
konkretnego programu użytkowego, AutoCAD sprawdza czy
nawiasy zostały prawidłowo sparowane.

Uwagd: Jeżeli grupa 1001 pojawia się w obrębie listy, to jest
ona po prostu traktowana jak zwykły łańcuch znaków alfa-
numerycznych i nie oznacza rozpoczęcia nowej grupy innego
programu użytkowego.

Dane 1004. Dane binarne są zorganizowane w porcje o zmiennej
binarne długości, które mogą być obsługiwane przez ADS poprzez

strukturę binarną ads_binary. Maksymalna długość każdej

porcji wynosi 127 bajtów.

Położenie 1011. W przeciwieństwie do zwykłego punktu 3W, współrzęd-
ny przestrzeni ne w przestrzeni globalnej podlegają przesunięciu,
globalnej skalowaniu, obrotowi i odbiciu zwierciadlanemu wraz z ele-
mentem macierzystym, do którego należą dane dodatkowe.
Położenie w przestrzeni Globalnej podlega również rozciąga-
niu, jeżeli w odniesieniu do elementu macierzystego zostało
wykonane polecenie ROZCIĄGNIJ, a zdefiniowany w da-
nych dodatkowych punkt leży w obrębie wybranego okna.

Przemieszczenie 1012. Punkt 3W, podlegający skalowaniu, obrotowi i odbiciu
w przestrzeni zwierciadlanemu wraz z elementem macierzystym, ale nie pod-
globalnej legający rozciąganiu (polecenie ROZCIĄGNIJ) i przesuwaniu
(polecenie PRZESUŃ).

Kierunek 1013. Również punkt 3W, podlegający obrotowi i odbiciu
w przestrzeni zwierciadlanemu wraz z elementem macierzystym, ale nie
globalnej podlegający rozciąganiu (polecenie ROZCIĄGNIJ), przesu-
waniu (polecenie PRZESUŃ) i skalowaniu (polecenie
SKALA). Kierunek w przestrzeni Globalnej jest unormowa-
nym przemieszczeniem, które zawsze ma jednostkową
długość.

Odległość 1041. Wartość rzeczywista (typu real), podlegająca skalowa-
niu wraz z elementem macierzystym.

Współczynnik 1042. Również wartość rzeczywista (typu real), podlegająca
skalowania skalowaniu wraz z elementem macierzystym.

Więcej informacji związanych z dodatkowymi danymi elementu można
znaleźć w dodatku B niniejszego podręcznika oraz w rozdziale 11 AutoCAD
Podręcznik Adaptacyjny.

Funkcje operujące na nazwach i danych elementów rysunkowych 71

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Rejestrowanie programu użytkowego

Nazwy programów użytkowych (aplikacji) są przechowywane nie tylko w do-
datkowych danych wykorzystującego je elementu, ale także w tablicy AP-
PID. Program użytkowy musi zarejestrować wykorzystywaną nazwę lub na-
zwy. W AutoLISP-ie dokonuje się tego przez wywołanie funkcji regapp. Fun-
kcja ta po prostu określa łańcuch alfanumeryczny, który ma być używany ja-
ko nazwa aplikacji. W przypadku zakończonego sukcesem dodania nazwy
aplikacji do tablicy APPID, regapp zwraca nazwę aplikacji. W przeciwnym
wypadku funkcja zwraca nil. Zwrócenie nil oznacza zazwyczaj, że podana na-
zwa już istnieje w tablicy APPID. Sytuacja taka nie jest równoważna po-
wstaniu błędu - nil jest zwyczajną zwracaną wartością, gdyż nazwa aplikacji
powinna być rejestrowana tylko raz w danym rysunku.

Aby się zarejestrować, aplikacja powinna najpierw sprawdzić, czyjej nazwy
nie ma już w tablicy APPID, gdyż funkcja regapp wymaga tylko jednokrot-
nego wywołania w danym rysunku. Jeśli poszukiwanej nazwy nie ma w tab-
licy, program użytkowy musi ją zarejestrować. Jeśli jest, można po prostu
przejść do wykorzystywania danych, tak jak opisano to w dalszych częściach
tego rozdziału.

Przykład

Poniższy fragment przedstawia typowe użycie funkcji regapp (funkcja
tbisearch jest opisana w części "Dostęp do tablic symboli" na stronie 75).

(setq appname "MYAPP_2356") Unikalna nazwa aplikacji
(if (tbisearch "appid" appname) Sprawdzenie, czy nie została

zarejestrowana wcześniej
(princ (strcat "\n" appname " została zarejestrowana wcześniej. "))
(if (= (regapp appname) nil) Jakieś inne problemy

(princ (strcat "\nNie jest możliwe zarejestrowanie danych dodatkowych dla " appname ". "))
)
)

Ważne: Funkcja regapp zapewnia pewien margines bezpieczeństwa, lecz nie
potrafi zagwarantować, że dwie różne aplikacje nie będą wykorzystywały tej sa-
mej nazwy. Jedną z dróg uniknięcia takiej sytuacji jest przyjęcie określonej kon-
wencji tworzenia nazw aplikacji, polegającej na wykorzystaniu nazwy firmy lub
produktu i jakiejś unikalnej liczby (jak własny numer telefonu lub aktualna da-
ta i czas).

Odczytywanie dodatkowych danych elementu

Program użytkowy może mieć dostęp do zarejestrowanych dodatkowych da-
nych elementu poprzez funkcję entget. Funkcja entget może zwracać zarówno
dane definiujące element, jak i dodatkowe dane elementu dla wskazanej apli-
kacji. entget wymaga podania dodatkowego argumentu application, definiują-
cego nazwę programu użytkowego. Nazwy dostarczone funkcji entget muszą
odpowiadać nazwom aplikacji, zarejestrowanym przez wcześniejsze wywołania
funkcji regapp. Możliwe jest wykorzystanie znaków uniwersalnych.

72 Funkcje operujące na nazwach i danych elementów rysunkowych

Rozdziaf3
Przykłady

Standardowo wzory kreskowań zawierają dodatkowe dane elementu. Poniższy
kod pozwala na obejrzenie listy tych danych dodatkowych. Wprowadzenie w li-
nii poleceń

Polecenie: (entget (car (entsel) '("ACAD")) i wskazanie kreskowania
spowoduje zwrócenie listy, wyglądającej mniej więcej tak, jak lista poniższa:

((-1 . ) (O . "INSERT") (8 . "O") (2 . "*XO") (10 0.0
0.0 0.0)

(41.1.0) (42 . 1.0) (50 . 0.0) (43 . 1,0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0)
(210 0.0 0.0 1.0) (-3 ("ACAD" (1000 . "HATCH") (1002 . "f) (1070 . 16)
(1000 . "LINĘ") (1040 . 1.0) (1040 , 0.0) (1002 . "}"))))

Następny fragment pokazuje typową kolejność odczytywania dodatkowych
danych elementu dla dwóch wybranych aplikacji. Należy zauważyć, że
w tym przykładzie argument application podaje nazwy aplikacji w postaci li-
sty.

(setq working_elist (entget ent_name
'(("MY_APP_1")("SOMETHING_ELSE"))

)

(if working_elist
(progn

Odczytywane są jedynie dane dodatko-
we aplikacji:

"MY APP 1"i"SOMETHING ELSE"

(entmod working_elist)
)
)

Modyfikuje robocze grupy elementów

Modyfikowane są tylko dane dodatko-
we związane z zarejestrowanymi
aplikacjami znajdującymi się na liście
working_elist

Jak pokazuje powyższy przykład, dodatkowe dane elementu odczytywane
przez funkcję entget mogą być następnie modyfikowane przez entmod, do-
kładnie w taki sam sposób, jak zwykłe dane definiujące element (dodatkowe
dane elementu mogą być tworzone również przez zdefiniowanie ich w liście
dostarczonej jako argument dla funkcji entmake).

Zwracanie danych dodatkowych tylko dla specjalnie wybranych aplikacji za-
bezpiecza dane związane z jednym programem przed zakłóceniem przez in-
ny program użytkowy. Kontroluje to także ilość potrzebnej dla programu pa-
mięci i upraszcza przetwarzanie dodatkowych danych elementu, które musi
być wykonane przez program.

Ostrzeżenie: Łańcuchy alfanumeryczne podawane w argumencie application
mogą zawierać znaki uniwersalne, więc nazwa aplikacji "*" spowoduje zwróce-
nie przez entget wszystkich dodatkowych danych, związanych z elementem.

Dołączanie danych dodatkowych do elementu

Dane dodatkowe mogą być wykorzystywane do przechowywania niemal każ-
dego rodzaju informacji. Ich użycie jest ograniczone tylko przez wyobraźnię
użytkownika. Poniżej podany jest prosty przykład dołączania do elementu
danych dodatkowych.

Funkcje operujące na nazwach i danych elementów rysunkowych 73

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Przykład

Przed uruchomieniem przykładu trzeba narysować prosty element (na przykład
Linię lub Okrąg), a następnie wprowadzić następujący kod:

(setq lastent (entget (entlast))) Odczytanie listy asocjacji danych definiujących dla

ostatniego elementu

(regapp "NEWDATA") Rejestrowanie nazwy aplikacji
(setq exdata Przypisanie zmiennej exdata listy nowych danych
'((-3 ("NEWDATA" dodatkowych elementu, w tym wypadku - łańcucha
(1000 . "To jest nowa rzecz!"))) tekstu
}
)

(setq newent (append lastent exdata)) Dodanie listy nowych danych do listy danych ele-
(entmod newent) mentu

Modifikuje element wykorzystując nowe dane defi-
niujące

Aby sprawdzić czy nowe dane dodatkowe elementu zostały dołączone do ele-
mentu rysunkowego trzeba wprowadzić poniższą linię kodu i wybrać element:

(entget (car (entsel)) '("NEWDATA"))

Nie jest to może zbyt praktyczny przykład wykorzystania dodatkowych da-
nych elementu, powinien jednak przybliżyć podstawową metodę dołączania
danych dodatkowych do elementu rysunkowego.

Informacje dodatkowe: Procedura xdane.lsp w katalogu dyskowym sample.

Wykorzystanie pamięci przez dane dodatkowe elementu

Dodatkowe dane elementu są obecnie ograniczone do 16K na element rysun-
kowy. Ponieważ jeden element rysunkowy może przechowywać dane dodat-
kowe dla wielu aplikacji, mogą wyniknąć kłopoty, gdy ilość dodatkowych da-
nych elementu zbliża się do tej granicy. Aby pomóc sterować pamięcią zaj-
mowaną przez dodatkowe dane elementu, AutoLISP posiada dwie funkcje:

xdsize i xdroom. Gdy xdsize otrzymuje listę dodatkowych danych elementu,
zwraca ilość pamięci zajmowanej przez te dane (w bajtach).

Sugestia: Funkcja xdsize musi czytać listę dodatkowych danych elementu,
która może być bardzo długa. Dlatego jej działanie może być wolne. Z tego
powodu nie zaleca się jej częstego wywoływania. Lepszym sposobem jej wy-
korzystania jest wstawienie jej (wraz z funkcją xdroom) do procedury obsłu-
gi błędów: jeśli wywołanie entmod zakończy się błędem, należy za pomocą
funkcji xdsize i Xdroom sprawdzić, czy błąd nie wystąpił wskutek przekro-
czenia limitu pamięci przez dane dodatkowe elementu i jeśli tak, podjąć od-
powiednie działanie.

Identyfikatory w dodatkowych danych elementu

Dodatkowe dane elementów mogą zawierać identyfikatory elementów (gru-
pa 1005), dzięki czemu możliwe jest zachowanie informacji o występujących
w rysunku zależnościach między elementami. Jeden element rysunku może
odwoływać się do innego poprzez umieszczenie jego identyfikatora w obsza-
rze swoich danych dodatkowych; umieszczony w obszarze danych dodatko-
wych identyfikator może być następnie odczytany i użyty jako argument
funkcji handent w celu dojścia do innego elementu. Jeden element może być
wykorzystywany przez wiele innych elementów i dlatego identyfikatory

74 Funkcje operujące na nazwach i danych elementów rysunkowyci

Rozdział 3

w dodatkowych danych elementu nie muszą być unikalne; polecenie TEST
wymaga, by identyfikatory w obszarze danych dodatkowych miały albo war-
tość NULL, albo były identyfikatorami elementów rzeczywiście występujący-
mi w aktualnym rysunku. Najlepszą metodą zagwarantowania prawidło-
wych wartości identyfikatorów elementów w obszarze danych dodatkowych
jest uzyskiwanie ich bezpośrednio z definiujących je danych za pomocą fun-
kcji entget (jeżeli tryb przydzielania identyfikatorów jest aktywny, to są one
umieszczane w grupie o kodzie 5).

Sugestia: Przy odwoływaniu się do elementów z innych rysunków (na przy-
kład z rysunków powiązanych z aktualnym za pomocą odnośników zewnę-
trznych), konfliktów z procedurami ustalonymi dla polecenia TEST można
uniknąć, jeżeli zamiast identyfikatorów elementów (grupa 1005) zostaną
w obszarze danych dodatkowych użyte łańcuchy tekstowe (grupa 1000). Jest
to konieczne z tego powodu, że elementy umieszczone w innych rysunkach
mają identyfikatory albo nieważne w rysunku aktualnym, albo kolidujące
z identyfikatorami w nim używanymi. Jeżeli jednak ODNOŚNIK Dołącz ma
być zmieniony na ODNOŚNIK Ustal, lub ma być włączony do aktualnego ry-
sunku w jakiś inny sposób, to zadaniem programu użytkowego (aplikacji)
jest odpowiednie zmodyfikowanie odnośników.

Ważne : Jeżeli rysunki są ze sobą powiązane w wyniku użycia poleceń
WSTAW, WSTAW *, ODNOŚNIK Ustal lub w wyniku wczytania części pliku
DXF (polecenie DXFWE), to identyfikatory ich elementów podlegają trans-
lacji i stają się ważne w aktualnym rysunku; zostało to opisane w podręcz-
niku AutoCAD Podręcznik Użytkownika w rozdziale 7 (gdy elementy dołą-
czanego rysunku dotychczas nie posiadały identyfikatorów, to zostaną im
przypisane nowe). Jeżeli wywoływane są te polecenia, to odnoszące się do im-
portowanych elementów identyfikatory w danych dodatkowych również
podlegają translacji.

Gdy element rysunkowy jest umieszany w definicji Bloku (poprzez polecenie
BLOK), to wewnątrz bloku nadawany mu jest nowy identyfikator (po odtwo-
rzeniu oryginalnego elementu przez polecenie ODDAJ, odzyskuje on swój
oryginalny identyfikator). Wartość dowolnego identyfikatora w danych do-
datkowych pozostaje niezmieniona. Po rozbiciu Bloku (poleceniem ROZBIJ),
identyfikatory elementów w danych dodatkowych są poddawane translacji
w sposób podobny, jak w sytuacji tworzenia powiązań między rysunkami.
Identyfikatory w danych dodatkowych, które odnoszą się do elementów poza
Blokami, pozostają niezmienione. Jeżeli jednak identyfikator taki odnosi się
do elementu umieszczonego wewnątrz Bloku, to otrzymuje on wartość nowe-
go identyfikatora elementu (po rozbiciu bloku).

Dostęp do tablic symboli

Funkcja tblnext służy do sekwencyjnego przeglądania pozycji tablic symboli,
a funkcja tbisearch odczytuje wskazane pozycje. Nazwy tablic są określone
przez łańcuchy alfanumeryczne. Ważnymi nazwami są: "LAYER" (tablica
warstw), "LTYPE" (tablica rodzajów linii), "VI EW" (tablica widoków),
"STYLE" (tablica stylów pisma), "BŁOCK" (tablica bloków), "UCS" (tabli-
ca lokalnych układów współrzędnych), "VPORT" (tablica rzutni) i "APPID"
(tablica aplikacji). Obie wymienione funkcje zwracają listy z kodami DXF,
bardzo podobne do danych elementów zwracanych przez entget.

Pierwsze wywołanie tblnext zwraca pierwszą pozycję ze wskazanej tablicy.
Dostęp do tablic symboli 75

Funkcje obsługi zbiorów wskazań, elementów i tablic symboli

Zazwyczaj powtarzanie tblnext zwraca za każdym razem następną z kolei
pozycję w określonej tablicy, chyba że podano również drugi, różny od zera,
argument rewind; w takim wypadku tblnext ponownie zwraca pierwszą pozy-
cję z tablicy symboli.

Przykład

Pokazana tu funkcja GETBLOCK odczytuje pozycję tablicy symboli dotyczą-
cą pierwszego Bloku w bieżącym rysunku (o ile Blok istnieje), a następnie
wyświetla ją w postaci listy.

(defun C:GETBLOCK (/ bik et)

(setq bik (tblnext "BŁOCK" 1)) Odczytuje pierwszą pozycje BŁOCK
(setq et 0) Ustawia et (licznik) na O
(textpage) Przełącza ekran w tryb tekstowy
(princ "\nWyniki z GETBLOCK: ")
(repeat (length bik) Powtórzenie tyle razy, ile jest elementów w liście

(print (nth et bik)) Wydruk nowej linii, a następnie każdego składnika listy

(setq et (1 + et)) Zwiększenie licznika o l

)
(princ) Niezauważalne zakończenie funkcji

)

Pozycje odczytywane z tablicy BŁOCK zawierają grupę o kodzie -2, w której
występuje nazwa pierwszego elementu w definicji Bloku. Jeżeli Blok jest pu-
sty, jest to nazwa elementu ENDBLK, który nigdy nie występuje w Blokach
niepustych. Zakładając więc, że nazwą Bloku mogło być "BOK", wywołanie
GETBLOCK spowodowałoby wyświetlenie następujących informacji (war-
tość nazwy zmienia się od sesji do sesji edycyjnej):

(O . "BŁOCK")

(2 . "BOX")

(70 . 0)

(109.02.00.0)

(-2 . )

Podobnie jak dla tblnext; pierwszym argumentem dla tbisearchjest łańcuch
alfanumeryczny zawierający nazwę tablicy, ale już drugim argumentem jest
łańcuch alfanumeryczny, będący nazwą określonego symbolu w tablicy. Jeśli
symbol ten zostanie odnaleziony, tbisearch zwraca związane z nim dane.
Funkcja ta posiada także trzeci argument setnext, który może służyć do ko-
ordynacji współpracy z funkcją tblnext. Jeśli setnext wynosi nil, wywołanie
funkcji tbisearch nie wpływa na tblnext. Jeśli jednak argument setnext Jest
różny od nil, to następne wywołanie funkcji tblnext zwraca pozycję tablicy,
występującą po pozycji znalezionej przez tbisearch.

Użycie argumentu setnext Jest najbardziej użyteczne w przypadku tablicy
VPORT. Wynika to z tego, że wszystkie Rzutnie mają taką samą nazwę w okre-
ślonej konfiguracji rzutni.

Przypomnienie: Jeśli dostęp do tablicy symboli VPORT odbywa się przy
wyłączonym trybie TILEMODE, wszystkie zmiany nie będą widoczne aż do
momentu ponownego włączenia trybu TILEMODE. Tryb TILEMODE moż-
na włączać albo przez polecenie SETVAR, albo podając jego nazwę bezpo-
średnio, w sposób opisany w AutoCAD Podręcznik Użytkownika. Nie należy
mylić rzutni opisywanych przez tablicę symboli VPORT z elementami rysunko-
wymi obszaru papieru Rzutnia.

76 Dostęp do tablic symboli

Rozdział3

Przykład

Poniższy kod przetwarza wszystkie rzutnie w konfiguracji "CZTERY":

(setq v (tbisearch "VPORT" "CZTERY" T)) Znalezienie pierwszej pozycji VPORT
(while (and v (= (cdr (assoc 2 v)) "CZTERY"))

Przetwarzanie pozycji...

(setq v (tblnext "VPORT")) Przejście do następnego elementu
) VPORT

Dostęp do tablic symboli 77

Wyszukiwarka

Podobne podstrony:
03 Funkcje zdaniowe i zbiory
05 Rozdział 03 Wzór Taylora i ekstrema funkcji
0202 04 03 2009, wykład nr 2 , Budowa i funkcje błony komórkowej oraz transport przez błony(1)
W10 wskazniki na tablice wielowymiarowe i funkcje
Excel 03 PL Funkcje Leksykon kieszonkowy exfulk
03 Tablica 1
tablica funkcji i operatorów typy danych
03 Rozdział 01 Granica i ciągłość funkcji wielu zmiennych
03 Relacje funkcje
tablica funkcji i operatorów
C w3 tablice wskazniki funkcje
Ćw 03?ycja rysunków – funkcje paska „Zmień”

więcej podobnych podstron