Dzisiaj krótko o szybkim modelowaniu prostych prymitywów brył w AutoCAD-zie… polegającym na konwersji wybranych tekstów na… trójwymiarowe bryły właśnie. Oczywiście teksty muszą spełniać pewne warunki, (ogólnie) opisujace geometrię brył (położenie i wielkość). Jest to proces odwrotny niż zwykle spotykany, czyli opiywanie właściwości obiektów.
Tekstowy „opis” bryły 3D w tym przypadku, pobierany jest z wybranego obiektu typu TEXT. Warstwa, położenie oraz obrót, są takie same jak dla tekstu, wartości geometrii (szerokość, wysokość i długość) określone są w wartości (treści) tekstu. Warunkiem koniecznym jest aby fragment tekstu zawierał (w jednym ciągu) trzy liczby rozdzielone dwoma znakami „x”. Teksty które nie spełniają tego warunku są pomijane.
Zdefiniowane jest polecenie TXT2SOL. Po wywołaniu należy wskazać teksty. Program sprawdza czy tekst spełnia warunki konieczne do utworzenia BOX-a, i (po ich spełnieniu) je tworzy. (Krótki) kod makra (w całości) wygląda tak:
; -------------------------------------------------------------------------------------- ;
; Convert TEXT to 3DSOLID by kojacek 2022 ;
; -------------------------------------------------------------------------------------- ;
(defun C:TXT2SOL ()(jk:SOL_Text->Box)(princ))
; -------------------------------------------------------------------------------------- ;
(defun jk:SOL_Text->Box (/ s CMD)
(princ "\nConvert text to 3D Solid Box...")
(if
(setq s (jk:SOL_SGet-Text))
(progn
(setq CMD (getvar "CMDECHO"))
(cd:SYS_UndoBegin)
(setvar "CMDECHO" 0)
(foreach % s (jk:SOL_3DBox-Data %))
(setvar "CMDECHO" CMD)
(cd:SYS_UndoEnd)
)
(princ "\nSelected objects are not correct.")
)
)
; -------------------------------------------------------------------------------------- ;
(defun jk:SOL_3D-Text-p (Str / l s :a)
(defun :a (i)
(cd:STR_Parse
(vl-list->string
(mapcar
'(lambda (%)
(if
(or
(>= % 58)
(<= % 47)
) 37 %
)
)
(vl-string->list i)
)
) "%" nil
)
)
(if
(wcmatch
(setq s (strcase Str))
"*#X#X#*,*#X##X#*,*#X###X#*,*#X####X#*"
)
(progn
(setq l (cd:STR_Parse s "X" nil))
(mapcar
'read
(list
(last (:a (car l)))
(cadr l)
(car (:a (last l)))
)
)
)
)
)
; -------------------------------------------------------------------------------------- ;
(defun jk:SOL_SGet-Text (/ s l)
(if
(setq s
(ssget
(list
(cons 0 "TEXT")
(cons 410 (getvar "CTAB"))
)
)
)
(setq l (cd:SSX_Convert s 0)
l (vl-remove-if
'numberp
(mapcar
'(lambda (%)
(if
(jk:SOL_3D-Text-p
(cdr (assoc 1 (entget %)))
) % 0
)
) l
)
)
)
)
)
; -------------------------------------------------------------------------------------- ;
(defun jk:SOL_3DBox-Data (Ent / d b x c o e)
(setq d (entget Ent)
x (jk:SOL_3D-Text-p (cdr (assoc 1 d)))
b (acet-geom-textbox d 0)
c (acet-geom-midpoint (car b)(caddr b))
e (entlast)
)
(command "_BOX" "_c" c "_l" (caddr x)(cadr x)(car x))
(setq o (entlast))
(if
(/= o e)
(progn
(setq v (vlax-ename->vla-object o))
(vla-rotate v
(vlax-3d-point c)(cdr (assoc 50 d))
)
(vla-put-Layer v (cdr (assoc 8 d)))
)
)
)
; -------------------------------------------------------------------------------------- ;
(princ)
Rzecz jasna konieczne jest załadowanie CADPL-Pack-a. Potrzebne jest również wcześniejsze wczytanie pakietu ExpressTools AutoCAD-a (wykorzystywane są dwie funkcje acet-). „Sprytne” umieszczenie tekstów, pozwala na szybkie tworzenie brył, z jednoczesnym precyzyjnym położeniem elementów. Jakiś szybki glulam portal frame? Voila:
Zautomatyzowany sposób opisywania brył 3D (typu box) omawiałem we wpisie Zliczanie 3DSOLID. Natomiast ogólnie o prymitywach brył w AutoCAD-zie (typu box), słów kilka można znaleźć tutaj: AutoCAD 3D.
To jest #213 wpis na blogu
( . . . )