cg-Cad

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