Sei sulla pagina 1di 18

Formar su MESH con LISP

Reinaldo N. Togores, Ph.D. Arquitecto, Diseador Industrial

AC5081-V
Entre las caractersticas que incorporan las versiones recientes de AutoCAD destacan las "superficies
de subdivisin" tambin conocidas como entidades MESH. Estas entidades son de especial inters ya
que sus propiedades se exponen en el clsico formato de las listas de entidad. Por ello, podemos usar
nuestro viejo conocido, el AutoLISP clsico, para crearlas y modificarlas. Calculando las coordenadas
de sus vrtices a partir de distintas frmulas matemticas podemos crear una variedad ilimitada de
formas tridimensionales. Suavizando estas mallas, convirtindolas a superficies y a slidos y empleando
las distintas herramientas disponibles para la edicin de superficies y slidos podemos explorar un vasto
universo de formas 3D, que pueden ser utilizadas en otros programas Autodesk como Revit o MAX
para el desarrollo de nuevos conceptos de diseo.

Objetivos de Aprendizaje
Al final de esta clase, usted ser capaz de:

Comprender, cargar, probar y ejecutar cdigo AutoLISP.

Automatizar el punto de vista 3D y los estilos visuales.

Comprender la estructura de los Cdigos de grupo DXF de la entidad MESH.

Crear y modificar entidades MESH a travs de la programacin AutoLISP.

Conocer y aplicar diferentes comandos AutoCAD para la conversin y edicin de objetos 3D

Sobre el Ponente
Reinaldo N. Togores ha utilizado AutoCAD por cerca de 25 aos en su labor como arquitecto y
diseador industrial. Durante los ltimos dieciocho aos ha enseado programacin AutoLISP a
Estudiantes de Ingeniera Civil e Industrial de la Universidad de Cantabria, en el norte de Espaa. Como
investigador en temas de diseo asistido por ordenador, ha trabajado con varios grupos de
investigacin de la Universidad de Cantabria y ha sido miembro de la Red de Desarrolladores de
Autodesk desde finales de los 90. Es autor de dos libros sobre programacin Visual LISP (2003 y 2012).
http://www.togores.net/
togoresr@unican.es
togores.design@gmail.com

Formar su MESH con LISP

Comprender, cargar, probar y ejecutar cdigo AutoLISP


El IDE Visual LISP
El entorno de desarrollo integrado Visual LISP (IDE VLISP) incluye herramientas que ayudan en la
redaccin del cdigo fuente, en su modificacin y en la depuracin de errores. Ahora podemos, una vez
escrito el programa empleando el Editor de programacin, comprobar paso a paso su funcionamiento,
teniendo a la vista en todo momento los resultados devueltos por la evaluacin de cada una de las
expresiones as como el valor que van asumiendo las distintas variables, sin tener para ello que incluir
expresiones adicionales en el programa. Proporciona adems, el medio para empaquetar y distribuir
aplicaciones en un archivo ejecutable nico que incluye la interfaz de dilogo programada en DCL. Estas
operaciones se realizan desde en un entorno nico, que permite tanto la edicin del texto como la
depuracin del programa y la interaccin con AutoCAD y otras aplicaciones.

Visual LISP tiene su propio conjunto de ventanas y mens propios, pero no puede ejecutarse
independientemente de AutoCAD. Para iniciar una sesin de trabajo se teclear vlide o vlisp en la lnea
de comandos.

Interactividad: La Consola Visual LISP..


Desde la Consola, podemos ejecutar expresiones LISP para comprobar sus resultados. Esto tambin
puede hacerse desde la lnea de comandos de AutoCAD pero hay varias diferencias en el modo en que
ambas operan. Por ejemplo, para mostrar el valor de una variable en LISP, simplemente tecleamos el
nombre de la variable en la ventana de la Consola y pulsamos INTRO. Pero para obtener el valor de una

Formar su MESH con LISP

variable en la lnea de comandos de AutoCAD, debemos preceder el nombre de la variable con un signo
de exclamacin (!).
La funcin principal de la Consola es la de evaluar expresiones LISP. El smbolo _$ indica que est en
condiciones de recibir una expresin para evaluarla. A continuacin de este smbolo puede escribirse la
misma. El texto que se teclea en la Consola no es procesado hasta presionar INTRO de manera
expresa. Para continuar una expresin LISP en una nueva lnea puede utilizarse la combinacin de
teclas CTRL+INTRO.

El Editor de Programacin:
Est diseado especialmente para su uso con el cdigo AutoLISP. Para cada archivo de cdigo fuente se
abre una nueva ventana del Editor con el nombre de ese archivo en su barra de ttulo. El nombre tambin
aparece en la barra de estado. Un asterisco (*) junto al nombre del archivo en la barra de estado indica
que se ha hecho algn cambio en el archivo que no ha sido guardado. El Editor, al igual que la Consola,
est diseado para asistir en la programacin AutoLISP y tiene la capacidad para completar expresiones,
localizar los parntesis de apertura y cierre correspondientes, colorear la sintaxis y ejecutar las
expresiones sin necesidad de abandonar la ventana del Editor. A diferencia de la Consola, en el Editor
para cambiar de lnea basta presionar INTRO. La nueva lnea queda sangrada de manera automtica. El
Editor tambin es capaz de formatear el cdigo segn diversos estilos a eleccin del usuario. En
trminos generales, adems de la sintaxis coloreada y la sangra automtica el Editor ofrece otras
ayudas que facilitan el desarrollo de programas. Algunas de estas utilidades son:

Comprobacin del cierre de parntesis.


Posibilidad de aadir comentarios de manera automtica al cierre de expresiones.
Poner y quitar de manera automtica marcas de comentario en las lneas seleccionadas.
Bsqueda y sustitucin de texto.
Comprobacin de la sintaxis.
Carga de expresiones LISP para ser evaluadas en la Consola.

El Formateador de cdigo Visual LISP organiza el contenido de la ventana activa del Editor mejorando su
apariencia y legibilidad. Aunque el sangrado inteligente va organizando el programa a medida que se
teclea el texto, tambin se puede invocar de manera explcita con los botones de la barra Herramientas
para reorganizar los bloques seleccionados o todo el texto contenido en el Editor.
Para iniciar nuestro trabajo son dos las herramientas que debemos dominar: la Consola Visual LISP y el
Editor. En el uso simultneo de ambos, Consola y Editor, se encuentra una de las claves para el xito en
la programacin Visual LISP.

