swazy Opublikowano 2 Marca Zgłoś Udostępnij Opublikowano 2 Marca 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 :) Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kojacek Opublikowano 3 Marca Zgłoś Udostępnij Opublikowano 3 Marca 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. dmatusz3 i swazy 2 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
swazy Opublikowano 3 Marca Autor Zgłoś Udostępnij Opublikowano 3 Marca Ale czad! 🤩 Dziękuję! Na ZW-Cadzie 2024 działa bez zarzutów. A z ciekawości: czy da się to zrobić klasycznym AutoLispem ? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
swazy Opublikowano 5 Marca Autor Zgłoś Udostępnij Opublikowano 5 Marca (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. Edytowane 5 Marca przez swazy Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kojacek Opublikowano 6 Marca Zgłoś Udostępnij Opublikowano 6 Marca 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>") ",`" ) ) ) ) Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
swazy Opublikowano 9 Marca Autor Zgłoś Udostępnij Opublikowano 9 Marca 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 😄 ). Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ą.