Recommended Posts

Posted

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

 

Posted

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.

 

DynamicBlockParameters.gif

Posted (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.
 

obraz.png

Edited by swazy
Posted

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>")
            ",`"
          )
        )
   )
 )

 

Posted

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

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