Trabajando en la Consola Visual LISP podemos comprender por qu decimos que LISP es un
lenguaje interactivo. Si tecleamos una expresin en la Consola, obtendremos de inmediato su valor.
As comprobamos las expresiones que luego incorporaremos a nuestros programas.
En el Editor es que establecemos la forma definitiva de nuestros programas para guardarlos de
manera permanente en las unidades de almacenamiento de datos de nuestro sistema.

Automatizar el Punto de Vista 3D y los Estilos visuales


Las representaciones de un objeto 3D sobre la pantalla o impresa, es decir proyectado sobre un plano
2D, deben incluir la informacin necesaria para que el observador identifique, para una orientacin
determinada en el espacio, cules partes del objeto estn ms prximas al observador. Estas tcnicas

Formar su MESH con LISP

incluyen las proyecciones en paralelo, las proyecciones en perspectiva, y sobre todo cuando se
combinan con tcnicas de diferenciacin de la representacin de las aristas visibles y ocultas o
directamente la supresin de lneas ocultas y el sombreado de las caras. Para automatizar este proceso
de manera que podamos apreciar de inmediato los resultados, hemos desarrollado funciones (Listados 1
y 2) que podemos incorporar a cualquier programa de modelado 3D.

Apariencia visual.
Aparte de la orientacin del punto de vista la percepcin de las formas 3D se ve favorecida mediante el
color, el sombreado y la iluminacin de los objetos. AutoCAD suministra una serie de estilos visuales
predefinidos que pueden establecerse mediante el comando ESTILVISUAL (_-VISUALSTYLES). Estos
estilos visuales predefinidos son:
"_W" = Almbrico; "_H" Lneas Ocultas; "_R" Realista; "_C" Conceptual; "_S" Sombreado; "_E"
Sombreado con aristas; "_G" Escala de Grises; "_SK" Bocetado; "_X" Rayos X.
La apariencia de estos estilos visuales se controla a partir de una serie de variables de sistema que nos
permiten desde nuestro programa establecer el estilo visual que prefiramos sin necesidad de recurrir a
los predefinidos. Estas variables se describen en la Tabla 1.
Tabla 1. Variables que controlan la apariencia visual.

Variable

Descripcin

Valores

VSBACKGROUNDS

Visualizacin de fondos.

0: Desactivada / 1: Activada

VSEDGECOLOR

Color de las aristas.

ndice de color o RGB.

VSEDGEJITTER

Aristas de los objetos 3D onduladas.

1: Inferior / 2: Medio /
3: Alta

VSEDGELEX

Extiende aristas
interseccin.

ms

all

de

su

De 1 a 100 pxeles.

VSEDGEOVERHANG

Extiende aristas
interseccin.

ms

all

de

su

De 1 a 100 pxeles.

VSEDGES

Controla los tipos de arista que se


muestran.

0: Ninguna / 1: Isolneas /
2: Aristas

VSEDGESMOOTH

ngulo en que se ven las aristas de


pliegue.

Entre 0 y 180.

VSFACECOLORMODE

Modo en el que se calcula el color de las


caras.

0: Normal / 1: Monocromo / 2:
Matizado /
3: Reducir saturacin

VSFACEHIGHLIGHT

Controla los
materiales.

Entre -100 y 100.

VSFACEOPACITY

Transparencia para objetos 3D.

Entre 100% y 0% de opacidad.

VSFACESTYLE

Modo de visualizacin de las caras.

0: No / 1: Real / 2: Gooch

VSHIDEPRECISION

Precisin de ocultaciones y sombras.

0: Simple / 1: Doble

VSINTERSECTIONCOLOR

Color de aristas de interseccin.

ndice de color o RGB.

VSINTERSECTIONEDGES

Visualizacin de aristas de interseccin.

0: Desactivada / 1: Activada

VSINTERSECTIONLTYPE

Tipo de lnea de las intersecciones.

Entre 0 y 11.

VSISOONTOP

Muestra isolneas
sombreados.

0: Desactivada / 1: Activada

reflejos

en

sobre

caras

los

sin

objetos

Formar su MESH con LISP

VSLIGHTINGQUALITY

Calidad de iluminacin.

0: Facetas / 1: Suave /
2: Ms suave

VSMATERIALMODE

Visualizacin de materiales.

0: Ninguno / 1: Materiales /
2: Con texturas

VSMONOCOLOR

Color visualizaciones monocromas y


matizadas.

Color RGB.

VSOBSCUREDCOLOR

Color de lneas ocultas.

ndice de color o RGB.

VSOCCLUDEDEDGES

Controla si se muestran las aristas


ocultas.

0: Desactivada / 1: Activada

VSOCCLUDEDLTYPE

Tipo de lnea de las lneas ocultas.

Entre 0 y 11.

VSSHADOWS

Controla si se muestran sombras.

0: Sin sombra / 1: En el suelo 2: Todas

VSSILHEDGES

Controla la visualizacin de aristas de


silueta.

0: Desactivada / 1: Activada

VSSILHWIDTH

Anchura en pxeles de las aristas de


silueta.

Entre 1 y 25.

PERSPECTIVE

Precisa si la
perspectiva.

0: Desactivada / 1: Activada

vista

se

muestra

en

