Hozzunk ki minél többet az AutoCAD-ből
  • pfprg
    #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)
    )
    )
    )
    )
    )
    )
    )
    )
    )
    )
    )
    )