cg-Cad

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