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
|