Lipiec w tym roku to miesiąc urlopowy. W tym czasie odbyły się również TWG, oraz WGP, stąd też nie powinno dziwić nieco zwolnione tempo ukazywania się tutejszych wpisów… Skoro jednak wszystko się kończy, a dziś ostatni dzień miesiąca, trzeba zatem nadrobić zaległości.
Bloki dynamiczne już bardzo mocno zadomowiły się w AutoCAD-zie, ich szerokie możliwości, dają użytkownikom szerokie pole zastosowań. Od tworzenia małych i prostych do całkiem skomplikowanych modeli parametrycznych. Dla zaawansowanych użytkowników, a zwłaszcza lispowych wyjadaczy (wron), dużym wyzwaniem są próby manipulacji blokami dynamicznymi z poziomu LISP-a. Jednym z nich jest wybieranie wstawień bloków dynamicznych czyli tworzenie zbiorów wskazań. Sam wybór takich bloków jest i tak już stosunkowo skomplikowany, jeśli zaś dodać do tego wybór bloków na podstawie określonych wartości ich parametrów, sprawa wydaje się być jeszcze bardziej trudniejsza.
Na początek zatem o „zwykłym” wyborze wstawień bloków dynamicznych, przy wykorzystaniu standardowej funkcji ssget. Koniecznym jest tutaj zapoznanie się z pojęciem nazwa efektywna, o czym już pisałem wcześniej TUTAJ. Wspomniana została tam funkcja zdefiniowana w CADPL-Pack-u, o nazwie cd:BLK_GetBlockNames. Zwraca ona listę wszystkich nazw wstawień bloków dynamicznych o określonej nazwie. Poniżej wywołanie i wynik działania funkcji, dla przykładowego bloku o nazwie „Pojazdy – metryczny” (z katalogu Sample AutoCAD-a):
Taka lista pozwala dopiero zbudować filtr zbioru wskazań funkcji ssget, dla wyboru przez nazwę (kod 2 DXF). Najprościej jest połączyć elementy listy w łańcuch tekstowy i przekazać jako wartość kodu 2 filtra ssget.
Pokazany tutaj sposób utworzenia zbioru wskazań określonego przez nazwę bloku, nazwę jego parametru i jego wartość, realizowany jest w dwóch etapach. Po pierwsze utworzony jest zbiór wskazań bloku dynamicznego (oknem) i przez nazwę. Gdy taki zbiór powstanie, ( w drugim etapie) zmieniany jest on na listę obiektów, które kolejno są „przeglądane”, pod kątem zgodności nazwy i wartości parametru bloku. Spełniające warunki są listy usuwane, a z pozostałych jest tworzony drugi zbiór wskazań. Ich różnica jest wynikiem zwracanym przez funkcję. Zilustrowane jest to poniżej. Wybierane są bloki o nazwie: „Pojazdy – metryczny”, parametrze widoczności: „Typ (widok)”, i jego wartości: „Sedan (przód)”:
Tak samo jak dla parametru widoczności, w wywołaniu funkcji można wykorzystać inny dowolny parametr bloku. Poniżej wybór bloków na podstawie wartości parametru liniowego:
Oczywiście prezentowana funkcja ilustruje mechanizm działania tworzenia zbiorów wskazań bloków dynamicznych na podstawie wartości ich parametru. To najprostszy przykład. Na jego podstawie można zbudować inne bardziej rozbudowane procedury wyboru (np. z zadanego zbioru wskazań, z dowolną nazwą bloku, z dowolnym parametrem, z wieloma parametrami itp.).
Funkcja wygląda tak:
; ------------------------------------------------------------------ ;
; funkcja jk:BLK_DynPropSS tworzy zbior wskazan blokow dynamicznych
; o nazwie [BName] parametrze [PropName] i jego wartosci [PropValue]
; by kojacek 2017
; ------------------------------------------------------------------ ;
(defun jk:BLK_DynPropSS (BName PropName PropValue / s l n r c)
(if
(setq s
(ssget
(list
'(0 . "INSERT")
(cons 2
(cd:STR_ReParse
(cd:BLK_GetDynBlockNames BName)
",`"
)
)
)
)
)
(progn
(setq l (cd:SSX_Convert s 0))
(setq c (getvar "CMDECHO")
n (ssadd)
)
(foreach % l
(if
(/= PropValue
(cdr
(assoc
PropName
(cd:BLK_GetDynamicProps % nil)
)
)
)
(ssadd % n)
)
)
(if
(< (sslength n)(sslength s))
(progn
(setvar "CMDECHO" 0)
(setq r (SS_SSsub s n))
(setvar "CMDECHO" c)
(sssetfirst nil r)
r
)
)
)
)
)
Do prawidłowego działania wymaga wcześniejszego załadowania funkcji bibliotecznych, zdefiniowanych w CADPL-Pack, (cd:STR_ReParse, cd:BLK_GetDynBlockNames, cd:BLK_GetDynamicProps i cd:SSX_Convert), oraz funkcji SS_SSsub, którą znajdziesz w opisie tworzenia różnicy zbiorów wskazań.
( . . . )
Hm. I czy to było/jest takie trudne żeby zamieścić „filmik” z użycia lispa (jak np u Lee M.) ?
Teraz każdy (również nie Polsko języczny) użytkownik AC wie co „robi” ten lisp – nawet jeśli nie rozumie jego opisu.
Chylę czoła przed Pana wiedzą ale komunikacja z „fanami” nadal kuleje – choć idzie w dobrym kierunku.
Pozdrawiam
MW
PolubieniePolubione przez 1 osoba
Dzięki za zauważenie zmian. Postaram się trzymać ten kurs. Jeżeli chodzi o komunikację to mechanizm ten działa w dwie strony, ale to osobny temat. 🙂
PolubieniePolubienie