|
Lisp »Tips 'n Tricks
»Xdata
»1
»2
»3
»4
»5
»6
Tipi speciali di xdata
Oltre ai codici visti precedentemente (ad esempio 1000, 1040) esistono anche diversi tipi di xdata che Autocad modifica automaticamente quando si edita l'entità associata:
Codice |
Descrizione |
Edit |
1011 |
Posizione X world |
Sposta, scala, ruota, specchia, allunga |
1012 |
Posizione X world |
Sposta, scala, ruota, allunga |
1013 |
Direzione X world |
Sposta, scala, ruota, specchia |
1041 |
Distanza |
Scala |
1042 |
Fattore di scala |
Scala |
Come esempio ecco un lisp che legge da un file di dati ASCII coordinate X Y Z e diametro di una serie di cerchi, una etichetta (ad esempio "A", "A01", "CERCHIO10") ed un valore numerico decimale.
TXC
;|
TXC.LSP (2 Aprile 2006)
Copyright (C) 2006 Claudio Piccini. All rights reserved
www.cg-cad.com
Legge dal file CERCHI.TXT coordinate X Y Z del punto,
il diametro del cerchio, una etichetta e un valore numerico decimale.
Esempio di file CERCHI.TXT:
x y z dia. etic. val. num.
706.3385 919.141108 0 10 "C" -1.5
731.027256 856.218884 0 1 "B" 0.33
654.002078 819.409167 0 1.5 "C" 2.3
632.234096 919.799307 0 2 "B" 12.45
528.417552 886.335928 0 3.5 "E" 99.99
503.300646 812.716491 0 4 "C" -0.80
|;
(defun myerror (s)
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(ripVar)
(princ)
)
(defun salVar ()
(setq orto (getvar "orthomode"))
(setq snapp (getvar "osmode"))
(setq snm (getvar "snapmode"))
(setq piano (getvar "clayer"))
(setq nomeDir (getvar "dwgprefix"))
)
(defun ripVar ()
(command "_redraw")
(setvar "cmdecho" 1)
(setvar "osmode" snapp)
(setvar "snapmode" snm)
(setvar "orthomode" orto)
(setvar "clayer" piano)
(setvar "cecolor" "BYLAYER")
(setq *error* olderr)
(princ)
)
(defun C:TXC (/ olderr snapp snm orto piano nomeDir
stringa lista nf1 f1 p1
val eti dia ed xd entX
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(if (not (tblsearch "appid" "CERCHI_TXC"))(regapp "CERCHI_TXC"))
(command "osnap" "_non")
(setq nf1 (strcat nomeDir "cerchi.txt"))
(setq f1 (open nf1 "r")) ; apre il file CERCHI.TXT
(setq stringa " ")
(while (/= stringa nil)
(setq stringa (read-line f1))
(if (/= stringa nil)
(progn
(setq lista (strcat "(" stringa ")"))
(setq lista (read lista))
(setq p1 (list
(nth 0 lista) ; X
(nth 1 lista) ; Y
(nth 2 lista) ; Z
)
)
(setq dia (nth 3 lista)) ; diametro
(command "_circle" p1 "_d" dia) ; disegna il cerchio
(setq ed (entget (entlast))) ; legge l'entita'
(setq eti (nth 4 lista)) ; etichetta
(setq val (nth 5 lista)) ; valore numerico decimale
(setq xd (list -3 (list "CERCHI_TXC"
(cons 1000 eti) ; etichetta
(cons 1002 "{")
(cons 1040 val) ; valore numerico
(cons 1041 dia) ; diametro
(cons 1002 "}")
)
)
)
(setq entX (append ed (list xd))) ; aggiunge la lista xd alla lista ed
(entmod entX) ; aggiorna l'entita' cerchio
)
)
)
(close f1)
(ripVar) ; ripristina l'ambiente
)
;;;eof
|
Test del Lisp
Command: txc
Con il lisp LEGGIX (modificato) si legge l'xdata...
(defun leggiX ( / p1 p2 s1 en ed k nEn )
(setq p1 (getpoint "\n Seleziona le entita' con una finestra: "))
(initget (+ 1 32))
(setq p2 (getcorner p1 "\n Secondo punto della finestra: "))
(setq s1 (ssget "_C" p1 p2 '((-3 ("*")))))
(setq nEn (sslength s1))
(setq k 0)
(repeat nEn
(setq en (ssname s1 k)
ed (entget en '("*"))
xd (cdr (assoc -3 ed))
)
(setq k (+ k 1))
)
(princ)
)
|
Command: !xd
(("CERCHI_TXC" (1000 . "C") (1002 . "{") (1040 . -0.8) (1041 . 4.0) (1002 . "}")))
Quindi si scala un cerchio di un fattore di 20 unità...
Command: (leggix)
Seleziona le entita' con una finestra:
Secondo punto della finestra:
Command: !xd
(("CERCHI_TXC" (1000 . "C") (1002 . "{") (1040 . -0.8) (1041 . 80.0) (1002 . "}")))
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 2 Aprile 2006
|
|