swazy Posted March 2 Report Share Posted March 2 Dobry wieczór, Mam problem z programistycznym okiełznaniem bloków dynamicznych - chodzi o blok belki prefabrykowanej występujący w kilku określonych długościach. Belka przedstawiona jest za pomocą bloku dynamicznego, który ma zdefiniowany kilka Visibility z Linear Parameter. Czy mogę prosić o nakierowanie w jaki sposób mogę się dowiedzieć, która długość belki jest aktualnie wybrana na rysunku? Obstawiam, że to siedzi gdzieś w słownikach. "(102 . {ACAD_XDICTIONARY) (360 . <ENTITY NAME: 2ba9f768>) (102 . })", Próbowałem googlować, ale nie za bardzo potrafię się połapać o co w tej technologyi chodzi... (niestety nie mam zgody na upublicznienie pliku z blokiem, więc muszę tak lakonicznie i opisowo) Będę dźwięczny za pomoc :) Quote Link to comment Share on other sites More sharing options...
kojacek Posted March 3 Report Share Posted March 3 Możesz użyć funkcji cd:BLK_GetDynamicProps z biblioteki CADPL-Pack-v1.lsp, tak jak na animacji poniżej dla bloku dynamicznego ścian wielowarstwowych. Ma to zastosowanie dla AutoCAD w wersji 2004 i wyższych, dla ZwCAD - nie wiem niestety. swazy and dmatusz3 2 Quote Link to comment Share on other sites More sharing options...
swazy Posted March 3 Author Report Share Posted March 3 Ale czad! 🤩 Dziękuję! Na ZW-Cadzie 2024 działa bez zarzutów. A z ciekawości: czy da się to zrobić klasycznym AutoLispem ? Quote Link to comment Share on other sites More sharing options...
swazy Posted March 5 Author Report Share Posted March 5 (edited) Pozwolę sobie pociągnąć wątek dalej. Dlaczego nie chce mi działać coś takiego i gdzie tu jest błąd? (defun C:HL ( / ) (setq LISTA (cdr (cd:BLK_GetDynBlockNames "<nazwa mojego bloku>" ))) (setq BLOKI (ssget "x" '(( 0 . "INSERT" )))) (setq WYB nil ) (setq n 0 ) (repeat (length LISTA ) (setq m 0 ) ;(setq jeszcze T ) (repeat (sslength BLOKI ) (setq POM (ssname BLOKI m )) (if (= (cdr (assoc 2 (entget POM ))) (nth n LISTA )) (progn (if WYB (progn (setq WYB (ssadd (cdr (assoc -1 (entget POM ))) WYB )) );progn (progn (setq WYB (ssadd (cdr (assoc -1 (entget POM ))))) );progn );if (setq jeszcze nil ) (setq n (1+ n )) );progn );if ;(if (= m (- (sslength BLOKI) 1 ))(setq jeszcze nil )) (setq m (1+ m )) );repeat );repeat (command "hideobjects" WYB "" ) (princ (strcat "\n...ukrylem < " (rtos (sslength WYB ) 2 0 ) " > blok/i/ow..." )) (princ) );defun Kod działa częściowo, bo listę bloków anonimowych tworzy tak jak bym tego chciał, ale dalsza część wyłapuje i ukrywa tylko część z bloków z listy... Na przykład *U286 nie ukrywa. Edited March 5 by swazy Quote Link to comment Share on other sites More sharing options...
kojacek Posted March 6 Report Share Posted March 6 Błędów jest więcej. Już w pierwszej linii - nie deklarujesz zmiennych lokalnych. W drugiej - nie warunkujesz utworzenia listy, Twoje wywołanie zadziała tylko w jednym przypadku - gdy blok istnieje. Potem już z górki... Warunek (if (= (cdr (assoc 2 (entget POM ))) (nth n LISTA )) jest właściwie losowy... Z drugiej strony nie rozumiem tych podwójnych repeat. Zbiór wskazań bloków dynamicznych uzyskasz przecież (w uproszczeniu) tak: (ssget "x" (list (cons 0 "INSERT") (cons 2 (cd:STR_ReParse (cd:BLK_GetDynBlockNames "<Nazwa bloku>") ",`" ) ) ) ) Quote Link to comment Share on other sites More sharing options...
swazy Posted March 9 Author Report Share Posted March 9 Dziękuję za odpowiedź. Moją ideą było przeszukanie "m" razy (gdzie m to długość mojej listy) zbiór wszystkich bloków w rysunku i pisałem to pod jeden konkretny blok, dlatego brak filtrów na wejściu. Teraz widzę, że "(1+ m)" i (1+ n ) są w złych miejscach no i mam oczywiście świadomość, że działanie programu jest mało finezyjne....ale tak jakoś nauczyłem się kiedyś AutoLispa a Visual wydaje mi się mniej czytelny no i nie ma o tym książek (chyba 😄 ). Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.