Para establecer un estilo visual personalizado para la ejecucin de nuestros programas definimos la
funcin var-vis (Listado 1) que establece una forma de presentar los objetos 3D a nuestro gusto. Los
efectos de los ajustes propuestos pueden verse en la portada de este libro. Para ello, definimos en
primer trmino un color para la variable VSMONOCOLOR de manera que no sea necesario establecer
un color determinado para la capa ni para el objeto, sino que el mismo est vinculado al estilo que
establecemos para la ventana grfica. El color se establece como color RGB pasando a la variable la
cadena de caracteres "RGB:211,76,3" para el color naranja que quisimos obtener. Pero para que este
color se aplique a la superficie de nuestros objetos 3D tendremos que dar a la variable
VSFACECOLORMODE el valor 1 en lugar del valor predeterminado que es 0.
Para un mejor realce del relieve he preferido utilizar, en lugar de un sombreado realista, un sombreado
del tipo Gooch, que utiliza colores fros y clidos, en lugar de oscuros y claros, como medio para
diferenciar mejor las partes en sombra. Este modo se activa estableciendo el valor de la variable
VSFACESTYLE como 2. Para una presentacin realista estableceramos su valor como 1.
En esta vista se muestran las isolneas en un color ms claro que la superficie como manera de enfatizar
el relieve del modelo. Para ello ha sido necesario asegurarnos que el valor de la variable VSEDGES sea
1 de manera que se muestren las isolneas y establecer su color a partir de la variable VSEDGECOLOR
como "RGB:255,212,82". Para obtener el efecto que se muestra en la portada se ha dado valor 0 a la
variable VSISOONTOP. De esta manera las isolneas de la parte trasera del modelo se mantendrn
ocultas.
La visibilidad de las aristas ocultas (obstrudas) se controla mediante la variable VSOBSCUREDEDGES.
Estableciendo su valor como 0 no se mostrarn las aristas ocultas. Otro tipo de aristas son las aristas de
interseccin. En este caso se trata de de las aristas donde se cortan dos objetos distintos y su visibilidad
se activa o desactiva mediante la variable VSOCCLUDEDEDGES. En el caso de la imagen de portada,
al ser un slo objeto no habr diferencia entre su valor activado (1) o desactivado (0).

Formar su MESH con LISP

(defun var-vis

()

(setvar "VSMONOCOLOR" " RGB:211,76,3")

(setvar
(setvar
(setvar
(setvar
(setvar
(setvar
(setvar
(setvar

"VSFACECOLORMODE" 1)
"VSEDGES" 1)
"VSEDGECOLOR" "RGB:255,212,82")
"VSISOONTOP" 0)
"VSFACESTYLE" 2)
"VSOBSCUREDEDGES" 0)
"VSOCCLUDEDEDGES" 0)
"PERSPECTIVE" 1))
Listado 1. Funcin que establece un estilo visual personalizado.

Establecer un punto de vista isomtrico Suroeste.


El punto de vista se establece mediante el comando VISTADIN. Esta es nuestra primera aproximacin a
la automatizacin de comandos a travs de AutoLISP. El Listado 2 muestra la definicin de la funcin.
Los argumentos que se pasan al comando VISTADIN son una cadena vaca como respuesta a la
pregunta Designe objetos o <utilizar DBLOQVISTA>:, _ca" para seleccionar la opcin Cmara, 45 como
respuesta Precise ubicacin de cmara, o indique ngulo del plano XY, y -135 como la respuesta a
Precise ubicacin de cmara, o indique ngulo en plano XY del eje X,. Una cadena vaca es necesario
para terminar el comando. Un ZOOM EXTENSION se ejecuta a continuacin y finalmente una llamada a
la funcin var-vis que hemos definido en el Listado 1.
(defun cmd-SW ()
(command "_dview" "" "_ca" 45 -135 "")
(command "_zoom" "_e")
(var-vis))
Listado 2. Punto de vista isomtrico SW y Estilo Visual.

Comprender la estructura de los cdigos de grupo DXF


Una malla es un objeto de superficie. A diferencia de los slidos 3D no tienen volumen o propiedades de
masa. Se compone de las caras que a su vez estn rodeadas por aristas. Esas aristas son especificadas
por pares de vrtices. Las MALLAS pertenecen a la clase de objetos conocidos en grficos por
ordenador como la superficies de subdivisin. Estos objetos pueden tener diferentes niveles de
suavizado. El aumento del nivel de suavizado genera facetas con que se aproximan formas cada vez
ms redondeadas.
Tenemos dos formas de crear objetos MESH a travs de AutoLISP. Podemos usarlo como un lenguaje
de scripting para automatizar comandos. O podemos usar la funcin de AutoLISP ENTMAKE para
crearlos directamente, sin las limitaciones de los diferentes comandos. Esto requiere una comprensin
profunda de la forma en que sus propiedades se exponen a travs de los cdigos de grupo DXF.

Las entidades MESH entities se definen a partir de Caras, Aristas y Vrtices. Las caras estn definidas a
partir de la secuencia de vrtices que la rodean. La secuencia de dos vrtices definen una arista y la
adyacencia de las caras se define a partir de las aristas que comparten. Esta estructura bsica de la
malla, sus caras, aristas y vrtices, se define como nivel 0.

Formar su MESH con LISP

Para explicar la manera en que se estructura la lista de definicin de la entidad utilizaremos como
ejemplo una malla en forma de tetraedro creada mediante uno de los programas que proponemos como
ejemplo en este captulo. La lista de entidad obtenida a partir de entget es discutida en detalle en la Tabla
2.
Tabla 2. Lista definitoria de la entidad MESH.

((-1 . <Nombre entidad:


7ffff605b00>)
(0 . "MESH")
;Entidad
(330 . <Nombre entidad:
7ffff6039f0>)
(5 . "228")
(100 . "AcDbEntity") ;Subclase
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbSubDMesh")
;Subclase

Cdigos comunes.
Los cdigos -1, 330 y 5 son propios de cada
objeto y no se incluyen en la lista que se pasa a
entmake.
Los cdigos 67, 410 y 8 que corresponden al
EspacioModelo/Papel, Ficha de Presentacin y
Capa pueden omitirse. Se asignan de manera
automtica los valores actuales.

Versin y suavizado.
(71 . 2) ;# de versin
(72 . 0) ;"Fusionar pliegue"
(91 . 0) ;Nivel subdivisin

El nmero de versin es siempre 2. Admite el


valor 1. Otro valor provoca un error.
Fusionar Pliegue determinara si el pliegue se
suavizar segn el valor de ZOOM. Este valor no
produce efecto alguno.
El nmero de nivel de subdivisin determina el
suavizado del objeto creado.

(92 . 4) ;# vrtices Niv.


(10 0.0 0.0 100.0)
;Vrt.
(10 0.0 94.2 -33.3) ;Vrt.
(10 -81.6 -47.1 -33.3);Vrt
(10 81.6 -47.1 -33.3);Vrt.
(93
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

0
0
1
2
3

16) ;Tamao lista caras


3) ;# vrtices, Cara 1
0)
1)
2)
3) ; # vrtices, Cara 2
0)
2)
3)
3) ; # vrtices, Cara 3
0)
3)
1)
3) ; # vrtices, Cara 4
1)
3)

