You are on page 1of 32

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!

xzcpsv

594

W typowym zastosowaniu AutoCADa (tj. rysowanie bez wykorzystania AutoLISPu),


wybieramy obiekty poprzez kursor, wskazujc je po kolei czy te wybierajc oknem.
Moemy rwnie wybra poprzedni zbir wskaza. AutoLISP posiada wbudowane
funkcje do tworzenia i obsugi zbiorw wskaza. Funkcje te posiadaj w swej nazwie
przedrostek ss (co jest skrtem Selection Set Wybr Elementw). Ponisza
tabela zawiera krtk charakterystyk tych funkcji.
Tabela 14.1. Funkcje do tworzenia i obsugi zbiorw wskaza
Nazwa funkcji

Format i opis

ssget

(ssget [mode][pt1[pt2]][pt-list][filter-list])

sslength

(sslength ss)

Funkcja tworzy zbir wyboru na podstawie otrzymanych argumentw.


Funkcja oblicza liczb elementw zawartych w zbiorze wyboru.
ssname

(ssname ss index)
Funkcja znajduje nazw elementu zawartego
w zbiorze wyboru.

ssadd

(ssadd [ename[ss]])
W zalenoci od dostarczonych argumentw funkcja tworzy pusty zbior
wyboru; tworzy zbir wyboru zawierajcy podany element lub dodaje
do zbioru wyboru element o podanej nazwie.

ssdel

(ssdel ename ss)


Funkcja usuwa ze zbioru wyboru element o podanej nazwie.

ssmemb

(ssmemb ename ss)


Funkcja sprawdza, czy element o podanej nazwie znajduje si w zbiorze
wyboru.

595

BvupMJTQ!!qsbluzd{oz!lvst
Programy omwione w tym rozdziale
PROG_105.LSP
Przykady tworzenia zbiorw wyboru przy pomocy funkcji ssget.
PROG_106.LSP
Przykady wykorzystania funkcji do obsugi zbiorw wskaza.
PROG_107.LSP
Funkcja umieszczajca w zbiorze wskaza wszystkie nowo utworzone obiekty.
PROG_108.LSP
Operacje na zbiorach wyboru.
Wikszo funkcji AutoLISPu, obsugujcych zbiory wskaza i elementy rysunkowe,
identyfikuje zbiory wskaza lub elementy poprzez ich nazw i alfanumeryczny kod,
nadawany im i pamitany przez AutoCAD. Zanim program uytkowy w AutoLISPie
bdzie mg operowa na zbiorze wskaza lub elemencie rysunkowym, musi najpierw
uzyska biec nazw zbioru wskaza lub elementu rysunkowego, wywoujc w tym
celu jedn z funkcji zwracajcych nazw zbioru wskaza lub elementu rysunkowego.
Nazwy zbiorw wskaza i elementw rysunkowych s ulotne, s one niezmienne tylko podczas biecej sesji rysunkowej. Programy uytkowe, ktre w rnym czasie (nie podczas tej samej sesji) musz odwoywa si do tego samego
elementu rysunkowego w danym rysunku (lub rysunkach), powinny korzysta
z identyfikatorw elementw.
Program uytkowy w AutoLISPie nie moe mie jednoczenie otwartych wicej
ni 128 zbiorw wskaza. Granica ta zaley od wielu czynnikw i w niektrych
systemach moe by nieco nisza. Po osigniciu tej granicy AutoCAD
przestaje tworzy zbiory wskaza. Nie jest zalecane denie do jednoczesnego
utrzymywania wielu zbiorw wskaza. Naley raczej utrzymywa sensown
ilo zbiorw wskaza otwartych w tym samym czasie, a niepotrzebnym ju
zbiorom jak najszybciej przypisywa nil.

Funkcja ssget udostpnia najbardziej ogln metod tworzenia zbiorw wskaza. Moe
ona utworzy zbir wskaza jedn z poniszych metod:
Przez bezporednie wskazanie elementw do zbioru przez opcje Last (oStatni),
Previous (Poprzedni), Window (Okno), WPolygon (OWbok), Crossing
(prZecicie), CPolygon (ZWbok) lub Fence (Krawd) (tak samo, jak podczas

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

596

interakcyjnej pracy z AutoCADem), lub przez wskazanie pojedynczego punktu.


Mona rwnie wybra ca baz danych.
Przez danie wybrania elementw przez uytkownika.
Dla kadej z powyszych grup opcji mona zastosowa filtracj. Pozwala to na okrelenie listy atrybutw lub warunkw, jakie musz spenia wybrane elementy.
Oglny format funkcji ssget jest nastpujcy:
(ssget [mode][pt1[pt2]][pt-list][filter-list])

Pierwszym argumentem funkcji ssget jest acuch tekstowy mode (tryb), okrelajcy
opcj wybierania obiektw. Dwa nastpne argumenty, pt1 i pt2 definiuj dwa punkty
dla wybranej opcji (jeli dla wybranej opcji punkty s niepotrzebne, naley je w ogle
pomin). Przy metodach wybierania obiektw przez Wielobok (a wic Krawd,
ZWbok i OWbok) musi by podany argument bdcy list punktw pt-list. Ostatni
argument filter-list jest opcjonalny. Jeli argument filter-list jest podany, okrela on list
wartoci pl elementw rysunkowych, wykorzystanych do filtrowania. Podana poniej
tabela zawiera zestawienie dostpnych wartoci trybw wybierania i argumentw
(argument filter-list moe by wykorzystany jako dodatkowy argument przy kadej
podanej metodzie wybierania):
Tabela 14.2. Opcje wyboru dla funkcji ssget
Tryb

Metoda dokonywania wyboru

Modele funkcji

brak

Wybr przez uytkownika lub wybr za pomoc


jednego punktu (jeli podany jest pt1)

(ssget) lub (ssget pt1)

"S" "_L"

Ostatni utworzony element rysunkowy

widoczny na ekranie

"P"

Poprzednio wybrany zbir wskaza

(ssget "P")

"U" "_I"

Niejawny zbir wskaza (poprzedni zbir wskaza)

utworzony przy
wczonym trybie
_PICKFIRST

"O" "_W"

Wybr oknem

(ssget "_W" pt1 pt2)

"Z" "_C"

Wybr oknem przecinajcym

(ssget "_C" pt1 pt2)

"K" "_F"

Wybr krawdzi (otwartym wieloktem)

(ssget "_F" pt-list)

"ZW" "_CP"

Wybr wieloktem przecinajcym

(ssget "_CP" pt-list)

"OW"
"_WP"

Wybr oknem obejmujcym w ksztacie wielokta

(ssget "_WP" pt-list)

"X"

Wybr wszystkich elementw w rysunku

(ssget "X")

Jeli podany jest argument mode = "X" i nie jest podana lista filter-list,funkcja
ssget wybiera wszystkie elementy rysunkowe w bazie danych, wcznie z elementami w warstwach wyczonych, zamroonych i usunitych z widocznego
ekranu.

597

BvupMJTQ!!qsbluzd{oz!lvst
Ponisze fragmenty kodu pokazuj kilka przykadowych wywoa funkcji ssget:
(setq zbior_1 (ssget))

danie wybrania elementw przez uytkownika i umieszczenie ich w zbiorze wskaza,


ktry jest nastpnie podstawiany pod zmienn zbior_1.
(setq zbior_2 (ssget "p"))

Wybranie poprzedniego zbioru wskaza.


(setq zbior_3 (ssget "_l"))

Utworzenie zbioru wskaza z ostatniego widocznego na ekranie elementu w bazie


danych.
(setq
pt1 '(1
pt2 '(1
pt3 '(6
pt4 '(6
);setq

1
6
6
1

0)
0)
0)
0)

(setq zbior_4 (ssget pt2))

Utworzenie zbioru wskaza z elementu przechodzcego przez punkt (1,6).


(setq zbior_5 (ssget "_w" pt1 pt3))

