Lisp »Tips 'n Tricks
»Xdata
»1
»2
»3
»4
»5
»6
Per estrarre l'etichetta (dalle liste xdate generate con il lisp TXP2 e il file punti.txt) la procedura è la stessa, solo cambia la combinazione di funzioni CAR.
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.
Command: !xd
(("PUNTO_TXP" (1000 . "E") (1002 . "{") (1040 . 99.99) (1002 . "}")))
Command: (setq a (car xd))
("PUNTO_TXP" (1000 . "E") (1002 . "{") (1040 . 99.99) (1002 . "}"))
Command: (setq b (cdr a))
((1000 . "E") (1002 . "{") (1040 . 99.99) (1002 . "}"))
Command: (setq c (car b))
(1000 . "E")
Command: (setq d (cdr c))
"E"
Command: (cdar (cdr (car xd)))
"E"
Command: (cdadar xd)
"E"
SEXP
Il lisp somma i valori numerici di etichette scritte in liste xdata associate ad entità punti con il comando TXP2.
Per semplificare l'input di selezione dell'etichetta e la ricerca nelle liste xdata uso la funzione (strcase stringa flag) che converte una stringa in caratteri maiuscoli se flag=nil, se flag=T converte la stringa in caratteri minuscoli.
;|
SEXP.LSP (2 Aprile 2006)
Copyright (C) 2006 Claudio Piccini. All rights reserved
www.cg-cad.com
Somma i valori numerici di una etichetta presente in una lista xdata
associata ad una entita' punto con il comando TXP2
|;
(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 leggi_somma_eX ( / p1 p2 s1 nEn
en ed xd
k kk s val eti
)
(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' xdata
(setq nEn (sslength s1))
(if (/= nEn nil)
(progn
(setq k 0 kk 0 s 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 eti (strcase (cdadar xd)))
(if (= eti E)
(progn
(setq kk (+ kk 1))
(setq s (+ s val))
)
)
(setq k (+ k 1))
)
(princ "\n La somma di ")(princ kk)
(princ " valori xdata ")(princ E)
(princ " e' = ")(princ s)
)
)
)
(defun C:SEXP ( / olderr snapp snm orto piano E )
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(setq E (strcase (getstring "\n Etichetta? ")))
(leggi_somma_eX)
(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: sexp
Etichetta? e
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 1 valori xdata E e' = 99.99
File PUNTI.TXT:
706.3385 919.141108 0 "C" -1.5
731.027256 856.218884 0 "B" 0.33
654.002078 819.409167 0 "C" 2.3
632.234096 919.799307 0 "B" 12.45
528.417552 886.335928 0 "E" 99.99
503.300646 812.716491 0 "C" -0.80
Command: txp2
Command: sexp
Etichetta? b
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 2 valori xdata B e' = 12.78
Command: sexp
Etichetta? c
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 3 valori xdata C e' = -2.22045e-016
Per leggere 0 (zero) uso la funzione (rtos numero modo precisione) (modo: 1=scientifico, 2=decimale, 3=ingegneristico, 4=architettonico, 5=frazionario), il codice del lisp è così cambiato:
(princ "\n La somma di ")(princ kk)
(princ " valori xdata ")(princ E)
(princ " e' = ")(princ (rtos s 2 2))
Command: sexp
Etichetta? c
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 3 valori xdata C e' = 0
SEEXP
Il lisp somma i valori numerici di 2 etichette scritte in liste xdata associate ad entità punti con il comando TXP2.
;|
SEEXP.LSP (2 Aprile 2006)
Copyright (C) 2006 Claudio Piccini. All rights reserved
www.cg-cad.com
Somma i valori numerici di 2 etichette presenti in liste xdata
associate ad entita' punto con il comando TXP2
Infine somma i due importi (e mostra il totale).
|;
(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 leggi_somma_eX2 ( / p1 p2 s1 nEn
en ed xd
k k1 k2 somma1 somma2 tot val eti
)
(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' xdata
(setq nEn (sslength s1))
(if (/= nEn nil)
(progn
(setq k 0
k1 0
k2 0
somma1 0
somma2 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 eti (strcase (cdadar xd)))
(if (= eti E1)
(progn
(setq k1 (+ k1 1))
(setq somma1 (+ somma1 val))
)
)
(if (= eti E2)
(progn
(setq k2 (+ k2 1))
(setq somma2 (+ somma2 val))
)
)
(setq k (+ k 1))
)
(princ "\n La somma di ")(princ k1)
(princ " valori xdata ")(princ E1)
(princ " e' = ")(princ (rtos somma1 2 2))
(princ "\n La somma di ")(princ k2)
(princ " valori xdata ")(princ E2)
(princ " e' = ")(princ (rtos somma2 2 2))
(princ "\n Il totale e' = ")
(setq tot (+ somma1 somma2))
(princ (rtos tot 2 2))
)
)
)
(defun C:SEEXP ( / olderr snapp snm orto piano E1 E2 )
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(setq E1 (strcase (getstring "\n 1 Etichetta: ")))
(setq E2 (strcase (getstring "\n 2 Etichetta: ")))
(leggi_somma_eX2)
(ripVar)
)
;;;eof
|
Test del Lisp
File PUNTI.TXT:
706.3385 919.141108 0 "C" -1.5
731.027256 856.218884 0 "B" 0.33
654.002078 819.409167 0 "C" 2.3
632.234096 919.799307 0 "B" 12.45
528.417552 886.335928 0 "E" 99.99
503.300646 812.716491 0 "C" -0.80
Command: txp2
Command: seexp
1 Etichetta: b
2 Etichetta: e
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 2 valori xdata B e' = 12.78
La somma di 1 valori xdata E e' = 99.99
Il totale e' = 112.77
Command: seexp
1 Etichetta: e
2 Etichetta: c
Seleziona le entita' con una finestra:
Secondo punto della finestra:
La somma di 1 valori xdata E e' = 99.99
La somma di 3 valori xdata C e' = 0
Il totale e' = 99.99
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 2 Aprile 2006
|