Hozzunk ki minél többet az AutoCAD-ből
-
#247
Az első megoldás a ZENOKA által körvonalazott megoldások valamelyike lenne, de mivel én csak R2006 verziót használok, és az AutoCAD méretező funkcióit sohasem használom, ezekhez pillanatnyilag nem tudok segítséget nyújtani neked.
A másik megoldás az, hogy az általad leírt attribútumos blokkot nem az AutoCAD INSERT parancsával illesztem be, hanem egy AutoLisp-ben definiált paranccsal, amely a beillesztés során végigvizsgálja a blokkdefiníciót, és ha az attribútumai között talál olyanokat amelyek címkéje "Y-koord" , "X-koord" vagy "Z-koord" értékű, akkor azokban automatikusan elhelyezi a beillesztési pont megfelelő koordinátáit.
Már régebben készítettem egy ilyen parancsot.
Elindítása után bekéri a beillesztendő blokk nevét, a beillesztési szorzót, és a koordináták megjelenítendő tizedesjegyeinek számát, majd beillesztési pontokat, és irányokat kér, és elhelyezi a blokkreferenciákat. Ha azoknak van a fentiektől eltérő címkéjű attribútumuk is, azokat is bekéri.
A parancs következő indításakor már nem kéri a blokk nevét, beillesztési szorzóját, és a tizedesek számát, de azok módosíthatók amig a beillesztési pont megadására szolgáló porompt aktív.
Ide biggyesztem a Lisp kódot, ha jónak találod, használd egészséggel.
Használatának legegyszerűbb módja az, ha belemásolod az AutoCAD menüjéhez tartozó *.MNL fájlba. Ennek neve általában acad.mnl szokott lenni.
(defun c:koord_blokk ()
(defun koord_blokk_nev ()
(initget 1)
(setq koordblokknev (getstring "\nBlokk neve: "))
)
(defun koord_blokk_meret ()
(initget 3)
(setq blokkszorzo (getreal "\nBlokk beillesztési szorzója: "))
)
(defun koord_blokk_tizedes ()
(initget 5)
(setq koordtizedes (getint "\nKoordináták tizedesjegyeinek száma: "))
)
(defun elem_alaplista_orig (eleml / q result)
(setq result '() q -1)
(while (setq q (1+ q) lista (nth q eleml))
(if (not (member (car lista) '(-1 330 5 100 410 360 67 3))) (setq result (append result (list lista))))
)
)
(defun blokk_attributumELIST_lista (blokknev / elem eleml result)
(setq result '())
(if (setq elem (tblobjname "BLOCK" blokknev))
(if (logand 2 (cdr (assoc 70 (entget elem))))
(while (setq elem (entnext elem))
(if (= (cdr (assoc 0 (entget elem))) "ATTDEF")
(setq result (append result (list (entget elem))))
)
)
)
)
result
)
(defun blokk_attrib_ertekadas (elem_ cimke_ ertek_ / *eleml_)
(if (setq eleml_ (entget elem_))
(if (= (cdr (assoc 0 eleml_)) "INSERT")
(while (not (equal (cdr (assoc 0 (entget (setq elem_ (entnext elem_))))) "SEQEND"))
(setq eleml_ (entget elem_))
(if (equal (cdr (assoc 0 eleml_)) "ATTRIB")
(if (equal (strcase (cdr (assoc 2 eleml_))) (strcase cimke_))
(progn
(entmod (subst (cons 1 ertek_) (assoc 1 eleml_) eleml_))
(entupd elem_)
)
)
)
)
)
)
)
;
(if (not koordblokknev) (setq koordblokknev (getstring "\nBlokk neve: ")))
(if (tblsearch "BLOCK" koordblokknev)
(progn
(if (not blokkszorzo) (koord_blokk_meret))
(if blokkszorzo
(progn
(if (not koordtizedes) (koord_blokk_tizedes))
(if koordtizedes
(while (setq qwe (initget "N M T") bp (getpoint "\nBeillesztési pont (Név/Méret/Tizedes) "))
(cond
((equal bp "N") (koord_blokk_nev))
((equal bp "M") (koord_blokk_meret))
((equal bp "T") (koord_blokk_tizedes))
((and (equal (type bp) 'LIST)
(equal (type blokkszorzo) 'REAL)
(equal (type koordtizedes) 'INT)
(tblsearch "BLOCK" koordblokknev)
)
(setq irany (getangle bp "\nBeillesztés iránya: ")
irany (if irany irany 0.0)
eleml (entget (tblobjname "BLOCK" koordblokknev))
flag (if (logand 2 (cdr (assoc 70 eleml))) 1 0)
egyeb '()
)
(entmake
(list
'(0 . "INSERT")
(cons 2 koordblokknev)
(cons 10 bp)
(cons 41 blokkszorzo)
(cons 42 blokkszorzo)
(cons 43 blokkszorzo)
(cons 50 irany)
(cons 66 flag)
)
)
(if (setq attrlist (blokk_attributumELIST_lista koordblokknev))
(progn
(setq q -1)
(while (setq q (1+ q) eleml (nth q attrlist))
(if (= (cdr (assoc 0 eleml)) "ATTDEF")
(progn
(setq cimke (strcase (cdr (assoc 2 eleml)))
eleml (elem_alaplista_orig eleml)
eleml (subst '(0 . "ATTRIB") (assoc 0 eleml) eleml)
eleml (subst (cons 40 (* blokkszorzo (cdr (assoc 40 eleml)))) (assoc 41 eleml) eleml)
eleml (subst (cons 50 irany) (assoc 50 eleml) eleml)
eleml (subst (cons 11 (polar bp (+ (angle '(0 0 0) (cdr (assoc 11 eleml))) irany) (* (distance '(0 0 0) (cdr (assoc 11 eleml))) blokkszorzo))) (assoc 11 eleml) eleml)
eleml (subst (cons 10 (polar bp (+ (angle '(0 0 0) (cdr (assoc 10 eleml))) irany) (* (distance '(0 0 0) (cdr (assoc 10 eleml))) blokkszorzo))) (assoc 10 eleml) eleml)
)
(cond
((= cimke (strcase "X-koord"))
(setq eleml (subst (cons 1 (rtos (car bp) 2 koordtizedes)) (assoc 1 eleml) eleml))
)
((= cimke (strcase "Y-koord"))
(setq eleml (subst (cons 1 (rtos (cadr bp) 2 koordtizedes)) (assoc 1 eleml) eleml))
)
((= cimke (strcase "Z-koord"))
(setq eleml (subst (cons 1 (rtos (caddr bp) 2 koordtizedes)) (assoc 1 eleml) eleml))
)
(T
(setq egyeb (append egyeb (list (cdr (assoc 2 eleml)))))
)
)
(if (not (entmake eleml))
(princvalt "eleml")
)
)
)
)
)
)
(entmake (list '(0 . "SEQEND") '(8 . "0")))
(if egyeb
(progn
(setq q -1 elem (entlast))
(while (setq q (1+ q) cimke (nth q egyeb))
(setq ertek (getstring T (strcat "\n" cimke " attribútum értéke: ")))
(blokk_attrib_ertekadas elem cimke ertek)
)
)
)
)
)
)
)
)
)
)
)
)