Lisp »Tips 'n Tricks
»Xdata
»1
»2
»3
»4
»5
»6
Ecco come estrarre un valore numerico da una lista Xdata, prima manualmente e poi in automatico con un lisp.
Per semplificare la procedura salviamo un file punti.txt con un solo rigo di dati: 706.3385 919.141108 0 "A" -1.5
Disegniamo il punto con le coordinate (706.3385 919.141108 0) con il lisp TXP2 quindi modifichiamo il lisp (leggiX) in questo modo:
(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 ("PUNTO_TXP")))))
(setq nEn (sslength s1))
(setq k 0)
(repeat nEn
(setq en (ssname s1 k)
ed (entget en '("PUNTO_TXP"))
xd (cdr (assoc -3 ed)) ; xd var. globale
)
(setq k (+ k 1))
)
(princ)
)
|
Command: (leggiX)
Seleziona le entita' con una finestra:
Secondo punto della finestra:
selezionare il punto
A questo punto xd è una variabile globale che contiene la lista xdata associata all'entità punto di coordinate (706.3385 919.141108 0).
Command: !xd
(("PUNTO_TXP" (1000 . "A") (1002 . "{") (1040 . -1.5) (1002 . "}")))
Per estrarre il valore numerico -1.5 uso una combinazione di funzioni CAR...
Command: (setq a (car xd))
("PUNTO_TXP" (1000 . "A") (1002 . "{") (1040 . -1.5) (1002 . "}"))
Command: (setq b (cdddr a))
((1040 . -1.5) (1002 . "}"))
Command: (setq c (car b))
(1040 . -1.5)
Command: (setq d (cdr c))
-1.5
Command: (cdr (car (cdddr (car xd))))
-1.5
Il più è fatto, e adesso il lisp...
Ad esempio il lisp SOMMA legge e, in linea con il nome, somma i valori numerici contenuti nelle liste xdata create con il lisp TXP2.
;|
SOMMA.LSP (1 Aprile 2006)
Copyright (C) 2006 Claudio Piccini. All rights reserved
www.cg-cad.com
Somma i valori numerici contenuti in liste xdata
generate con TXP2 e PUNTI.TXT
|;
(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"))
)
(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 leggiX ( / p1 p2 s1 en ed xd k nEn val )
(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 ("PUNTO_TXP"))))) ; intercetta le entita'
(setq nEn (sslength s1))
(setq k 0)
(repeat nEn
(setq en (ssname s1 k)
ed (entget en '("PUNTO_TXP"))
xd (cdr (assoc -3 ed))
)
(setq val (cdr (car (cdddr (car xd)))))
(setq lstVal (append lstVal (list val))) ; salva i valori in una lista
(setq k (+ k 1))
)
(princ)
)
(defun sommaX ( / k s nEn val )
(setq nEn (length lstVal))
(setq k 0)
(setq s 0)
(repeat nEn
(setq val (nth k lstVal))
(setq s (+ s val))
(setq k (+ k 1))
)
(princ "\n La somma di ")(princ nEn)
(princ " valori xdata e' = ")(princ s)
)
(defun C:SOMMA (/ olderr snapp snm orto piano
lstVal
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(leggiX)
(sommaX)
(ripVar)
)
;;;eof
|
Test del Lisp
File PUNTI.TXT:
706.3385 919.141108 0 "A" -1.5
731.027256 856.218884 0 "B" 0.33
654.002078 819.409167 0 "C" 2.3
632.234096 919.799307 0 "D" 12.45
528.417552 886.335928 0 "E" 99.99
503.300646 812.716491 0 "F" 0.99
Command: txp2
Command: somma
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 6 valori xdata e' = 114.56
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 1 Aprile 2006
|