cg-Cad

Lisp »Tips 'n Tricks »Lisp & 3dmesh

Una mesh 3d viene costruita definendo il numero di vertici rispetto alla direzione M e alla direzione N e inserendo le coordinate x y z di ciascun vertice.
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 processo per generare una mesh è quindi molto lungo e di conseguenza è facile l'errore; questo è uno di quei casi dove l'implementazione in AutoLISP di un comando CAD è necessario e non superfluo.
Come esempio d'uso del comando 3dmesh ecco f3dm un lisp che traduce uno script di Python per generare funzioni 3D *

f3dm

;|
   f3dm Copyright (C) 2005 by Claudio Piccini.
   All rights reserved
   www.cg-cad.com

   Generatore di funzioni 3D

   Traduce Function_plotter.py (C) by C. Wartmann
   Oktober 1999
|;

(defun pow2 ( a )(setq a (* a a)))

(defun c:f3dm ( / snapp
                  M N 
                  xw yw 
                  x y z r 
                  distZ distZZ 
 )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")

 (setq xw 0.5 yw 0.5)
 
 ; dim M mesh
 (while 
  (progn
   (initget (+ 2 4)) ; M>0  
   (setq M (getint "\n Dim M della mesh [2..256] <50>: "))
   (if (= M nil)(progn (setq M 50) nil) T)
   (if (and (>= M 2)(<= M 256)) nil T)
  )
 )

 ; dim N mesh
 (while
  (progn
   (initget (+ 2 4)) ; N>0  
   (setq N (getint "\n Dim N della mesh [2..256] <50>: "))
   (if (= N nil)(progn (setq N 50) nil) T)
   (if (and (>= N 2)(<= N 256)) nil T)
  )
 )

 (initget (+ 2 4)) ; distZ>0  
 (setq distZ (getreal "\n Disturbo asse Z <10>: "))
 (if (= distZ nil)(setq distZ 10))

 (setq distZZ (/ distZ 2))

 (command "3dmesh" M N) 
 (setq y 0)
 (while (< y M)
  (setq x 0)
  (while (< x N)
   (setq r (sqrt (+ (pow2 (- x (/ N 2)))(pow2 (- y (/ M 2))))))
   (setq z (* (sin (* r xw))(cos (* r yw))(exp (/ (* -1 r) distZZ)) distZ))
   (command (list x y z))
   (setq x (1+ x))
  )
  (setq y (1+ y))
 )

 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

Command: f3dm
Dim M della mesh [2..256] <50>: Invio
Dim N della mesh [2..256] <50>: Invio
Disturbo asse Z <10>: Invio

F3DM.LSP

Command: f3dm
Dim M della mesh [2..256] <50>: Invio
Dim N della mesh [2..256] <50>: Invio
Disturbo asse Z <10>: 15

F3DM.LSP

(*) C. Wartmann, Blender, la guida - 2001, Mondadori

# Function_plotter.py, Oktober 1999
# C. Wartmann@bigfoot.de

import Blender

from Blender import NMesh,Object
from Blender.NMesh import Col
from math import sin,cos,sqrt,exp

xw=0.5
yw=0.5
xmax=36 # x resolution
ymax=36 # y resolution

me2=NMesh.GetRaw()

# crea i vertici
for y in range(0,ymax):
   for x in range(0,xmax):
      r=sqrt((x-xmax/2)**2+(y-ymax/2)**2)
      z=sin(r*xw)*cos(r*yw)*exp(-r/5)*10
      v=NMesh.Vert(x,y,z)
      me2.verts.append(v)

# collega i vertici alle facce
for y in range(0,ymax-1):
   for x in range(0,xmax-1):
      a=x+y*ymax
      f=NMesh.Face()
      f.v.append(me2.verts[a])
      f.v.append(me2.verts[a+ymax])
      f.v.append(me2.verts[a+ymax+1])
      f.v.append(me2.verts[a+1])
      me2.faces.append(f)

NMesh.PutRaw(me2,"Function",1)
Blender.Redraw()

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 5 Agosto 2005