Lisp »Tips 'n Tricks »LATXT
LATXT consente di salvare su file TXT (linee.txt) angoli e lunghezze (in quest'ordine) di tutte le linee selezionate con una finestra di intersezione.
Le due misure sono precedute da un numero progressivo, inizializzato dall'utente del Lisp.
I tre numeri sono separati dal separatore "|".
Che succede se nella finestra di selezione oltre alle linee ci sono anche altre entità? Nulla, le altre entità sono ignorate dal Lisp.
;|
LATXT.LSP * 26 Febbraio 2008
Copyright (C) 2008 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"))
(setq piano (getvar "clayer"))
(setq nomeDir (getvar "dwgprefix"))
)
(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)
)
; converte un angolo da radianti in gradi
(defun r2g (ang)
(/ (* ang 180.0) pi)
)
(defun C:LATXT (/ olderr nf1 f1
p1 p2 s1 ;nEnt K KK ent
l1 l2 dist ang
snapp snm orto piano nomeDir
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(setq nf1 (strcat nomeDir "linee.txt"))
(command "osnap" "_nea")
(setq p1 (getpoint "\n Primo vertice finestra: "))
(setq p2 (getcorner "\n Secondo vertice finestra: " p1))
(setq s1 (ssget "_c" p1 p2)) ; intercetta con finestra "intersecante"
(if (/= s1 nil) ; se esiste almeno un'entita' nella finestra...
(progn
(setq nEnt (sslength s1))
(initget (+ 1 4)) ; non nullo, non negativo
(setq KK (getint "\n Valore iniziale del numero progressivo: "))
(setq k 0) ; contatore entita'
(setq f1 (open nf1 "w")) ; apre il file LINEE.TXT
(repeat nEnt
(setq ent (entget (ssname s1 k)))
(if (= "LINE" (cdr (assoc 0 ent)))
(progn
(setq l1 (assoc 10 ent))
(setq l2 (assoc 11 ent))
(setq p1 (cdr l1))
(setq p2 (cdr l2))
(setq dist (distance p1 p2))
(setq dist (abs dist)) ; valore assoluto di dist
(setq dist (rtos dist 2 4)) ; formatta dist con 4 cifre decimali
(setq ang (angle p1 p2))
(setq ang (r2g ang)) ; converte l'angolo da radianti in gradi
(setq ang (rtos ang 2 4)) ; formatta ang con 4 cifre decimali
(write-line (strcat (itoa KK) " | " ang " | " dist) f1)
(setq KK (+ KK 1)) ; incrementa il numero progressivo
)
)
(setq k (+ k 1)) ; aggiorna il contatore delle entita'
)
(close f1) ; chiude LINEE.TXT
)
)
(ripVar) ; ripristina l'ambiente
)
;;;eof
|
Test del Lisp
Comando: latxt
Primo vertice finestra:
Secondo vertice finestra:
Valore iniziale del numero progressivo: 1000
File LINEE.TXT:
1000 | 285.8735 | 583.5272
1001 | 33.9426 | 365.5338
1002 | 323.2357 | 458.2263
1003 | 29.6007 | 561.6922
Analisi del Lisp
La stringa di colore blu nel codice sorgente del Lisp formatta i tre valori numerici, dopo averli tradotti in stringhe, nel file TXT.
Quindi se si vuole cambiare l'ordine delle misure è qui che si deve intervenire.
Esempi.
(write-line (strcat (itoa KK) " , " ang " , " dist) f1)
Risultato:
1000 , 285.8735 , 583.5272
1001 , 33.9426 , 365.5338
1002 , 323.2357 , 458.2263
1003 , 29.6007 , 561.6922
(write-line (strcat (itoa KK) " " dist " " ang) f1)
Risultato:
1000 583.5272 285.8735
1001 365.5338 33.9426
1002 458.2263 323.2357
1003 561.6922 29.6007
La stringa di colore rosso nel codice sorgente del Lisp trasforma l'angolo da radianti in gradi, per salvare in radianti basta far precedere l'istruzione dal segno ; (commento).
Risultato (sulle stesse entità):
100 | 4.9894 | 583.5272
101 | 0.5924 | 365.5338
102 | 5.6415 | 458.2263
103 | 0.5166 | 561.6922
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 26 Febbraio 2008
|