cg-Cad

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