Utworzenie zbioru wskaza z elementw wewntrz okna o wierzchokach (1,1) i (6,6).


(setq zbior_6 (ssget "_c" pt1 pt2))

Utworzenie zbioru wskaza z elementw przecinajcych okno o wierzchokach (1,1)


i (6,6).
(setq zbior_7 (ssget "_f" (list pt1 pt2 pt3 pt4)))

Utworzenie zbioru wskaza z elementw przecinajcych krawd zdefiniowan przez


punkty (1,1), (1,6), (6,6), (6,1).
(setq zbior_8 (ssget "_wp" (list pt1 pt2 pt3 pt4)))

Utworzenie zbioru wskaza z elementw wewntrz wieloboku zdefiniowanego przez


punkty (1,1), (1,6), (6,6), (6,1).
(setq zbior_9 (ssget "x"))

Utworzenie zbioru wskaza ze wszystkich elementw w rysunkowej bazie danych.


Istotne jest, by po zakoczeniu korzystania ze zbioru wskaza, program uytkowy usuwa go z pamici. Mona to osign przez przypisanie mu nil.
(setq
zbior_1 nil zbior_2 nil zbior_3 nil
zbior_4 nil zbior_5 nil zbior_6 nil
zbior_7 nil zbior_8 nil zbior_9 nil
);setq

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

598

