Documente Academic
Documente Profesional
Documente Cultură
Fundamentos
de
Scripts de SketchUp
Temas del Capitulo
las 3 estructuras de datos fundamentales de SketchUp.
Las clases Edge y Face
Extrusion de formas en 3D con los metodos pushpull y followme
En este captulo, vamos a dejar de lado la teora de la programacin y llegar a la parte divertida: la
creacin de formas SketchUp desde el cdigo. Esta presentacin comienza con las lneas de una sola
dimensin y las superficies de dos dimensiones. Al final del captulo, nos acercaremos a como formar
sus propias figuras en tres dimensiones, utilizando los mismos mecanismos Push / Pull y Follow Me
disponibles en SketchUp.
En el camino, en este captulo se explica cmo crear archivos de script de Ruby y ejecutarlos en
SketchUp. Hasta ahora, hemos introducido (con suerte) comandos en la consola Ruby de SketchUp y
visto los resultados. Pero con las secuencias de comandos (script), puede almacenar sus archivos de
comandos en lugar de tener que volver a escribirlos cada vez. Adems, como se hace evidente en los
prximos captulos, se puede lograr mucho ms con las secuencias de comandos que con comandos
individuales.
Este captulo se refiere principalmente a los objetos Edge y Face de SketchUp - una vez que comprenda
cmo funcionan, puede construir casi cualquier cosa. Pero antes de que puedas insertar estos objetos en
un diseo, necesita familiarizarse con otras tres estructuras de datos:
- el mdulo Sketchup.
- la clase Model.
- la clase Entities
El Modulo Sketchup
1
A diferencia de las clases y objetos que se describen en el captulo anterior, la primera estructura de
datos que encontramos en Sketchup, es un mdulo. El captulo 8 describe los mdulos con gran detalle,
pero por ahora, todo lo que necesita saber es que un mdulo es una coleccin de mtodos. La mayora de
los scripts de Ruby en este libro comienzan llamando a uno de los mtodos de este mdulo.
Los mtodos del mdulo Sketchup acceden a las propiedades relacionadas con la aplicacin SketchUp
en su conjunto. Para ver cmo funciona esto, abra la consola de Ruby (Ventana> Consola Ruby de
SketchUp en el men principal) y ejecute el siguiente comando:
Sketchup.version ->
6.4.265
es
es
Esto recupera el objeto Model actual y lo almacena en una variable denominada mod. El objeto Model
es crucial en todas las rutinas no triviales de SketchUp, y en la siguiente discusin se explica por qu.
El Objeto Model
As como el mdulo de Sketchup representa toda la aplicacin SketchUp, el objeto Model representa un
nico archivo de SketchUp (*. SKP), o ms exactamente, la informacin de diseo contenidos en el
fichero. Cuando se abre un nuevo archivo en SketchUp, las propiedades del mdulo de Sketchup siguen
siendo las mismas pero los datos en el objeto Model activo pasan a ser completamente diferentes.
Los mtodos de la clase Model proporcionan informacin sobre el diseo actual. Por ejemplo, el
metodo modified? identifica si el diseo actual se ha cambiado desde la ltima vez que se guard. Los
comandos siguientes muestran cmo se usa:
mod = Sketchup.active_model
mod.modified?> false (si no ha cambiado)
Si dibuja una linea con la herramienta de dibujo de Sketchup y vuelve a escribir:
Modificando los objetos de estos seis contenedores, puede configurar casi todos los aspectos de un
diseo de SketchUp. Para acceder a ellos, debe llamar a los mtodos apropiados de Model. Estos son:
1. entities
- devuelve un objeto Entities que contiene las formas en el diseo actual (introducido en
este captulo y discutidos a lo largo del libro)
2. layers - devuelve un objeto Layers que contiene las capas de SketchUp en el diseo actual (captulo
7)
3. definitions - devuelve un objeto ComponentDefinitions con las definiciones de componentes en
el diseo actual (captulo 7)
4. materials - devuelve un objeto Materials que gestiona los materiales utilizados en el diseo actual
(captulo 6)
5. options - devuelve un OptionManager que proporciona acceso a mltiples OptionsProviders
(captulo 9)
6. pages - devuelve un objeto Pages que contiene las pginas del diseo actual (captulo 10)
La mayora de estos mtodos tienen nombres en plural, como entities, layers, definitions, y
materials. Devuelven objetos cuyas clases tienen nombres similares: Entities, Layers, Definitions,
y Materials. Cada objeto plural funciona esencialmente como un array. Como puede imaginar, un
elemento del array Entities es una Entity. Del mismo modo, la matriz Layers contiene objetos
Layer, la matriz Materials contiene objetos Material, y as sucesivamente.
3
Nota: Esto puede parecer confuso, as que preste mucha atencin. Un objeto Materials contiene varios
objetos Material. Es decir, un objeto Materials contiene objetos . Si la "s" est en el cdigo fuente, se
est haciendo referencia contenedor. Sin la "s" se hace referencia a los objetos individuales.
Por el momento, todo lo que queremos hacer es dibujar formas bsicas de SketchUp. Para empezar, el
primer paso es llamar al mtodo entities de la clase Model y acceder al objeto Entities del diseo
actual. El cdigo siguiente muestra cmo esta se realiza en el cdigo:
mod = Sketchup.active_model
ents = mod.entities
Una gran parte de este libro se refiere a la aadir modificar de objetos dentro del contenedor de
Entities del diseo actual. Esto se discute a continuacin.
El Objeto Entities
Todos los objetos geomtricos en un diseo de SketchUp est representado por una Entity o una
subclase de ellas, incluyendo lines (lneas), faces (caras), images (imgenes), text (textos), groups (grupos)
y components (componentes). Para administrar o modificar objetos Entity en un diseo, necesita
acceder al contenedor primario Entities del diseo. Este contenedor tiene tres propsitos principales:
1. Aade nuevos objetos Entity al actual diseo SketchUp
2. Mueve, escala, gira, y borra objetos Entity en el diseo
3. Almacena objetos Entity en una matriz a la que se puede acceder por el ndice
El primer papel es el ms importante. La clase Entities contiene muchos mtodos que aaden nuevos
objetos Entity al diseo actual. Los mtodos ms simples de adicin (add_X) son los siguientes:
add_line - crea un objeto Edge desde dos puntos
add_edges - forma una matriz de objetos Edge desde una serie de puntos
add_circle - forma una matriz de objetos Edge que se combinan para formar un crculo
add_ngon - forma una matriz de objetos Edge que se combinan para formar un polgono
add_face - crea un objeto Face desde edges (aristas) o points (puntos)
add_text - aade una etiqueta en el diseo en un punto dado
Cuando se trata de formas, el objeto Edge y Face son los ms importantes de los objetos Entity. Cada
vez que aada una al contenedor Entities, aparecera la forma correspondiente en la ventana de
SketchUp. Entonces, al guardar el diseo, las Edges (aristas) y las Faces (caras) se incluirn en el objeto
Model almacenado. Para entender completamente las clases Edges (aristas) y las Faces (caras) , necesita
estar familiarizado con sus superclases, Entity y Drawingelement.
La subclase primaria de Entity es Drawingelement, que es la superclase de muchas de las clases que
vamos a estudia en este captulo y en el futuro. Antes de continuar, vamos a echar un breve vistazo a
estos dos superclases importante.
La clase Entity
En la figura 3.2, la clase Entity est en la cima de la jerarqua. Los mtodos de esta clase estn
disponibles para cada subclase debajo de ella. Muchos de estos mtodos proporcionan informacin
bsica acerca de Entity, e incluyen los siguientes:
entityID - devuelve un identificador nico para la Entity
typename - Identifica el tipo geomtrico de la Entity (Edge, Face, etc)
valid?/deleted? - Identifica si podr seguir accediendo a la Entity
model - devuelve el objeto Model del diseo
Los siguientes comandos muestran cmo se utilizan estos mtodos en el cdigo:
test_line = Sketchup.active_model.entities.add_line [0,0,0], [1,1,1]
#<Sketchup::Edge:0x767be50>
test_line.typename
Edge
test_line.entityID
1895
Adems de estos mtodos, cada Entity puede acceder a informacin especificada por el usuario
mediante la invocacin del mtodo attribute_dictionaries. La Entity puede recuperar, modificar
o eliminar estos atributos. El captulo 9 describe el uso y explotacin de la clase
AttributeDictionaries en detalle.
Por ltimo, la entidad puede tener uno o ms objetos EntityObserver asociados a ella. Los
observadores supervisarn el estado de la Entity y responden a los cambios. El captulo 9 explica
cmo trabajan los observadores y la manera de crearlos en el cdigo.
La clase Drawingelement
La clase Drawingelement es la superclase de las clases Edge, Face, Group, Image, Text,
ComponentDefinition, y ComponentInstance. Muchos de los mtodos de esta clase controlan cmo
aparecera el elemento en SketchUp, y establecer las propiedades tales como shadowing (sombras),
composicin del material, y si el elemento est hidden (oculto) o visible (visible). Estas son las mismas
propiedades definidas para la entidad en el dilogo Informacin dela entidad de SketchUp, que se
muestra en la Figura 3.3.
5
La clase Drawingelement proporciona un mtodo llamado bounds (lmites) que devuelve un objeto
BoundingBox. Este representa el menor volumen rectangular que puede contener el Drawingelement
manteniendo sus lados alineados con los ejes x, y, z. Los comandos siguientes crean un BoundingBox
de una lnea trazada de [0, 0, 0] a [2, 2, 5].
new_line = Sketchup.active_model.entities.add_line [0,0,0], [2,2,5]
#<Sketchup::Edge:0x767ab18>
box = new_line.bounds
#<Geom::BoundingBox:0x76784d8>
Una vez que obtiene el BoundingBox, sus mtodos proporcionan informacin acerca de su dimensin,
diagonales, esquinas, y los puntos mximo / mnimo. Los siguientes comandos muestran la ubicacin
del centro de un BoundingBox y la longitud de su diagonal (en pulgadas).
box.center
Point3d(1, 1, 2.5)
box.diagonal
5.74456264653803
Los objetos BoundingBox son tiles cuando se necesita determinar si el usuario hace clic en una forma.
Una vez que haya adquirido el BoundingBox de una forma, usted puede comparar sus dimensiones con
la posicin del clic del ratn del usuario.
una lnea suave (smooth): una lnea que combina suaves superficies adyacentes en una sola (por lo
general curva) de superficie, mientras que una lnea oculta no altera las superficies adyacentes.
En la segunda categora, el mtodo all_connected devuelve una matriz con todos los objetos Entity
conectados a Edge. Del mismo modo, el mtodo faces devuelve una matriz que contiene los objetos
Face conectados a Edge.
En SketchUp, los extremos de Edge estn representados por objetos Vertex. La clase Edge contiene
una serie de mtodos que interactan con ellos:
vertices - devuelve una matriz con los dos objetos Vertex del Edge
start/end - devuelve los objetos Vertex de inicio y final del Edge
other_vertex - dado uno de los objetos Vertex del Edge, este mtodo devuelve el otro
used_by? - Identifica si un Vertex est conectado al Edge
Hay dos mtodos de la clase Edge que no caen en las dos categoras anteriores: length (longitud) y
split (dividir). El primero devuelve la longitud del segmento que corresponde al Edge. El segundo
acepta un punto de la lnea y crea un segundo objeto Edge. Despus de llamar a split, el primer objeto
Edge contina slo hasta el punto dado y el segundo objeto Edge contina desde el punto hasta el final
de la lnea original. Los comandos siguientes muestran cmo se invocan estos mtodos en la prctica:
line = Sketchup.active_model.entities.add_line [0, 0, 0], [6, 3, 0]
line.length
6.70820393249937
new_line = line.split [4, 2, 0]
line.length
4.47213595499958
line.start.position
Point3d(0, 0, 0)
line.end.position
Point3d(4, 2, 0)
new_line.length
2.23606797749979
new_line.start.position
Point3d(4, 2, 0)
new_line.end.position
Point3d(6, 3, 0)
La figura 3.4 muestra grficamente los resultados. El objeto Edge original se extiende desde [0, 0, 0] a
[6, 3, 0]. Despus ejecutar split, el objeto Edge original se extiende desde [0, 0, 0] a [4, 2, 0] y un
nuevo objeto Edge se extiende desde [4, 2, 0] a [6, 3, 0].
Ruby Scripts
En la programacin general, un script es un archivo que contiene comandos que controlan un
programa en ejecucin. Los scripts UNIX dirigen comandos directamente al programa shell, como un
Bash. En Windows, scripts escritos en VBScript interactuar con el sistema operativo y ejecutar
programas como utilidades DOS .
Todas las secuencias de comandos descritos en este libro estn dirigidos a SketchUp. Usted puede
escribir un script de SketchUp en cualquier editor de texto que usted elija, pero tenga en cuenta tres
puntos:
1. Los comandos en un script de SketchUp tienen que estar en lenguaje de programacin Ruby.
2. Los archivos script sin encriptar deben tener extension .rb, los cifrados debe terminar con .RBS.
3. Para ejecutar un script, se debe cargar en SketchUp.
Este ltimo punto es importante. Uno de los comandos a conocer ms tiles de Ruby es load. Cuando
se ejecuta en la consola, load le dice a SketchUp que lea una secuencia de comandos y ejecute cada
uno de sus comandos en secuencia. Listado de 3,1 nos da nuestro primer ejemplo de guin.
Listado 3.1: star.rb
# Acceso al actual objeto Entities
ents = Sketchup.active_model.entities
=begin
Crea 5 puntos en 3 dimensiones
Cada punto es el vertex de una forma de estrella
=end
pt1 = [0, 1, 0]
pt2 = [0.588, -0.809, 0]
pt3 = [-0.951, 0.309, 0]
pt4 = [0.951, 0.309, 0]
pt5 = [-0.588, -0.809, 0]
# Dibuja 5 lineas en forma de estrella
ents.add_line pt1, pt2
ents.add_line pt2, pt3
ents.add_line pt3, pt4
ents.add_line pt4, pt5
ents.add_line pt5, pt1
Este comando le dice a SketchUp que acceda a la secuencia de comandos del archivo star.rb y
ejecute cada uno de sus comandos. Esto crea una forma de estrella en el plano xy, centrada en torno al
origen. La figura 3.5 muestra lo que parece la forma resultante.
Si no puede ver el patrn de la estrella con claridad, abra el men Cmara en SketchUp y elija Vista
estndar y superior. Entonces, siempre en el men Cmara, seleccione proyeccin paralela. Por ltimo,
haga clic en la herramienta Zoom a extensin para centrarse en el nuevo dibujo.
No es obligatorio situar sus scripts en el directorio de plugins. Para acceder a una secuencia de
comandos fuera de esta carpeta, llame a load con la ubicacin completa del directorio del script. Por
ejemplo, si ha guardado el cdigo de ejemplo en C:/ruby_scripts, puede cargar star.rb con el siguiente
comando:
load "C:/ruby_scripts/Ch3/star.rb"
El resto del cdigo de este libro se divide en dos categoras: los ejemplos de comandos y listados de
cdigo. Los ejemplos de comandos son conjuntos de comandos que demuestran los conceptos simples.
Se pueden ejecutar directamente desde la ventana de la consola de Ruby. Los listados de cdigo,
como el listado 3,1, contienen archivos de script dentro de uno de los directorios captulo. Cada archivo
de comandos se pueden ejecutar mediante la ejecucin del comando de carga en la ventana de la consola
de Ruby.
Comentarios Ruby
9
El cdigo del listado 3.1 contiene un aspecto de Ruby que no hemos visto antes: los comentarios. Un
comentario es una nota colocada dentro de la secuencia de comandos que describe lo que hace el cdigo.
Los comentarios Ruby son de dos tipos:
1. Una sola lnea de comentario - Comienza con # y contina hasta el final de la lnea
2. Comentario Multi-lnea - Comienza con =begin y sigue hasta =end
Cualquier cdigo que se coloca en un comentario no ser procesado por el intrprete de Ruby. Por lo
tanto, usted puede escribir lo que quiera en un comentario siempre y cuando no pongan fin a la
observacin antes de tiempo.
Hay tres comentarios en star.rb. El primer comentario,
# Acceso al actual objeto Entities
explica la que hacen las ltimas cinco lneas. Los comentarios frecuentes es un aspecto vital de los
profesionales de programacin, no slo para que otros puedan leer su guin, sino tambin para recordar
cmo se pretende que funcione el cdigo.
3.5 Vectores
Antes de discutir los mtodos que dibujan curvas, es necesario tener un conocimiento bsico de los
vectores. El trmino vector tiene diferentes significados dependiendo de si ests hablando de
matemticas, fsica o ingeniera. Como diseadores de SketchUp, utilizamos vectores principalmente
para identificar la direccin. Por esta razn, representamos grficamente los vectores con flechas. La
figura 3.6 representa varios vectores en un espacio tridimensional.
En el cdigo, un vector se identifica con tres valores numricos. El primero identifica la cantidad de
puntos en la direccin x, la segunda es la cantidad de los puntos en la direccin y, y el tercero, en la
direccin z. Estos valores se llaman componentes del vector. Si un vector se representa por [a, b, c], a es
la componente x, b es el componente y, y c es la componente z.
.
10
Un vector normal es un tipo especfico de vector que identifica la direccin con respecto a una cara.
Por ejemplo, si dibuja un crculo en el plano xy y quiere que quedar hacia arriba, un vector normal
aceptable es [0, 0, 1]. Aqu, slo la componente z tiene un valor distinto de cero, y este valor es positivo.
Por lo tanto, el vector es la direccin z positiva, o hacia arriba. Si el vector normal se fija en [0, 0, -1],
los puntos de crculo estaran la direccin z negativa, o hacia abajo.
Una cuestin que se plantea. No necesitamos vectores para dibujar la estrella en el listado 3.1, as
que por qu necesitamos vectores para dibujar curvas? La respuesta es que las lneas que formaron la
estrella son unidimensionales. Tienen longitud, pero no zona. Una vez que seleccione un punto de
partida y un punto final, cada lnea se identifica.
Pero si todo lo que tiene es el centro y el radio de un crculo o un arco, no pueden identificar de
modo nico a la curva. Por ejemplo, se pueden dibujar un nmero infinito de crculos con un centro
determinado y un radio distinto de cero. Esto se muestra en la Figura 3.7.
Para distinguir entre los crculos, podria identificar varios puntos del crculo. Pero es ms fcil
definir el vector normal del crculo. Si usted camina alrededor del crculo, los puntos del vector normal
estan hacia arriba. Del mismo modo, si utiliza la herramienta Push / Pull (Empujar/Tirar) de SketchUp
para crear un cilindro del crculo, esa es la direccin en la que tiraria.
Figura 3.7: Circulos concentricos con igual radio y diferentes vectores normales
Curvas
El ms simple de los mtodos de creacin de curvas es add_curve. Este acepta una sucesin de
puntos y devuelve la matriz de objetos perimetral que conecte los puntos. Por ejemplo, los comandos
siguientes producen la forma de la estrella misma que la creada en el captulo anterior.
pt1 = [0, 1, 0]
pt2 = [0.588, -0.809, 0]
pt3 = [-0.951, 0.309, 0]
pt4 = [0.951, 0.309, 0]
pt5 = [-0.588, -0.809, 0]
curve = Sketchup.active_model.entities.add_curve pt1, pt2, pt3, pt4, pt5, pt1
curve.class
Array
curve.length
5
11
Aqu, el mtodo add_curve produce una serie de cinco objetos Edge, lo que significa el resultado es
realmente una polilnea en lugar de una curva. Cuantos ms puntos designe, cuanto ms se acerque la
polilnea a una curva, mas se parecer a una curva redondeada. Por lo general, es ms fcil crear curvas
redondeadas con los mtodos add_circle o add_arc.
Cicrulos
El mtodo add_circle crea un crculo con un centro determinado, vector normal, y el radio. El
vector normal identifica la direccin hacia arriba - si alguien camina en el permetro del crculo y apunta
hacia arriba, estaran apuntando en la direccin del vector normal. A modo de ejemplo, el comando
siguiente crea un crculo con centro en [1, 2, 3], un vector normal igual a [4, 5, 6], y un radio de 7:
circle = Sketchup.active_model.entities.add_circle [1, 2, 3], [4, 5, 6], 7
circle.class
Array
circle.length
24
circle[0].class
Edge
El mtodo add_circle crea una matriz de 24 objetos Edge, lo que equivale a un segmento por cada
15 . Veinticuatro es el nmero predeterminado de segmentos en un crculo, con independencia de radio
o de orientacin. Sin embargo, puede agregar un cuarto parmetro al mtodo add_circle que
personaliza el nmero de segmentos en el crculo. Por ejemplo, el comando siguiente se crea un crculo
con 72 segmentos:
circle = Sketchup.active_model.entities.add_circle [1, 2, 3], [4, 5, 6], 7, 72
La figura 3.8 muestra cmo la apariencia de un crculo se ve afectada por el nmero de segmentos.
El crculo de 72-segmentos se aproxima ms a un crculo real que el crculo 24-segmentos o el crculo
de 12 segmentos, pero las operaciones en las aristas del crculo requiere ms tiempo.
Cuantos menos segmentos contenga su crculo, ms se parecer a un polgono. Si se especifica una cifra
de cinco segmentos, add_circle crear un pentgono. Sin embargo, es ms comn para invocar el
mtodo add_ngon para crear polgonos. Esto se discute a continuacin.
Poligonos
El mtodo add_ngon es casi exactamente igual a add_circle, y los dos mtodos producen
esencialmente las mismas formas. La nica diferencia es el nmero de segmento: con add_circle, el
nmero predeterminado de segmentos es de 24, pero si lo desea, puede establecer un nmero diferente
de segmentos. El mtodo add_ngon no tiene ningn numero de segmentos por defecto: siempre hay que
indicarr el nmero de lados de su polgono.
12
Para aclarar esto, la secuencia de comandos en el listado 3,2 produce cuatro formas: un polgono con
8 lados, un crculo con 8 lados, un polgono con 24 lados, y un crculo con 24 lados.
Listing 3.2: poly_circle.rb
ents = Sketchup.active_model.entities
normal = [0, 0, 1]
radius = 1
# Poligono con 8 lados
ents.add_ngon [0, 0, 0], normal, radius, 8
# Circul con 8 lados
ents.add_circle [3, 0, 0], normal, radius, 8
# Poligono con 24 lados
ents.add_ngon [6, 0, 0], normal, radius, 24
# Circulo con 24 lados
ents.add_circle [9, 0, 0], normal, radius
Para ejecutar este script, asegrese de que la carpeta Ch3 est en la carpeta plugins del directorio de
Sketchup. A continuacin, abra la consola de Ruby y ejecute el siguiente comando:
load "Ch3/poly_circle.rb"
Para ver las formas resultantes, abra el men cmara y elija la de proyeccin paralela. A continuacin,
vaya a Cmara> Vista Standard y seleccione Inicio. El resultado se muestra en la Figura 3.9.:
Arcos
La creacin de un arco es similar a crear un crculo, pero necesita parmetros adicionales. En primer
lugar, tiene que especificar los ngulos de inicio y final. Estos ngulos deben medirse (en radianes)
desde un eje, por lo que necesita para identificar el vector que sirve como la direccin cero radianes. La
lista completa de parmetros para add_arc son los siguientes:
center - Un punto de identificar el centro del arco circular
zero_vec - Un vector que identificar la direccin del ngulo cero
normal - Un vector perpendicular al arco circular
radius - Radio del arco circular
start_angle - A partir ngulo, medido a partir del vector zero_vec
end_angle - Acabar en ngulo, medido a partir del vector zero_vec
num_segments (Opcional) - Nmero de segmentos de lnea en el arco
El siguiente comando crea un arco con centro en [0, 0, 0] que intercepta un ngulo de 0 a 90 . El
ngulo se mide desde el eje y, por lo que el vector a 0 es [0, 1, 0]. El arco tiene un radio de 5 y se
encuentra en el plano xy, por lo que su vector normal es [0, 0, 1]. El nmero de segmentos se deja a su
valor predeterminado.
arc = Sketchup.active_model.entities.add_arc [0,0,0], [0,1,0],
[0,0,1], 5, 0, 90.degrees
arc.length
6
13
Este arco de 90 est compuesto por seis objetos, lo que significa el arco contiene un Edge por cada
15 , al igual que con el crculo. Se pueden agregar ms Edges mediante la adicin de un parmetro
opcional para el mtodo add_arc.
El apndice B presenta un mtodo para crear un arco con tres puntos haban ordenados. Esto es ms
conveniente que el mtodo add_arc, que requiere que conozca tanto el centro y el radio del crculo que
encierra el arco.
Figura 3.10 muestra el resultado como se ve en la ventana de SketchUp. A diferencia de las matrices
de Edges anteriores, toda la superficie del objeto Face esta relleno.
Sin incluir a las dimensiones, los resultados de impresin son los siguientes:
Point 0: (-0.951, 0.309, 0)
14
Point 1: (0, 1, 0)
Point 2: (0.951, 0.309, 0)
Point 3: (0.588, -0.809, 0)
Point 4: (-0.588, -0.809, 0)
Al definir los puntos para crear una cara, el orden es importante. Si cambia pt2 y pt3 en la lista de
parmetros, la forma no se parece en nada a un pentgono. Sin embargo, la orientacin de los puntos (en
sentido horario o antihorario) no es importante. Si los puntos se enumeran de pt1 a pt5 o de pt5 a pt1,
el objeto resultante ser el mismo.
Para aclarar esto, mire la salida de pentagon.rb. Puede ver que el objeto cara almacena sus puntos en
un orden diferente al que ha listado. En este caso, el mtodo add_face ordena los puntos en una
orientacin hacia la derecha, y el vector normal siempre apunta hacia abajo. Volviendo a la cara
pentagonal, esto se puede demostrar con el siguiente cdigo:
pent.normal
(0, 0, -1)
pent.reverse!
pent.normal
(0, 0, 1)
El vector normal de una cara determina su direccin de extrusin. Por ejemplo, si el vector normal
en la direccin-z, el mtodo pushpull tirara de ella hacia abajo. Muchos diseadores esperan que las
formas tridimensionales crezcan hacia arriba, de manera que deber invertir el vector normal invocando
al mtodo reverse!.
15
face.classify_point [1, 1, 0]
4
face.classify_point [1, 2, 0]
8
face.classify_point [1, 1, 1]
16
El mtodo outer_loop de la clase cara devuelve un objeto Loop que contiene entidades Faces. El
mtodo loops devuelve una matriz de Loops adyacente a la cara. Los objetos Loop son tiles en la
topologa, pero no ser explorado en este libro.
Vale la pena examinar de cerca el ltimo comando. La segunda cara de la esquina no est
explcitamente creada con cdigo. En vez de ello, se construye de forma automtica cuando la nueva
Edge se dibuja en la esquina de la cara. Una vez dibujada, esta Edge est conectada a dos caras: una
que representa la cara principal y otra que representa la cara de la esquina. Cada Edge puede tener
16
acceso a una matriz de objetos de caras adyacentes (con el metodo faces), y la nueva cara tiene el
ndice 1. Por lo tanto, el comando:
cut.faces[1].pushpull -5
El lado izquierdo de la figura 3.11 muestra la cara original y el camino de extrusin rectangular. El lado
derecho muestra la extrusin tridimensional creada por followme.
Figura 3.11: Extrusion Creada por followme.rb (las lineas punteadas se han aadido para mejor claridad)
Echemos un vistazo a otro uso de followme. El cdigo del listado 3.6 crea una figura torneada girando
una cara elrededor de un eje. Aqu, la cara se construye a partir de la matriz de puntos devueltos por el
mtodo add_curve.
17
1.238382],
1.188846],
1.145139],
1.118914],
0.996269],
0.871026],
0.711683],
0.492371],
0.26629 ],
0.088283],
0.001531],
1.244209]
2
El lado izquierdo de la figura 3.12 muestra la Cara de media botella en dos dimensiones y su trayectoria
circular. El lado derecho muestra la figura torneadas producidas por followme.
Al igual que pushpull, el mtodo followme puede eliminar partes de una figura tridimensional.
Para ello, forme una cara en la figura mediante la creacin de uno o ms objetos Edge. A
continuacin, constituyen el camino por elegir qu aristas de la figura deben ser cortadas. Invocar a
followme con la ruta para retirar la porcin limitada.
El cdigo del listado 3.7 muestra cmo funciona esto. Se crea una caja en tres dimensiones y llama a
followme para cortar los bordes superiores de la caja.
Listado 3.7: chamfer.rb
# Crea la caja
ents = Sketchup.active_model.entities
main_face = ents.add_face [0,0,0], [5,0,0], [5,8,0], [0,8,0]
main_face.reverse!
main_face.pushpull 6, true
# Dibuja una linea en una esquina
cut = ents.add_line [5, 7, 6], [5, 8, 5]
# Crea el chaflan
cut.faces[0].followme main_face.edges
En el lado izquierdo de la figura 3.13 se muestra la caja con el borde dibujado en la esquina superior. El
lado derecho muestra la caja con el chafln despues de que se invoque a followme.
18
La trayectoria de corte se obtiene mediante una llamada al mtodo edges de la cara superior de la
caja. Este devuelve la matriz de objetos Edge perimetrales conectados y que delimitan la superficie
superior. Cuando se necesita aplicar followme a cada arista de una superficie, es ms fcil llamar al
mtodo edges que localizar individualmente los objetos Edge.
En el listado 3.7, el mtodo pushpull esta seguido por un segundo parmetro establecido a true.
Normalmente pushpull elimina la cara utilizada para la extrusin. Sin embargo con este argumento
opcional la main_face permanecer accesible tras el pushpull . Recuerde esto si recibe un error de tipo
reference to delete Face en su script. (En este ejemplo anterior habria dado igual si no se pone true y
se elimina)
El cdigo del listado 3.8 crea la Face circular y la trayectoria circular, y despus invoca followme para
extruir la esfera. Tenga en cuenta que ambos crculos tienen el mismo centro pero sus vectores normales
son perpendiculares entre s.
Listado 3.8: sphere.rb
# Acceso al objeto Entities
ents = Sketchup.active_model.entities
# Crea el circulo inicial
center = [0, 0, 0]
radius = 5
circle = ents.add_circle center, [0, 0, 1], radius
circle_face = ents.add_face circle
# Crea la trayectoria circular
path = ents.add_circle center, [0, 1, 0], radius + 1
# Crea la esfera
circle_face.followme path
# Elimina la trayectoria
ents.erase_entities path
La ltima lnea de la secuencia de comandos elimina las Edges que forman la trayectoria de la extrusin.
Esta es una consideracin importante cuando se utiliza el mtodo followme.
19
3.8 Conclusion
En este captulo se ha presentado una gran cantidad de informacin, desde las estructuras bsicas de
datos de SketchUp a los objetos que representan las formas en el diseo. La primera parte de este
captulo habla del mdulo de Sketchup, cuyos mtodos proporcionan informacin sobre la aplicacin
SketchUp. Por el contrario, la clase Model slo representa el diseo actual que puede ser guardado en
un archivo *. skp. Un objeto Model sirve como un contenedor de contenedores: contiene objetos como
Entities, Materials, Layers, Tools, etc.
El contenedor Entities es particularmente importante porque almacena todos los objetos grficos del
diseo actual. Estos objetos grficos se denominan objetos Entity, y la clase Entity tiene un nmero
importante de las subclases. Una subclase, Drawingelement, sirve como una superclase de todas las
formas de la API de SketchUp.
La ltima parte de este captulo discute las formas actuales que componen los modelos de SketchUp:
Edges, arrays de Edge, Faces y figuras tridimensionales. Las clases y sus mtodos son fciles de
entender, pero puede ser difcil su coordinacin para formar un diseo. Por lo tanto, te recomiendo que
practiques la creacin de estos objetos en secuencias de comandos: crear Faces desde Edges y usar
pushpull y followme para extruir las Faces y convertirlas en figuras tridimensionales.
20