cg-Cad

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
TXC.LSP

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à...

TXC.LSP
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