25/2/2/!Mjtuz!gjmus x!emb!{cjp
25/2/2/!Mjtuz!gjmus x!emb!{cjps x!xtlb{b
x!emb!{cjps x!xtlb{b
Lista filtrw elementw rysunkowych jest list asocjacji, wykorzystujc kody grup
w takim samym formacie, jak listy zwracane przez funkcj entget. Funkcja ssget
rozpoznaje wszystkie kody grup, oprcz nazw elementw (grupa 1), identyfikatorw
(grupa 5) i kodw danych dodatkowych elementw (grupa >= 1000). Jeeli w licie
filter-list uyty zosta niewaciwy kod grupy, ssget go ignoruje.
Jeeli ostatnim podanym argumentem funkcji ssget jest filter-list, przeglda ona
wybrane elementy i tworzy zbir wskaza, zawierajcy nazwy wszystkich gwnych
elementw rysunkowych, speniajcych podane kryteria. Wykorzystujc ten mechanizm, mona na przykad uzyska zbir wskaza skadajcy si ze wszystkich elementw danego typu, w wybranej warstwie lub w wybranym kolorze.
Argument filter-list okrela, ktre cechy elementw maj by sprawdzane i jaka ma by
ich warto.
Ponisze przykady demonstruj metody uycia argumentu filter-list z rnymi opcjami
wyboru.
(setq zbior_1 (ssget '((0 . "TEXT"))))

da od uytkownika zwykego wybrania elementw, lecz do zbioru wskaza dodaje


tylko elementy typu TEXT (TEKST).
(setq zbior_2 (ssget "P" '((0 . "LINE"))))

Utworzenie zbioru wskaza z ostatnio wybranych elementw, bdcych jednoczenie


elementami typu LINE (LINIA).
(setq zbior_3 (ssget "_W" pt1 pt2 '((8 . "WEZLY"))))

Utworzenie zbioru wskaza ze wszystkich elementw w oknie o naronikach


biegncych przez punkty pt1 i pt2, lecych na warstwie WEZLY.
(setq zbior_4 (ssget "X" '((0 . "CIRCLE"))))

Utworzenie zbioru wskaza ze wszystkich elementw w bazie danych, bdcych


elementami typu CIRCLE (OKRG).
Jeeli znany jest zarwno kod, jak i dana warto, lista moe by zacytowana
w caoci, zgodnie z poprzednimi przykadami. Jeeli ktrykolwiek skadnik listy jest
dany w postaci zmiennej, lista musi zosta skonstruowana z wykorzystaniem funkcji
list lub cons.
(setq
nazwa_warstwy (getstring "Podaj nazwe warstwy: ")
);setq
(setq zbior_1 (ssget "X" (list (cons 8 nazwa_warstwy))))

Utworzenie zbioru wskaza ze wszystkich elementw w bazie danych, lecych na


warstwie podanej przez uytkownika w odpowiedzi na funkcj getstring.

599

BvupMJTQ!!qsbluzd{oz!lvst
Jeli lista filtrw okrela wicej ni jedn cech, element zostaje wczony do zbioru
wskaza tylko wtedy, gdy spenia wszystkie podane warunki. Na przykad cig dalszy
poprzedniego przykadu mgby wyglda nastpujco:
(setq zbior_1 (ssget "X" (list (cons 0 "CIRCLE")(cons 8
nazwa_warstwy)(cons 62 1))))

Spowodowaby on wybranie elementu rysunkowego typu CIRCLE (OKRG) w


warstwie podanej przez uytkownika i w kolorze czerwonym. Ten rodzaj testu
wykonuje logiczn operacj AND.
Naley pamita o tym, e w tego rodzaju konstrukcjach musz zosta
spenione wszystkie warunki, aby element zosta wczony do zbioru wskaza.
Przykadowo, ponisze wyraenie nigdy nie zostanie spenione (element nie
moe lee na dwch warstwach jednoczenie).
(setq zbior_1 (ssget "X" '((8 . "WEZLY")(8 .
"ELEMENTY"))))
Funkcja ssget filtruje rysunek przegldajc wybrane elementy i porwnujc
pola kadego gwnego elementu z podan list filtrujc. Jeli cechy elementu
odpowiadaj wszystkim polom podanym w licie filtrujcej, element zostaje
wczony do zwracanego zbioru wskaza. Funkcja ssget zwraca nil, jeli aden
ze wskazanych elementw nie spenia podanych warunkw filtrujcych.

25/2/3/![oblj!vojxfstbmof!x!mjtubd
5/2/3/![oblj!vojxfstbmof!x!mjtubdi!gjmusvkd
xfstbmof!x!mjtubdi!gjmusvkdzdi
i!gjmusvkdzdi
Nazwy symboli podane w listach filtrujcych: 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. Przykadowo, poniszy fragment kodu spowoduje utworzenie
zbioru wskaza zawierajcego wszystkie elementy z bazy danych lece na warstwach
zaczynajcych si od liter SW (np. SW_1, SWORZNIE, SW_5 itp.).
(setq zbior_1 (ssget "X" '((8 . "SW*"))))
Przy filtracji bloku bez nazwy (anonimowego) naley zaznaczy znak * za
pomoc lewego apostrofu (`), gdy znak * jest odczytywany przez ssget jako
znak uniwersalny. Na przykad blok anonimowy o nazwie *U2 mona odczyta
za pomoc nastpujcej instrukcji:
(setq zbior_1 (ssget "X" '((2 . "`*U2"))))

25/2/4/!Uftupxbojf!sfmbd
25/2/4/!Uftupxbojf!sfmbdkj
tupxbojf!sfmbdkj
Jeli nie zostanie to okrelone inaczej, dla kadej pozycji argumentu filter-list
przeprowadzany jest test rwnoci. Dla grup liczbowych (cakowitych, rzeczywistych, punktw i wektorw) mona okreli inne rodzaje zalenoci, podajc specjalny
kod grupy 4, okrelajcy operator relacji. Wartoci grupy 4 jest acuch tekstowy,

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

59:

wskazujcy operator testujcy do zastosowania w odniesieniu do nastpnej grupy


w licie filter-list.
Ponisze wyraenie powoduje wybranie wszystkich elementw typu CIRCLE
(OKRG) o promieniu (kod grupy 40) wikszym lub rwnym 2.0:
(setq zbior_1 (ssget "X" '((0 . "CIRCLE")(-4 . ">=")(40 .
2.0))))

25/2/5/!Mphjd{of!hsvqpx
25/2/5/!Mphjd{of!hsvqpxbojf!uftu x!gjmu
of!hsvqpxbojf!uftu x!gjmusvkdzdi
bojf!uftu x!gjmusvkdzdi
Oprcz opisanych poprzednio operatorw logicznych, grupy mona testowa za pomoc zagniedonych wyrae logicznych, wykorzystujcych logiczne operatory grupowe
(przedstawione w dodatku B opis funkcji ssget).
Operatory grupowe s okrelane za pomoc grup 4, podobnie jak operatory relacji. S
one parowane i aby nie wystpi bd dziaania funkcji ssget, musz by waciwie
zrwnowaone w licie filtrujcej.
Przykady grupowania operatorw w licie filtrw pokazane s poniej:
(setq
zbior_1 (ssget "X"
'(
(-4 . "<OR")
(8 . "WEZLY")
(8 . "ELEMENTY")
(-4 . "OR>")
)
);ssget
);setq

Taki fragment programu powoduje wybranie wszystkich elementw lecych na warstwie WEZLY lub ELEMENTY.
(setq
zbior_2 (ssget "X"
'(
(-4 . "<OR")
(-4 . "<AND")
(0 . "CIRCLE")
(40 . 1.0)
(-4 . "AND>")
(-4 . "<AND")
(0 . "LINE")
(8 . "ABC")
(-4 . "AND>")
(-4 . "OR>")
)
);ssget
);setq

5:1

BvupMJTQ!!qsbluzd{oz!lvst
Taki fragment programu powoduje wybranie wszystkich elementw typu CIRCLE
(OKRG) o promieniu 1.0 oraz dodatkowo wszystkich elementw typu LINE (LINIA)
w warstwie "ABC".
Operatory grupowe nie zwracaj uwagi na pisowni duymi lub maymi literami.
Mona uywa take ich odpowiednikw, pisanych maymi literami.

Poniej przedstawiono program pokazujcy przykady tworzenia zbiorw wyboru.


;*************************************************PROG_105
;Przyklady tworzenia zbiorow wyboru przy pomocy funkcji
SSGET.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Utworzenie warstw, przyporzadkowanie kolorow,
;narysowanie obiektow
;
(defun RYSUNEK_PROTOTYPOWY ()
(progn
;---------(command
"_zoom" "_window" "0,0" "12,9"
"_ucsicon" "_off"
"_layer"
"_new" "circle_1,circle_2"
"_new" "3dface_1,3dface_2"
"_new" "line_1,line_2"
"_color" "1" "circle_1,3dface_1"
"_color" "_blue" "circle_2,3dface_2"
"_color" "2" "line_1,line_2"
""
);command
;---------(command
"_layer" "_set" "circle_1" ""
"_circle" "2,2" "1"
"_circle" "7,7" "2"
"_circle" "5,5" "3"
);command
;

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
(command
"_layer" "_set" "circle_2" ""
"_circle" "11,7" "0.5"
);command
;
(command
"_layer" "_set" "3dface_1" ""
"_3dface" "1,1" "1,3" "4,3" "4,1" ""
);command
;
(command
"_layer" "_set" "3dface_2" ""
"_3dface" "_i" "2,2" "_i" "5,5" "_i" "8,2" "" ""
"_3dface" "4,4" "5,6" "9,8" "10,2" ""
);command
;
(command
"_layer" "_set" "line_1" ""
"_color" "6"
"_line" "3,6" "8,1" ""
"_color" "_bylayer"
);command
;
(command
"_layer" "_set" "line_2" ""
"_color" "3"
"_line" "6,0" "6,9" ""
"_color" "_bylayer"
);command
;
(command "_layer" "_set" "0" "")
(redraw)
;---------(princ)
;---------);progn
);RYSUNEK_PROTOTYPOWY
;
;------------------------------------------------;Utworzenie zbiorow wyboru.
;
(defun UTWORZ_ZBIORY_WYBORU ()
(progn
;---------(setq zbior_1 (ssget "X" '((0 . "CIRCLE"))))
;
(setq zbior_2 (ssget "X" '((0 . "CIRCLE")(62 . 5))))
;
(setq
zbior_3
(ssget "X" '((0 . "CIRCLE")(-4 . "<")(40 . 2.0)))
);setq
;
(setq
zbior_4 (ssget "_w" '(0 0) '(12 9) '((0 . "3DFACE")))

5:2

5:3

BvupMJTQ!!qsbluzd{oz!lvst
);setq
;
(setq zbior_5 (ssget "X" '((0 . "3DFACE"))))
;
(setq
zbior_6 (ssget "X"
'(
(0 . "LINE")
(-4 . "<OR")
(62 . 3)
(62 . 6)
(-4 . "OR>")
)
);ssget
);setq
;---------(princ)
;---------);progn
);UTWORZ_ZBIORY_WYBORU
;
;------------------------------------------------;Wypisanie list DXF dla kazdego elementu
;ze zbioru wyboru.
;
(defun WYPISZ_LISTY_DXF (zbior_wyboru /
dlugosc licznik
ename lista_dxf
)
(progn
;---------(if(= zbior_wyboru nil)
(progn
(princ
"\nZbior wyboru nie zawiera elementow.\n"
);princ
);progn
);if
(if (= (type zbior_wyboru) 'PICKSET)
(progn
(if (> (sslength zbior_wyboru) 0)
(progn
;---------(textscr)
(princ "\n")
(princ "Liczba elementow w zbiorze wyboru: ")
(princ (sslength zbior_wyboru))
(princ "\n")
(setq
dlugosc (sslength zbior_wyboru)
licznik 0
);setq
(repeat dlugosc
(progn
;----------

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
(setq
ename (ssname zbior_wyboru licznik)
lista_dxf (entget ename)
);setq
(princ "\nLista DXF dla elementu numer ")
(princ licznik)
(princ ".\n")
(prin1 lista_dxf)
(CZEKAJ)
(setq licznik (1+ licznik))
;---------);progn
);repeat dlugosc
(graphscr)
;---------);progn
);if
);progn
);if
;---------(princ)
;---------);progn
);WYPISZ_LISTY_DXF
;
;------------------------------------------------;Zwolnienie zbiorow wyboru - nadanie im wartosci nil.
;
(defun ZWOLNIJ_ZBIORY_WYBORU (lista_zbiorow)
(progn
;---------(if (= (type lista_zbiorow) 'LIST)
(progn
(setq
dlugosc (length lista_zbiorow)
licznik 0
);setq
(if (> dlugosc 0)
(progn
;---------(repeat dlugosc
(progn
;---------(setq zbior (nth licznik lista_zbiorow))
(if (/= zbior nil)
(if (= (type (eval zbior)) 'PICKSET)
(set zbior nil)
);if
);if
(setq licznik (1+ licznik))
;---------);progn
);repeat dlugosc
;---------);progn

5:4

5:5

BvupMJTQ!!qsbluzd{oz!lvst
);if
);progn
);if
;---------(princ)
;---------);progn
);ZWOLNIJ_ZBIORY_WYBORU
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu.
;
(RYSUNEK_PROTOTYPOWY)
(UTWORZ_ZBIORY_WYBORU)
;
(CZEKAJ)
(princ "\n\nElementy ze zbioru wyboru ZBIOR_1.")
(princ "\nWszystkie elementy typu CIRCLE.")
(WYPISZ_LISTY_DXF zbior_1)
;
(CZEKAJ)
(princ "\n\nElementy ze zbioru wyboru ZBIOR_2.")
(princ "\nWszystkie elementy typu CIRCLE w kolorze
niebieskim.")
(WYPISZ_LISTY_DXF zbior_2)
;
(CZEKAJ)
(princ "\n\nElementy ze zbioru wyboru ZBIOR_3.")
(princ "\nWszystkie elementy typu CIRCLE ")
(princ "o promieniu mniejszym od 2.")
(WYPISZ_LISTY_DXF zbior_3)
;
(CZEKAJ)
(princ "\n\nElementy ze zbioru wyboru ZBIOR_4.")
(princ "\nWszystkie elementy typu 3DFACE ")
(princ "wybierane oknem.")
(WYPISZ_LISTY_DXF zbior_4)
;
(CZEKAJ)
(princ "\n\nElementy ze zbioru wyboru ZBIOR_5.")
(princ "\nWszystkie elementy typu 3DFACE ")
(princ "wybierane opcja \"X\".")
(WYPISZ_LISTY_DXF zbior_5)
;
(CZEKAJ)
(princ "\n\nElementy ze zbioru wyboru ZBIOR_6.")
(princ "\nWszystkie elementy typu LINE ")
(princ "w kolorze 3 lub 6.")
(WYPISZ_LISTY_DXF zbior_6)
;
(CZEKAJ)
(ZWOLNIJ_ZBIORY_WYBORU
'(zbior_1 zbior_2 zbior_3 zbior_4 zbior_5 zbior_6)
)

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

5:6

;------------------------------------------------;*************************************************KONIEC

Gwnymi funkcjami programu s:

SZTVOFL`QSPUPUZQP
SZTVOFL`QSPUPUZQPXZ
L`QSPUPUZQPXZ
Funkcja przygotowuje rodowisko pracy dla programu tworzy warstwy, przyporzdkowuje im kolory oraz rysuje na poszczeglnych warstwach elementy. Ponisza
tabela charakteryzuje poszczeglne obiekty rysunkowe.
Tabela 14.3. Dane obiektw rysunkowych
Warstwa

Kolor warstwy

Kolor obiektu

Obiekty

CIRCLE_1

CIRCLE (2 2) 1

CIRCLE (7 7) 2

CIRCLE (5 5) 3
CIRCLE (11 7) 0.5

CIRCLE_2

3DFACE_1

3DFACE (1 1)(1 3)(4 3)(4 1)

3DFACE_2

3DFACE i(2 2) i(5 5) i(8 2)

3DFACE (4 4)(5 6)(9 8)(10 2)

LINE_1

LINE (3 6)(8 1)

LINE_2

LINE (6 0)(6 9)

Zauwa, e na warstwie 3DFACE_2 pierwszy z rysowanych obiektw jest cakowicie


niewidoczny oraz e obiekty narysowane na warstwach LINE_1 i LINE_2
posiadaj swj wasny kolor (rny od koloru warstw).

VUXPS[`[CJPSZ`
VUXPS[`[CJPSZ`XZCPS
S[`[CJPSZ`XZCPSV
XZCPSV
W funkcji tej tworzymy 6 zbiorw wskaza za pomoc rnych wywoa funkcji ssget.
Zbir wskaza zbior_1 ma zawiera wszystkie elementy typu CIRCLE (nie precyzujemy tutaj adnych dodatkowych warunkw).
Zbir wskaza zbior_2 ma zawiera wszystkie elementy typu CIRCLE o grupie (62 . 5)
kolor elementu. Kod koloru pojawia si na licie DXF tylko wtedy, gdy obiekt zosta
narysowany kolorem ustawionym komend COLOR. Poniewa aden okrg nie zosta
narysowany kolorem niebieskim ustawionym komend COLOR, zbir wskaza zbior_2
jest zbiorem pustym (nie zawiera adnych elementw).
Zbir wskaza zbior_3 ma zawiera wszystkie okrgi o promieniu mniejszym od 2.

5:7

BvupMJTQ!!qsbluzd{oz!lvst
Zbir wskaza zbior_4 ma zawiera wszystkie elementy typu 3DFACE lece w zadanym oknie. Pomimo tego, e jeden z elementw 3DFACE mieci si cakowicie
w podanym oknie, nie zostanie on dodany do zbioru wskaza. Dzieje si tak dlatego, e
funkcja ssget "_w" wybiera tylko te obiekty, ktre s widoczne na ekranie. Poniewa
wszystkie boki elementu 3DFACE zostay zadeklarowane jako niewidoczne, nie jest on
brany pod uwag podczas wyboru elementu.
Zbir wskaza zbior_5 ma zawiera wszystkie elementy typu 3DFACE z rysunkowej
bazy danych. Tworzymy go wykorzystujc funkcj ssget "X". Funkcja ta wybiera
wszystkie elementy, take te, ktre s niewidoczne, le na warstwach wyczonych lub
zamroonych. Tak wic powierzchnia 3DFACE o wszystkich niewidocznych ciankach
zostanie doczona do zbioru wyboru.
Zbir wskaza zbior_6 ma zawiera wszystkie elementy typu LINE narysowane
kolorem 3 lub 6 (tzn. na licie DXF musi istnie grupa z kodem 62).
O tym, ktry bok elementu 3DFACE jest niewidoczny, decyduje grupa z kodem
70 na licie DXF opisu elementu. Gdy jest ona rwna 0 wszystkie boki
elementu s widoczne, 1 pierwszy bok jest niewidoczny, 2 drugi bok jest
niewidoczny, 4 trzeci bok jest niewidoczny, 8 czwarty bok jest niewidoczny.
Przy wikszej liczbie bokw niewidocznych sumujemy odpowiednie cyfry. Grn
wartoci sumy jest 15 (1+2+4+8) wszystkie boki elementu s niewidoczne.
Poniewa ze zbiorw wskaza bdziemy korzysta w dalszej czci programu,
zmiennych zbior_1 zbior_6 nie deklarujemy jako zmienne lokalne funkcji.

XZQJT[`MJTUZ`E
XZQJT[`MJTUZ`EYG
[`MJTUZ`EYG
Zadaniem funkcji jest wypisanie listy DXF dla kadego elementu w podanym zbiorze
wskaza. Zbir wskaza, ktry ma by przetworzony, podany jest jako argument
wywoania funkcji zbior_wyboru. Jeeli zmienna podana jako argument wywoania funkcji jest zbiorem wskaza (PICKSET) o dugoci wikszej od zera, w ptli repeat pobieramy nazw kolejnych jego elementw, uzyskujemy list DXF opisujc dany element
oraz wypisujemy j na ekranie tekstowym wraz z numerem elementu (liczc od zera).

[XPMOJK`[CJP
[XPMOJK`[CJPSZ`XZCPS
MOJK`[CJPSZ`XZCPSV
SZ`XZCPSV
Zadaniem funkcji jest nadanie zmiennej oznaczajcej zbir wskaza wartoci nil.
Funkcja wywolywana jest z jednym argumentem: lista_zbiorow jest to lista nazw
zmiennych oznaczajcych zbiory wskaza, ktre nie bd ju nam potrzebne i chcemy
tym samym nada im warto nil. Argument wywoania funkcji sprawdzamy, czy jest to
lista o dugoci wikszej od zera. Jeeli tak, w ptli repeat pobieramy kolejne elementy
listy, sprawdzamy, czy jest to zbir wskaza (PICKSET), a jeeli tak, wykorzystujc
instrukcj podstawiania set nadajemy mu warto nil.

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

5:8

Po utworzeniu zbiorw wskaza do dodawania lub odejmowania elementw od tych


zbiorw mona wykorzystywa funkcje ssadd i ssdel, podobne w dziaaniu do opcji
Add (Dodaj) i Remove (Usu), stosowanych jako interakcyjna odpowied na zgoszenie
AutoCADa Select objects: (Wska obiekty: ). Funkcja ssadd moe by take wykorzystana do tworzenia nowych zbiorw wskaza, co pokazuje poniszy przykad.
(setq
first_name (entnext) ;odczytanie pierwszego elementu rysunku
last_name (entlast)
;odczytanie ostatniego elementu rysunku
);setq
(if (not first_name)
(progn
(princ "\nNie ma zadnych elementow w rysunku.")
);progn
(progn ;else
;utworzenie zbioru wskazan z pierwszego elementu
(setq zbior_1 (ssadd first_name))
;
;dodanie ostatniego elementu do tego samego zbioru wskazan

(ssadd last_name zbior_1)


);progn
);if

Podany fragment kodu programu powoduje utworzenie zbioru wskaza zbior_1, zawierajcego dwa elementy: pierwszy i ostatni, z biecego rysunku.
Przykad 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). Jeli funkcja ssadd otrzyma jako argument nazw
elementu ju istniejcego w zbiorze wskaza, po prostu ignoruje danie umieszczenia
go w zbiorze i nie wywietla komunikatu o bdzie.
Ponisze wyraenie usuwa pierwszy element ze zbioru wskaza utworzonego w przykadzie poprzednim:
(ssdel first_name zbior_1)

Jeli w rysunku istnieje wicej, ni jeden element rysunkowy (co oznacza, e first_name
i last_name nie s rwnowane), zbir wskaza zbior_1 zawiera teraz tylko last_name
ostatni element w rysunku.
Funkcja sslength zwraca liczb elementw w zbiorze wskaza, a funkcja ssmemb
sprawdza, czy okrelony element rysunkowy wchodzi w skad zbioru wskaza. Funkcja
ssname zwraca nazw okrelonego elementu w zbiorze wskaza, wykorzystujc indeks
wewntrz zbioru (elementy w zbiorze wskaza s numerowane od zera).

5:9

BvupMJTQ!!qsbluzd{oz!lvst
Poniszy fragment programu zawiera kilka wywoa funkcji ssname:
;utworzenie zbioru wskazan (przez zazadanie tego od uzytkownika)

(setq zbior_1 (ssget))


;
;odczytanie nazwy pierwszego elementu w zbiorze wskazan
(setq ent1 (ssname zbior_1 0))
;
;odczytanie nazwy czwartego elementu w zbiorze wskazan
(setq ent4 (ssname zbior_1 3))
(if (not ent4) ; <=> (if (= ent4 nil)
(princ "\nNalezy wybrac co najmniej cztery elementy.")
);if
;
;znalezienie indeksu ostatniego elementu w zbiorze wskazan
(setq ilast (sslength zbior_1))
;
;odczytanie nazwy ostatniego elementu w zbiorze wskazan
(setq lastent (ssname zbior_1 (1- ilast)))
Niezalenie od sposobu dodawania elementw do zbioru wskaza, zbir nigdy
nie zawiera podwjnych elementw. Jeli ten sam element jest dodawany do
zbioru wskaza wielokrotnie, wszystkie te operacje (poza pierwsz) s po
prostu ignorowane. Z tej przyczyny sslength zwraca dokadn liczb rnych
elementw w wybranym zbiorze wskaza.

Poniszy program pokazuje nam przykady wykorzystania funkcji do obsugi zbiorw


wskaza.
;*************************************************PROG_106
;Przyklady wykorzystania funkcji do obslugi zbiorow wskazan.
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Rysunek prototypowy
;Narysowanie obiektow w odpowiednich kolorach.
;
(defun RYSUNEK_PROTOTYPOWY ( / lista_dxf handle dane)
(progn
;---------(command
"_cmdecho" "0"
"_blipmode" "_off"

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
"_handles" "_on"
"_limits" "0,0" "12,9"
"_zoom" "_all"
);command
;
(setq lista_obiektow (list))
;
(command
"_color" "1"
"_circle" "4,3" "0.5"
);command
(setq
lista_dxf (entget (entlast))
handle (cdr (assoc 5 lista_dxf))
dane (list 1 handle)
lista_obiektow (append lista_obiektow
);setq
;
(command
"_color" "2"
"_circle" "4,6" "0.5"
);command
(setq
lista_dxf (entget (entlast))
handle (cdr (assoc 5 lista_dxf))
dane (list 2 handle)
lista_obiektow (append lista_obiektow
);setq
;
(command
"_color" "3"
"_circle" "6,3" "0.5"
);command
(setq
lista_dxf (entget (entlast))
handle (cdr (assoc 5 lista_dxf))
dane (list 3 handle)
lista_obiektow (append lista_obiektow
);setq
;
(command
"_color" "4"
"_circle" "6,6" "0.5"
);command
(setq
lista_dxf (entget (entlast))
handle (cdr (assoc 5 lista_dxf))
dane (list 4 handle)
lista_obiektow (append lista_obiektow
);setq
;
(command
"_color" "5"
"_circle" "8,3" "0.5"
);command

(list dane))

(list dane))

(list dane))

(list dane))

5::

611

BvupMJTQ!!qsbluzd{oz!lvst
(setq
lista_dxf (entget (entlast))
handle (cdr (assoc 5 lista_dxf))
dane (list 5 handle)
lista_obiektow (append lista_obiektow (list dane))
);setq
;
(command
"_color" "6"
"_circle" "8,6" "0.5"
);command
(setq
lista_dxf (entget (entlast))
handle (cdr (assoc 5 lista_dxf))
dane (list 6 handle)
lista_obiektow (append lista_obiektow (list dane))
);setq
;
(command "_color" "_bylayer")
;---------(princ)
;---------);progn
);RYSUNEK_PROTOTYPOWY
;
;------------------------------------------------;Wykorzystanie funkcji ssadd, ssdel i ssmemb
;do obslugi zbiorow wskazan.
;
(defun OPERACJE_NA_ZBIORACH_WSKAZAN
( / handle_4 ename handle_5 handle_1 czy_jest_w_zbiorze)
(progn
;---------;utworzenie zbioru wskazan zbior_1
;zawierajacego okregi w kolorach 1, 2 i 3
(princ
(strcat
"\nUtworzenie zbioru wskazan zbior_1 "
"zawierajacego okregi w kolorach 1, 2 i 3."
);strcat
);princ
(CZEKAJ)
;
(setq
zbior_1 (ssget "X"
'(
(0 . "CIRCLE")
(-4 . "<OR")
(62 . 1)
(62 . 2)
(62 . 3)
(-4 . "OR>")
)
);ssget
);setq

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
;---------;przesuniecie zbioru wskazan zbior_1
;o wektor [-2 -2]
(princ
(strcat
"\nPrzesuniecie zbioru wskazan zbior_1 "
"o wektor [-2 -2]."
);strcat
);princ
(CZEKAJ)
;
(command "_move" zbior_1 "" "-2,-2" "")
;---------;dodanie do zbioru wskazan zbior_1
;okregow w kolorach 4 i 5
(princ
(strcat
"\nDodanie do zbioru wskazan zbior_1 "
"okregow w kolorach 4 i 5."
);strcat
);princ
(CZEKAJ)
;
(setq
handle_4 (cadr (assoc 4 lista_obiektow))
ename (handent handle_4)
);setq
(ssadd ename zbior_1)
;
(setq
handle_5 (cadr (assoc 5 lista_obiektow))
ename (handent handle_5)
);setq
(ssadd ename zbior_1)
;---------;przeskalowanie zbioru wskazan zbior_1
;wzgledem punktu "0,0"
;ze wspolczynnikiem skali "1.25"
(princ
(strcat
"\nPrzeskalowanie zbioru wskazan zbior_1 "
"wzgledem punktu (0 0) ze wspolczynnikiem "
"skali 1.25"
);strcat
);princ
(CZEKAJ)
;
(command "_scale" zbior_1 "" "0,0" "1.25")
;---------;usuniecie okregu w kolorze 1 ze zbioru
;wskazan zbior_1
(princ
(strcat
"\nUsuniecie okregu w kolorze 1 "
"ze zbioru wskazan zbior_1."

612

613

BvupMJTQ!!qsbluzd{oz!lvst
);strcat
);princ
(CZEKAJ)
;
(setq
handle_1 (cadr (assoc 1 lista_obiektow))
ename (handent handle_1)
);setq
(ssdel ename zbior_1)
;---------;sprawdzenie, czy okrag w kolorze 1
;jest w zbiorze wskazan zbior_1
(princ
(strcat
"\nSprawdzenie, czy okrag w kolorze 1 "
"jest w zbiorze wskazan zbior_1."
);strcat
);princ
(CZEKAJ)
;
(setq
handle_1 (cadr (assoc 1 lista_obiektow))
ename (handent handle_1)
czy_jest_w_zbiorze (ssmemb ename zbior_1)
);setq
(if czy_jest_w_zbiorze
(progn
(princ "\nElement ")
(princ ename)
(princ " nalezy do zbioru wskazan zbior_1.")
);progn
(progn ;else
(princ "\nElement ")
(princ ename)
(princ " nie nalezy do zbioru wskazan zbior_1.")
);progn
);if
;---------;wykasowanie zbioru wskazan zbior_1
(princ "\nWykasowanie zbioru wskazan zbior_1.")
(CZEKAJ)
(command "_erase" zbior_1 "")
;---------(princ)
;---------);progn
);OPERACJE_NA_ZBIORACH_WSKAZAN
;
;------------------------------------------------;Ten fragment programu zostanie wykonany
;automatycznie po jego zaladowaniu.
;
(princ "\nUtworzenie obiektow rysunkowych.")
(CZEKAJ)
(RYSUNEK_PROTOTYPOWY)

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

614

(princ "\nOperacje na zbiorach wskazan.")


(CZEKAJ)
(OPERACJE_NA_ZBIORACH_WSKAZAN)
(CZEKAJ)
(setq lista_obiektow nil)
(setq zbior_1 nil)
(princ "\nKoniec programu.")
(princ)
;------------------------------------------------;*************************************************KONIEC

Program skada si z dwch gwnych funkcji: RYSUNEK_PROTOTYPOWY


i OPERACJE_NA_ZBIORACH_WSKAZAN oraz z funkcji pomocniczej CZEKAJ.
Funkcje gwne wykonuj nastpujce czynnoci:

SZTVOFL`QSPUPUZQP
SZTVOFL`QSPUPUZQPXZ
L`QSPUPUZQPXZ
Funkcja rysuje poszczeglne elementy 6 okrgw w kolorach od 1 do 6, pobiera ich
listy DXF, wyszukuje na licie grup z kodem 5 (identyfikator elementu), tworzy list
w formacie (numer_porzdkowy identyfikator), gdzie numer porzdkowy odpowiada
kolorowi elementu oraz dopisuje utworzon list na koniec listy lista_obiektow. Po
zakoczeniu dziaania funkcji dostp do poszczeglnych elementw moemy osign
poprzez ich identyfikatory pobierane z listy lista_obiektow.

PQFSBDKF`OB`
PQFSBDKF`OB`[CJPSB
SBDKF`OB`[CJPSBDI`XTL
[CJPSBDI`XTLB[BO
DI`XTLB[BO
Funkcja tworzy zbir wskaza zbior_1, ktry na pocztku zawiera 3 okrgi. Podczas
tworzenia zbioru wskaza wykorzystujemy funkcj ssget "X". Po przesuniciu zbioru
o wektor [2 2], dodajemy do niego okrgi w kolorach 4 i 5. Wykorzystujemy tutaj
funkcje ssadd oraz handent, ktra zwraca nazw obiektu w oparciu o jego identyfikator. Identyfikator elementu pobieramy z listy lista_obiektow, posugujc si funkcj
assoc, w ktrej kluczem jest kolor elementu. Tak zmieniony zbir wskaza przeskalowujemy wzgldem punktu (0 0) ze wspczynnikiem skali 1.25. Nastpnie, uywajc
funkcji ssdel, usuwamy ze zbioru wskaza okrg w kolorze 1. Nastpnie, funkcja
ssmemb sprawdza, czy okrg w kolorze 1 znajduje si w zbiorze wskaza. Na koniec,
kasujemy zbir wskaza zbior_1. W swej kocowej postaci zbir wskaza zawiera
4 okrgi (o kolorach 2 3 4 5).
Bardzo czsto, wykonujc operacje edycyjne, chcielibymy mie dostp do zbioru
wskaza zawierajcego nowo utworzone obiekty. Poniszy program zawiera funkcj
GET_NEW_OBJECTS, realizujc to zadanie. Program zawiera rwnie funkcj
C:TEST, wywoanie ktrej rozpoczyna testowanie funkcji gwnej.

615

BvupMJTQ!!qsbluzd{oz!lvst
;*************************************************PROG_107
;Funkcja umieszczajaca w zbiorze wskazan wszystkie
;nowo utworzone obiekty.
;
;Funkcja wywolywana jest z dwoma argumentami:
;pickset_name - nazwa zbioru wyboru, do ktorego beda
;
dodawane nowo utworzone obiekty.
;
UWAGA - zbior wyboru musi istniec w chwili
;
wywolania funkcji, nawet jezeli ma to byc
;
zbior pusty.
;ename - nazwa obiektu, od ktorego zaczynamy przetwarzanie
;
bazy danych (nie wlaczajac podanego obiektu).
;
;Przyklad wywolania funkcji:
;(setq
; zbior_1 (ssadd)
; ename_1 (entlast)
;);setq
;(GET_NEW_OBJECTS zbior_1 ename_1)
;
;------------------------------------------------;
(defun GET_NEW_OBJECTS (pickset_name ename /
argumenty x
)
(progn
;---------;sprawdzenie argumentow funkcji
(setq argumenty T)
;
(if (/= (type pickset_name) 'PICKSET) 
(progn
(alert
(strcat
"Komunikat funkcji GET_NEW_OBJECTS"
"\n"
"\nBledny typ argumentu PICKSET_NAME."
"\nPrzerwanie wykonywania funkcji."
);strcat
);alert
(setq argumenty nil)
);progn
);if

;
(if (/= (type ename) 'ENAME)

(progn
(alert
(strcat
"Komunikat funkcji GET_NEW_OBJECTS"
"\n"
"\nBledny typ argumentu ENAME."
"\nPrzerwanie wykonywania funkcji."
);strcat
);alert

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
(setq argumenty nil)
);progn
);if
;---------;jesli argumenty zostaly podane poprawnie,
;przetworzenie bazy danych zaczynajac
;od elementu ename
(if argumenty
(progn
(setq x ename)
(while (setq x (entnext x))
(ssadd x pickset_name)
);while
);progn
);if argumenty
;---------(princ)
;---------);progn
);GET_NEW_OBJECTS
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")
(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Funkcja testujaca
;
(defun C:TEST ( / ename_1 ename_2 ename_3
zbior_1 zbior_2 zbior_3
)
(progn
;---------(setvar "cmdecho" 0)
(command "_zoom" "_window" "0,0" "12,9")
;---------;narysowanie obiektow
;ustawienie wskaznikow
(command "_circle" "2,2" "1")
(setq ename_1 (entlast))
(princ "\nUstawienie wskaznika ename_1.")
(CZEKAJ)
(command "_line" "1,1" "1,6" "10,6" "")
(setq ename_2 (entlast))
(princ "\nUstawienie wskaznika ename_2.")

616




617

BvupMJTQ!!qsbluzd{oz!lvst
(CZEKAJ)
(command "_pline" "1,2" "4,6" "8,8" "11,1" "_c")
(setq ename_3 (entlast))
(princ "\nUstawienie wskaznika ename_3.")
(CZEKAJ)
(command "_circle" "10,5" "1")
;---------;utworzenie zbiorow wskazan
(princ "\nTworzenie zbiorow wskazan.")
(CZEKAJ)
;
;bledny typ argumentow pickset_name i ename
(GET_NEW_OBJECTS zbior_x x)
;
(setq zbior_1 (ssadd))

(GET_NEW_OBJECTS zbior_1 ename_1)

;
(setq zbior_2 (ssadd))
(GET_NEW_OBJECTS zbior_2 ename_2)
;
(setq zbior_3 (ssadd))
(GET_NEW_OBJECTS zbior_3 ename_3)
(CZEKAJ)
;---------;operacje edycyjne na zbiorach wskazan
(princ "\nOperacje edycyjne na zbiorach wskazan.")
(CZEKAJ)
(princ
"\nZmiana koloru obiektow ze zbioru ZBIOR_1 na
czerwony."
);princ
(CZEKAJ)
(command "_chprop" zbior_1 "" "_color" "1" "")

(CZEKAJ)
(princ
(strcat
"\nZmiana skali obiektow ze zbioru ZBIOR_2 x0.5 "
"wzgledem srodka ekranu."
);strcat
);princ
(CZEKAJ)
(command "_scale" zbior_2 "" "6,4.5" "0.5")
(CZEKAJ)
(princ "\nWykasowanie zbioru wskazan ZBIOR_3.")
(CZEKAJ)
(command "_erase" zbior_3 "")
(CZEKAJ)
(princ "\nKoniec testu.")
;---------(princ)
;---------);progn
);C:TEST
;

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

618

;------------------------------------------------(princ "\nProgram zaladowany.")


(princ "\nKomenda TEST uruchamia testowanie.")
(princ)
;------------------------------------------------;*************************************************KONIEC

Omwmy teraz wyrnione linie i bloki programu.


 W bloku tym sprawdzamy, czy pierwszy argument funkcji GET_NEW
_OBJECTS jest zbiorem wskaza (PICKSET). Jeli nie, wywietlne jest okno
ostrzegawcze oraz warto zmiennej argumenty jest ustawiana na nil.
 W bloku tym sprawdzamy, czy drugi argument funkcji GET_NEW_OBJECTS
jest nazw obiektu rysunkowego AutoCADa (ENAME). Jeli nie, wywietlane
jest okno ostrzegawcze oraz warto zmiennej argumenty jest ustawiana na nil.
 Blok ten jest wykonywany wwczas, gdy oba argumenty funkcji GET_NEW
_OBJECTS zostay podane poprawnie. Poruszajc si w ptli while, pobieramy
nazwy kolejnych elementw, liczc od elementu podanego w argumencie ename
(ale bez niego), oraz dodajemy je do zbioru wskaza podanego w argumencie
pickset_name.
 Rysujemy pierwszy obiekt rysunkowy.
 Ustawiamy zmienn ename_1 na nazwie ostatnio narysowanego obiektu.
 Tworzymy pusty zbir wskaza zbior_1.
 Dodajemy wszystkie obiekty, utworzone po obiekcie ename_1, do zbioru
wskaza zbior_1.
 Zmieniamy kolor obiektw wystpujcych w zbiorze wskaza zbior_1 na czerwony.
Na koniec omawiania operacji na zbiorach wyboru omwi funkcje do wyznaczania
sumy i rnicy zbiorw. W ksice Joseph Smith & Rusty Gesner AutoLISP czyli
programowanie AutoCADa podano przykady na sum i rnic dwch zbiorw
wskaza. Program podany poniej rozszerza moliwoci funkcji: moemy doda do
siebie dowoln liczb zbiorw wskaza oraz odj od zbioru wskaza dowoln liczb
innych zbiorw wskaza.
;*************************************************PROG_108
;Operacje na zbiorach wyboru.
;
;------------------------------------------------;Funkcja laczy podane zbiory wyboru za pomoca
;komendy SELECT.
;
;Funkcja wywolywana jest z dwoma argumentami:
;output_pickset - nazwa zbioru wyboru, do ktorego beda
;
dodawane pozostale zbiory.
;
UWAGA - zbior wyboru musi istniec w chwili
;
wywolania funkcji, nawet jezeli ma to byc
;
zbior pusty.
;input_picksets - lista zbiorow wyboru, ktore maja byc

619

BvupMJTQ!!qsbluzd{oz!lvst
;
dolaczone do zbioru glownego podanego
;
w argumencie output_pickset.
;
;Wartosc zwrotna funkcji:
;suma zbiorow wyboru
;
;Przyklad wywolania funkcji:
;(setq zbior_1 (ssget "X" '((0 . "CIRCLE"))))
;(setq zbior_2 (ssget "X" '((0 . "TEXT"))))
;(setq zbior_3 (ssget "X" '((8 . "WEZLY"))))
;(setq zbior_1 (GET_SSUNION zbior_1 '(zbior_2 zbior_3)))
;
(defun GET_SSUNION (output_pickset input_picksets /
argumenty dlugosc licznik zbior
)
(progn
;---------;sprawdzenie argumentu output_pickset
(setq argumenty T)
;
(if (/= (type output_pickset) 'PICKSET)

(progn
(alert
(strcat
"Komunikat funkcji GET_SSUNION"
"\n"
"\nBledny typ argumentu OUTPUT_PICKSET."
"\nPrzerwanie wykonywania funkcji."
);strcat
);alert
(setq argumenty nil)
);progn
);if

;
;---------(if argumenty

(progn
;---------(setq
dlugosc (length input_picksets) 
licznik 0
);setq
(repeat dlugosc

(progn
;---------(setq
zbior (eval (nth licznik input_picksets))

);setq
(if (= (type zbior) 'PICKSET) 
(progn
;---------(command
"_select" output_pickset zbior ""
);command

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
(setq output_pickset (ssget "P"))
;---------);progn
);if

;---------(setq licznik (1+ licznik))

;---------);progn
);repeat dlugosc
;---------;zwrot sumy zbiorow
output_pickset

;---------);progn
); if argumenty

;---------);progn
);GET_SSUNION
;
;------------------------------------------------;Funkcja odejmuje zbiory wyboru podane w argumencie
;input_picksets od zbioru wyboru podanego w argumencie
;output_pickset za pomoca komendy SELECT.
;
;Funkcja wywolywana jest z dwoma argumentami:
;output_pickset - nazwa zbioru wyboru, do ktorego beda
;
odejmowane pozostale zbiory.
;
UWAGA - zbior wyboru musi istniec w chwili
;
wywolania funkcji, nie powinien to takze
;
byc zbior pusty
;input_picksets - lista zbiorow wyboru, ktore maja byc
;
odjete ze zbioru glownego podanego
;
w argumencie output_pickset
;
;Przyklad wywolania funkcji:
;(setq zbior_1 (ssget "X"))
;(setq zbior_2 (ssget "X" '((0 . "TEXT"))))
;(setq zbior_3 (ssget "X" '((8 . "WEZLY"))))
;(setq zbior_1 (GET_SSDIFF zbior_1 '(zbior_2 zbior_3)))
;
(defun GET_SSDIFF (output_pickset input_picksets /
argumenty dlugosc licznik zbior
)
(progn
;---------;sprawdzenie argumentu output_pickset
(setq argumenty T)
;
(if (/= (type output_pickset) 'PICKSET)
(progn
(alert
(strcat
"Komunikat funkcji GET_SSDIFF"
"\n"

61:

621

BvupMJTQ!!qsbluzd{oz!lvst
"\nBledny typ argumentu OUTPUT_PICKSET."
"\nPrzerwanie wykonywania funkcji."
);strcat
);alert
(setq argumenty nil)
);progn
);if
;
;---------(if argumenty
(progn
;---------(setq
dlugosc (length input_picksets)
licznik 0
);setq
(repeat dlugosc
(progn
;---------(setq
zbior (eval (nth licznik input_picksets))
);setq
(if (= (type zbior) 'PICKSET)
(progn
;---------(command
"_select" output_pickset "_r" zbior ""
);command
(setq output_pickset (ssget "P"))
;---------);progn
);if
;---------(setq licznik (1+ licznik))
;---------;zwrot roznicy zbiorow
output_pickset
;---------);progn
);repeat dlugosc
;---------);progn
); if argumenty
;---------);progn
);GET_SSDIFF
;
;------------------------------------------------;Funkcja zatrzymujaca realizacje programu,
;dopoki uzytkownik nie nacisnie ENTER.
;
(defun CZEKAJ ()
(progn
;---------(getstring "\nNacisnij ENTER...")

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv
(princ)
;---------);progn
);CZEKAJ
;
;------------------------------------------------;Funkcja testujaca
;
(defun C:TEST ( / zbior_1 zbior_2 zbior_3
zbior_suma zbior_roznica
)
(progn
;---------(setvar "cmdecho" 0)
;---------;utworzenie warstw
;narysowanie obiektow
(command
"_layer"
"_new" "1"
"_new" "2"
"_color" "1" "1"
"_color" "5" "2"
""
"_zoom" "_w" "0,0" "12,9"
"_text" "1,7" "0.8" "0" "Test_1"
"_text" "7,7" "0.8" "0" "Test_2"
"_layer" "_set" "1" ""
"_line" "1,1" "1,6" ""
"_line" "3,1" "3,6" ""
"_line" "5,1" "5,6" ""
"_line" "7,1" "7,6" ""
"_line" "9,1" "9,6" ""
"_layer" "_set" "2" ""
"_circle" "1,6" "0.5"
"_circle" "3,6" "0.5"
"_circle" "5,6" "0.5"
"_circle" "7,6" "0.5"
"_circle" "9,6" "0.5"
"_layer" "_set" "0" ""
);command
;---------;utworzenie zbiorow wskazan
(princ
(strcat
"\nTworzenie zbiorow wskazan zbior_1 "
"zbior_2 zbior_3,"
"\nzbior_suma = zbior_2 + zbior_3,
"
"\zbior_roznica = zbior1 - zbior_2 - zbior_3."
);strcat
);princ
(CZEKAJ)
(setq
zbior_1 (ssget "X")
zbior_2 (ssget "X" '((8 . "1")))
zbior_3 (ssget "X" '((8 . "2")))

622

623

BvupMJTQ!!qsbluzd{oz!lvst
zbior_suma (ssadd)
zbior_roznica (ssadd)
);setq
(setq
zbior_suma
(GET_SSUNION zbior_suma '(zbior_2 zbior_3))
zbior_roznica
(GET_SSDIFF zbior_1 (list zbior_2 zbior_3))
);setq
(CZEKAJ)
;---------;operacje edycyjne na zbiorach wskazan
(princ "\nOperacje edycyjne na zbiorach wskazan.")
(CZEKAJ)
(princ
"\nZmiana koloru zbioru ZBIOR_SUMA na zielony."
);princ
(CZEKAJ)
(command "_chprop" zbior_suma "" "_color" "3" "")
(CZEKAJ)
(princ
(strcat
"\nZmiana skali obiektow ze zbioru ZBIOR_ROZNICA "
"x0.5 wzgledem punktu (0 0)."
);strcat
);princ
(CZEKAJ)
(command "_scale" zbior_roznica "" "0,0" "0.5")
(CZEKAJ)
(princ "\nKoniec testu.")
;---------(princ)
;---------);progn
);C:TEST
;
;------------------------------------------------(princ "\nProgram zaladowany.")
(princ "\nKomenda TEST uruchamia testowanie.")
(princ)
;------------------------------------------------;*************************************************KONIEC

Poniewa funkcje GET_SSUNION i GET_SSDIFF s podobne w dziaaniu, zostanie


tutaj szczegowo omwiona pierwsza z nich.
 W bloku tym sprawdzamy, czy zosta prawidowo podany argument funkcji
output_pickset. Ma on wskazywa na zbir wyboru, nawet jeli ma to by zbir
pusty. W przypadku bdnego podania argumentu, wywietlone zostaje okno
ostrzegawcze po czym zmienna argumenty jest ustawiana na warto nil,
zapobiegajc tym samym wykonaniu dalszej czci funkcji.
 Ten blok instrukcji wykonywany jest wwczas, gdy argument output_pickset
zosta podany prawidowo.
 Ustalamy dugo listy podanej w argumencie input_picksets.

25/!Uxps{fojf!j!pqfsbdkf!ob!{cjpsbdi!xzcpsv

624

 Wchodzimy w ptl repeat i rozpoczynamy sumowanie zbiorw wskaza.


 Pobieramy kolejny element listy input_picksets.
 Ten blok instrukcji wykonywany jest wwczas, gdy element listy jest zbiorem
wskaza (obojtne, czy jest to zbir peny czy te pusty). czymy wwczas
kolejny zbir wskaza z listy ze zbiorem output_pickset, po czym wywoujemy
komend ssget "P", podstawiajc jej rezultat pod zbir wynikowy.
 Zwikszamy zmienn licznik o 1, umoliwiajc tym samym przetworzenie
kolejnej zmiennej z listy input_picksets.
 Funkcja zwraca swoj warto sum zbiorw.
Funkcje GET_SSUNION i GET_SSDIFF testujemy w funkcji C:TEST. Funkcja tworzy dwie warstwy "1" i "2" i rysuje nastpujce obiekty:
dwa napisy "Test_1" i "Test_2" na warstwie "0",
pi linii na warstwie "1",
pi okrgw na warstwie "2".
Nastpnie, uywajc funkcji ssget "X", tworzymy nastpujce zbiory wskaza:
zbior_1, skadajcy si ze wszystkich obiektw na rysunku,
zbior_2, skadajcy si z obiektw lecych na warstwie "1",
zbior_3, skadajcy si z obiektw lecych na warstwie "2".
Po utworzeniu pustych zbiorw wskaza zbior_suma i zbior_roznica (wykorzystujc
funkcj ssadd wywoan bez argumentw), podstawiamy pod nie wartoci zwrotne
funkcji GET_SSUNION i GET_SSDIFF.
(setq zbior_suma (GET_SSUNION zbior_suma '(zbior_2
zbior_3)))

Zmienna zbior_suma zawiera obiekty znajdujce si w zbiorach zbior_suma (zbir


pusty), zbior_2 (pi linii) oraz zbior_3 (pi okrgw).
(setq zbior_roznica (GET_SSDIFF zbior_1 (list zbior_2
zbior_3)))

Zmienna zbior_roznica zawiera obiekty, ktre pozostay po odjciu ze zbioru wskaza


zbior_1 (wszystkie obiekty na rysunku) obiektw znajdujcych si w zbiorach zbior_2
(pi linii) i zbior_3 (pi okrgw). Tak wic w zbiorze wskaza zbior_roznica
pozostay dwa napisy.
Na kocu funkcji testujcej, zmieniamy kolor obiektw znajdujcych si w zbiorze
wskaza zbior_suma oraz skalujemy obiekty znajdujce si w zbiorze wskaza
zbior_roznica.

625

BvupMJTQ!!qsbluzd{oz!lvst

Rozdzia ten zapozna Ci ze sposobami tworzenia, modyfikacji oraz wykorzystania


zbiorw wskaza. Zbir wskaza to nic innego jak lista obiektw. Wikszo edycyjnych komend AutoCADa dziaa na zbiorach wskaza. Na pocztku kadej komendy
edycyjnej AutoCAD prosi o wskazanie obiektw, ktrych ta komenda ma dotyczy.
Mona wybra obiekty za pomoc np. okna lub wskaza je wprost na ekranie. Do wskazywania obiektw w AutoLISPie suy funkcja ssget, ktr wywoujemy z argumentami lub bez argumentw. Funkcja ssget zwraca identyfikator zbioru wskaza.
Identyfikator ten musi by przypisany zmiennej. Operujc na zbiorach wskaza musisz
pamita o tym, e AutoLISP pozwala na utworzenie jednoczenie tylko do 128
zbiorw wskaza. Jeeli ta liczba zostanie przekroczona, to funkcja ssget zwrci nil
(odmwi utworzenia nowego zbioru wskaza). Aby tego unikn przypisuj warto nil
wszystkim nie uywanym zbiorom wskaza, deklaruj zbiory wskaza jako zmienne
lokalne i wykorzystuj je ponownie, gdy zbir wskaza nie jest ju potrzebny.
W nastpnym rozdziale omwimy obsug plikw tekstowych w AutoLISPie.

You might also like