Rekomendowane odpowiedzi

Opublikowano

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

 

Opublikowano

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

Opublikowano (edytowane)

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
Opublikowano

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

 

Opublikowano

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

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się