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
|