Rekomendowane odpowiedzi

Opublikowano (edytowane)

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 😄 ).

Edytowane przez swazy
Opublikowano

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)
)

 

Opublikowano

Ł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.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się