|
Lisp »Tips 'n Tricks »TXT->Coord. Z->CSV
TXT2CSV esamina uno o più testi nel disegno, selezionati uno a uno con il mouse o all'interno di una finestra di selezione, e se i testi sono stringhe numeriche (ad esempio "10.20") prima li converte in numeri (10.20) quindi li usa come coordinata Z di punti di quota, con X e Y coordinate del punto di inserimento del testo nel disegno.
Infine salva i punti in un file di testo (PUNTI.CSV).
Che succede se nella finestra di selezione oltre alle stringhe numeriche ci sono anche parole? Nulla, le parole sono ignorate dal Lisp.
;|
TXT2CSV.LSP * 1 Giugno 2007
Copyright (C) 2007 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)
)
(defun leggi_num ( / punto x y z stringa
numEnt indice tipoEnt
)
(setq ls (cdr ls)) ; elimina nil
(setq numEnt (length ls))
(if (or (/= numEnt 0)(/= s2 nil))
(progn
(if (/= numEnt 0) ; legge le entita' contenute nella lista ls
(progn
(setq indice 0)
(repeat numEnt
(setq ent1 (entget (nth indice ls)))
(setq tipoEnt (assoc 0 ent1))
(if (= "TEXT" (cdr tipoEnt))
(progn
(setq punto (cdr (assoc 10 ent1)))
(setq x (car punto))
(setq y (cadr punto))
; estrae il numero-stringa. Es. "10.0"
(setq z (cdr (assoc 1 ent1)))
(if (/= (atof z) 0.0) ; se Z non e' una parola
(progn
; trasforma la stringa in un numero reale
(setq z (atof z))
(setq punto (list x y z))
(command "_point" punto)
(setq stringa
(strcat
(rtos x 2 6) ; formatta X
", "
(rtos y 2 6) ; formatta Y
", "
(rtos z 2 6) ; formatta Z
)
)
(write-line stringa f1) ; scrive la stringa nel file PUNTI.CSV
)
)
)
)
(setq indice (+ indice 1))
)
)
)
(if (/= s2 nil) ; se la finestra di selezione non e' vuota
(progn
(setq numEnt (sslength s2))
(setq indice 0)
(repeat numEnt
(setq ent1 (entget (ssname s2 indice)))
(setq tipoEnt (assoc 0 ent1))
(if (= "TEXT" (cdr tipoEnt))
(progn
(setq punto (cdr (assoc 10 ent1)))
(setq x (car punto))
(setq y (cadr punto))
; estrae il numero-stringa. Es. "10.0"
(setq z (cdr (assoc 1 ent1)))
(if (/= (atof z) 0.0) ; se Z non e' una parola
(progn
; trasforma la stringa in un numero reale
(setq z (atof z))
(setq punto (list x y z))
(command "_point" punto)
(setq stringa
(strcat
(rtos x 2 6) ; formatta X
", "
(rtos y 2 6) ; formatta Y
", "
(rtos z 2 6) ; formatta Z
)
)
(write-line stringa f1) ; scrive la stringa nel file PUNTI.CSV
)
)
)
)
(setq indice (+ indice 1))
)
)
)
)
)
)
(defun C:TXT2CSV (/ olderr k ls s1 p1 p2 s2 ent1
snapp snm orto piano nomeDir
nf f1
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(setq nf (strcat nomeDir "punti.csv"))
(setq f1 (open nf "w")) ; apre il file PUNTI.CSV
(setq ls (list nil))
(command "osnap" "_non")
(command "osnap" "_nea")
(setq k 1)
(while k
(setq p1 (getpoint "\n Seleziona un numero :"))
(if (= p1 nil)
(progn ; se e' stato battuto Invio (nil)...
(setq k nil)
(leggi_num)
)
(progn ; se il set non e' vuoto...
(setq s1 (ssget p1))
(if (/= s1 nil)
(progn
(setq ent1 (entget (ssname s1 0)))
(setq ent1 (car ent1))
(setq ent1 (cdr ent1))
(setq ls (append ls (list ent1))) ; aggiorna la lista
)
(progn ; se il set e' vuoto apre una finestra...
(setq k nil)
(initget 32) ; linea tratteggiata
(setq p2 (getcorner p1 "\n Secondo punto della finestra:"))
(if (> (car p2)(car p1))
(progn
(setq s2 (ssget "_W" p1 p2))
(leggi_num)
)
(progn
(setq s2 (ssget "_C" p1 p2))
(leggi_num)
)
)
)
)
)
)
)
(close f1) ; chiude PUNTI.CSV
(ripVar)
)
;;;eof
|
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 1 Giugno 2007
|
|