_

grupy warstw lispami dotknięte

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

grupy warstw lispami dotknięte

Postprzez asa » cze 24, 2019 14:30

W sumie cisza się wakacyjna tu zrobiła, lecz w związku z tym, że kiedyś walczyłem sobie z grupami warstw, chciałbym się z Wami, jeżeli pozwolicie podzielić moimi doświadczeniami.
Założenie: wydłubać grupy warstw na 1 poziomie i warstwy do nich przynależnych
jak zrobimy tak:
Kod: Zaznacz cały

(setq extdic(vla-GetExtensionDictionary (vla-get-layers(vla-get-activedocument(vlax-get-acad-object)))));
(setq aclydic (vla-item extdic "ACLYDICTIONARY") lista_gr nil)
(vlax-for el aclydic (setq lista_gr (append lista_gr (list el))))

(setq lista_gr (mapcar '(lambda (el)   (entget(vlax-vla-object->ename el))  ) lista_gr) )

(setq lista_gr(mapcar '(lambda(el)
(vl-member-if  '(lambda(el1) (= (car el1) 300) )  el))   lista_gr) )

(setq lista_gr (mapcar '(lambda (el) (mapcar 'cdr el)) lista_gr))
(setq lista_gr(mapcar '(lambda(el)(list(car el) (mapcar 'vlax-ename->vla-object(cdr el)))) lista_gr))

(setq id1  (last(cadr(last lista_gr) )))
 (vla-objectidtoobject (vla-get-activedocument(vlax-get-acad-object)) (vla-get-objectID id1))

to będzie dobrze.
Lecz jeżeli podejdziemy w ten sposób, bardziej jak dla mnie wygodny
Kod: Zaznacz cały

