[LISP] Odmrażanie warstw za pomocą kodu.


Recommended Posts

Cześć! Popełniłem taką oto komendę, która ma na celu odmrożenie wszystkich warstw pasujących do danego klucza.
I o ile w ZWCAD 2021 (i 2024) działa tak jak się tego spodziewałem, o tyle w AC 2022 już nie. To znaczy w memu warstw, warstwy na których mi zależy w kolumnie freeze zmieniają symbol na "odmrożony", ale w programie te warstwy fizycznie nie wyświetlają się.

	(defun C:ODMROZENIE_WARSTW ( / POM jeszcze LAY qqq )

		(setq POM (tblnext "layer" T ))
		(setq jeszcze T )
		
		(while jeszcze
			
			(setq LAY (cdr (assoc 2 POM )))
			
			(if (and 
					(wcmatch (substr LAY 1 17 )	(strcat "@@####@#########@#"  )) ;tutaj jakiś klucz nazewnictwa warstw
				);and
				(progn
					(setq qqq (entget (tblobjname "layer" LAY )))
					(if (= 	1 (cdr (assoc 70 qqq )))
						(progn
							(setq qqq (subst (cons 70 0 )(assoc 70 qqq ) qqq))
							(entmod qqq)
						);progn
					);if
					(if (= 	49 (cdr (assoc 70 qqq )))
						(progn
							(setq qqq (subst (cons 70 48 )(assoc 70 qqq ) qqq))
							(entmod qqq)
						);progn
					);if			
				);progn
			);if
			

			(setq POM (tblnext "layer" ))
			(if (= POM nil ) (setq jeszcze nil ))
			
		);while					

		(princ)
	);defun	


Macie pomysł co można z tym zrobić? "regen" nie działa, "redrawall" też nie. Ale już po zapisaniu, wyjściu i wczytaniu pliku wyświetla się to tak jak powinno.
Również po włączeniu "layon" odmrożone warstwy się wyświetlają poprawnie, no ale siłą rzeczy włączają się warstwy, które chciałbym mieć "off".

I kolejne pytanie: czy jest gdzieś sporządzona lista wszystkich komend visual lispa analogicznie jak to jest w naszym cad-packu? Bo może dałoby się odmrozić skutecznie te warstwy visualowo (?) (szczerze mówiąc wolę klasycznego lispa bo jest ładniejszy 😄 ).

Edited by swazy
Link to comment
Share on other sites

Być może przyczyną jest funkcja entmod. Wprawdzie może ona modyfikować obiekty niegraficzne (tutaj LAYER), ale gdzieś czytałem że są wyjątki dla kodu 70 - nie pamiętam jednak czego dotyczyły. W autocadowskich "antycznychch" czasach (przed ActiveX (czyli przed 1999 :))), pewnie bym użył command zamiast entmod… ale pewnie dlatego że byłoby łatwiej.
Na marginesie - Twoje warunkowanie kodu 70 jest błędne - działa tylko w wyjątkowych sytuacjach. Kod 70 jest wartością bitową, więc na przykład 1 jest prawdziwe nie tylko dla 1, ale też 3 (2+1)... 5 (4+1)... 7 (2+4+1)... 9... etc.
Teraz przykład z użyciem ActiveX (i CADPack'a). Krótko (i co ważniejsze) działa:

(defun C:ODMROZWAR ()
  (vlax-for % (cd:ACX_Layers)
    (if
      (and
        (= :vlax-true (vla-get-freeze %))
        (wcmatch (vla-get-name %) "LS*") ; <- moj testowy filtr
      )
      (vla-put-freeze % :vlax-false)
    )
  )
  (vla-regen (cd:ACX_ADoc) 0)
  (princ)
)

 

Link to comment
Share on other sites

Łał, mega... Dziękuję :) 
Chyba rzeczywiście pora się przesiąść z trabanta na coś nowszego...

A czy możecie polecić jakieś materiały, które wprowadzają w v-lisp'a i ActivX'a ?
Oczywiście znam LeeMac'a i wordpress'a Kojacka +to forum, ale czy są jakieś opracowania z listą wszystkich dostępnych komend.
LISP'a nauczyłem się z prehistorycznej książki zassanej z odmętów chomika i mówiąc szczerze to najbardziej mi odpowiada taka forma
nauki. Pomoc ZWCAD-owa też jest mega pożyteczna, ale tam już trzeba wiedzieć, czego się szuka.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...