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.

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