(setq extdic(vla-GetExtensionDictionary (vla-get-layers(vla-get-activedocument(vlax-get-acad-object)))))
(setq aclydic (vla-item extdic "ACLYDICTIONARY"))
(setq lista nil)
(vlax-for el aclydic (setq lista (append lista (list el))))
(vla-GetXRecordData (car lista)  'a 'b)
(setq id(vlax-safearray->list(last(mapcar 'vlax-variant-value (vlax-safearray->list b)))))
 (vla-objectidtoobject (vla-get-activedocument(vlax-get-acad-object)) (vla-get-objectID id ))
 

to ... użyłem kilku haniebnych słów.
Co jest problemem. Pod kodem 330 mamy przecież ID obiektu w postaci tablicy wariantowej tylko że tablica wariantowa ma typ Array of Long (8192+3 Safearray (vlax-vbArray) of some data type. For example, an array of - Long integer (vlax-vbLong) 8195(8192 +3)) wygląda to tak (-5218112 -35172841) jak przekonwertować to na zjadliwą formę dla vla-objectidtoobject... Pewnie ktoś już się z tym próbował....
Pozdrawiam ciepło
asa
asa
 
Posty: 616
Dołączył(a): lut 18, 2007 20:01

Re: grupy warstw lispami dotknięte

Postprzez kojacek » cze 25, 2019 11:13

asa napisał(a):W sumie cisza się wakacyjna tu zrobiła, lecz w związku z tym, że kiedyś walczyłem sobie z grupami warstw, chciałbym się z Wami, jeżeli pozwolicie podzielić moimi doświadczeniami.
Założenie: wydłubać grupy warstw na 1 poziomie i warstwy do nich przynależnych
jak zrobimy tak:
Kod: Zaznacz cały

(setq extdic(vla-GetExtensionDictionary (vla-get-layers(vla-get-activedocument(vlax-get-acad-object)))));
(setq aclydic (vla-item extdic "ACLYDICTIONARY") lista_gr nil)
(vlax-for el aclydic (setq lista_gr (append lista_gr (list el))))

(setq lista_gr (mapcar '(lambda (el)   (entget(vlax-vla-object->ename el))  ) lista_gr) )

(setq lista_gr(mapcar '(lambda(el)
(vl-member-if  '(lambda(el1) (= (car el1) 300) )  el))   lista_gr) )

(setq lista_gr (mapcar '(lambda (el) (mapcar 'cdr el)) lista_gr))
(setq lista_gr(mapcar '(lambda(el)(list(car el) (mapcar 'vlax-ename->vla-object(cdr el)))) lista_gr))

(setq id1  (last(cadr(last lista_gr) )))
 (vla-objectidtoobject (vla-get-activedocument(vlax-get-acad-object)) (vla-get-objectID id1))

to będzie dobrze.
Lecz jeżeli podejdziemy w ten sposób, bardziej jak dla mnie wygodny
Kod: Zaznacz cały

(setq extdic(vla-GetExtensionDictionary (vla-get-layers(vla-get-activedocument(vlax-get-acad-object)))))
(setq aclydic (vla-item extdic "ACLYDICTIONARY"))
(setq lista nil)
(vlax-for el aclydic (setq lista (append lista (list el))))
(vla-GetXRecordData (car lista)  'a 'b)
(setq id(vlax-safearray->list(last(mapcar 'vlax-variant-value (vlax-safearray->list b)))))
 (vla-objectidtoobject (vla-get-activedocument(vlax-get-acad-object)) (vla-get-objectID id ))
 

to ... użyłem kilku haniebnych słów.
Co jest problemem. Pod kodem 330 mamy przecież ID obiektu w postaci tablicy wariantowej tylko że tablica wariantowa ma typ Array of Long (8192+3 Safearray (vlax-vbArray) of some data type. For example, an array of - Long integer (vlax-vbLong) 8195(8192 +3)) wygląda to tak (-5218112 -35172841) jak przekonwertować to na zjadliwą formę dla vla-objectidtoobject... Pewnie ktoś już się z tym próbował....
Pozdrawiam ciepło
asa



Zapodaj jaki plik z tymi grupami, bo u mnie twój kod najpierw chwyta filtry warstw (i) się wyhacza nie dochodząc do grup warstw...
Avatar użytkownika
kojacek
 
Posty: 5553
Dołączył(a): paź 03, 2005 20:17

Re: grupy warstw lispami dotknięte

Postprzez asa » cze 25, 2019 20:29

kojacek napisał(a):

Zapodaj jaki plik z tymi grupami, bo u mnie twój kod najpierw chwyta filtry warstw (i) się wyhacza nie dochodząc do grup warstw...

Coś takiego jak w załączniku 64 bity system.
Załączniki
test.dwg
(29.07 KiB) Pobrane 121 razy
asa
 
Posty: 616
Dołączył(a): lut 18, 2007 20:01

Re: grupy warstw lispami dotknięte

Postprzez kojacek » cze 26, 2019 09:39

asa napisał(a):
kojacek napisał(a):

Zapodaj jaki plik z tymi grupami, bo u mnie twój kod najpierw chwyta filtry warstw (i) się wyhacza nie dochodząc do grup warstw...

Coś takiego jak w załączniku 64 bity system.


Rzeczywiście jakaś bieda z tym... chyba musisz po bożemu... a nie jakieś tam sejfereje;)
Avatar użytkownika
kojacek
 
Posty: 5553
Dołączył(a): paź 03, 2005 20:17

Re: grupy warstw lispami dotknięte

Postprzez asa » cze 26, 2019 14:29

kojacek napisał(a):
asa napisał(a):
kojacek napisał(a):

Zapodaj jaki plik z tymi grupami, bo u mnie twój kod najpierw chwyta filtry warstw (i) się wyhacza nie dochodząc do grup warstw...

Coś takiego jak w załączniku 64 bity system.


Rzeczywiście jakaś bieda z tym... chyba musisz po bożemu... a nie jakieś tam sejfereje;)

W sumie te moje "dziwactwa" grupowe, wzięły się z potrzeby chwili. Sympatyczna Płeć Przeciwna (SPP), podrzuca mi czasem do przejrzenia dokumentację. W zależności od oprogramowania zdarza się czasem 100 warstw, czasem więcej... Upisałem więc lispiki, co mi je segregują w zależności od nazwy sufiksów prefiksów i wrzucają do grup. Potem jest łatwiej. Lecz na koniec zostało uproszczenie włączania, wyłączania mrożenie, odmrażanie z okienkiem DCL'owym bo tradycyjnie to za dużo kliknięć. I tu pojawił się problem powyższy ;)
pozdrawiam ciepło
asa
P.S.
W załączeniu lispik i dcelek. Tylko proszę mi się nie śmiać z moich okienek ;) - w razie co można poprawić ;)
Załączniki
warstwy.lsp
(3.61 KiB) Pobrane 126 razy
okienka.DCL
tut taj moje nieudolne okienko ;)
(877 Bajtów) Pobrane 132 razy
asa
 
Posty: 616
Dołączył(a): lut 18, 2007 20:01


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników