cg-Cad

Lisp »Tips 'n Tricks »CXYZ »1 »2 »3

CXYZ v3

Questa variante del lisp usa le funzioni Cons e Foreach; inoltre presenta un numero minimo di variabili e prima di terminare libera la memoria di AutoCAD settando la funzione CooXYZ come variabile al valore nil.

L'altezza dei testi non è più richiesta da input ma è letta dalla variabile di sistema TEXTSIZE.

La funzione Cons permette di creare delle liste di coppie puntate (a . b); nel nostro lisp la lista si chiama lista.

Per poter leggere il contenuto di una lista o di una variabile (di sistema o utente) la si deve scrivere con il prefisso ! alla linea di comando di AutoCAD (o IntelliCAD).
La lista lista al termine del lisp è eliminata, per mantenerla in memoria e poter leggere il contenuto non la si deve scrivere nella lista delle variabili locali all'atto della creazione della funzione personalizzata CooXYZ:
(defun nome ( argomenti / var. locali ) istruzioni...)
Nel nostro caso la funzione Cons unisce in una coppia puntata una lista punto ad una stringa di testo cioè le coordinate X, Y (Z=0) del punto di inserimento del testo che dichiara la coordinata (X,Y,Z) del punto quotato:

Command: cxyz
 Seleziona il punto da quotare: node
of
 Punto inserimento coordinate:

Command: !lista
(((697.424 709.627 0.0) . "x = 696.71") ((697.424 709.402 0.0) . "y = 709.94") 
((697.424 709.177 0.0) . "z = -12.78"))

E per scrivere nel disegno il contenuto della lista lista il nostro lisp usa la funzione Foreach (foreach variabile_T lista_L istruzioni...).

La funzione Foreach legge in modo ordinato (dal primo all'ultimo) ogni elemento di una lista L e lo usa in una variabile temporanea T in una serie di istruzioni successive.

(foreach coo lista
 (command "_text" (car coo) hT 0.0 (cdr coo))
)

Con la funzione Car estraggo il primo elemento della coppia (le coordinate del punto di inserimento della stringa di testo) e con la funzione Cdr estraggo il resto della coppia puntata cioè la stringa di testo.

;|
	CXYZ.LSP (versione 3)
	Copyright (C) 2005 Claudio Piccini.
	All rights reserved
	www.cg-cad.com
|;

(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"))
)

(defun ripVar ()
 (command "_redraw")
 (setvar "cmdecho" 1)
 (setvar "osmode" snapp)
 (setvar "snapmode" snm)
 (setvar "orthomode" orto)
 (setq *error* olderr)
 (setq CooXYZ nil)
 (princ)
)

(defun CooXYZ ( / hT pQ p1 p2 p3 s lista)
 (setq hT (getvar "textsize"))
 (setq s (/ hT 2))
 (command "osnap" "_non")
 (command "osnap" "_int")
 (while (setq pQ (getpoint "\n Seleziona il punto da quotare: "))
  (command "osnap" "_non")
  (initget 1)
  (setq p1 (getpoint "\n Punto inserimento coordinate: ")) ; punto ins. stringa Y
  (setq p2 (list (car p1)(+ (cadr p1)(+ hT s)) 0.0))       ; punto ins. stringa X
  (setq p3 (list (car p1)(- (cadr p1)(+ hT s)) 0.0))       ; punto ins. stringa Z
  ; disegna una parentesi quadra aperta
  (command "_pline" (list (car p1)(- (cadr p3) s))
                    "_w" 0.0 0.0
                    (list (- (car p1) s)(- (cadr p3) s))
                    (list (- (car p1) s)(+ (cadr p2) s s))
                    (list (car p1)(+ (cadr p2) s s))
                    ""
  )
  (setq lista (list
                 (cons p2 (strcat "x = " (rtos (car pQ) 2 2)))
                 (cons p1 (strcat "y = " (rtos (cadr pQ) 2 2)))
                 (cons p3 (strcat "z = " (rtos (caddr pQ) 2 2)))
              )
  )
  (foreach coo lista
   (command "_text" (car coo) hT 0.0 (cdr coo))
  )
  (command "osnap" "_int")
 )
)

(defun C:CXYZ (/ olderr snapp snm orto)
 (setq olderr *error* *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 (CooXYZ)
 (ripVar)
)
;;;eof

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 27 Marzo 2005