Wyciągnięcie danych z bloku dynamicznego


Recommended Posts

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

 

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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