cg-Cad

Lisp »Tips 'n Tricks »TXT->Coord. Z

TXT2Z 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.
Che succede se nella finestra di selezione oltre alle stringhe numeriche ci sono anche parole? Nulla, le parole sono ignorate dal Lisp.

;|
	TXT2Z.LSP * 30 Maggio 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"))  
)

(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
                     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 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 indice (+ indice 1))
     )
    )
   )
  )
 )
)

(defun C:TXT2Z (/ olderr k ls s1 p1 p2 s2 ent1
                  snapp snm orto piano
 )
 (setq olderr *error* *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 (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)
       )
      )
     )
    )
   )
  )
 )
 (ripVar)
)
;;;eof

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 30 Maggio 2007