cg-Cad

Lisp »Tips 'n Tricks »Come inserire blocchi leggendo le coordinate da file TXT

;|
        T2B.LSP
        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)
)

(defun C:T2B (/ olderr snapp snm orto piano nomeDir 
                stringa lista nf1 f1 p1
 )
 (setq olderr *error* *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 (command "osnap" "_non")
 (setq nf1 (strcat nomeDir "coo.txt"))
 (setq f1 (open nf1 "r")) ; apre e legge il file COO.TXT
 (setq stringa " ")
 (while (/= stringa nil)
  (setq stringa (read-line f1))
  (if (/= stringa nil)
   (progn
    (setq lista (strcat "(" stringa ")"))
    (setq lista (read lista))
    (setq p1 (list 
              (nth 0 lista) ; coord. x
              (nth 1 lista) ; coord. y
              (nth 2 lista) ; coord. z
             )
    )
    (command "_insert" "ALBERO" p1 1 1 "") ; es. inserisce n volte il blocco ALBERO
   )
  )
 )
 (close f1)
 (ripVar) ; ripristina l'ambiente
)
;;;eof

Analisi del Lisp

L'istruzione LISP di colore blu nel codice sorgente formatta una stringa contenente il percorso e il nome del file (coo.txt).
L'istruzione di colore rosso inserisce il blocco DWG (nell'esempio è il file Albero.dwg).

Per generare in automatico un file TXT di coordinate dei punti d'inserimento, si può usare ad esempio il seguente Lisp, che legge i punti da un disegno CAD:

;|

  PTXT.LSP
  Copyright (C) 2004-2008 Claudio Piccini.
  All rights reserved
  www.cg-cad.com

  * Salva su file COO.TXT le coordinate x,y,z dei punti
    presenti su un layer

|;

(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 C:PTXT (/ olderr s1 nEnt nomeLayer 
                 k ent str10 str11
                 snapp snm orto piano nomeDir 
                 nf1 f1
 )
 (setq olderr *error* *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 (setq nf1 (strcat nomeDir "coo.txt"))
 (command "osnap" "_nea")
 (setq s1 (entsel "\n Seleziona un'entita' di riferimento:"))
 (setq ent (entget (car s1)))
 (setq nomeLayer (cdr (assoc 8 ent)))         ; legge il layer
 (setq s1 (ssget "X" (list (cons 8 nomeLayer))))
 (setq nEnt (sslength s1))
 (setq k 0)                                   ; contatore entita'
 (setq f1 (open nf1 "w"))                     ; apre il file COO.TXT
 (repeat nEnt
  (setq ent (entget (ssname s1 k)))
  (if (= "POINT" (cdr (assoc 0 ent)))
   (progn
    (setq str10 
     (strcat                                  ; codice 10 del punto
      (rtos (car   (cdr (assoc 10 ent))) 2 6) ; estrae e formatta X
      " "
      (rtos (cadr  (cdr (assoc 10 ent))) 2 6) ; estrae e formatta Y
      " "
      (rtos (caddr (cdr (assoc 10 ent))) 2 6) ; estrae e formatta Z
     )
    )
    (write-line str10 f1)
   )
  )
  (setq k (+ k 1))
 )
 (close f1) ; chiude COO.TXT
 (ripVar)   ; ripristina l'ambiente
)
;;;eof

Esempio di file TXT:

1584.398505 977.205984 0
1341.801912 1079.25619 0
1412.027244 922.991814 0
1373.722516 699.756987 0
1329.033672 929.369949 0
1230.079797 881.533915 0

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 2 Marzo 2008