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


Rekomendowane odpowiedzi

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
Odnośnik do komentarza
Udostępnij na innych stronach

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie