Wyciągnięcie danych z bloku dynamicznego


Rekomendowane odpowiedzi

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

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

Edytowane przez swazy
Odnośnik do komentarza
Udostępnij na innych stronach

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

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

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