cg-Cad

Lisp »Tips 'n Tricks »Xdata »1 »2 »3 »4 »5 »6

Con i dati estesi delle entità (xdata) è possibile collegare dati alfanumerici ad una qualsiasi entità di AutoCAD, cioè è possibile memorizzare delle informazioni personali all'interno di un'entità (punto, linea, ecc.) del disegno.

Dato che un disegno può essere utilizzato in molte applicazioni (ad esempio lisp), queste devono sapere distinguere i propri dati da quelli di altre applicazioni.
Perché ciò sia possibile, deve essere utilizzato un nome di identificazione unico per ogni applicazione (appid); questo nome non è una password, cioè non usate il vostro nome segreto (o il numero di telefono).
Come esempio cito dal mio manuale di PicK versione 3.4:

PRLINX proietta le curve altimetriche sul piano, memorizzando all'interno di ogni entità linea (come dato esteso o Xdata) la coordinata z originale (quota altimetrica).

Il dato esteso creato da PrlinX è: (("PICKV14" (1000 . "Coord Z")(1002 . "{")(1000 . "Coord Z")(1040 . quota alt.)(1002 . "}")))

PICKV14 è l'appid storico della libreria PicK.
Se si apre PRLINX con il blocco note di Win si leggono le seguenti istruzioni:

(setq nomeApp "PICKV14")
(if (not (tblsearch "appid" nomeApp))(regapp "PICKV14"))


e cioè inizializzo (setq) la variabile nomeApp con la stringa PICKV14 (è una stringa perché racchiusa dai doppi apici), quindi se (if) non (not) esiste una tabella appid PICKV14 (dove? nel data-base del disegno dwg, quindi salvate il disegno, anche se vuoto prima di usare gli xdata) la funzione (regapp) la crea.
La ricerca viene effettuata con la funzione (tblsearch nome_tabella simbolo).
(regapp) registra l'appidname in AutoCAD in una tabella di simboli APPID. Se è OK la funzione restituisce il nome, altrimenti (dato che qualcosa deve restituire) restituisce nil.
(regapp) restituisce nil se un appid è già stato registrato in precedenza con quel nome. Quindi l'appid deve essere unico, uno ed uno solo, cioè non chiamate la vostra applicazione PIPPO, in quanto l'utente che userà la vostra applicazione potrebbe utilizzare un'altra applicazione con lo stesso appid.
L'appid può essere composto da 31 caratteri, compresi quelli particolari come il segno del dollaro.

Anche gli xdata sono una lista, ma una lista nidificata speciale che deve sempre iniziare con il codice -3
Esempio di inizializzazione di una lista con dati estesi:

(defun test ()
 (setq xd (list -3 (list "PICKV14"
                         (cons 1000 "Coord Z")
                         (cons 1002 "{")
                         (cons 1000 "Coord Z")
                         (cons 1040 0.1)
                         (cons 1002 "}")
                   )
          )
 )
)

Command: (test)
(-3 ("PICKV14" (1000 . "Coord Z") (1002 . "{") (1000 . "Coord Z") (1040 . 0.1) (1002 . "}")))

(cons) restituisce una lista con gli elementi separati da un punto, ad esempio (1040 . 0.1).
Il codice 1000 consente di memorizzare stringhe di caratteri, esempio "Coord Z".
Il codice 1002 è una stringa di controllo che consente di raggruppare insiemi di dati, esempio (cons 1002 "{")(cons 1000 "Coord Z")(cons 1040 0.1)(cons 1002 "}")
Il codice 1040 consente di memorizzare valori reali, esempio (1040 . 0.1).

Ecco un lisp che consente di vedere gli xdata nascosti nel disegno selezionando le entità con una finestra.

(defun leggiX ( / p1 p2 s1 en ed xd 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 ("*"))))) ; intercetta le entita' con xdata di qualsiasi appid
 (setq nEn (sslength s1))
 (setq k 0)
 (repeat nEn
  (setq en (ssname s1 k)
        ed (entget en '("*"))
        xd (cdr (assoc -3 ed))
  )
  (princ xd)
  (setq k (+ k 1))
 )
 (princ)
)

Command: (leggiX)
Seleziona le entita' con una finestra:
Secondo punto della finestra: ((PICKV14 (1000 . Coord Z) (1002 . {) (1000 . Coord Z) (1040 . 0.0) (1002 . })))

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 30 Marzo 2006