cg-Cad

Lisp »Tips 'n Tricks »XYZ->3DMesh

Una mesh 3D viene definita assegnando una dimensione M ed una dimensione N. Il numero di vertici necessari per disegnare la mesh è dato dal prodotto MxN. L'assegnazione dei valori della matrice di ordine MxN avviene riga per riga (M) e ripetuta per il numero delle colonne (N).
Esempio:
3dmesh
Dim M della mesh : 2
Dim N della mesh : 2
Vertice (0,0) : 10,10,-1
Vertice (0,1) : 10,20,1
Vertice (1,0) : 20,10,1
Vertice (1,1) : 20,20,0

Il lisp T2M legge un file ASCII con estensione XYZ generato con il software pkJuM 4.9.2 e disegna la relativa mesh 3D.

ASCII sta per American Standard Code for Information Interchange e definisce il modo in cui vengono salvate le lettere dell'alfabeto come informazioni digitali. Il sistema ASCII definisce 127 simboli alfanumerici.

Il numero dei vertici della mesh 3D nelle direzioni M e N non deve essere inferiore a 2 e superiore a 256, di conseguenza il file XYZ salvato con pkJuM non deve superare in larghezza e in altezza la misura massima di 256 pixel. Inoltre pkJuM nella conversione dal formato TGA al formato XYZ tralascia un bordo di 4 pixel intorno al perimetro dell'immagine (pixel non elaborati dal filtro di smussamento).
Ad esempio un'immagine TGA di 200x200 pixel viene convertita nel formato XYZ sottoforma di un insieme (192x192) di terne di coordinate x y z (in quest'ordine e una terna per rigo).

;|
	T2M.LSP * 12 Agosto 2006
        Copyright (C) 2006 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 C:T2M (/ olderr snapp snm orto piano
                stringa lista f1
                M N k
 )
 (setq olderr *error* *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 ; dim M, 2-256
 (while 
  (progn
   (initget (+ 2 4))
   (setq M (getint "\n Altezza dell'immagine: "))
   ; se M e' maggiore di 2 e minore di 256 stop loop
   (if (and (>= M 2)(<= M 256)) nil T)
  )
 )
 ; dim N, 2-256
 (while
  (progn
   (initget (+ 2 4))
   (setq N (getint "\n Larghezza dell'immagine: "))
   ; se N e' maggiore di 2 e minore di 256 stop loop
   (if (and (>= N 2)(<= N 256)) nil T)
  )
 )
 ; input file ASCII con estensione XYZ
 (setq f1 (open (getfiled "Input file" "" "XYZ" 8) "r"))
 (command "osnap" "_non")
 (setq stringa " ")
 (setq k 0)
 (command "3dmesh" M N) 
 (repeat M
  (repeat N
   ; legge un rigo del file = x y z...
   (setq stringa (read-line f1))
   ; ...e lo trasforma in una lista = (x y z)
   (setq lista (strcat "(" stringa ")"))
   (setq lista (read lista))
   (command (list (nth 0 lista)(nth 1 lista)(nth 2 lista)))
   (setq k (1+ k))
  )
 )
 (close f1)
 (princ (strcat " elaborati " (itoa k) " punti"))
 (ripVar)
)
;;;eof

Test del Lisp

Es.1

frattale di Newton L'immagine (200x200) salvata (con pkJuM v4.9.2) in scala di grigio e con un filtro gaussiano (5 6 8 N 100 formula=2)
...ed il relativo file XYZ:
4 4 16.400000
5 4 17.000000
6 4 18.000000
via via
194 196 14.500000
195 196 14.900000
196 196 15.000000



Command: t2m
Larghezza dell'immagine: 192
Altezza dell'immagine: 192
elaborati 36864 punti

t2m.lsp

Es.2

arance L'immagine (200x150) salvata (con pkbark v0.4) in scala di grigio e con un filtro gaussiano
...ed il relativo file XYZ:
4 4 24.000000
4 5 24.000000
4 6 24.000000
via via
146 194 25.300000
146 195 25.300000
146 196 25.300000



Command: t2m
Altezza dell'immagine: 142
Larghezza dell'immagine: 192
elaborati 27264 punti

t2m.lsp

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 12 Agosto 2006