cg-Cad

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