Posicin de los Vrtices.


El cdigo 92 indica la cantidad de vrtices. Debe
estar seguido de tantos cdigos 10 como vrtices
haya. La sublista asociada a cada cdigo 10
contiene las coordenadas X, Y y Z de un vrtice.
Definicin de Caras.
El cdigo 93 indica el nmero de sublistas que
componen la definicin de las caras del Nivel 0.
Cada cara se define a partir de un bloque de
cdigos 90, el primero de los cuales indica el
nmero de vrtices que rodean la cara y le siguen
tantos cdigos 90 como vrtices posea la cara. Es
decir
cada
bloque
se
compone
de
nmero_de_vrtices + 1 sublistas.
El valor asociado para cada sublista es el ndice
(de base 0) correspondiente al vrtice en la
secuencia de cdigos 10.
A diferencia de lo que sucede con las Mallas
Policara, el nmero de vrtices no est limitado a
7

Formar su MESH con LISP

(90 . 2)
(94
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90
(90

.
.
.
.
.
.
.
.
.
.
.
.
.

6)
0)
1)
1)
2)
0)
2)
2)
3)
0)
3)
1)
3)

4.
;# aristas Nivel 0
;Arista 1
;Arista 2
;Arista 3
;Arista 4

Definicin de Aristas.
El cdigo 94 indica el nmero de aristas para el
Nivel 0. Las sublistas que le siguen asociadas al
cdigo 90 son el doble de este nmero, ya que
cada arista se define a partir de dos sublistas
sucesivas. Por ejemplo, la Arista 1 en este caso
es la que une los vrtices 0 y 1.

;Arista 5
;Arista 6

(95 . 6) ;# de pliegues
(140 . 0.0) ;Arista 1
(140 . 0.0) ;Arista 2
(140 . 0.0) ;Arista 3
(140 . 0.0) ;Arista 4
(140 . 0.0) ;Arista 5
(140 . 0.0) ;Arista 6

Pliegues de Arista.
El cdigo 95 coincide con el cdigo 94 ya que
cuenta el nmero de aristas. Para cada arista, el
cdigo 140 indica el nivel ms alto de suavizado
para el cual se mantiene el pliegue. Si el nivel de
suavizado es mayor, tambin se suaviza este
pliegue. Un valor de -1 indica que siempre se
mantiene el pliegue. Un valor de 0 indica que no
hay pliegue.
Modificacin de propiedades.

(90
(91
(92
(90
(63

.
.
.
.
.

1)
9)
1)
0)
1)

;# modificadas
;ID subentidad
;# de propiedades
;(0 = Color)
;Valor (1 = Rojo)

El cdigo 90 que sigue a los cdigos 140 indica el


nmero de sub-entidades cuyas propiedades se
han modificado. El cdigo 91 indica la subentidad
modificada. Las sub-entidades se numeran con
base 0 comenzando por las aristas. En este caso,
la entidad 9 es la ltima cara (0 al 5 para aristas +
4 caras). El cdigo 90 que sigue al 92 indica el
tipo de propiedad modificada: 0 = Color; 1 =
Material; 2 = Transparencia; 3 = Mapeado de
material. En este caso se ha cambiado el color a
rojo (cdigo 63).

Crear y modificar entidades MESH mediante programacin


AutoLISP
Los comandos se pueden usar para crear objetos de malla. El comando MESH proporciona un conjunto
de las llamadas "primitivas", una variedad de formas simples como cajas, esferas, cilindros, etc. El
nmero de caras (o teselaciones) para las primitivas de malla se puede establecer mediante el comando
_MESHOPTIONS, pero este comando utiliza un cuadro de dilogo que no puede ser suprimido, por lo
que no es adecuado para su uso en programas AutoLISP. En AutoLISP vamos a usar en su lugar un
conjunto de variables de sistema identificadas por el prefijo DIVMESH que establecen las teselaciones
para cada una de las dimensiones de las primitivas. Estas variables se describen en la Tabla 3.
8

Formar su MESH con LISP

Tabla 19.1. Variables de sistema que controlan la subdivisin de las mallas.


Variable:

Subdivisiones:

DIVMESHBOXHEIGHT

A lo largo del eje Z. Valor de 1 a 256.

DIVMESHBOXLENGTH

A lo largo del eje X. Valor de 1 a 256.

DIVMESHBOXWIDTH

A lo largo del eje Y. Valor de 1 a 256.

DIVMESHCONEAXIS

Del permetro de la base. Valor de 3 a 256.

DIVMESHCONEBASE

A lo largo del radio. Valor de 1 a 256.

DIVMESHCONEHEIGHT

En altura. Valor de 1 a 256.

DIVMESHCYLAXIS

Del permetro de la base. Valor de 3 a 256.

DIVMESHCYLBASE

A lo largo del radio. Valor de 1 a 256.

DIVMESHCYLHEIGHT

En altura. Valor de 1 a 256.

DIVMESHPYRBASE

Del radio de la base. Valor de 1 a 256.

DIVMESHPYRHEIGHT

En altura. Valor de 1 a 256.

DIVMESHPYRLENGTH

De cada lado de la base. . Valor de 1 a 256.

Esfera
_Sphere

DIVMESHSPHEREAXIS

De su ecuador. Valor de 3 a 512.

DIVMESHSPHEREHEIGHT

De su eje Z. Valor de 2 a 1024.

Toroide
_Torus

DIVMESHTORUSPATH

A lo largo del barrido del perfil. Valor de 3 a 512.

DIVMESHTORUSSECTION

Del perfil barrido. Entre 3 y 512.

DIVMESHWEDGEBASE

Del baricentro del tringulo a sus lados. Valor de 1 a 64.

DIVMESHWEDGEHEIGHT

A lo largo del eje Z. Valor de 1 a 64.

DIVMESHWEDGELENGTH

A lo largo del eje X. Valor de 1 a 64.

DIVMESHWEDGESLOPE

De la cara inclinada. Valor de 1 a 64.

DIVMESHWEDGEWIDTH

A lo largo del eje Y. Valor de 1 a 64.

Malla:
pRisma
_Box

Cono
_Cone
cIlindro
_CYlinder
Pirmide
Pyramid

cUa
_Wedge

