Beruflich Dokumente
Kultur Dokumente
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:
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
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.
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:
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.
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
VSEDGEJITTER
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
0: Ninguna / 1: Isolneas /
2: Aristas
VSEDGESMOOTH
Entre 0 y 180.
VSFACECOLORMODE
0: Normal / 1: Monocromo / 2:
Matizado /
3: Reducir saturacin
VSFACEHIGHLIGHT
Controla los
materiales.
VSFACEOPACITY
VSFACESTYLE
0: No / 1: Real / 2: Gooch
VSHIDEPRECISION
0: Simple / 1: Doble
VSINTERSECTIONCOLOR
VSINTERSECTIONEDGES
0: Desactivada / 1: Activada
VSINTERSECTIONLTYPE
Entre 0 y 11.
VSISOONTOP
Muestra isolneas
sombreados.
0: Desactivada / 1: Activada
reflejos
en
sobre
caras
los
sin
objetos
VSLIGHTINGQUALITY
Calidad de iluminacin.
0: Facetas / 1: Suave /
2: Ms suave
VSMATERIALMODE
Visualizacin de materiales.
0: Ninguno / 1: Materiales /
2: Con texturas
VSMONOCOLOR
Color RGB.
VSOBSCUREDCOLOR
VSOCCLUDEDEDGES
0: Desactivada / 1: Activada
VSOCCLUDEDLTYPE
Entre 0 y 11.
VSSHADOWS
VSSILHEDGES
0: Desactivada / 1: Activada
VSSILHWIDTH
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).
(defun var-vis
()
(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.
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.
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.
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0
0
1
2
3
(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)
Subdivisiones:
DIVMESHBOXHEIGHT
DIVMESHBOXLENGTH
DIVMESHBOXWIDTH
DIVMESHCONEAXIS
DIVMESHCONEBASE
DIVMESHCONEHEIGHT
DIVMESHCYLAXIS
DIVMESHCYLBASE
DIVMESHCYLHEIGHT
DIVMESHPYRBASE
DIVMESHPYRHEIGHT
DIVMESHPYRLENGTH
Esfera
_Sphere
DIVMESHSPHEREAXIS
DIVMESHSPHEREHEIGHT
Toroide
_Torus
DIVMESHTORUSPATH
DIVMESHTORUSSECTION
DIVMESHWEDGEBASE
DIVMESHWEDGEHEIGHT
DIVMESHWEDGELENGTH
DIVMESHWEDGESLOPE
DIVMESHWEDGEWIDTH
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.
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
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.
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.
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
(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
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
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
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.
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
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
(defun entmod-XYZ
(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.
17
(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