En el caso de las mallas creadas a partir de los comandos SUPREGLA (_RULESURF), SUPTAB
(_TABSURF), SUPREV (_REVSURF) y SUPLADOS (_EDGESURF) las subdivisiones se controlan a
partir de las variables SURFTAB1 y SURFTAB2.

Creacin de una MESH en forma de Prisma Rectangular.


Para ayudar en la creacin de mallas utilizando estos comandos podemos definir funciones para
automatizar el proceso de configuracin de las variables de subdivisin. El Listado 3 muestra una funcin
que crea un prisma rectangular.
(defun cmd-mesh-box
(center dim-x dim-y dim-z div-x div-y div-z /)
(setvar "DIVMESHBOXLENGTH" div-x)
(setvar "DIVMESHBOXWIDTH" div-y)
(setvar "DIVMESHBOXHEIGHT" div-z)
(vl-cmdf "._MESH" "_B" "_C" center "_L" dim-x dim-y dim-z))
Listado 3. Crear una CAJA con el comando MALLA.

La funcin CMD-MESH-BOX toma como argumentos un punto para ser utilizado como centro de
gravedad de la caja, las dimensiones X, Y y Z, y el nmero de subdivisiones de longitud, anchura y
9

Formar su MESH con LISP

altura. En este caso, la antigua funcin AutoLISP COMMAND se sustituye por la ms nueva VL-CMDF.
Las opciones que se utilizan para el comando MALLA son "_B" para el tipo de primitiva BOX "_C" para la
opcin centro y "_L" para la longitud.

Creacin de una malla cuadrada plana


El Listado 4 muestra una funcin que crea una malla cuadrada plana con el comando EDGESURF.
(defun cmd-square-mesh (ins-pt side div / x-min x-max y-min y-max z edges)
(setvar "MESHTYPE" 1)
; MESH type object
(setvar "SURFTAB1" div)
; U tesselations
(setvar "SURFTAB2" div)
; V tesselations
(setq x-min (nth 0 ins-pt)
x-max (+ x-min side)
y-min (nth 1 ins-pt)
y-max (+ y-min side)
z
(nth 2 ins-pt))
(vl-cmdf "_LINE" ins-pt (list x-max y-min z) "")
; Line 1
(setq edges (cons (entlast) edges))
(vl-cmdf "_LINE" (list x-max y-min z) (list x-max y-max z) "") ; Line 2
(setq edges (cons (entlast) edges))
(vl-cmdf "_LINE" (list x-max y-max z) (list x-min y-max z) "") ; Line 3
(setq edges (cons (entlast) edges))
(vl-cmdf "_LINE" (list x-min y-max z) ins-pt "")
; Line 4
(setq edges (cons (entlast) edges))
(apply 'vl-cmdf (cons "EDGESURF" edges))
; Create MESH
(mapcar 'entdel edges)
; Erase lines
(princ))
Listado 4. Creacin de una malla cuadrada plana con el comando EDGESURF.

La funcin CMD-SQUARE-MESH recibe como argumentos un punto (INS-PT) que ser la esquina
inferior izquierda de la malla, la longitud SIDE del lado de la malla y DIV, el nmero de divisiones que
ser la misma a lo largo de las direcciones X e Y . Al crear las lneas de los bordes su ENAME (obtenido
a travs de ENTLAST) se aade a la lista EDGES. Esta lista se utiliza para pasar las lneas a
EDGESURF y para borrarlas una vez que la malla ha sido creada. Como los bordes estn contenidas en
una lista, se emplean dos procedimientos ms bien complejos. Para crear la malla se utiliza la funcin de
transformacin que pasa a una lista de argumentos, y emplea la funcin APPLY:
(apply 'vl-cmdf (cons "EDGESURF" edges))
De esta manera la cadena "EDGESURF" se agrega como el primer trmino de la lista que ya contiene
los ENAMES de las lneas y entonces se aplica VL-CMDF a esta lista. Para borrar las lneas se usa la
funcin MAPCAR que ejecuta una funcin con una lista que recibe como argumento.

Crear entidades MESH mediante ENTMAKE.


Para crear entidades MESH sin utilizar los comandos de AutoCAD se propone la funcin ENT-MESH
(Listado 5). ENT-MESH recibe tres argumentos listas, vrtices, caras y aristas.

La lista VERTICES contiene las coordenadas de cada vrtice.


La lista FACES contiene sublistas, cada una de ellas indicando los vrtices que rodean a una cara.
Los vrtices se especifican mediante ndices que hacen referencia a la lista VERTICES.
La lista EDGES contiene una secuencia de pares de ndices de vrtice. Cada par indica el punto de
inicio y final de una arista.
10

Formar su MESH con LISP

La funcin ENT-MESH comienza creando la Lista de cabecera con valores fijos. El nivel de suavizado
(cdigo de grupo 91) se define como cero.
A partir de la informacin contenida en las listas VERTICES, FACES y EDGES, ENT-MESH crea las sublistas de definicin de la entidad, asociadas con los correspondientes cdigos de grupo DXF. El proceso
es:
1. Hallar la longitud de cada lista (VERTICES, FACES y EDGES) y asociarlas con el cdigo de
grupo (92 para los vrtices, 93 para las caras y 94 para los bordes) que indican el nmero de
elementos.
2. Aadir la sublista cada elemento.
Los elementos contenidos en la lista VERTICES se aaden utilizando la funcin CONS en un bucle
FOREACH a una lista asignada a la variable ENT-LIST.
Agregar los datos de la lista FACES es un poco ms complicado. Se hace en dos bucles FOREACH
anidados. El valor asociado con el cdigo de grupo 93 es la suma del nmero de sublistas en FACES
devuelto por la expresin (length FACES), mas el nmero total de vrtices que rodean las caras que se
han hallado a travs de la expresin (length (apply 'append FACES)). Esto funciona de la siguiente
manera:
1. Aplanar la lista con (apply 'append FACES)
2. Encontrar la longitud de la lista "aplanada" utilizando la funcin LENGTH
3. Finding the list of the flattened list using the LENGTH function.
La expresin que hace esto es:
(setq
ent-list (cons (cons 93
(+ (length faces)
(length (apply 'append faces))))
ent-list))

Una vez calculado el valor que se asigna al cdigo de grupo 93 ser necesario aadir los valores del
cdigo 90. Para cada cara hay que aadir:
1. Un cdigo de grupo 90 que indica el nmero de vrtices que rodean la cara.
2. Tantos valores asignados al cdigo de grupo 90 como ndices de vrtices contenga la sublista
para esa cara.
La siguiente expresin FOREACH anidada se utiliza para realizar esto:
(foreach face faces
(setq ent-list (cons (cons 90 (length face)) ent-list))
(foreach vertexindex face
(setq ent-list (cons (cons 90 vertexindex) ent-list)))

Como cada arista se define en la lista EDGES por pares de ndices de vrtices, el nmero de aristas que
se utilizar como el valor para el cdigo de grupo 94 ser la mitad de la longitud de la lista EDGES. Los
valores para las sublistas con los cdigos de grupo 90 que siguen se asignarn en un solo bucle
FOREACH tal como lo hicimos para los datos de vrtices.
(defun ent-mesh (vertices faces edges / header ent-list)
;;Entity header:
(setq header '((0 . "MESH")
(100 . "AcDbEntity")
(100 . "AcDbSubDMesh")

11

Formar su MESH con LISP

(71 . 2)
(72 . 0)
(91 . 0)))
;;Vertices data:
(setq ent-list (cons (cons 92 (length vertices)) ent-list))
(foreach vertex vertices
(setq ent-list (cons (cons 10 vertex) ent-list)))
;;Faces data:
(setq
ent-list (cons (cons 93
(+ (length faces)
(length (apply 'append faces))))
ent-list))
(foreach face faces
(setq ent-list (cons (cons 90 (length face)) ent-list))
(foreach vertexindex face
(setq ent-list (cons (cons 90 vertexindex) ent-list))))
;;Edges data:
(setq ent-list (cons (cons 94 (/ (length edges) 2)) ent-list))
(foreach vertexindex edges
(setq ent-list (cons (cons 90 vertexindex) ent-list)))
;;Crease data:
(setq ent-list (cons (cons 95 (/ (length edges) 2)) ent-list))
(setq ent-list (append header (reverse ent-list)))
(entmake ent-list))
Listing 5. Creating a MESH through ENTMAKE.

Aunque no se aadir informacin para los pliegues, el nmero de pliegues se debe aadir a la
cabecera. Ese nmero es el mismo que el nmero de aristas. La cabecera se aade luego a la lista ENTLIST invertida mediante REVERSE. A continuacin se llama a ENTMAKE con la lista ENT-LIST final
como argumento.
AutoCAD no tiene Tetraedros entre sus primitivas de MALLA. Utilizando la funcin ENT-MESH podemos
definir un nuevo comando TETRAHEDRON (Listado 6) y DODECAHEDRON (Listado 7) que crean
estos poliedros con el radio definido por el usuario. Lo centramos en el origen del sistema de
coordenadas para simplificar el cdigo. En mi libro se muestra cmo colocarle en cualquier posicin,
alinendolo a cualquier sistema de coordenadas definido por el usuario.
Los nombres de estas funciones tienen el prefijo C: por lo que se puede invocar desde la lnea de
comandos de AutoCAD sin necesidad de parntesis, al igual que cualquier otro comando nativo. Estos
dos comandos solicitan el radio, establecen los valores de las listas VERTICES, FACES y EDGES y
luego llama a ENT-MESH. La malla resultante se escala con el comando SCALE. Finalmente se
establece el punto de vista y el estilo visual evaluando CMD-SW.
(defun C:TETRAHEDRON (/ radius vertices faces edges)
(setq radius
(getdist '(0 0 0) "\nCircumscribed sphere radius: ")
vertices '((0 0 1)
(0 0.94280904 -0.33333333)
(-0.81649658 -0.47140452 -0.33333333)
(0.81649658 -0.47140452 -0.33333333))
faces
'((0 1 2) (0 2 3) (0 3 1) (1 3 2))
edges
'(0 1 1 2 2 0 2 3 3 0 3 1))
(ent-mesh vertices faces edges)
(command "_scale" (entlast) "" '(0 0 0) radius)
(cmd-SW))
Listiado 6. Comando TETRAHEDRON.

12

Formar su MESH con LISP

(defun C:DODECAHEDRON (/ radius vertices faces edges)


(setq radius
(getdist '(0 0 0) "\nCircumscribed sphere radius: ")
vertices '((0.57735 -0.187592 0.794654)
(0.356822 0.491123 0.794654)
(-0.356822 0.491123 0.794654)
(-0.57735 -0.187592 0.794654)
(-1.11022e-016 -0.607062 0.794654)
(0.934172 -0.303531 0.187592)
(0.934172 0.303531 -0.187592)
(0.57735 0.794654 0.187592)
(-5.55112e-017 0.982247 -0.187592)
(-0.57735 0.794654 0.187592)
(-0.934172 0.303531 -0.187592)
(-0.934172 -0.303531 0.187592)
(-0.57735 -0.794654 -0.187592)
(5.55112e-017 -0.982247 0.187592)
(0.57735 -0.794654 -0.187592)
(0.356822 -0.491123 -0.794654)
(0.57735 0.187592 -0.794654)
(-1.33234e-016 0.607062 -0.794654)
(-0.57735 0.187592 -0.794654)
(-0.356822 -0.491123 -0.794654))
faces
'((0 1 2 3 4)
(0 5 6 7 1)
(1 7 8 9 2)
(2 9 10 11 3)
(3 11 12 13 4)
(4 13 14 5 0)
(5 14 15 16 6)
(7 6 16 17 8)
(9 8 17 18 10)
(11 10 18 19 12)
(13 12 19 15 14)
(15 19 18 17 16))
edges
'(0 1 1 2 2 3 3 4 4 0 0 5 5 6 6 7
7 1 7 8 8 9 9 2 9 10 10 11 11 3 11 12
12 13 13 4 13 14 14 5 14 15 15 16 16 6 16 17
17 8 17 18 18 10 18 19 19 12 19 15))
(ent-mesh vertices faces edges)
(command "_scale" (entlast) "" '(0 0 0) radius)
(cmd-SW))
Listado 7. Comando DODECAHEDRON.

MODIFICAR la MALLA
ENTMOD recibe de una lista de entidad modificada y transforma dicha entidad segn lo especificado por
los nuevos valores de los grupos de cdigo DXF. La lista se suele modificar empleando la funcin
SUBST. Puesto que los vrtices estn asociados al mismo Cdigo de grupo DXF, necesitamos una
funcin que rena todos estos valores. Hemos incluido en el cdigo LISP de AU2012-MESH la funcin
auxiliar VALUES (Listado 8) que recibe un cdigo de grupo como el argumento KEY y una lista de
definicin de entidad como el argumento LST, devolviendo una lista con todos los valores asociados al
cdigo de grupo KEY.

13

Formar su MESH con LISP

(defun values (key lst / sublist result)


(while (setq sublist (assoc key lst))
(setq result (cons (cdr sublist) result)
lst
(cdr (member sublist lst))))
(reverse result))
Listado 8. Extraccin de valores multiples de una lista de asociacin.

ENTMOD-Z obtendr la lista de la entidad MESH, asignndola a la variable ENT-LIST y aplicando la


funcin VALUES extraer una lista con las coordenadas de todos los vrtices, asignndolos a la variable
VERTICES. La lista VERTICES es luego procesada en un bucle foreach, extrayendo los valores de X e Y
de cada vrtice y calculando la nueva coordenada Z, aplicando la funcin EQUATION recibida como
argumento a los valores X e Y del vrtice. Una vez calculado el valor de z la lista de coordenadas XYZ se
aade a la lista VERTICES-MOD utilizando la funcin CONS. Al concluir el bucle foreach, la lista
VERTICES-MOD se invierte para recuperar el orden original de los vrtices. La lista de definicin de la
entidad ser modificada en sucesivas llamadas a ENTMOD. Esto se hace en un bucle WHILE que
recorre en paralelo la lista VERTICES original y la lista de vrtices modificados VERTICES-MOD. Al
concluir el bucle todos los vrtices en la lista de definicin de entidad asignado a la variable ENT-LIST
han sido modificados.
Llamar a ENTMOD con ENT-LIST como argumento aplicar estas modificaciones a la malla original.
AU-2012-MESH incluye diez funciones que pueden ser utilizados para calcular un valor como funcin de
dos variables numricas. Al pasar una de estas funciones a ENTMOD-Z el nombre de la funcin debe ser
precedido por el smbolo apstrofe.
(defun entmod-Z
(ename equation / ent-list vertices x y z vertices-mod)
(setq ent-list (entget ename)
vertices (values 10 ent-list))
(foreach vertex vertices
(setq x
(nth 0 vertex)
y
(nth 1 vertex)
z
(apply equation (list x y))
vertices-mod (cons (list x y z) vertices-mod)))
(setq vertices-mod (reverse vertices-mod))
(setq i 0)
(while (< i (length vertices))
(setq ent-list (subst (cons 10 (nth i vertices-mod))
(cons 10 (nth i vertices))
ent-list)
i
(1+ i)))
(entmod ent-list))
Listado 9. Modificacin de la coordenada Z de los vrtices con entmod

El comando SHAPE-M
Hemos estudiado cmo se puede modificar el valor Z como una funcin de los valores X e Y. Pero
debamos ser capaces tambin de hacerlo tambin para los valores de X o de Y. De esta manera
tendramos un comando realmente til para dar forma a nuestras mallas. La definicin de este comando,
el comando SHAPE-M se muestra en el Listado 11.
El comando SHAPE-M incluye una interfaz de usuario en la lnea de comandos que solicitar la
informacin necesaria. Una vez que se suministre esta informacin, se llama a la funcin ENTMOD-XYZ
que es una variacin de la funcin ENTMOD-Z explicada en el Mdulo 6.
14

Formar su MESH con LISP

SHAPE-M empieza por solicitar la seleccin de la entidad MESH a la que queremos dar forma. A
continuacin se solicitar la direccin de la transformacin, ofreciendo X, Y o Z como opciones. Una vez
que hemos seleccionado la direccin de la transformacin, se solicitar el nombre de la funcin a utilizar
para el clculo. Debe ser una funcin que haya sido ya cargada como las llamadas S01 a S10 que se
incluyen en el archivo de cdigo fuente AU2012-MESH contenido en el dataset.
Por ltimo, se pedir el intervalo de la transformacin (shaping offset). Esta es la distancia objetivo entre
los valores mximo y mnimo calculados. Este valor se utiliza para el escalado de la transformacin en la
direccin seleccionada.

(defun C:SHAPE-M (/ ent axis equation offset)


(command "_undo" "_begin")
(prompt "\nSelect MESH to shape: ")
(while (not (setq ent (ssget "_:S" '((0 . "MESH")))))
(prompt "\nSelect MESH to shape: "))
(initget (+ 2 4) "X Y Z")
(setq axis
(getkword "\nSpecify shaping axis [X/Y/Z]<Z>"))
(cond ((= axis "X") (setq axis 0))
((= axis "Y") (setq axis 1))
(t (setq axis 2)))
(setq ent (ssname ent 0))
(initget 1)
(setq equation
(getstring
"\nSpecify shaping equation function: "))
(cond
((car (atoms-family 0 (list equation)))
(initget (+ 1 2 4))
(setq offset (getdist "\nShaping offset: "))
(entmod-xyz ent (read equation) offset axis))
(t
(prompt
(strcat
"\nFunction "
equation
" has not been defined in the current context."))))
(command "_undo" "_end")
(princ))
Listing 11. Mesh shaping program.

La funcin ENTMOD-XYZ
La funcin ENTMOD-XYZ ejecuta la transformacin de las coordenadas de los vrtices. Se recibirn los
cuatro valores especificados por el usuario como argumentos. El nombre de la funcin de clculo (en el
argumento EQUATION) se introduce como una cadena, por lo que debe ser transformado en un smbolo
aplicando la funcin READ.
El argumento AXIS define la direccin de la transformacin. De acuerdo a su valor, las variables I y J se
establecen para las otras dos coordenadas:

15

Formar su MESH con LISP

(cond ((= axis 0) (setq i 1 j 2))


((= axis 1) (setq i 0 j 2))
((= axis 2) (setq i 0 j 1)))

y se ordenan las listas de coordenadas XYZ.


(cond ((= axis 0) (setq vertices-mod (cons (list v-mod v-i v-j) vertices-mod)))
((= axis 1) (setq vertices-mod (cons (list v-i v-mod v-j) vertices-mod)))
((= axis 2) (setq vertices-mod (cons (list v-i v-j v-mod) vertices-mod))))

El argumento OFFSET se utiliza para calcular un factor de escala que se aplica a los valores de las
coordenadas calculadas. Para calcular este factor de escala se calculan en una expresin MAPCAR
todos los valores, restando el valor mnimo del mximo y se divide el valor del argumento OFFSET por
esta altura asignando el valor resultante a la variable SCALE-F. El valor calculado para cada vrtice se
multiplica despus por este factor de escala.
(setq lst-mod
(mapcar
'(lambda (vert) (apply equation (list (nth i vert) (nth j vert))))
vertices)
height (- (apply 'max lst-mod) (apply 'min lst-mod))
scale-f (/ offset height))

Por ltimo, la lista de definicin de la entidad MESH se modificar en un bucle WHILE tal como lo
hicimos en ENTMOD-Z utilizando la lista transformada para modificar la entidad pasndola a ENTMOD.
(setq k 0)
(while (< k (length vertices))
(setq ent-list
(subst (cons 10 (nth k vertices-mod)) (cons 10 (nth k vertices)) ent-list)
k
(1+ k)))
(entmod ent-list)

La funcin concluye con una llamada a la funcin ENTUPD que actualiza la entidad transformada por lo
que las modificaciones se muestran inmediatamente.

16

Formar su MESH con LISP

(defun entmod-XYZ

(ename equation offset axis / ent-list vertices i j k lst-mod


height scale-f v-i v-j v-mod vertices-mod)
(entget ename)
(values 10 ent-list))
0) (setq i 1 j 2))
1) (setq i 0 j 2))
2) (setq i 0 j 1)))

(setq ent-list
vertices
(cond ((= axis
((= axis
((= axis
(setq lst-mod
(mapcar
'(lambda (vert) (apply equation (list (nth i vert) (nth j vert))))
vertices)
height (- (apply 'max lst-mod) (apply 'min lst-mod))
scale-f (/ offset height))
(foreach vertex vertices
(setq v-i
(nth i vertex)
v-j
(nth j vertex)
v-mod (+ (nth axis vertex) (* scale-f (apply equation (list v-i v-j)))))
(cond ((= axis 0) (setq vertices-mod (cons (list v-mod v-i v-j) vertices-mod)))
((= axis 1) (setq vertices-mod (cons (list v-i v-mod v-j) vertices-mod)))
((= axis 2) (setq vertices-mod (cons (list v-i v-j v-mod) vertices-mod)))))
(setq vertices-mod (reverse vertices-mod))
(setq k 0)
(while (< k (length vertices))
(setq ent-list
(subst (cons 10 (nth k vertices-mod)) (cons 10 (nth k vertices)) ent-list)
k
(1+ k)))
(entmod ent-list)
(entupd ename))
Listado 12. Funcin universal para modificar vrtices.

Ejemplos de Ecuaciones de Superficie


Hemos incluido en AU2012-MESH diez funciones que calculan un valor en funcin de dos argumentos
que he llamado X e Y, pero que, obviamente, pueden ser cualesquiera valores numricos. Se nombran
como S01 a S10. Los modelos que se muestran en el vdeo del Mdulo 7 estn hechos utilizando una
malla cuadrada de 5 unidades de dibujo con su centro en el origen del sistema de coordenadas
universal. Esta malla tiene 400 caras en 20 columnas y 20 filas. El valor de intervalo u OFFSET utilizado
ha sido de 3 unidades.
(defun s01 (x y) (* x y))
(defun s02 (x y /)
(sqrt (abs (* x y))))
(defun s03 (x y)
(+ (expt x 2) (expt y 2)))
(defun s04 (x y) ;Hyperbolic paraboloid
(- (expt x 2) (expt y 2)))
(defun s05 (x y /) ;Revolution paraboloid
(- (+ (expt x 2)
(expt y 2))))

17

Formar su MESH con LISP

(defun s06 (x y)
(- (+ (expt x 2) (expt y 2) (expt y 3)) (expt x 3)))
(defun s07 (x y /)
(exp (- (+ (expt x 2) (expt y 2)))))
(defun s08 (x y /)
(/ (sin (* pi x y)) (+ 0.5 (expt x 2) (exp 2))))
(defun s09 (x y /)
(cos (* x y)))
(defun s10 (x y /)
(sin (+ (expt x 2) (expt y 2))))

Resumen.
El cdigo que he utilizado en esta clase se ha simplificado con el fin de aclarar los conceptos esenciales.
Esta simplificacin ha supuesto la eliminacin del control de errores que sera necesario para
aplicaciones reales. Tambin hemos recurrido a utilizar los comandos de AutoCAD donde en nuestro
estilo de programacin usual hubiramos utilizando ENTMAKE o funciones ActiveX. Estos aspectos ms
sutiles de AutoLISP / Visual LISP se tratan en detalle en mi libro Experto AutoCAD con Visual LISP, del
que el contenido de esta clase se ha extrado.
Espero que las posibilidades que conllevan las nuevas prestaciones 3D de AutoCAD se ver en una
nueva luz al comprender cmo ellas tambin pueden ser objeto de la personalizacin a travs de la
programacin.
Me complacera poder servir de ayuda en estas tareas. Para ello ofrezco mi pgina web,
www.togores.net.

Agradecimientos
Me gustara reconocer el apoyo recibido de los Servicios de Asistencia para Desarrolladores del
Autodesk Development Network por sus respuestas a mis muchas preguntas sobre las nuevas entidades
de MALLA y SUPRERFICIE. A esto debo aadir la contribucin de los participantes a los muchos foros
de AutoLISP en la Internet, en particular el de Visual LISP, AutoLISP and General Customization.
Muchas de las ideas expuestas han sido ensayadas en ejercicios propuestos durante mis 18 aos como
profesor en el Departamento de Ingeniera Geogrfica y Tcnicas de Expresin Grfica en la Universidad
de Cantabria (Espaa). Quiero reconocer la contribucin de mis colegas y en particular del profesor
Csar Otero, director de mi tesis doctoral sobre Mtodos de Geometra Computacional Aplicados al
Diseo de Estructuras Espaciales.

18

Potrebbero piacerti anche