You are on page 1of 224

!

"
#
%
&
!"

NDICE
1 INTRODUCCIN.....................................................................................................................................9
1.1 Presentacin de la problemtica ........................................................................................................9
1.2 Objetivo: CAD Mecnico ..................................................................................................................9
1.3 Trabajo previo y temporalizacin del proyecto ...............................................................................10
1.4 Metodologa utilizada: UML ...........................................................................................................13
1.4.1 Introduccin al UML ...............................................................................................................13
1.4.2 Porqu utilizar UML?.............................................................................................................15
1.5 Estructura del documento ................................................................................................................15
2 PIEZAS Y CONECTORES LEGO .........................................................................................................19
2.1 Piezas Lego......................................................................................................................................19
2.1.1 Qu son?.................................................................................................................................19
2.1.2 Grandes grupos de piezas Lego ...............................................................................................19
2.2 Conectores Lego ..............................................................................................................................20
2.2.1 Qu son?.................................................................................................................................20
2.2.2 Clasificacin de conectores Lego.............................................................................................20
3 LDRAW ..................................................................................................................................................29
3.1 Qu es?...........................................................................................................................................29
3.2 Historia ............................................................................................................................................29
3.3 Formato de los ficheros del paquete LDraw ....................................................................................32
3.4 CADs que utilizan el paquete Ldraw ...............................................................................................40
3.4.1 MLCAD ...................................................................................................................................40
3.4.2 LeoCAD...................................................................................................................................42
3.4.3 Limitaciones de los CADs .......................................................................................................44
3.4.4 Eleccin del LeoCAD ..............................................................................................................44
4 ARQUITECTURA DEL LEOCAD ........................................................................................................49
4.1 Diagrama de clases ..........................................................................................................................49
4.2 Libreras utilizadas...........................................................................................................................57
4.2.1 Librera 3dsftk..........................................................................................................................57
4.2.2 Librera jpeglib.........................................................................................................................58
4.2.3 Librera libpng .........................................................................................................................58
4.2.4 Librera zlib..............................................................................................................................58
5 DISEO ..................................................................................................................................................61
5.1 Conceptos previos............................................................................................................................61
5.1.1 Definiciones tiles ...................................................................................................................61
5.1.2 Sistemas de referencia del conector, de la pieza y del mundo .................................................62
5.1.3 Sistema de referencia de los conectores...................................................................................64
5.1.4 Hermandad entre conectores ....................................................................................................65
5.2 Diagrama de clases ..........................................................................................................................66
5.2.1 Clase pieza ...............................................................................................................................66
5.2.2 Jerarqua de clases del conector ...............................................................................................68
5.2.3 Clase Simbolo ..........................................................................................................................73
5.3 Assembling ......................................................................................................................................75
5.3.1 Qu es? ...................................................................................................................................75
5.3.2 Pasos para realizar el assembling.............................................................................................75
5.3.3 Seleccin de conectores a ensamblar .......................................................................................75
5.3.4 Verificacin de compatibilidad entre conectores .....................................................................76
5.3.5 Evitar lazos y cadenas ..............................................................................................................78
5.3.6 Realizacin del assembling......................................................................................................82
5.3.7 Propagacin del assembling.....................................................................................................94
5.4 Transformaciones a realizar sobre piezas ensambladas ................................................................. 106
5.5 Comunicacin de transformaciones sobre piezas ensambladas ..................................................... 107
5.5.1 Comunicacin de la rotacin.................................................................................................. 107

5.5.2 Comunicacin de la traslacin ............................................................................................... 115


5.5.3 Comunicacin del deslizamiento ........................................................................................... 125
5.6 Aplicacin de transformaciones sobre piezas ensambladas........................................................... 130
5.7 Otros .............................................................................................................................................. 133
5.7.1 Desconexin de conectores y piezas ensambladas................................................................. 133
5.7.2 Eliminacin de piezas en un modelo ensamblado.................................................................. 134
5.7.3 Cargar un modelo con y sin piezas LCI ................................................................................. 135
5.8 Parser ............................................................................................................................................. 135
6 IMPLEMENTACIN ........................................................................................................................... 141
6.1 Assembling .................................................................................................................................... 141
6.1.1 Pasos para realizar el assembling........................................................................................... 141
6.1.2 Seleccin de conectores a ensamblar. .................................................................................... 141
6.1.3 Verificacin de compatibilidad entre conectores ................................................................... 142
6.1.4 Realizacin del assembling. ................................................................................................... 144
6.1.5 Propagacin del assembling................................................................................................... 149
6.2 Comunicacin de transformaciones sobre piezas ensambladas ..................................................... 156
6.2.1 Comunicacin de la traslacin ............................................................................................... 157
6.2.2 Comunicacin del deslizamiento ........................................................................................... 158
6.3 Deteccin de colisiones ................................................................................................................. 161
6.4 Parser ............................................................................................................................................. 165
6.5 Robustez ........................................................................................................................................ 169
6.6 Interfaz de usuario ......................................................................................................................... 171
6.6.1 Habilitar y deshabilitar la opcin de assembling ................................................................... 171
6.6.2 Realizacin del assembling.................................................................................................... 172
6.6.3 Desconexin de conectores ensamblados .............................................................................. 174
6.6.4 Desconexin de una pieza ensamblada .................................................................................. 175
6.6.5 Deslizamiento de piezas ensambladas ................................................................................... 175
6.6.6 Seleccin de la ubicacin del directorio LCI ......................................................................... 176
7 RESULTADOS Y CONCLUSIONES .................................................................................................. 179
7.1 Resultados obtenidos ..................................................................................................................... 179
7.2 Conclusiones del proyecto ............................................................................................................. 183
8 TRABAJOS FUTUROS Y AGRADECIMIENTOS............................................................................. 187
8.1 Trabajos futuros ............................................................................................................................. 187
8.2 Agradecimientos ............................................................................................................................ 189
CUADRO DE FIGURAS Y TABLAS .................................................................................................. 193
BIBLIOGRAFA .................................................................................................................................... 199
ANEXO 1. ESTRUCTURA DE DIRECTORIOS DEL PAQUETE LDRAW .................................. 203
ANEXO 2. FORMATO, SINTAXIS Y SEMNTICA DE LOS FICHEROS LCI........................... 204
1 Formato, sintaxis y semntica de los ficheros LCI................................................................................ 204
2 Ejemplo de fichero LCI ......................................................................................................................... 206
ANEXO 3. DTD Y XML SCHEMA DE LOS FICHEROS LCI ........................................................ 209
1 Qu es un DTD? .................................................................................................................................. 209
2 DTD de los ficheros LCI ....................................................................................................................... 209
3 Qu es un XML Schema? .................................................................................................................... 209
4 XML Schema de los ficheros LCI......................................................................................................... 210
ANEXO 4. SISTEMAS DE COORDENADAS LDRAW Y LEOCAD.............................................. 211
1 Sistema de coordenadas Ldraw ............................................................................................................. 211
2 Sistema de coordenadas LeoCAD ......................................................................................................... 211
ANEXO 5. ROTACIONES Y FRMULA DE RODRIGUES........................................................... 212
1 Matrices de rotacin .............................................................................................................................. 212

2 Vectores de rotacin .............................................................................................................................. 213


3 La frmula de Rodrigues ....................................................................................................................... 213
4 La frmula inversa de Rodrigues........................................................................................................... 214
ANEXO 6. PIEZAS CON FICHEROS LCI ASOCIADOS ................................................................ 215
ANEXO 7. DISTANCIA PUNTO RECTA ....................................................................................... 219
ANEXO 8. LISTA GENRICA ............................................................................................................ 221
ANEXO 9. CLASE DICCIONARIO .................................................................................................... 223

' () "

*'

CAD Mecnico para piezas Lego

UdG

CAD Mecnico para piezas Lego

INTRODUCCIN

1.1

Presentacin de la problemtica

Actualmente existen en el mercado diversas herramientas de CAD (Computer Aidded Design),


herramientas stas de delineacin y diseo que permiten crear modelos asistidos por ordenador de
diferente ndole de forma relativamente sencilla y detallada. Dentro de los CADs ha aparecido en los
ltimos aos una distincin de ellos que se caracteriza por permitir interaccin entre los objetos de un
modelo: son los llamados CADs mecnicos. Los sistemas de CADs mecnicos actuales ofrecen muchas
posibilidades al diseador, generalmente basndose en el uso de restricciones geomtricas impuestas al
modelo en construccin. Este proceso es, cuanto menos, incmodo y artificioso, ms an cuando los
propios objetos contienen en s mismos la informacin necesaria para interaccionar los unos con los otros.
Adems, cabe decir, que existen situaciones donde esta generalidad de imponer restricciones geomtricas
al modelo que se est creando no aporta ningn beneficio extra para ensamblar sistemas complejos. Un
claro ejemplo son los motores, cuyas piezas se unen entre si de formas muy especficas. Para modelar
estas interacciones entre objetos es necesario incluir varias restricciones simultneamente, lo cual, adems
de aumentar el tiempo de clculo para resolver el posicionamiento de tales objetos, representa una
molestia para el modelador que se ve obligado a definir restricciones que, desde un punto de vista
prctico, son altamente redundantes.
Partiendo de las limitaciones de los CADs mecnicos, se ha decidido llevar a cabo la implementacin de
la interaccin entre objetos dentro de una aplicacin de CAD, creando una herramienta donde es posible
conectarlos nicamente identificando las partes de ellos que, por su naturaleza, permitan realizar tal
interaccin. Con esto, lo que se consigue es eliminar la incomodidad que supone estar definiendo
continuamente restricciones geomtricas, potenciando as la ergonoma de la aplicacin.

1.2

Objetivo: CAD Mecnico

El objetivo del presente proyecto es el de disear una herramienta de CAD mecnico que modele
interacciones especficas entre objetos de un modelo. Estas interacciones permitirn unir partes de un
modelo en construccin con mayor eficiencia que utilizando simples restricciones, debido a que cada
interaccin se representar mediante primitivas que equivalen a un nmero de restricciones elementales
del tipo de las utilizadas tradicionalmente en los CADs mecnicos.
Para poder llevar a cabo este objetivo se ha eligido el sistema de ladrillos

, debido principalmente

a tres motivos:
1

UdG

Su simplicidad y valor educativo.

Captulo 1. Introduccin

Los principios aplicados y desarrollados en esta herramienta son fcilmente escalables a


problemas de ingeniera de mayor complejidad y tamao (motores, mecanismos mviles, brazos
mecnicos, sistemas robticos ...).

Las piezas Lego ofrecen toda la riqueza, en trminos de interacciones, de un motor real y a solo
una fraccin del coste de ste.

1.3

Trabajo previo y temporalizacin del proyecto

El trabajo previo para llevar a cabo el desarrollo del CAD Mecnico para piezas Lego se puede dividir en
seis fases:
1

Conocimiento de las piezas y conectores Lego. Este estudio se bas en la identificacin de los
conectores (ver Captulo 2. Piezas y conectores Lego) ms usuales que se pueden encontrar
dentro de las piezas que forman el catlogo de Lego. Todo este estudio permiti definir los
posibles conectores y comprobar empricamente la forma cmo diferentes piezas Lego se
conectan entre si.

Estudio del paquete LDraw. Conocer los elementos que forman el paquete LDraw [1], as
como el peculiar formato de los ficheros que lo componen, fue vital para obtener toda la
informacin referente a una determinada pieza y a los conectores de la misma (ver Captulo 2.
Piezas y conectores Lego). Su comprensin ha sido fundamental, debido a que es la base de los
CADs de piezas Lego (ver Captulo 3. LDraw apartado 3.4 CADs que utilizan el paquete
LDraw).

Estudio de los CADs para piezas Lego. Esta parte del trabajo previo del proyecto se bas en el
conocimiento de los dos CADs de piezas Lego que actualmente existen: el LeoCAD [2] y el
MLCAD [3] (ver Captulo 3. LDraw apartado 3.4 CADs que utilizan el paquete LDraw). Con el
anlisis de ambos se pudo determinar sus pros y contras y posteriormente elegir el CAD ms
adecuado para poder llevar a cabo la implementacin del assembling o interaccin (ver Captulo
5. Diseo apartado 5.3 Assembling) entre las piezas Lego.

UML. Este trabajo previo se bas en la ampliacin de los conocimientos adquiridos sobre diseo
[5] y programacin orientada a objetos (OOP) [10] en las asignaturas de Enginyeria del
Software: Disseny y Llenguatges de Programaci de la titulacin.

Conocimiento de la herramienta de desarrollo Visual C++ 6.0. Una vez decidido el CAD que
se va a utilizar para desarrollar el assembling o interaccin entre piezas Lego, es muy importante
conocer las peculiaridades de la herramienta con la que ha sido desarrollado para poder
modificar e introducir el cdigo que sea necesario. Por eso, hubo una etapa de adaptacin y

10

EPS

CAD Mecnico para piezas Lego

conocimiento a la aplicacin. Cabe comentar que, pese a que ya conoca tal lenguaje, nunca
haba realizado programacin orientada a objetos con l, con lo que hubo un perodo importante
de conocimiento de las caractersticas de dicho lenguaje. Con todo ello tuve la base necesaria
para implementar todo lo que se haba diseado con anterioridad utilizando la metodologa UML
[5].
6

Estudio de la arquitectura del LeoCAD. Probablemente, esta fase fue una de las ms
importantes, ya que en ella se tuvieron que conocer y comprender las estructuras de datos de la
aplicacin e identificar las partes donde se tendra que introducir una implementacin adicional.
ste estudio, conjuntamente con la fase de implementacin, ha sido una de las fases ms largas
del proyecto, puesto que no es trivial la comprensin global de una aplicacin tan compleja y
extensa como puede serlo un CAD, donde son necesarios conocimientos en diversos campos
(programacin orientada a objetos, lgebra, grficos por computador), y con la dificultad
aadida que supone entender un cdigo ajeno.

En cuanto a la temporalizacin del proyecto, en el diagrama de la Figura 1.1 se puede comprobar la


duracin aproximada de cada una de las fases ms importantes del proyecto. Cabe comentar que dicho
diagrama est dividido en cuatrimestres, desde el inicio del proyecto en el mes de marzo del 2002, hasta
su finalizacin en el mes de Junio del presente ao 2003.

Figura 1.1. Temporalizacin del proyecto.


Las fases del diagrama de la Figura 1.1 son:
1

Estudio piezas y conectores Lego. Esta fase corresponde al estudio realizado en el trabajo
previo sobre los tipos, comportamiento y caractersticas de las diferentes piezas y conectores
Lego.

UdG

11

Captulo 1. Introduccin

Estudio del paquete LDraw. En esta etapa se pretendi conocer el paquete que abastece de
piezas Lego a los CADs que lo utilizan. Corresponde con la fase dos del estudio previo.

Estudio del LeoCAD y MLCAD. Etapa basada en el aprendizaje de los dos CADs para piezas
Lego disponibles y decisin de la utilizacin del LeoCAD para la implementacin de la
interaccin entre piezas. Esta etapa se corresponde con la fase tres del trabajo previo.

UML y Visual C++ 6.0. Esta etapa se corresponde con el trabajo previo descrito en las fases
cuatro y cinco para ampliar los conocimientos ya adquiridos durante la carrera sobre diseo e
implementacin orientado a objetos.

Estudio de la arquitectura del LeoCAD. Estudio de la jerarqua de clases y estructura de datos


ms importantes para poder comprender el funcionamiento interno bsico de la aplicacin a
utilizar para desarrollar el proyecto. Esta etapa corresponde con el trabajo previo descrito en la
fase seis.

Diseo. Etapa de diseo de los diagramas de clases y diagramas de secuencia para documentar la
parte esttica aadida a la aplicacin y la comunicacin entre los elementos de esa parte esttica
(parte dinmica) mediante los diagramas de secuencia. Tambin se definieron las
funcionalidades bsicas a aadir as como los pasos a seguir para ello.

Implementacin. Etapa de imlementacin de todos los aspectos diseados con anterioridad.

Refactorizacin. A la vez que la etapa de implementacin, se llev a cabo un proceso de


refactorizacin. La refactorizacin podramos definirla como la modificacin de la estructura
interna de un software con el objetivo de que sea ms fcil de entender y modificar en el futuro,
tal que el comportamiento observable en el software al ejecutarse no se vea afectado [17]. La
refactorizacin ha sido necesaria para recuperar la claridad del diseo, y como consecuencia de
la implementacin, debido a que se observaba que el propio diseo inicial no cumpla con todos
los requisitos necesarios para la implantacin de la opcin de assembling (ver Captulo 5. Diseo
apartado 5.3 Assembling) dentro del LeoCAD [2].

Pruevas. Fase de pruevas donde se comprobaron diveros casos para certificar la ausencia de
bugs en la aplicacin y por lo tanto su correcto funcionamiento. La principal prueva se bas en la
creacin de un modelo de piezas Lego completo.

10 Documentacin. Etapa en la que se ha ido documentando todos los elementos referentes al


proyecto.

12

EPS

CAD Mecnico para piezas Lego

1.4

Metodologa utilizada: UML

1.4.1 Introduccin al UML


UML [5] es un lenguaje de modelado visual que se usa para especificar, visualizar, construir y
documentar elementos de un sistema de software.
OBJETIVOS DEL UML
Los principales objetivos del UML son:

UML es un lenguaje de propsito general que pueden usar todos los modeladores. No tiene
propietario y est basado en el comn acuerdo de gran parte de la comunidad informtica.

UML no pretende ser un mtodo de desarrollo completo. No incluye un proceso de desarrollo


paso a paso. UML incluye todos los conceptos que se consideran necesarios para utilizar un
proceso moderno iterativo, basado en construir una slida arquitectura para resolver requisitos
dirigidos por casos de uso.

Ser tan simple como sea posible pero manteniendo la capacidad de modelar toda la gama de
sistemas que se necesita construir. UML necesita ser lo suficientemente expresivo para manejar
todos los conceptos que se originan en un sistema moderno, tales como la concurrencia y
distribucin, as como tambin los mecanismos de la ingeniera del software, como la
encapsulacin y componentes.

Debe ser un lenguaje universal, como cualquier lenguaje de propsito general.

Imponer un estndar mundial.

ARQUITECTURA DEL UML


En cuanto a la arquitectura del UML, habra que destacar que est formada por cuatro capas, con el fin de
cumplir con la especificacin Meta Object Facility del OMG. Tales capas son:

Meta metamodelo. Define el lenguaje para especificar metamodelos.

Metamodelo. Define el lenguaje para especificar modelos.

Modelo. Define el lenguaje para describir un dominio de informacin.

UdG

13

Captulo 1. Introduccin

Objetos de usuario. Define un dominio de informacin especfico.

REAS CONCEPTUALES
Los conceptos y modelos de UML pueden agruparse en las siguientes reas conceptuales:

Estructura esttica. Cualquier modelo preciso debe primero definir su universo, esto es, los
conceptos clave de la aplicacin, sus propiedades internas, y las relaciones entre cada una de
ellas. Este conjunto de construcciones es la estructura esttica. Los conceptos de la aplicacin
son modelados como clases, cada una de las cuales describe un conjunto de objetos que
almacenan informacin y se comunican par implementar un comportamiento. La informacin
que almacena es modelada como atributos. La estructura esttica se expresa con diagramas de
clases y puede usarse para generar la mayora de las declaraciones de estructuras de datos en un
programa.

Comportamiento dinmico. Hay dos formas de modelar el comportamiento, una es la historia


de la vida de un objeto y la forma como interacta con el resto del mundo, y la otra es por los
patrones de comunicacin de un conjunto de objetos conectados, es decir, la forma en que
interactan entre s. La visin de la interaccin de los objetos se representa con los enlaces entre
objetos junto con el flujo de mensajes y los enlaces entre ellos. Este punto de vista unifica la
estructura de los datos, el control de flujo y el flujo de datos.

Construcciones de implementacin. Los modelos UML tienen significado para el anlisis


lgico y para la implementacin fsica. Un componente es una parte fsica reemplazable de un
sistema y es capaz de responder a las peticiones descritas por un conjunto de interfaces. Un nodo
es un recurso computacional que define una localizacin durante la ejecucin de un sistema.
Puede contener componentes y objetos.

Organizacin del modelo. La informacin del mdelo debe ser dividida en partes coherentes,
para que los equipos puedan trabajar en las diferentes partes de forma concurrente. El
conocimiento humano requiere que se organice el contenido del modelo en paquetes de tamao
modesto. Los paquetes son unidades organizativas, jerrquicas y de propsito general de los
modelos de UML. Pueden usarse para almacenamiento, control de acceso, gestin de la
configuracin y construccin de bibliotecas que contengan fragmentos de cdigo reutilizable.

Mecanismos de extensin. UML tiene una limitada capacidad de extensin pero que es
suficiente para la mayora de las extensiones que requiere el da a da sin la necesidad de un
cambio en el lenguaje bsico. Un estereotipo es una nueva clase de elemento de modelado con la
misma estructura que un elemento existente pero con restricciones adicionales.

14

EPS

CAD Mecnico para piezas Lego

1.4.2 Porqu utilizar UML?


La metodologa que se ha utilizado para llevar a cabo la realizacin de este proyecto
ha sido UML (Lenguaje Unificado de Modelado) [5], lo que implica que todos los
diseos incluidos en la memoria (diagramas de clases, diagramas de secuencia...)
siguen tal estndar. Se ha elegido UML debido a que la aplicacin sobre la que se ha
implantado el assembling o interaccin entre piezas Lego haba sido diseada siguiendo UML y como
consecuencia implementada mediante la programacin orientada a objetos (OOP) [10].

1.5

Estructura del documento

Esta memoria se ha estructurado en ocho captulos:

Captulo 1. Introduccin. En este captulo se pretende dar a conocer la problemtica que ha


llevado a la realizacin del proyecto y partiendo de ella, cual es el objetivo que el presente
proyecto ha pretendido abarcar. Tambin se da una visin del trabajo previo que se ha tenido que
realizar antes del inicio del proyecto y de la estructura del presente documento, as como
informacin de la metodologa utilizada.

Captulo 2. Piezas y conectores Lego. En el captulo dos de la memoria se ofrece toda la


informacin referente a las piezas y conectores Lego, ya que son conceptos importantes que
aparecern de forma continuada durante toda la documentacin.

Capulo 3. LDraw. Aqu se profundiza en todo lo referente al paquete LDraw [1] , desde su
historia hasta su peculiar sintaxis. Tambin se ofrece un resumen de los dos CADs que utilizan
tal paquete como mtodo de abastecimiento de piezas Lego, las limitaciones de ellos y los
motivos que han llevado a la eleccin de uno de los dos para la implementacin del assembling
(ver Captulo 5. Diseo apartado 5.3 Assembling) entre piezas.

Captulo 4. Arquitectura del LeoCAD. En este captulo se pretende dar a conocer la


arquitectura del CAD escogido para la implementacin del assembling: el LeoCAD [2]. Con la
informacin de este apartado de la memoria podremos conocer el diseo y estructuras de datos
ms relevantes de tal editor.

Captulo 5. Diseo. Sin duda alguna, uno de los captulos ms extensos e importantes de toda la
documentacin. En l se darn a conocer todos los pormenores en lo que se refiere al diseo del
CAD mecnico para piezas Lego.

UdG

15

Captulo 1. Introduccin

Captulo 6. Implementacin. La principal misin de este captulo es la de dar a conocer, ms en


profundidad, ciertos aspectos del anterior que en su momento no eran indispensables para la
comprensin del diseo del CAD Mecnico para piezas Lego. As pues, no se ha pretendido
llegar al cdigo fuente de la aplicacin, ya que para ello est el Manual Tcnio de la misma (ver
documento adjunto Introduccin al Manual Tcnico).

Captulo 7. Resultados y conclusiones. El captulo siete pretende dar a conocer los resultados
obtenidos con la realizacin del CAD Mecnico para piezas Lego y las conclusiones derivados
de los mismos.

Captulo 8. Trabajos futuros y agradecimientos. El ltimo captulo es un captulo que


pretende finalizar la memoria exponiendo los posibles trabajos futuros y los agradecimientos
personales del autor.

16

EPS

- )'
)

)(

Captulo 2. Piezas y conectores Lego

18

EPS

CAD Mecnico para piezas Lego

PIEZAS Y CONECTORES LEGO

En este captulo se pretende dar a conocer dos conceptos sencillos, a la vez que importantes, para el
proyecto que se ha desarrollado: el concepto de pieza Lego y el de conector Lego. La comprensin de
tales conceptos es ms que relevante ya que aparecern de forma constante en todo el documento.

2.1

Piezas Lego

2.1.1 Qu son?
Podramos definir una pieza Lego como cualquier elemento que forma parte del catlogo que ofrece el
paquete LDraw [1] (ver Captulo 3. LDraw) y por lo tanto utilice su sintaxis y las subpartes que ste
ofrece. As pues, una pieza siempre estar formada por un conjunto de subpartes (son nicamente
geometra a dibujar) y conectores (partes de las piezas que permitirn realizar el assembling o conexin
con el resto de piezas).

2.1.2 Grandes grupos de piezas Lego


Las piezas Lego que nos ofrece el paquete LDraw las podramos clasificar dentro de nueve grupos
diferentes dependiendo de la tipologa de pieza a la que pertenezcan. Estos nueve grupos son:

Plates. Este tipo de pieza es una de las ms abundantes y se distinguen de


los Bricks en la altura, ya que esta tipologa de pieza posee una altura de
2/3 la de los Bricks.

Bricks. Dentro de los Bricks podemos encontrar prcticamente el mismo


tipo de piezas que en los plates, pero tal y como se ha comentado antes,
con la diferencia en la altura entre ambas tipologa de piezas.

Tiles. En cuanto a los Tiles podramos decir que son como los plates, pero
con la diferencia que no poseen conectores en su parte superior.

Slope Bricks. Los Slope Bricks podramos definirlos como Bricks, pero
con diferencias en la geometra bsica.

UdG

19

Captulo 2. Piezas y conectores Lego

Technic. En cuanto al grupo Technic, decir simplemente que son las


piezas con la geometra ms compleja y tambin con los conectores ms
complejos y por lo tanto, el assembling donde intervengan piezas que
pertenezcan al grupo de las technic, tambin ser ms especial.

Space. Dentro de la tipologa Space, encontramos a cualquier pieza que


est relacionada con el mundo del espacio.

Train. En el conjunto Train, anlogamente al conjunto de piezas Space,


encontramos las piezas necesarias para construir modelos relacionados con
el mundo ferroviario.

Other Bricks. En los Other Bricks tendremos a los Bricks que por
diferencias geomtricas no se han incluido dentro de los anteriores tipos de
Bricks..

Accesories. Finalmente nos encontramos con el conjunto denominado


Accessories. Aqu, tal como su nombre indica, se engloba un conjunto de
accesorios de diversa ndole.

2.2

Conectores Lego

2.2.1 Qu son?
Un conector es la parte de la pieza que, por su naturaleza, permite la conexin (ver Capitulo 5. Diseo
apartado 5.3 Assembling) con otras piezas, siendo ste fundamental para el proyecto que se ha abordado,
ya que sin la existencia de l, el ensamblaje de piezas sera imposible. Hay que aclarar que el concepto de
conector ha sido creado para el presente proyecto y por lo tanto la clasificacin realizada de los mismos
es totalmente nueva.

2.2.2 Clasificacin de conectores Lego


Un conector Lego se puede clasificar de dos maneras diferentes: segn su tipologa y segn su estado.
1

Clasificacin segn su tipologa.

Dentro de los conectores que poseen las piezas Lego, podemos encontrar dos grandes grupos si los
distinguimos segn al tipo de conector que pertenezcan:
20

EPS

CAD Mecnico para piezas Lego

Conectores puntuales. Un conector clasificado como puntual (ver Figura 2.1) es aqul que
se caracteriza por poder ser interpretado como un punto en el espacio y por permitir realizar
assembling (ver Capitulo 5. Diseo apartado 5.3 Assembling) con un solo conector al mismo
tiempo. Para el proyecto se han identificado dos de ellos:

Vista lateral derecha Vista perspectiva 3D


Figura 2.1. Ejemplo de conector de tipo puntual.

STUD. Este conector es el ms abundante dentro de las piezas de tipo Plates, Bricks
Slope Bricks y Other Bricks, lo que no significa que no podemos encontrarlo dentro
de otro grupo de piezas. Tal y como se explicar en el captulo de diseo de la
memoria (ver Captulo 5. Diseo) ms extensamente, los conectores de tipo Stud
pueden ensamblar con conectores de tipo Stud Inlet y conectores de tipo Cylindrical
Hole, pero con solo uno de ellos al mismo tiempo.
Nombre

Stud

N conectados

Grupo de piezas

Plates, Bricks, Slope


Bricks y Other Bricks

Ejemplo

STUD INLET. Este conector puede ensamblar nicamente con conectores de tipo
Stud y lo podemos encontrar bsica pero no exclusivamente en el mismo grupo de
piezas que los conectores de tipo Stud. El nmero de conectores que pueden
ensamblar, al mismo tiempo, con los conectores de tipo Stud Inlet son los mismos
que en el caso de los conectores Stud: uno.
Nombre

Stud Inlet

N conectados

Grupo de piezas

Plates, Bricks, Slope


Bricks y Other Bricks

Ejemplo

UdG

21

Captulo 2. Piezas y conectores Lego

Conectores de tipo segmento. Un conector definido dentro de este grupo es aqul que posee
un cuerpo de una cierta longitud interpretable como un segmento, que le permite ensamblar
con ms de un conector a la vez (ver Figura 2.2). Los conectores de tipo segmento poseen la
peculiaridad de que solo pueden ensamblar a travs de sus extremos. Tal y como se ver en
posteriores captulos (ver Captulo 5. Diseo), el nmero de conectores que se podrn
conectar a este tipo de ellos depender de la longitud de los propios conectores.

extremo
longitud

extremo

longitud

Vista perspectiva 3D

Vista lateral derecha

Figura 2.2. Ejemplo de conector de tipo segmento.


Los conectores de tipo segmento que se han identificado para el presente proyecto son tres:

AXLE. Los conectores de tipo Axle se encuentran dentro del grupo de piezas
Technic y pueden ensamblar (ver Captulo 5.Diseo apartado 5.3 Assembling) con
los conectores de tipo Axle Hole y Cylindrical Hole. Tal como se ha dicho para todo
conector de tipo segmento, los conectores de tipo Axle pueden estar conectados con
ms de un conector al mismo tiempo.
Nombre

Axle

N conectados

Grupo de piezas

Technic

Ejemplo

AXLE HOLE. El Axle Hole, al igual que el Axle, lo podemos encontrar


mayoritariamente dentro del grupo de piezas Technic. Pude ensamblar,
exclusivamente con conectores de tipo Axle y como todo conector de tipo segmento,
con ms de uno de ellos a la vez.

22

EPS

CAD Mecnico para piezas Lego

Nombre

Axle Hole

N conectados

Grupo de piezas

Technic

Ejemplo

CYLINDRICAL HOLE. ste tipo de conectores segmento tambin pertenece a


piezas clasificadas dentro del grupo Technic y pueden conectarse a ms de un
conector al mismo tiempo. Los conectores de tipo Cylindrical Hole pueden
ensamblar con conectores de tipo Axle y Stud.
Nombre

Cylindrical Hole

N conectados

Grupo de piezas Technic

Ejemplo

Clasificacin segn su estado.

Los conectores de una pieza pueden clasificarse como conectores libres y conectores ocupados.
Tales definiciones variarn segn si hablamos de conectores puntuales o si lo hacemos de conectores
de tipo segmento.
A

Estado de conectores puntuales. Diremos que un conector puntual est libre cuando no se
encuentre conectado a ningn otro conector, por el contrario, diremos que esta tipologa de
conectores se encuentra en estado ocupado cuando se encuentre realizando assembling (ver
Captulo 5. Diseo apartado 5.3 Assembling) con otro conector. As pues, para los conectores
de tipo puntual, podramos decir que si un conector est libre ser lo mismo decir que no se
encuentra ocupado y viceversa (ver Figura 2.3).
Stud libre

Stud Inlet
ocupado
Stud Inlet libre

Stud
ocupado

Figura 2.3. Ejemplo de conectores de tipo puntual en sus diferentes estados.

UdG

23

Captulo 2. Piezas y conectores Lego

Estado de conectores de tipo segmento. Un conector de tipo segmento se le puede clasificar


como conector libre cuando posea el extremo de su cuerpo libre, ya que este tipo de
conectores solo puede conectar con otros a travs de su extremo, es decir, no se puede
conectar otro conector a uno de tipo segmento en cualquier parte del segmento que
representan. Por otro lado, para poder considerar un conector de tipo segmento como
ocupado, al igual que los conectores de tipo puntual, tendr que estar conectado a otro u otros
conectores. As pues, la principal diferencia entre los conectores de tipo segmento y los de
tipo puntual, en lo que se refiere a su estado, es la siguiente: Decir que un conector de tipo
puntual est libre es anlogo a decir que se encuentra en estado no ocupado y viceversa. Por
el contrario, un conector de tipo segmento puede estar libre y ocupado al mismo tiempo por
lo que no podemos afirmar que cuando se encuentre libre su estado sea el de conector no
ocupado o viceversa (ver Figura 2.4).
S

libre

libre

No

ocupado

ocupado

CH = Cylindrical Hole

No

libre

No

libre

ocupado

ocupado

Figura 2.4. Esquema de un conector de tipo Axle y sus diferentes estados.


Despus de clasificar los conectores segn su tipologa y estado, habra que dejar claro dos aspectos
importantes:
1

Un conector pertenecer a un tipo u otro de conector si se comporta y tiene las caractersticas de


una determinada tipologa de ellos. Con esto lo que se quiere decir es que dos conectores C1 y C2
puede tener ciertas diferencias geomtricas pero ambos ser considerados del mismo tipo, debido
a que ambos posean las mismas caractersticas y propiedades.
En la Figura 2.5 se puede observar a un conector C1 y a otro C2. Ambos son considerados Studs,
ya que pueden ensamblar con el Stud Inlet y no pueden tener ms de un conector ensamblado a
ellos a la vez, pese a ser diferentes geomtricamente.

24

EPS

CAD Mecnico para piezas Lego

STUD

C1
C2
STUD

Figura 2.5. Dos conectores de tipo Stud pero con una geometra diferente.

Cabe decir que hay ms tipos de conectores dentro de las piezas Lego, pero se ha escogido un
subconjunto de ellos para demostrar la implementacin del assembling dentro de una
herramienta de CAD para piezas Lego en un espacio de tiempo razonable.

UdG

25

Captulo 2. Piezas y conectores Lego

26

EPS

( /

Captulo 3. LDraw

28

EPS

CAD Mecnico para piezas Lego

LDRAW

3.1

Qu es?

LDraw [1] no es ms que un paquete que ejerce de proveedor de piezas Lego (ver Captulo 2. Piezas y
conectores Lego) para las aplicaciones (editores, visualizadores...) que lo utilizan.
ste paquete est compuesto principalmente por cuatro elementos bsicos:
1

Un conjunto de librerias.

Las piezas bsicas que forman el basto catlogo de Lego.

Las partes que componen a stas ltimas.

Un visualizador de modelos creados a partir de las piezas contenidas en este paquete.

3.2

Historia

A continuacin se presenta, de forma esquematizada, la evolucin que ha sufrido todo lo relacionado con
el paquete LDraw y las aplicaciones (editores, visualizadores...) que hacen uso de l.
AO
1995

DESCRIPCIN

James Jessiman desarrolla el software y formato original de los ficheros LDraw. El


programa es destinado a la generacin de imgenes de las partes que forman las
piezas de Lego del inventario que posea James en ese momento.

La comunidad Lego inicia un proyecto llamado Minifig World Tour. El tour incluye
un libro donde todos los participantes crean instrucciones de montaje para sus
modelos con el programa basado en LDraw de James. En este preciso instante
LDraw comienza a adquirir popularidad.

1996

Un grupo de usuarios de LDraw renen la lista de mails de los participantes en el


Minifig World Tour y forman el L-CAD, una lista de correo para discutir lo que un
futuro CAD de Lego debera permitir. Las discusiones no se basan en el propio
LDraw, pero incluyen otros programas, como el SimLego, creado por Tore Eriksson,
y el LeoCAD [2] de Leonardo Zide.

(Mayo) Steve Bliss crea un Add-on para el paquete LDraw, una herramienta de
administracin para varias aplicaciones que utilizan LDraw.

UdG

29

Captulo 3. LDraw

AO
1996

DESCRIPCIN

(Junio) Leonardo Zide finaliza el LeoCAD [2], un editor para plataformas Windows
y Linux basado en LDraw.

1997

(Julio) James Jessiman, el creador de LDraw, fallece a la edad de 26 aos.

Terry Keller rene informacin y crea una web en conmemoracin a James


Jessiman. Actualmente tal informacin se encuentra en ldraw.org. Desde el
momento en que se crea este site, ldraw.org sirve como punto bsico de informacin
para todo aqul que quisiera crear herramientas y aplicaciones basadas en LDraw.

Jacob Sparre Andersen realiza el Fractal Landscape Editor un generador de paisajes


para LDraw.

Lutz Uhlmann finaliza el L2P, herramienta que permite la conversin de un fichero


LDraw al formato de POV-Ray, con la ayuda de un conjunto de librerias llamadas
LGEO. Esta opcin permite al usuario crear renders de alta calidad a partir de los
modelos LDraw y utilizarlos en una escena ya creada anteriormente con POV-Ray.

(Marzo) Paul Gyugyi crea LDrawVR, una aplicacin web que permite al usuario
transformar un modelo LDraw a VRML.

Jean-Pierre Paris crea LD2Vr, el cual transforma los ficheros LDraw para permitir
su posterior visualizacin mediante un plugin para VRML.

Lars Hassing finaliza el L3P, aplicacin que tambin convierte los ficheros LDraw a
ficheros POV-Ray, con extensin POV. La principal diferencia entre el L3P y el L2P
es que el primero no requiere tener el conjunto del librerias LGEO. Los usuarios no
estn limitados a que partes estn en las libreras LGEO, ya que el L3P genera las
partes de las piezas en POV-Ray como parte del proceso de conversin.

1998

(Agosto) Paul Gyugyi crea LDLite, un programa para sistemas operativos Windows
de renders de ficheros DAT (extensin de los ficheros del paquete LDraw) basado en
el LDrawVR.

30

EPS

CAD Mecnico para piezas Lego

AO
1998

DESCRIPCIN

(Septiembre) Bram Lambrecht crea dos tutoriales. Uno basado en LDraw y otro en
LEdit1.

(Octubre) Todd Lehman y Suzanne Rich inician el proyecto Lugnet, un servidor de


noticias relacionadas con el mundo Lego.

Los MPD (Multi-Part DAT) se introducen permitiendo a los usuarios tener multiples
ficheros DAT en uno de solo. Normalmente un usuario crea un modelo y utiliza
diversos subficheros, que actuan como unidades del modelo a crear, para despus
unir todos los ficheros en un MPD.

El 7 de julio Tim Courtney crea www.LDraw.org. LDraw.org se convierte en el


centro de todo lo relacionado con LDraw.

1999

Michael Lachmann crea el MLCAD [3], un editor para sistemas operativos Windows
de modelos LDraw. Rpidamente comienza a ganar popularidad dentro de la
comunidad Lego.

2000

(Junio) Tim Courtney y Bram Lambrecht realizan una presentacin sobre LDraw en
el BrickFest 2000, en Arlington, Virginia (USA).

(Julio) Tim con la ayuda de Bram Lambrecht, Terry Keller y Mike Poindexter
presenta LDraw en el LEGO Maniac KidVention, un evento del club Lego que tuvo
lugar en Legoland (parque de atracciones de Lego), California. La presentacin se
bas en los modelos fsicos de Lego y en escenas renderizadas de los mismos.

Travis Cobbs crea el LDView, otro visualizador para LDraw en sistemas operativos
Windows. El LDView tiene la caracterstica de poseer renderizado 3D en tiempo real
gracias al uso de OpenGL.

El LEdit es un editor de piezas Lego que se caracteriza por utilizar el paquete LDraw y por haber sido
creado para sistemas operativos MS-DOS.

UdG

31

Captulo 3. LDraw

AO
2001

DESCRIPCIN

(Julio) Don y Robyn Jessiman, los padres de James Jessiman, viajan desde Australia
para conocer a muchos de los organizadores de LDraw en el BrickFest 2001. Dentro
de los organizadores se encuentran Steve Bliss, Tim Courtney, Bram Lambrecht y
Erik Olson. Cabe decir que se realiz una presentacin sobre la historia y los
conceptos bsicos de lo que el paquete LDraw era y Steve se convierte en el primer
ganador del premio anual James Jessiman Memorial Award.

(Octubre) Jaco Van Der Molen realiza una demostracin de LDraw en el LegoWorld
2001, un evento para fans de Lego en Zwolle, Holanda. Esta pequea feria tuvo una
asistencia de pblico de 40.000 personas.

3.3

Formato de los ficheros del paquete LDraw

Los ficheros que albergan la informacin necesaria para definir un modelo LDraw (pieza o partes de
ellas) son de extensin DAT. Actualmente sta se ha visto modificada, adoptando por defecto la extensin
LDR (LDraw). El motivo que ha llevado a este cambio es que la extensin DAT es demasiado genrica,
lo cual puede llegar a producir errores en las asociaciones aplicacin-fichero que los usuarios tengan en
su ordenador (muchos programas utilizan la extensin DAT). As pues, en estos momentos la extensin
LDR es la extensin por defecto para las creaciones de los usuarios (conjunto de piezas). Las partes que
forman estos modelos (piezas o partes de ellas) continuan utilizando la extensin DAT.
Los ficheros del paquete LDraw [1] poseen la peculiaridad de que su nombre es el nmero de serie real
que la pieza tiene, lo cual permite una distincin unvoca de cada una de las piezas.
Un ejemplo de la relacin entre el nombre de un modelo LDraw y su nmero de referencia real sera la
siguiente pieza:

Figura 3.1. Ejemplo de pieza Lego (3002).

32

EPS

CAD Mecnico para piezas Lego

La pieza de la Figura 3.1, la cual es un Brick 2 x 3, est definida en el fichero 3002.dat. Esto nos viene a
decir que la pieza tiene como nmero de referencia el 3002.
Los ficheros que contienen la definicin de las piezas tienen una estrucutra un tanto peculiar. A
continuacin se muestra un fragmento del cdigo que se utiliza para definir la pieza de la Figura 3.1.
Tipo de lnea

0
0
0
0

Brick 2 x 3
Name: 3002.dat
Author: James Jessiman
Original LDraw Part - LDraw beta 0.27 Archive

1
1
1

16 20 4 0
16
0 4 0
16 -20 4 0

1 0 0 0 5 0 0 0 1
1 0 0 0 5 0 0 0 1
1 0 0 0 5 0 0 0 1

stud4.dat
stud4.dat
stud4.dat

Figura 3.2. Parte del cdigo de la pieza Lego Brick 2 x 3 con nmero de referencia 3002.
En la Figura 3.2 se puede observar parte del cdigo que permite definir a la pieza de la Figura 3.1. ste
formato se ha mantenido, principalmente, en memoria de James Jessiman, su creador all por el ao
1995.
Como se puede comprovar, el contenido de los ficheros del paquete LDraw es nica y exclusivamente
texto. Cada lnea de estos ficheros es un comando individual e independiente del resto de lneas. El
significado de cada una de ellas nos lo proporciona lo que en la Figura 3.2 se ha especificado como tipo
de lnea, es decir, el primer nmero de cada lnea. Los posibles valores de este parmetro van desde el
cero hasta el cinco (0..5) con los significados que en la siguiente tabla se descriven:

TIPO DE LNEA
0
1
2
3
4
5

SIGNIFICADO
Comentarios o meta-comandos
Referencia a una parte de la pieza
Lnea
Tringulo
Cuadriltero
Lnea condicional

Tabla 3.1. Tipos de lneas y su significado.

UdG

33

Captulo 3. LDraw

A continuacin se va a proceder a la explicacin de cada uno de los posibles tipos de lneas.


0 - Comentarios / Meta-comandos.
En el caso de los meta-comandos, hay que remarcar dos aspectos importantes:
1

El nmero que identifica el tipo de lnea va seguido de una palabra clave que identifica el metacomando correspondiente.

Los meta-comandos no son utilizados por los CADs (LeoCAD y MLCAD), sin que son
nicamente de utilidad para el visualizador que el propio paquete LDraw posee (ldraw.exe).

Ttulo del Modelo


El nombre descriptivo del modelo o de la parte de una pieza.
Si la primera lnea del fichero tiene el tipo 0 el texto de la lnea ser considerado el ttulo para el fichero.
Formato de lnea:
0

ttulo-modelo

donde

ttulo-modelo es el nombre del modelo.

ttulo-parte

donde

ttulo-parte es el nombre de una parte de una pieza del paquete LDraw.

Metacomando Paso
Marca el fin de los pasos de construccin de un modelo determinado.
Este comando provocar a LDraw (ldraw.exe) detenerse hasta que se presione <enter> y tambin
provocar que salve la imagen actual en un bitmap en el directorio ldraw\bitmap.
Formato de lnea:
0

34

CLEAR

EPS

CAD Mecnico para piezas Lego

Metacomando Escritura
Imprime un mensaje en la parte superior de la pantalla.
Formato de lnea:

0 WRITE texto-mensaje

0 PRINT texto-mensaje

donde

texto-mensaje es el conjunto de caracteres que se desea imprimir por pantalla.

Metacomando Borrado
Este meta-comando limpia la pantalla.
Formato de lnea:
0

CLEAR

Metacomando Pausa
Provoca que LDraw se detenga en la visualizacin del modelo, hasta que se presione la tecla <enter>.
Formato de lnea:
0

PAUSE

Metacomando Salvar
Provoca que LDraw (ldraw.exe) salve la imagen que actualmente se est visualizando en un bitmap.
Formato de lnea:
0

UdG

SAVE

35

Captulo 3. LDraw

1 - Referencia a una parte de la pieza.


Inserta una parte de una pieza, la cual se encuentra definida en otro fichero del paquete LDraw.
Formato de lnea:
1 color x y z a b c d e f g h i parte.dat

donde

color indica el color de la parte de la pieza. Los valores posibles para este parmetro son: 015, 16, 24, 32-47, 256-511. Los valores ms comunes son los que se encuentran
comprendidos entre el rango 0-15, por eso a continuacin se especifica el color asociado a
cada cdigo dentro de dicho rango.

0 = Negro

8 = Gris Oscuro

1 = Azul

9 = Azul Claro

2 = Verde

10 = Verde Claro

3 = Cian Oscuro

11 = Cian

4 = Rojo

12 = Rojo Claro

5 = Magenta

13 = Rosa

6 = Marrn

14 = Amarillo

7 = Gris

15 = Blanco

x y z definene la posicin de la parte.

a b c d e f g h i son seis coordenadas que forman una matriz de transformacin 3D, la


cual nos indica la orientacin y escalado de la pieza en las tres dimensiones. Cabe decir que
el valor por defecto de este parmetro es la matriz identidad (3x3).

36

EPS

CAD Mecnico para piezas Lego

parte.dat es el nombre del fichero a insertar.

2 - Lnea.
Dibuja una lnea entre dos puntos.
Formato de lnea:

2 color x1 y1 z1 x2 y2 z2

donde

color indica el color de la lnea. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.

x1 y1 z1 es la poscin del primer punto.

x2 y2 z2 es la poscin del segundo punto.

3 - Tringulo.
Dibuja un tringulo lleno dados tres puntos.
Formato de lnea:

3 color x1 y1 z1 x2 y2 z2 x3 y3 z3

donde

UdG

color indica el color del tringulo. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.

x1 y1 z1 es la poscin del primer punto.

x2 y2 z2 es la poscin del segundo punto.

x3 y3 z3 es la poscin del tercer punto.

37

Captulo 3. LDraw

4 - Cuadriltero.
Dibuja un cuadriltero lleno a partir de cuatro puntos.
Formato de lnea:

4 color x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4

donde

color indica el color del tringulo. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.

x1 y1 z1 es la poscin del primer punto.

x2 y2 z2 es la poscin del segundo punto.

x3 y3 z3 es la poscin del tercer punto.

x4 y4 z4 es la poscin del quarto punto.

5 - Lnea condicional.
Dibuja una lnea entre los dos primeros puntos si las projecciones de los dos ltimos en la pantalla se
encuantran en el mismo lado, de una lnea imaginria, a travs de las projecciones de los dos primeros
puntos en la pantalla.
Formato de lnea:

5 color x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4

donde

38

color indica el color del tringulo. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.

x1 y1 z1 es la poscin del primer punto.

x2 y2 z2 es la poscin del segundo punto.

x3 y3 z3 es la poscin del tercer punto.

x4 y4 z4 es la poscin del cuarto punto.

EPS

CAD Mecnico para piezas Lego

A continuacin se muestra un ejemplo de uso del comando lnea condicional. Supongamos el siguiente
prisma hexagonal, el cual viene a representar un conector de tipo Stud.

3
5

Figura 3.3. Prisma hexagonal sin aplicar el comando lnea condicional.


Las lneas que realmente se tendran que dibujar serian las siguientes:

La lnea bajo el punto 1 no debera ser dibujada por que el punto 6 y el 2 estn en diferentes
lados.

La lnea bajo el punto 2 no debera ser dibujada por que el punto 1 y el 3 estn en diferentes
lados.

La lnea bajo el punto 3 debera ser dibujada por que el punto 2 y el 4 estn en el mismo lado.

La lnea bajo el punto 4 no debera ser dibujada por que el punto 3 y el 5 estn en diferentes
lados.

La lnea bajo el punto 5 no debera ser dibujada por que el punto 4 y el 6 estn en diferentes
lados.

La lnea bajo el punto 6 debera ser dibujada por que el punto 5 y el 1 estn en el mismo lado.

As pus el prisma hexagonal que cabra dibujar sera el que se muestra:

3
5

Figura 3.4. Prisma hexagonal una vez aplicado el comando lnea condicional.

UdG

39

Captulo 3. LDraw

3.4

CADs que utilizan el paquete LDraw

Antes de la aparicin los dos CADs que ocupan las siguientes lneas, las personas que querian realizar
modelos basados en las piezas de Lego utlizaban los editores creados para los sistemas operativos MSDOS, principalmente LEdit, con las limitaciones que ello conllevaba en cuanto a interfaz se refiere.
Actualmente ya existen diversos CADs, que utilizan el paquete LDraw [1] como sistema de
abastecimiento de piezas Lego y que han sido desarrollados para los sistemas operativos Windows y/o
Linux. Dentro de stos, los ms conocidos son el MLCAD [3] y el LeoCAD [2].

3.4.1 MLCAD
En el ao 1999 Mike Lachmann cre el MLCAD [3], el cual usa la librera LDraw. El aspecto ms
importante de sta herramienta se encuentra en que la aplicacin est creada para entornos Windows, con
una diferencia abismal en lo que a interfaz respecta, en relacin a las aplicaciones para DOS.
El MLCAD, como cualquier aplicacin para Windows, presenta la caracterstica de permitir la utilizacin
del ratn. sta opcin es aprovechada por el editor para la traslacin,rotacin... de las piezas Lego. Tal
caracterstica, la ausencia de la cual resultara hoy en da impensable en cualquier programa, permite crear
un modelo de una forma drsticamente ms rpida en comparacin al antiguo sistema de teclas que
utilizaban los editores para piezas Lego de MS-DOS. An as, cabe decir, que el MLCAD no soporta el
movimiento de las piezas mediante teclas, lo cual es un handicap para los usuarios ms veteranos que
estaban familiarizados con tal tipo de interaccin con el editor de piezas Lego.

Figura 3.5. Aplicacin MLCAD.


El MLCAD tiene una alta calidad de renderizacin tanto en las previews que realiza de las piezas, lo
que permite seleccionarlas visualmente y no tener que conocer el nmero de referencia o el nombre de las
mismas, como en su posterior visualizacin simultnea desde los cuatro ngulos diferentes: alzado, perfil,
alto y perspectiva. Pero su principal virtud se encuentra en los MPD (Multi Part DAT). stos no son

40

EPS

CAD Mecnico para piezas Lego

ms que proyectos creados con el MLCAD pero con la particularidad de que las partes que forman el
modelo no son piezas bsicas si no otros modelos creados con antelacin. sta opcin es realmente til,
ya que en el momento de crear una escena se pueden utilizar otros proyectos realizados anteriormente y
as no tener que volver a construirlos, es decir, esta opcin nos permite la reutilizacin de modelos ya
creados.
Las extensiones de ficheros que la aplicacin reconoce son de tres tipos:

DAT para las piezas que integran el paquete LDraw.

LDR para los proyectos creados con el MLCAD.

MPD para los proyectos LDraw formados a partir de otros.

A continuacin se muestran los principales pros y contras del MLCAD:


CONTRAS

PROS

Movimiento de piezas via mouse.

No soporta los movimientos de las piezas


mediante el sistema de teclas.

Men desplegable de piezas.

No permite trasladar piezas con el ratn en


la vista en perspectiva (3D).

Facilidad de utilizacin del sistema de


mens para las piezas y el modelo en
creacin.

Cdigo cerrado.

Visualizacin de piezas en modo wireframe


(malla).

Compatibilidad con el formato de los


ficheros del paquete LDraw.

Tabla 3.2. Principales pros y contras del MLCAD.


Cabe decir que en prximas versiones del MLCAD se pretende incluir opciones que le permitan tener
capacidad de imprimir listas de piezas, soporte para crear imgenes como fondos a travs de los modelos
as como soporte completo MPD.

UdG

41

Captulo 3. LDraw

3.4.2 LeoCAD

El LeoCAD [2] es un CAD, para plataformas Windows y


Linux, que ayuda al usuario en el diseo de modelos
utilizando como base las conocidas piezas de Lego que le
provee el paquete LDraw [1]. ste CAD fue creado por
Leonardo Zide en el ao 1996.

Figura 3.6. Aplicacin LeoCAD.

Tal y como se comentaba antes para el MLCAD, el LeoCAD permite tambin trasladar y rotar las piezas
con la ayuda del mouse. En lo que se refiere al soporte de las teclas para tales efectos, el LeoCAD lo
implementa de forma parcial.
Una de las principales diferencias que encontramos entre el MLCAD y el LeoCAD es la ausencia de
MPDs en ste ltimo, lo cual provoca que no se puedan utilizar modelos creados con anterioridad para la
formacin de uno de nuevo.
Dentro de las novedades que aporta el LeoCAD podramos destacar tres realmente interesantes:

Minifig Wizard: Esta herramienta permite crear de


forma simple los tpicos muecos de Lego sin tener
que crearlos manualmente, es decir, automatiza la
creacin de los muecos Lego. Cada parte del cuerpo
viene provista de mens que nos permiten elegir
dentro de una variado rango de posibilidades e incluso
seleccionar el color de las mismas (ver Figura 3.7).

Figura 3.7. Imagen del Minifig Wizard.

2 Animacin bsica via Keyframing: ste tipo de animacin sirve principalmente para indicar
los pasos a seguir en la creacin de un cierto modelo, lo cual es de gran ayuda para el resto de
usuarios que pretendan recrear un modelo ya existente. As pues, la informacin creada por el
propio CAD con este tipo de animacin se podr utilizar de forma anloga a las instrucciones de
construccin que se adjuntan con cualquiera de los modelos de Lego que se pueden comprar
actualmente.

42

EPS

CAD Mecnico para piezas Lego

3 Capacidad para exportar a otras herramientas de render y animacin: Aplicaciones tales


como 3DstudioMax, POV-Ray y Alias Wavefront son a las que el LeoCAD permite exportar.
Esta opcin es muy til ya que, despus de crear el modelo deseado, podremos renderizarlo con
alguna de las aplicaciones anteriores y obtener resultados visuales de gran calidad (ver Figura
3.8).

Figura 3.8. Modelo diseado con el LeoCAD y renderizado con POV-Ray.


Las extensiones de ficheros que la aplicacin reconoce son de dos tipos:

DAT para las piezas que integran el paquete LDraw.

LCD para los proyectos creados con el LeoCAD.

Los principales pros y contras de sta aplicacin son:


CONTRAS

PROS

Minifig Wizard.

Excelente posicionamiento
mediante el ratn.

Animacin bsica via Keyframing.

Fcil posicionamiento de la cmara y vistas


mediante la barra de herramientas.

Cdigo open source

de

piezas

Soporte incompleto al sistema original de


teclas de los antiguos editores.

La organizacin de las piezas es un tanto


confusa, aunque el buscador erradica en
parte este defecto.

El renderizado de las piezas podra


mejorar.

Tabla 3.3. Principales pros y contras del LeoCAD.

UdG

43

Captulo 3. LDraw

3.4.3 Limitaciones de los CADs


El principal handicap que tenemos los usuarios al utilizar el LeoCAD [2] y el MLCAD [3] se encuentra,
principalmente, en el instante de ensamblar las piezas, ya que ninguno de los dos posee implementada
sta opcin. Tal laguna influye en dos aspectos importantes:
1

La ergonoma de la aplicacin se ve afectada de forma considerable, ya que al no existir


interaccin fsica entre las piezas, sto provoca que el montaje de un modelo sea bastante ms
complejo y sobre todo incmodo.

La facilidad de uso disminuye, ya que para poder encajar dos piezas hay que rotar
constantemente la cmara para comprovar desde diferentes ngulos que la posicin de las
mismas es la correcta y no se producen superposiciones (ver Figura 3.9).

Figura 3.9. Ejemplo de piezas mal ensambladas.

3.4.4 Eleccin del LeoCAD


El principal motivo que ha hecho decantarse por el LeoCAD [2] para utilizarlo como base para desarrollar
el CAD Mecnico para piezas Lego y no el MLCAD [3] ha sido nica y exclusivamente porque el
primero es open source, es decir, el cdigo del LeoCAD se encuentra disponible para todos los usuarios.
Pero, porqu partir de un CAD ya creado y no comenzar el anlisis, diseo e implementacin de uno
totalmente nuevo?
Esta pregunta tiene una fcil respuesta basada en dos motivos:
1

Lo importante del proyecto era modelar las interacciones entre las piezas y mejorar as la
ergonoma y facilidad de uso de una aplicacin ya existente y por lo tanto, no crear una de
nueva.

44

EPS

CAD Mecnico para piezas Lego

La implementacin de las interacciones entre piezas ya es de por si sola lo suficientemente


compleja y larga como para implementar toda una aplicacin de CAD, ms aun cuando existen
en el mercado algunas de gran calidad pero sin la caracterstica que el proyecto que se ha llevado
a cabo aborda.

Cabe remarcar que en el proyecto se ha utilizado la versin para sistemas operativos Windows del
LeoCAD, principalmente porque la mayora de usuarios poco familiarizados con la informtica utilizan
tal aplicacin por su facilidad de uso, con lo cual, el proyecto podr ser disfrutado potencialmente por un
nmero de usuarios mucho mayor.

UdG

45

Captulo 3. LDraw

46

EPS

CAD Mecnico para piezas Lego

(1 "

"(
)

UdG

47

Captulo 3. LDraw

48

EPS

CAD Mecnico para piezas Lego

ARQUITECTURA DEL LEOCAD

En este captulo se pretende dar a conocer las clases ms importantes utilizadas por el LeoCAD [2] y el
uso que ste realiza de ellas, as como la descripcin del conjunto de libreras externas que el CAD
utiliza. Cabe aclarar que las clases que se presentan en este captulo son las ms importantes pero no
forman ni tan solo la cuarta parte del conjunto de clases que posee el LeoCAD y que por motivos de
volmen de datos, los mtodos y atributos expuestos son nicamente los ms representativos de las
mismas.

4.1

Diagrama de clases

A continuacin se van apresentar las clases ms relevantes para comprender mnimamente como est
estructurado el LeoCAD.

Figura 4.1. Diagrama de clases ms importantes del LeoCAD.

UdG

49

Captulo 4. Arquitectura del LeoCAD

A coninuracin se explica, classe por clase, sus principales utilidades dentro del LeoCAD.
CLASE PROJECT
Esta es la clase ms importante dentro del LeoCAD, tal y como se puede observar en el diagrama de
clases anterior. Es la clase en torno a la cual giran todas las dems. En esta clase se gestionan todas las
caractersticas principales que posee LeoCAD. Como se puede comprobar, la clase Project utiliza la gran
mayora de clases para la gestin de las caractersticas de las que dispone el CAD. Veamos pues, para que
necesita cada una del resto de clases presentes en el diagrama de la Figura 4.1:

Figura 4.2. Clase Porject del LeoCAD.

50

EPS

CAD Mecnico para piezas Lego

Clase Piece. En la clase Project encontramos una lista dinmica simplemente enlazada para
poder gestionar todas las piezas de un modelo. Tal lista se mantiene de la sigiuente forma: la
clase Project sabe cal es la primera pieza del modelo y cada pieza sabe cul es la siguiente, as
hasta que haya una pieza que nos indique que es la ltima de la lista.

Clase PieceInfo. La clase Project necesita crear instancias de la clase PieceInfo para poder
inicializar la informacin de toda pieza instanciada para la creacin de un determinado modelo.

Clase Camera. La clase Camera es utilizada por la clase Project para gestionar los diferentes
puntos de vista que ofrece LeoCAD para la visualizacin de la escena. Para ello, al igual que las
piezas, posee una lista dinmica simplemente enlazada de las cmaras activas.

Clase Light. El LeoCAD permite la introduccin de luces en cualquier modelo. Para su gestin ,
el CAD posee una lista dinmica simplemente enlazada de luces.

Clase Group. La utilizacin de esta clase por parte de la clase Project se debe a la propiedad que
posee LeoCAD de permitir crear grupos de piezas para tratar a un conjunto de ellas como a una
de sola. La estructura de un grupo es una estructura jerrquica en forma de rbol (ver Figura
4.3). Con esto lo que se consigue es que si a un grupo se le aplica algn tipo de transformacin
(rotacin o traslacin), tales transformaciones se le apliquen a todos los elementos que
pertenecen a tal grupo, inclusive a subgrupos pertenecientes a los mismos.
G1

G2

G3

G4

G5
Figura 4.3. Esquema de la estructura de arbol de los grupos en el LeoCAD.

Clase File. Clase utilizada tanto para la lectura de los ficheros de texto DAT del paquete LDraw
[1] (ver Captulo 3. LDraw apartado 3.3 Formato de los ficheros del paquete LDraw) como para
la lectura de los ficheros binarios que utiliza el propio CAD. Hay que destacar que LeoCAD ya
posee una base de piezas Lego almacenadas en formato binario que utiliza por defecto, pero ello
no impide que tambin sea compatible con el paquete LDraw.

UdG

51

Captulo 4. Arquitectura del LeoCAD

LC_UNDOINFO. Esta estructura la utiliza la clase Project para la gestin de la opcin de undo
y el redo de la aplicacin, es decir, para la recuperacin de estados anteriores o posteriores,
siempre que los haya, del estado en el que nos encontremos. El nmero de undos o redos que
gestiona el LeoCAD son treinta.

CLASE OBJECT
Esta clase es la base de toda pieza creada dentro del LeoCAD [2]. De esta clase abstracta derivan las
clases Piece, Light y Camera, las cuales implementan los mtodos que la clase base deja sin implementar
a parte de heredar un conjunto de mtodos y atributos comunes a todo objeto. El motivo de esta jerarqua
de clases es obvio: todo objeto puede ser seleccionado, trasladado, rotado, eliminado, posee una caja
englobante para la deteccin de su seleccin...Un conjunto de propiedades comunes que hacen necesaria
la definicin de una clase base comn a las tres dichas anteriormente.

Figura 4.4. Clase Object del LeoCAD.


Los atributos comunes a todo objeto son: la tipologa del mismo, la informacin referente a la caja
englobante del mismo, as como ciertos atributos para almacenar la informacin referente a un
determinado objeto en un determinado paso de animacin via keyframing (ver Captulo 3. LDraw
apartado 3.4.2 LeoCAD).
Los mtodos comunes a cualquier objeto son: mtodos que permiten conocer la tipologa del objeto (luz,
cmara o pieza), mtodos que permiten leer o escribir informacin referente a objetos de o en ficheros (la
informacin a leer o escribir difiere de un objeto a otro y por eso es virtual), mtodos que gestionan la
parte referente a todo objeto en cuanto a la animacin via keyframing, mtodos para la gestin de las
cajas englobantes, as como mtodos para seleccionar y trasladar objetos. Estos dos ltimos deben ser
obligatoriamente implementados por cada una de las clases que representa a los tres tipos de objetos.

52

EPS

CAD Mecnico para piezas Lego

CLASE CAMERA
Clase que deriva de la clase base Object y que es utilizada por el LeoCAD para la gestin de las cmaras
del LeoCAD. Los atributos ms importantes a destacar de la clase Camera son: la direccin de la cmara,
el estado (visible o no visible), la profundiad mxima y mnima a visualizar y el campo de visin de la
cmara.
En cuanto a los mtodos ms representativos de esta clase tenemos: implementacin de los mtodos
virtuales puros heredados para trasladar y seleccionar una cmara, redifinicin de los mtodos para
almacenar o leer la informacin referente a las cmaras en o de un fichero, mtodos que permiten realizar
diferentes acciones con las cmaras como zooms, rotaciones..., mtodo para renderizar todos los elmentos
dentro del campo de visin de la cmara y tambin posee otros conjuntos de mtodos para saber si la
cmara debe renderizarse o no.

Figura 4.5. Clase Camera del LeoCAD.


CLASE LIGHT
Esta clase, al igual que las clases Piece y Camera, deriva de la clase Object y su existencia dentro de la
jerarqua del LeoCAD se ve justificada debido a la posibilidad de la utilizacin de puntos de luz en la
creacin de modelos. En esta clase se pueden elegir propiedades de la luz como el tipo de la misma
(componente ambiente, difusa y especular de la luz), su posicin y la regin a la que afectar.
En cuanto a los mtodos, toda luz implementa los mtodos que permiten mover (modificar la regin que
afecta la fuente de luz) y seleccionar una luz. A parte encontramos un mtodo que nos informa de si la luz
debe ser visualizada o no en la escena que se est creando, as como los mtodos que nos permiten
inicializar la informacin referente a una luz y renderizar los elementos afectados por la misma.

UdG

53

Captulo 4. Arquitectura del LeoCAD

Figura 4.6. Clase Light del LeoCAD.


CLASE PIECEINFO
Clase utilizada para almacenar y gestionar todas la informacin bsica referente a una pieza.
Los atributos ms importantes de esta clase nos informan del nombre de la pieza, de la descripcin de la
misma, del nmero de grupos a los que pertenece, de las texturas que posee y del nmero de ellas, as
como de la estructura de datos para almacenar la geometra de la pieza.
En cuanto a los mtodos, decir que los ms significativos permiten renderizar la infromacin de la pieza
(su geometra), as como liberar y cargar la informacin referente a ella.

Figura 4.7. Clase PieceInfo del LeoCAD.


CLASE PIECE
Esta clase viene a representar a toda pieza Lego (ver Captulo 2. Piezas y conectores Lego). La clase
Piece deriva de la clase Object. En ella encontramos mtodos y atributos que nos permiten gestionar
cualquier propiedad de las piezas dentro del LeoCAD. Esta clase utiliza la clase PieceInfo para poder
gestionar de forma mucho ms fcil y estructurada toda la informacin referente a ella.
Los atributios ms destacables de esta clase nos definen de la posicin, rotacin, nombre, estado (visible o
no visible), color, as como la informacin de la pieza (PieceInfo).

54

EPS

CAD Mecnico para piezas Lego

En cuanto a los mtodos, tal y como se puede observar implementa los heredados que no lo estaban de la
clase Object (Move y Select), as como reimplementa los mtodos para gestionar la animacin via
keyframing y los mtodos para leero y escribir toda la infromacin referente a una pieza.
Tambin podemo encontrar mtodos para agrupar o desagrupar piezas en o de grupos, as como un
mtodo para inicializar la informacin de la pieza (PieceInfo). Por otro lado tambin existen mtodos ms
triviales como los que actualizan y nos informan del valor de los diferentes atributos de la pieza.

Figura 4.8. Clase Piece del LeoCAD.


CLASE GROUP
Esta clase se utiliza para poder agrupar un conjunto de piezas y poder manejarlas como una de sola. Tal y
como antes se coment es una estructura jerrquica de rbol. Esta clase es una realizacin del patrn
Composite [11]. Tal patrn se basa en componer objetos en estructura de rboles par representar
jerarquas de partes de un todo. El patrn Composite permite tratar objetos individuales y objetos
compuestos de forma uniforme.

Figura 4.9. Clase object del LeoCAD.

UdG

55

Captulo 4. Arquitectura del LeoCAD

Los principales atributos de todo grupo son el nombre dado por el usuario, el centro del grupo de piezas
que lo forman, el prximo grupo de la lista que posee el modelo en construccin y el grupo al que
pertenece el propio grupo, si es que pertenece a otro.
Los mtodos de esta clase nos permiten agrupar y desagrupar as como guardar o leer la informacin
referente a un grupo.
CLASE FILE
La clase File es una clase abstracta que posee los mtodos y atributos comunes a todo fichero, tales como
la lectura y escritura de los mismos. Se utiliza principalmente para el parseo de los ficheros DAT del
paquete LDraw (ver Captulo 3. LDraw), los ficheros LDR (extensin de los ficheros creados con el
LeoCAD) y los binarios del propio LeoCAD.
Como se puede comprobar, la gran mayora de mtodos son virtuales puros [10] y son implementados por
las clases que derivan de File: FileDisk y FileMem. El motivo de ello es claro, ya que las acciones a
realizar para escribir en memoria secundaria (FileDisk) sern diferentes que las que haya seguir para
realizar la misma accin pero en memoria principal (FileMem).

Figura 4.10. Clase File del LeoCAD.

CLASE FILEDISK
Clase que deriva de la clase base File y que se encarga de la lectura y escritura de un fichero en memoria
secundaria o, lo que es lo mismo, de la lectura de ficheros almacenados en el disco duro.

56

EPS

CAD Mecnico para piezas Lego

Figura 4.11. Clase FileDisk del LeoCAD.


CLASE FILEMEM
Clase que deriva, al igual que la clase FileDisk, de la clase abstracta File. Su principal objetivo es la
lectura y escritura de ficheros almacenados en memoria principal o memoria RAM.

Figura 4.12. Clase FileMem del LeoCAD.

4.2

Libreras utilizadas

El LeoCAD a parte de utilizar sus propias libreras tambin realiza uso de otras para diferentes objetivos.
A continuacin se explica las librerias utilizadas y sus principales funcionalidades.

4.2.1 Librera 3dsftk


La libreria 3dsftk (3D Studio File Toolkit) es una librera que proporciona un conjunto de funcionalidades
para la lectura y escritura de ficheros pertenecientes al Autodesk 3D Studio con extensin 3DS. Esta
librera proporciona todos los ficheros necesarios para compilar y debugar las 3dsftk.

UdG

57

Captulo 4. Arquitectura del LeoCAD

4.2.2 Librera jpeglib


Esta librera est formada por un conjunto de ficheros que permiten la gestin, as como la lectura y
creacin de imgenes en formato jpeg.

4.2.3 Librera libpng


Al igual que las libreras jpeglib, la librera libpng nos provee de todas las funcionalidades necesarias para
el tratamiento, lectura y creacin de imgenes en formato png.

4.2.4 Librera zlib


La librera zlib permite la compresin y descompresin de ficheros. La versin utilizada por el LeoCAD
solo permite un mtodo de compresin (deflation). La compresin puede ser realizada en un solo paso si
los buffers son lo suficientemente grandes, o puede realizarse por repetidas llamadas a las funciones de
compresin. La librera tambin soporta la lectura y escritura de ficheros en gzip, con extension GZ, con
una interfaz similar a la que posee la librera stdio.

58

EPS

CAD Mecnico para piezas Lego

UdG

3)

59

Captulo 4. Arquitectura del LeoCAD

60

EPS

CAD Mecnico para piezas Lego

DISEO

5.1

Conceptos previos

Antes de empezar a explicar exhaustivamente todo lo que se refiere al diseo llevado a cabo para
conseguir el objetivo principal del proyecto (ver Captulo 1. Introduccin apartado 1.2 Objetivo: CAD
Mecnico), es necesaria la introduccin de diversos conceptos que sern indispensables para comprender,
sin problemas, lo que en el captulo en el que nos encontramos se aborda.

5.1.1 Definiciones tiles

Pieza dinmica. Es aquella sobre la que se aplican todas las transformaciones, modificando su
rotacin y posicin para que quede perfectamente ensamblada con la pieza esttica con la que
quiere conectar (ver Figura 5.1). Esta es la pieza que se desplaza y cambia de posicin.

Pieza esttica. Es aquella pieza que participa en el proceso de assembling pero sobre la que no
se aplica ningn tipo de transformacin, es decir, es la pieza que resta quieta o esttica en el
proceso (ver Figura 5.1).

Conector dinmico. Es aqul que pertenece a una pieza que asume el papel de dinmica en el
proceso de assembling (ver Figura 5.1).

Conector esttico. Es aqul conector que pertenece a una pieza considerada esttica en el
proceso de assembling (ver Figura 5.1).

Parte dinmica del modelo. Es aquella parte del modelo en construccin que posee a la pieza
dinmica que interviene en el proceso de assembling y a todas las conectadas a ella, tanto de
forma directa como indirecta (ver Figura 5.1). Es la nica parte del modelo que cambia su
configuracin geomtrica.

Parte esttica del modelo. Es aquella parte del modelo que no pertenece a la parte dinmica, es
decir, las piezas que forman el modelo a construir excluyendo las piezas que forman la parte
dinmica del mismo (ver Figura 5.1).

UdG

61

Captulo 5. Diseo

ANTES DEL ASSEMBLING

DESPUS DEL ASSEMBLING

5
4
6
1

Pieza esttica

Conector dinmico

Pieza 3005

Pieza dinmica

Parte esttica del modelo

Pieza 3004

Conector esttico

Parte dinmica del modelo

Pieza 3004

Figura 5.1. Ejemplo de pieza esttica, pieza dinmica, conector esttico, conector dinmico, parte
sttica del modelo y parte dinmica del modelo.

5.1.2 Sistemas de referencia del conector, de la pieza y del mundo


Toda pieza de un determinado modelo tendr su propio sistema de referencia. Anlogamente, todo
conector de una determinada pieza tambin tendr su sistema de referencia propio. El sistema de
referencia del conector lo llamaremos sistema de coordenadas de conector. En cuanto al sistema de
referencia de las piezas lo llamaremos sistema de coordenadas de pieza (ver Figura 5.2).

C2P1

C2P3

( 0, 0, 0)

C2P2

.. .
. .
P2W

C2P4

Brick 1 x 2

..

Centro pieza
Centro Conector j

Figura 5.2. Sistemas de referencia del conector, de la pieza y del mundo de un Brick 1 x 2.

62

EPS

CAD Mecnico para piezas Lego

As pues, para toda pieza i tenemos una matriz P2Wi (Piece To World) y para cada conector j de la pieza i
existe una matriz C2Pij (Connector To Piece).
Para saber las coordenadas de un determinado conector j en el mundo, solo har falta componer las
matrices de dicho conector y la de la pieza i a la que pertenece, de la siguiente forma (ver Figura 5.3):
C2Wij = P2Wi * C2Pij
Hay que dejar claro que el orden al componer las matrices es importante, ya que el producto de las
mismas no es conmutativo. Esquemticamente:
C2P

P2W
W

C2W
Figura 5.3. Esquema de los sistemas de referencia del conector, de la pieza y del mundo, as
como la transicin de uno al otro.
Con este proceso conseguimos que al aplicar transformaciones (traslaciones o rotaciones) a una
determinada pieza, nicamente sea necesaria la actualizacin de la matriz de transformacin P2Wi, con lo
que podemos saber en todo momento las coordenadas de cualquier conector respecto al mundo sin tener
que actualizar constantemente las matrices de todos los conectores de una determinada pieza.

UdG

63

Captulo 5. Diseo

5.1.3 Sistema de referencia de los conectores


Para cada tipo de conector se le ha definido un sistema de referencia que debe ser respetado. A
continuacin se especifica el sistema de referencia asignado a cada tipo de conector (ver Anexo 4.
Sistemas de Coordenadas LDraw y LeoCAD):
Conector

Sistema de Referencia

Conector

Sistema de Referencia

Stud

Stud Inlet

Y
X

Axle

Cylindrical
Hole

Y
Axle Hole

Como se puede comprobar tanto los conectores de tipo Stud como los de tipo Axle tiene su eje Z hacia
fuera del cuerpo del propio conector. Por su parte el resto de conectores, es decir, el Stud Inlet, el Axle
Hole y el Cylindrical Hole, poseen dicho eje en direccin opuesta a los primeros, esta es, hacia el interior
de los propios conectores.

64

EPS

CAD Mecnico para piezas Lego

5.1.4 Hermandad entre conectores


Dentro de los conectores de tipo segmento (ver Captulo 2. Piezas y conectores Lego), nos podemos
encontrar con aquellos que posean hermanos y aquellos que no (ver Figura 5.4 y Figura 5.5).
Hermanos

Pieza 3704
Figura 6.45.

Final2

Inicial2
ZAxle2

Hermanos

Axle2

ZAxle1

Axle1

Axle1

Axle2

Inicial1

Final1
Figura 5.4. Ejemplo de pieza que posee conectores con hermanos y su esquema pertinente.

Pieza 32013
Figura 6.45.
ZAxle1

Axle Hole

Axle

Inicial

Final

Figura 5.5. Ejemplo de pieza con un conector sin hermano y su esquema pertinente.
Diremos que dos conectores comparten el parentesco de hermandad si:
1

Son conectores de tipo segmento.

Pertenecen a la misma pieza.

Son coaxiales.

Son consecutivos, es decir, el punto inicial o final de uno coincide con el punto inicial o final del
otro.

Dos conectores que mantengan una relacin de hermandad debern conocerse, es decir, saber de todos los
conectores de la pieza a la que pertenecen, cuales son. Para ello se ha provisto a todo conector de tipo
segmento que posea hermano de una referencia al conector con el que tiene establecida dicha relacin.
Tal y como se ver en sucesivos apartados, que un conector conozca a su hermano ser fundamental para
llevar a cabo comprobaciones en el proceso de assembling y propagacin del mismo (ver apartado 5.4
Assembling), as como en el proceso de traslacin y deslizamiento de las piezas que posean conectores
disponibles para ello (ver apartado 5.6.2 Comunicacin de la traslacin y 5.6.3 Comunicacin del
deslizamiento).
UdG

65

Captulo 5. Diseo

Cabe destacar que el principal motivo que ha llevado a la introduccin del concepto de hermandad entre
conectores ha sido principalmente el hecho de que es deseable permitir al usuario poder ensamblar
conectores de tipo segmento por ambos lados de los mismos y no obligar a conectar tal tipologa de
conectores siempre por el mismo extremo. Ahora bien, es cierto que se podra haber prescindido del
concepto de hermanos y gestionar internamente la seleccin de uno u otro extremo para llevar a cabo una
cierta conexin. Es precisamente para no tener que introducir una considerable cantidad de cdigo
simplemente para tales fines, que se ha optado por la introduccin del concepto de hermandad entre
conectores de tipo segmento.

5.2

Diagrama de clases

En este apartado se pretende dar a conocer la jerarqua de clases diseada para el proyecto. Pese a todo
hay que aclarar que no se van a exponer todos los mtodos ni atributos de las clases, nicamente se van a
dar a conocer los ms esenciales para comprender sin problemas el resto de apartados de este mismo
captulo, donde se aborda el diseo de todas las caractersticas que posee la aplicacin (para los detalles
ver el Captulo 6. Implementacin). Por este motivo se recomienda al lector referenciarse a esta jerarqua
y conjunto de clases en todo momento.

5.2.1 Clase pieza


Tal como se ha explicado en anteriores captulos (ver Captulo 2. Piezas y conectores Lego) el CAD
Mecnico para piezas Lego utiliza como objetos para modelar las propias piezas de Lego. Por ello es
necesaria una clase que contenga toda la informacin referente a ellas.
La clase pieza ya estaba creada en la aplicacin original (ver Captulo 4. Arquitectura del LeoCAD). En
ella se han aadido diversos atributos y mtodos que son necesarios para el desarrollo del CAD mecnico.
Cabe destacar que en el siguiente esquema solo se muestran los atributos y mtodos ms importantes as
como los aadidos para el presente proyecto.

66

EPS

CAD Mecnico para piezas Lego

La principal labor de la clase pieza ser la de representar al objeto que posee los conectores, que son los
elementos que realmente permiten ensamblarlas.
Ha continuacin se va a porceder a explicar brebemente los atributos y mtodos de la clase Pieza. Para
ms informacin acerca de los mismos ver el Captulo 6. Implementacin.
PRINCIPALES ATRIBUTOS
Todos los atributos aadidos a la clase pieza son atributos privados, ya que es solo dicha clase la que debe
tener acceso a los mismos de forma directa.

P2W. Toda pieza posee una matriz de transformacin 3D en coordenadas de mundo. Tal matriz

nos informa de la rotacin y posicin de la pieza respecto al mundo.

conectoresLibres conectoresOcupados. Cada pieza posee una lista (ver Anexo 8. Lista

genrica) de conectores libres y ocupados para gestionar sus conexiones.

visitada. Flag que nos permitir modificar el estado de la pieza de no visitada a visitada en

los mtodos que lo necesiten.

transformar. Flag que nos informa de si a la pieza se le debe aplicar o no algn tipo de

transformacin.

UdG

transformacion. Matriz a aplicar a la pieza en caso de que el flag transformar est activado.

67

Captulo 5. Diseo

PRINCIPALES MTODOS

bool

assemblingConLazosCadenas(Conector

conectorFinal). Este mtodo le

permite a la pieza detectar posibles lazos y cadenas entre los dos conectores a ensamblar (ver
apartado 5.4.5 Evitar lazos y cadenas).

propagarAssembling(Pieza pieza). Mtodo que busca conexiones secundarias entre los

propios conectores de la pieza esttica y los de la pieza introducida como parmetro, la dinmica
(ver apartado 5.4.7 Propagacin del assembling).

comunicarRotacion(Matriz

R). Mtodo que permite comunicar a la pieza y a las

conectadas a ella, tanto de forma directa como indirecta, la rotacin a llevar a cabo (ver apartado
5.6.1 Comunicacin de la rotacin).

comunicarTraslacion(Vector T). Mtodo que permite comunicar a la pieza y a las

conectadas a ella, tanto de forma directa como indirecta, la traslacin a llevar a cabo (ver
apartado 5.6.2 Comunicacin de la traslacin).

transformar(). Mtodo que aplica la trasformacin realizada anteriormente, rotacin o

traslacin, a la pieza y a las conectadas a ella, tanto directa como indirectamente (ver apartado
5.7 Aplicacin de transformaciones sobre piezas ensambladas).

desconectar(). Mtodo que nos permite desconectar a una pieza de todas sus ensambladas

(ver apartado 5.8.1 Desconexin de conectores y piezas ensambladas).


El resto de mtodos sirven, simplemente, para la gestin de las listas de conectores libres y ocupados de
la pieza de forma externa a ella (ver Anexo 8. Lista genrica).

5.2.2 Jerarqua de clases del conector


Un conector, tal y como se ha comentado en anteriores captulos (ver Captulo 2. Piezas y conectores
Lego), es la parte de todo objeto que nos permite interaccionar con otro. En el proyecto, los objetos son
las piezas y de conectores tenemos de dos tipos: puntuales y de tipo segmento. Precisamente el diseo
realizado se basa en dicha clasificacin, con lo que se ha intentado representar tanto a las conectores de
tipo puntual como a las de tipo segmento mediante las clases que poseen el mismo nombre. Dichas clases
derivan de una base comn para todo elemento que nos permite realizar procesos de assembling. Tal base
es la clase Conector. Esta clase posee todas las funcionalidades comunes a cualquier tipologa de
conector. En el ltimo nivel de herencia observamos que las clases se concretan en los cinco tipos de

68

EPS

CAD Mecnico para piezas Lego

conectores utilizados en el proyecto para demostrar la implementacin del proceso de assembling entre
piezas. El motivo de crear este ltimo nivel es obvio: algunas caractersticas y comportamientos frente a
una situacin son comunes entre conectores de un tipo u otro, pero hay casos, tal y como veremos ms
adelante, en el que dos conectores de la misma tipologa pueden comportarse de forma diferente.
Para la introduccin del concepto de conector dentro del proyecto, se ha creado una jerarqua de clases
siguiendo la distincin de los mismos segn la tipologa a la que pertenecen (ver Captulo 2. Piezas y
conectores Lego). As pues, nos encontramos que tenemos la clase base Conector, que es una clase
abstracta [10]. De ella derivan las clases Puntual y Segmento, que a su vez tambin son abstractas. En el
tercer y ltimo nivel de herencia tenemos a las clases Stud y Stud Inlet que derivan de la clase Puntual y a
las clases Axle, Axle Hole y Cylindrical Hole, que derivan de la clase Segmento. Estas clases no son
abstractas ya que son clases de las cuales podremos realizar una instancia (ver Figura 5.5).

UdG

69

Captulo 5. Diseo

70

EPS

CAD Mecnico para piezas Lego

CLASE CONECTOR
A continuacin se va a proceder a explicar de forma escueta el significado de los atributos y de los
mtodos ms relevantes de la clase Conector. Para ms informacin sobre los atributos y mtodos de esta
clase referenciarse al Captulo 7. Implementacin.
PRINCIAPLES ATRIBUTOS

id. Identificador del conector. Todo conector posee un identificador nico que nos

permite diferenciarle del resto.

nombre. Nombre del tipo de conector. Los valores posibles son: stud, studInlet, axle,

axleHole y cylindricalHole.

C2P. Matriz de transformacin 3D del conector, la cual nos informa de la rotacin y

posicin del conector respecto a la pieza a la que pertenece.

madre. Pieza a la que pertenece el conector.

conectados. Lista de conectores conectados al propio conector (ver Anexo 8. Lista

genrica).

dibujo. Dibujo asociado al conector (ver apartado 5.2.3 Jerarqua de dibujado).

visitado. Flag que le permite al conector modificar su estado de visitado a no

visitado para su utilizacin en mtodos de comunicacin con otros conectores y con la


propia pieza a la que pertenece.
PRINCIPALES MTODOS

virtual bool puedeConectar(Conector con)=0. Mtodo virtual puro [10] que

debe ser implementado en las clases derivadas. Cada tipo de conector decidir si puede
ensamblar con el conector pasado por parmetro, dependiendo de la compatibilidad
entre ambos para ensamblar (ver apartado 5.4.4 Verificacin de compatibilidad entre
conectores).

bool

conLazosCadenasConector(Conector

conectorFinal)

bool

conLazosCadenas(Conector conectorFinal). Mtodos que detectan la

UdG

71

Captulo 5. Diseo

existencia de lazos y cadenas en el proceso de assembling (ver apartado 5.3.5 Evitar


lazos y cadenas).

virtual

assembling(Conector

dinamico)=0. Mtodo virtual puro que

ensambla al conector estico con el dinmico (ver apartado 5.1.1 Definiciones tiles y
apartado 5.4 Assembling). Ser cada tipologa de conector que definir los pasos
necesarios a seguir para ensamblar con el dinmico compatible.

assemblingStudCylindricalHole(Conector dinamico). Mtodo que realiza

los pasos necesarios para ensamblar un conector de tipo Stud con otro de tipo
Cylindrical Hole (ver apartado 5.4 Assembling y Captulo 8 Trabajos futuros y
agradecimientos).

virtual bool

con)=0. Cada uno de los

conexionSecundaria(Conector

conectores implementa este mtodo llevando a cabo las comprobaciones pertinentes


para que se pueda dar como vlida la conexin secundaria entre el conector que llam a
este mtodo y el pasado como parmetro (ver apartado 5.4.7 Propagacin del
assembling).

bool

con). Mtodo

conexionSecundariaStudCylindricalHole(Conector

que devuelve cierto en caso de que la conexin secundaria entre el Stud y el Cylindrical
Hole sea posible (ver apartado 5.4.7 Propagacin del assembling y Captulo 8 Trabajos
futuros y agradecimientos).

virtual

comunicarRotacion(Matrix

comunicarRotacionConector(Matrix

R).

R)

Mtodos

virtual

que

permiten

la

comunicacin en el proceso de comunicacin de rotaciones de piezas ensambladas (ver


apartado 5.5.1 Comunicacin de la rotacin). Estos mtodos son virtuales debido a que
algunas clases necesitan reimplementarlo, con lo que al llamar este mtodo se ejecute el
suyo propio y no el de la clase Conector.

virtual

comunicarTraslacion(Vector

comunicarTraslacionConector(Vector

T).

Mtodos

T)

que

permiten

la

comunicacin en el proceso de comunicacin de traslacin de piezas ensambladas (ver


apartado 5.5.2 Comunicar la traslacin). Estos mtodos son virtuales debido a que
algunas clases necesitan reimplementarlo.

72

EPS

CAD Mecnico para piezas Lego

transformar()

tranformarConector().

Mtodos

que

habilitan

la

comunicacin de los conectores en el proceso de transformacin de piezas ensambladas


(ver apartado 5.6 Aplicacin de transformaciones sobre piezas ensambladas).

virtual deslizar(Vector T). Mtodo que permite al conector intervenir en el

proceso de deslizamiento de una pieza que tenga conectores en disposicin de ello (ver
apartado 5.5.3 Comunicacin del deslizamiento).

virtual init(Diccionario d). Mtodo que permite inicializar al conector con la

informacin necesaria (ver apartado 5.9 Parser).

desconectar() desconectarConector(Conector con). Mtodos que nos

permiten, dado un conector, desconectarlo de todos sus conectados (primer mtodo) o


de un de solo (segundo mtodo) (ver apartado 5.8.1 Desconexin de conectores y piezas
ensambladas).

introducirConector(Conector con). Introduce al conector con en la lista


de conectores conectados (ver Anexo 8. Lista genrica).

5.2.3 Clase Simbolo


La clase abstracta Simbolo es la clase que utiliza cada conector para dibujar el smbolo que desea en el
momento en el que es seleccionado, tanto para ensamblar como para ser desensamblado. Todo conector
tendr una referencia a un objeto de la clase Simbolo. Ser en el momento en que el conector sea creado
que, dependiendo del tipo que sea, realizar una instancia de alguna de las subclases que derivan de dicha
superclase.
Como se puede comprobar, el nico contenido de dicha jerarqua de clases es el mtodo que renderiza el
smbolo adecuado alrededor del conector. Tal mtodo no se encuentra implementado en la clase base
Simbolo, ya que sern las clases Cuadrado, Circulo y Cruz que lo implementarn dependiendo del
smbolo a renderizar.

UdG

73

Captulo 5. Diseo

El motivo de haber creado esta sencilla jerarqua de clases, en vez de introducir dichos mtodos en la
propia clase Conector, se debe a que con este diseo lo que conseguimos es independizar el dibujado de la
seleccin del conector, del propio conector, con lo que en un futuro si queremos aadir nuevos smbolos
para nuevos conectores bastar con aadir una nueva subclase que derive de Simbolo sin modificar en
absoluto la clase conector. De la misma manera, podremos crear nuevos conectores reutilizando los
dibujos ya existentes, sin la necesidad de crear una correspondencia uno a uno entre conectores y
smbolos.

Cruz

Circulo

Cuadrado

Figura 5.6. Figuras dibujadas al llamar al mtodo dibujar.

74

EPS

CAD Mecnico para piezas Lego

5.3

Assembling

5.3.1 Qu es?
El assembling se podra definir como el proceso por el cual dos objetos se conectan de la misma manera
que lo haran fsicamente en el mundo real. En el caso del proyecto realizado, los objetos que
interaccionan entre s son las piezas, que mediante sus conectores (ver Captulo 2. Piezas y conectores
Lego) ensamblan unas con otras.

5.3.2 Pasos para realizar el assembling


Para llevar a cabo el assembling, mediante los conectores de los que vienen provistas las piezas Lego, hay
que realizar los siguientes pasos, en el orden prestablecido:
1

Seleccin de conectores a ensamblar.

Verificacin de compatibilidad entre conectores.

Evitar lazos y cadenas.

Realizacin del assembling.

Propagacin del assembling

5.3.3 Seleccin de conectores a ensamblar


El primer paso para poder realizar el assembling es el de decidir que conectores se implicarn en la
conexin que se pretenda llevar a cabo. Para esto, solo ser necesario seleccionar los dos conectores a
ensamblar.
Cuando el usuario selecciona una pieza, LeoCAD [2] detecta la pieza seleccionada creando una recta r a
partir del punto de observacin (o eje en el caso de perspectiva isomtrica) y del punto donde clic el
usuario en la pantalla, calculada en el espacio 3D. Esta recta r se intersectar con la caja englobante
(bounding box) de las piezas que se encuentren en su camino. Basta con elegir la primera pieza que sea
intersectada por la recta r.
Partiendo de este sistema, la seleccin del conector ms cercano de una pieza concreta por parte del
usuario, se ha realizado calculando la distancia mnima al cuadrado d2 [8] (ver Anexo 7. Disntancia Punto
Recta) entre los conectores Ci libres de la pieza y la recta r creada por LeoCAD, siendo el conector
seleccionado por el usuario el que tenga la menor distancia al cuadrado entre el conector Ci y la recta r
d2min (Ci,r).

UdG

75

Captulo 5. Diseo

Los motivos que han llevado a la utilizacin de la distancia al cuadrado en vez de la distancia
convencional han sido dos:
1

No es necesario el valor concreto de la distancia entre el conector Ci y la recta r, una funcin


de ella que sea estrictamente creciente es suficiente a efectos prcticos.

Debido a la asiduidad con la que se lleva a cabo la seleccin de conectores y al gran nmero
de conectores libres que puede llegar a tener una cierta pieza, este proceso debe ser lo ms
rpido posible. As pues, con el valor de la distancia mnima al cuadrado evitamos el clculo
de las races cuadradas.

5.3.4 Verificacin de compatibilidad entre conectores


Tal y como se ha descrito en captulos anteriores de la memora (ver Captulo 2. Piezas y conectores
Lego), los conectores que abarca el proyecto son el Stud, Stud Inlet, Axle, Axle Hole y el Cylindrical
Hole. No todos ellos ensamblan entre si, por lo que a continuacin se muestra un cuadro resumen donde
se especifica que conectores pueden llevar a cabo el proceso de assembling, es decir, que conectores son
compatibles para conectarse entre si:
Stud

Stud Inlet

Stud
Stud Inlet

Axle

Cylindrical Hole
2

1
1

Axle

Axle Hole
Cylindrical Hole

Axle Hole

3
2

Tabla 5.1. Compatibilidad entre conectores. Observar que la matriz es simtrica respecto a la diagonal.

A continuacin se muestran ejemplos de los assemblings posibles entre los conectores existentes (ver
Captulo 2. Piezas y conectores Lego).

76

EPS

CAD Mecnico para piezas Lego

Figura 5.8. Assembling Stud Cylindrical Hole.

Figura 5.7. Assembling Stud Stud Inlet.

Figura 5.10. Assembling Axle Cylindrical Hole.

Figura 5.9. Assembling Axle Axle Hole.

Para llevar a cabo la verificacin de compatibilidad, cada conector posee un mtodo que le permite saber
si puede conectar con otro conector, o lo que es lo mismo, si es compatible la conexin entre ambos.

Conector

virtual bool puedeConectar(Conector con)=0;

ste mtodo no posee implementacin ni en la clase abstracta Conector ni en las derivadas directamente
de ella (Puntual y Segmento), con lo que debe ser implementado por cada uno de los conectores, tanto los
de tipo segmento como los de tipo puntual, ya que cada uno de ellos sabr con que conector es compatible
para poder llevar a cabo un proceso de assembling.
Como ejemplo, un conector de tipo Stud implementara dicho mtodo de verificacin de la conexin con
otro de una forma muy similar a la siguiente:

UdG

77

Captulo 5. Diseo

Stud

bool puedeConectar(Conector con)


return ((con.obtenerNombre()==studInlet) or
(con.obtenerNombre()==cylindricalHole));

Los conectores de tipo Stud al ser compatibles con los conectores de tipo Stud Inlet y con los de tipo
Cylindrical Hole, devolvera cierto en tales casos y falso en el resto.

5.3.5 Evitar lazos y cadenas


Dado los dos conectores dinmico CD y esttico CS (ver apartado 5.1.1 Definiciones tiles) con los que se
pretenda llevar a cabo un proceso de assembling, definiremos al primero como el conector inicial Ci y al
segundo como el conector final Cf. Anlogamente tendremos a la pieza inicial Pi y la pieza final Pf, que
son las piezas a las que pertenecen Ci y Cf respectivamente.
Para todo conjunto de piezas ensambladas se puede definir implcitamente un grafo no dirigido de
assembling GA (ver Figura 5.11). En tal grafo de assembling GA tendremos los nodos, que representan las
piezas, y las aristas, que representan la existencia de assembling entre ellas.
As pues, un assembling ser posible, a parte de porque los dos conectores sean compatibles para
ensamblar, si se cumplen las siguientes condiciones:
1

No existen lazos en la pieza inicial Pi. Esto quiere decir que el conector inicial y el conector
final no son el mismo conector y por lo tanto no se intenta ensamblar el conector inicial con l
mismo o lo que es equivalente, que los dos conectores a ensamblar no pertenecen a la misma
pieza.

No existen cadenas entre la pieza inicial Pi y la pieza final Pf. La existencia de cadenas entre
la pieza inicial y la final implica que no se pueda llevar a cabo el assembling, ya que se intenta
ensamblar dos piezas que ya estn conectadas directa o indirectamente, tal y como puede verse
en el ejemplo de la Figura 5.10, donde las piezas A y D estn conectadas mediante la pieza B y
la C.

78

EPS

CAD Mecnico para piezas Lego

Conector inicial Ci

A2

A1

A3
Brick 1 x 1

B1
B
B2
D1
D3

GRAFO DE ASSEMBLING GA
A1,A2,A3,A4

Brick 1 x 2

A4
C1

C
C2
D2
D

A
B1,B2

C1,C2

Brick 1 x 1

D1,D2,D3,D4

Brick 1 x 2

D4

Conector final Cf

Pieza
Conexin entre piezas

Figura 5.11. Ejemplo de posible assembling con cadenas y de su grafo de assembling implcito GA.
El conector Ci (A1) no puede conectarse con Cf (D3) porque existe una cadena que nos permite
llegar de uno a otro pasando slo por conectores conectados.
Para llevar a cabo el proceso de deteccin de lazos y cadenas, solo har falta preguntarle a la pieza a la
que pertenece el conector inicial, involucrado en el proceso de conexin, si existe algn lazo o cadena
entre tal pieza y el conector final, es decir, si puedo llegar del conector inicial al final pasando por las
conexiones directas o indirectas entre las piezas Pi y Pf. Desde el cuerpo del CAD Mecnico para piezas
Lego tendramos:
...
if(not piezaInicial assemblingConLazosCadenas(conectorFinal)) return true;
else return false;

La pieza inicial llevar a cabo la deteccin de lazos y cadenas de la siguiente forma: Si no ha sido
visitada, le modificamos su estado para que en futuras llamadas a este mtodo de la misma pieza no
vuelva a realizar los clculos, con lo que evitamos que si una pieza est conectada a ms de otra, pueda
entrar en un bucle infinito donde las llamadas entre piezas conectadas que intentan encontrar lazos y
cadenas, no cesaran. A continuacin se pasa a comprobar si el conector final Cf existe como conector
libre en la pieza actual. Si es as, entonces si existir un lazo o cadena, ya que es posible llegar del
conector inicial Ci al conector final Cf. Por el contrario tendremos que buscar si desde los conectores
ocupados de la pieza actual existe una cadena hasta el conector final.

UdG

79

Captulo 5. Diseo

Pieza

bool assemblingConLazosCadenas(Conector conectorFinal)


Conector conActual;
bool cadena=false;
if(not visitada)
{
visitada=true;
if(conectoresLibres.Existe(conectorFinal)) cadena=true;
else
{
for each conActual in conectoresOcupados and not cadena do
{
if(conActual.conLazosCadenasConector(conectorFinal)) cadena=true;
}
}
}
return cadena;

Cabe aclarar que no se pretenden buscar todas las posibles cadenas entre Pi y Pf, sino que, tan solo con
encontrar una, ya podremos afirmar que el assembling no se puede llevar a cabo. Esto se puede ver
perfectamente en el ejemplo expuesto en la Figura 5.11, ya que hay dos cadenas de Pi=A a Pf =D:
(ABD ) y (ACD). As pues, si encontramos la cadena (ABD) no har falta seguir buscando la
cadena (ACD) y viceversa, ya que podremos asegurar que al menos existe una cadena de la pieza
inicial a la pieza final.
En lo que respecta a cada conector ocupado de la pieza, preguntar a cada uno de los conectores
conectados a l, si existe una lazo o cadena con el conector final.
Conector

bool conLazosCadenasConector(Conector conectorFinal)


Conector conActual;
bool cadena=false;
for each conActual in conectados and not cadena do
{
if(conActual.conLazosCadenas(conectorFinal) cadena=true;
}
return cadena;

80

EPS

CAD Mecnico para piezas Lego

Cada uno de los conectores conectados le preguntar a la pieza a la que pertenece si el conector final
existe como conector libre y por lo tanto si existe un lazo o cadena. De esta manera volveramos a repetir
el proceso descrito anteriormente para toda pieza hasta obtener la confirmacin o no de la existencia de
lazos y/o cadenas en la conexin a realizar.

Conector

bool conLazosCadenas(Conector conectorFinal)


return madre.assemblingConLazosCadenas(conectorFinal);

Hay que destacar que despus de llevar a cabo la comunicacin expuesta entre piezas y conectores para la
deteccin de lazos y cadenas hay que volver a modificar el estado de las piezas participantes en dicho
proceso a no visitada, para as poder volver a aplicar dicha comprobacin posteriormente.
Para acabar de comprender el proceso de deteccin de lazos y cadenas, a continuacin se adjunta el
diagrama de secuencia que describira el ejemplo de la Figura 5.10.

UdG

81

Captulo 5. Diseo

Como se puede observar la pieza A recibe el mensaje para comprobar si existe un lazo o cadena entre el
conector inicial y el final. Esta modifica su estado a visitada y comprueba si el conector final existe en su
lista de conectores libres. Debido a que D3 no se encuentra en dicha lista, la pieza A le pregunta a sus
conectores ocupados si a travs de sus conectados se produce algn lazo o cadena. El primer conector de
la pieza A en recibir el mensaje es el conector A3. Este le pregunta al conector conectado a l, el B1, si
existe un lazo o cadena. El conector B1 propaga el mensaje hacindole la misma pregunta a la pieza a la
que pertenece. La pieza B vuelve a realizar el mismo proceso que inici la pieza A. La pieza B modifica
su estado a visitada y comprueba si existe el conector final dentro de sus conectores libres. Como D3 no
se encuentra como conector libre de B, sta le pregunta al conector ocupado B1 por la existencia de lazos
y cadenas. El conector B1 propaga el mensaje hacia A3, que es el conector conectado a l. ste ltimo
realiza la misma pregunta, pero a la pieza a la que pertenece. La pieza A no realizar ninguna operacin
debido a que ya ha estado visitada y por lo tanto de momento no se habr encontrado ningn lazo ni
cadena.
A continuacin la pieza B pregunta por la existencia de lazos y cadenas al conector B2, su otro conector
ocupado. ste se lo pregunta al conector conectado a l, el D1, y el conector D1 propaga el mensaje a la
pieza D. La pieza D modifica su estado a visitada, debido a que no lo ha sido anteriormente y comprueba
la existencia de D3 como conector libre suyo. El conector D3 se encuentra en la lista de conectores libres
de D y entonces el proceso finaliza, ya que hemos encontrado un lazo independientemente de los otros
posibles que puedan existir.

5.3.6 Realizacin del assembling


En este apartado se va a explicar ampliamente las transformaciones a aplicar a la pieza dinmica y al resto
de parte dinmica del modelo en construccin (ver aparatado 5.1.1 Definiciones tiles), para que pueda
ensamblar mediante sus conectores con la pieza esttica del mismo.
Tal y como se ha comentado en anteriores apartados (ver apartado 5.4.4 Verificacin de compatibilidad
entre conectores) no todos los conectores que ha abarcado el proyecto ensamblan entre si. As pues, a
continuacin se definen los pasos posibles a realizar para que los conectores compatibles ensamblen
correctamente (No todos son necesarios en todos los tipos de conexin):

82

Paso A. Coincidencia de Normales.

Paso B. Coincidencia de posiciones.

Paso C. Coincidencia en forma de cruz.

Paso D. Acomodar los conectores.

Paso E. Actualizacin de la lista de conectores conectados.

Paso F. Actualizacin de la lista de conectores libres y ocupados de las piezas.

Conexin

Actualizacin

EPS

CAD Mecnico para piezas Lego

Tal y como se puede comprobar a continuacin en la explicacin de cada uno de los paso descritos, los
pasos A, B, C y D son pasos que podramos llamar de conexin y los pasos E y F son pasos de
actualizacin. Mientras los primeros llevan a cabo los cculos pertinentes para cumplir el proceso de
assembling, los segundos actualizan correctamente las listas de conectores conectados para un
determinado conector y las de conectores libres y ocupados para una determianda pieza.
Hay que aclarar que el orden de las transformaciones es estricto, es decir, que no conmutan, porque las
respectivas matrices tampoco lo hacen.
PASO A. COINCIDENCIA DE NORMALES.
Dado el conector esttico CS, el conector dinmico CD y sus respectivas piezas PS y PD, podemos obtener
w

sus normales en coordenadas de mundo (world) NS y ND de la siguiente forma (ver Figura 5.12):
w

NS

ND

CD

PS

0
c
w
NS = S2W * NS = S2W * 0
1

PD

CS
0
w
c
ND = D2W * ND= D2W * 0
1
Pieza 3005

Pieza 3005

Pieza 3004

Figura 5.12. Normales en coordenadas de mundo del conector esttico y del conector dinmico. Vista lateral.
donde D2W = PD2W * D2PD y S2W = PS2W * S2PS (ver apartado 5.1.2 Sistemas de referencia del
conector, de la pieza y del mundo).
Hay que aclarar que en vez de utilizar la matriz S2W para transformar las normales deberamos utilizar la
inversa traspuesta (S2W-1)T de la misma. El motivo de no hacerlo se debe a que no se realizan ni
traslaciones ni cambios de escala (slo rotaciones), lo cual nos permite utilizar la matriz de tranformacin
S2W.
A continuacin hay que realizar dos pasos muy importantes:
1

Calcular el producto vectorial PV = ND

NS . El producto vectorial entre las normales del

conector dinmico y del esttico nos dar como resultado un vector perpendicular a ambas.
2

Calcular el ngulo (

w
w
ND , NS ) . Con este segundo paso obtendremos el ngulo entre

ambas normales, que realizaremos alrededor de PV.


UdG

83

Captulo 5. Diseo

Una vez obtenido el vector producto vectorial PV y el ngulo , tenemos la rotacin a aplicar a la pieza
dinmica PD y a las conectadas a ella, tanto directa como indirectamente, en forma de vector y ngulo de
rotacin alrededor suyo (ver Figura 5.13).

ND

NS

.
w

PV = ND

ND

ND
Pieza 3005
Figura 6.45.
Pieza 3004

NS

Figura 5.13 Vector PV y ngulo entre (

w
w
ND , NS ).

Para poder aplicar tal rotacin a las matrices de las piezas, necesitamos transformar la representacin
vectorial de la rotacin a su representacin matricial mediante la frmula de Rodrigues (ver Anexo 5.
Rotaciones y Frmula de Rodrigues), debido a la representacin interna de la rotacin de las piezas
utilizada por el propio LeoCAD [2] mediante un vector y un ngulo de rotacin. Una vez obtenida tal
matriz, solo hace falta aplicarla a la pieza dinmica PD y a las conectadas a sta ltima, tanto de forma
directa como indirecta (ver apartado 5.5 Transformaciones a ralizar sobre piezas ensambladas).
Con todo esto, tendremos la pieza dinmica y las conectadas a ella en una rotacin que cumple que las
normales de los conectores esttico y dinmico coinciden (ver Figura 5.14).
w

ND '

w
NS

PD
PS

(xD,yD,zD)
Pieza 3005
Pieza 3005
Pieza 3004

(xS,yS,zS)

Figura 5.14. La

NS y la ND 'son el mismo vector con la nica diferencia de su origen. Vista lateral.

Cabe destacar que los ejes X e Y del conector esttico y dinmico no tienen porqu coincidir, con lo que
conseguimos mantener la rotacin original de tales ejes para el conector dinmico y por lo tanto no los
modificamos (ver Figura 5.15).

84

EPS

CAD Mecnico para piezas Lego

ND '

(xS,yS,zS)

XD

PS

NS

YD

PD

YS

(xD,yD,zD)

Pieza 3005
Pieza 3005
Pieza 3004

XS

Figura 5.15. La

son el mismo vector con la nica diferencia de su origen. Vista 3D.


NS y la ND '

PASO B. COINCIDENCIA DE POSICIONES.


Para que el conector esttico CS y el dinmico CD se encuentren en la misma posicin POSCS = POSCD,
simplemente ser necesario aplicar una traslacin T a la pieza dinmica y a las conectadas a ella, tanto
directa como indirectamente (ver apartado 5.6 Traslacin de piezas ensambladas). Tal traslacin T la
obtendremos restando la posicin del conector dinmico a la del conector esttico.
T = POSCS POSCD
Con ello tendremos el vector traslacin T que habr que aplicar (ver Figura 5.16).
w

ND '

NS

POSS (xS,yS,zS)

POSD (xD,yD,zD)
Pieza 3005
Pieza 3005
Pieza 3004

Figura 5.16. Vector traslacin T a aplicar a la pieza dinmica. Vista lateral de la posicin inicial.

Una vez realizado este paso, tendremos el conector dinmico y el esttico en la misma posicin, tal y
como muestra la Figura 5.17.

UdG

85

Captulo 5. Diseo

NS ND '

(xS,yS,zS) = (xD,yD,zD)

Pieza 3005
Pieza 3005
Pieza 3005
Figura 5.17. Conector esttico y dinmico en la misma posicin. Vista lateral de la posicin final.

PASO C. COINCIDENCIA EN CRUZ.


Dado un conector de tipo Axle Hole (ver Figura 5.18) y otro de tipo Axle (ver Figura 5.98), despus de
pasar por los pasos A y B anteriormente descritos, los tendremos tal y como se muestra en las Figura
5.20.

Y
Y

ND

w
NS

X
Figura 5.18. Pieza 32064 con un
conector de tipo AxleHole.

X
Figura 5.19. Pieza 3704 con un conector
de tipo Axle.

PS

Pieza 32064
Pieza 3704

PD
Figura 5.20. Piezas dinmica PD y esttica PS despus de aplicar los pasos A y B de assembling.

86

EPS

CAD Mecnico para piezas Lego

Tal y como se puede comprobar en la figura anterior, los ejes XS e YS del conector esttico deben coincidir
con los XD e YD del conector dinmico o diferenciarse en una rotacin de 90, 180 o 270 para que el
assembling en forma de cruz, entre ambos conectores, sea posible.
Para que se cumpla ( XS,YS ) =

0, 90, 180, 270

( XD, YD ) simplemente hace falta llevar a cabo un proceso

muy similar al que se ha descrito en el paso B. Lo nico que har falta ser calcular el mnimo ngulo min
entre el eje XD y el XS, -XS, YS y el YS (ver Figura 5.21). Hay que aclarar que el proceso tambin se
podra llevar a cabo con el eje YD, ya que fijando uno de los dos automticamente se fijara el otro.

= min

Figura 5.21. ngulo min calculado entre el eje XD y los XS, -XS, YS y el YS.
El motivo de calcular el ngulo min ms pequeo de los cuatro mencionados, es debido a que de esta
forma modificaremos la rotacin original de la pieza dinmica, y como consecuencia, la rotacin de las
piezas conectadas a ella tanto directa como indirectamente, lo menos posible.
Con el ngulo min, el vector producto vectorial PV = ( XD, Ejemin ) entre el eje XD y el eje del mnimo
ngulo min, y la frmula de Rodrigues (ver Anexo 5. Rotaciones y Frmula de Rodrigues), podremos
crear la rotacin a aplicar a la pieza dinmica PD y a las conectadas a ella, tanto directa como
indirectamente (ver apartado 5.5 Transformaciones a realizar sobre piezas ensambladas), para que se
cumpla ( XS,YS ) = 0, 90, 180, 270 ( XD, YD ) (ver Figura 5.22).

.
PV = ( XS, Ejemin )

min S

XD

Figura 5.22. Vector PV y el ngulo min a partir de los cuales podremos crear la matriz de rotacin a
aplicar a la pieza dinmica y a las conectadas a ella, tanto de una forma directa como indirecta.

UdG

87

Captulo 5. Diseo

PASO D. ACOMODAR LOS CONECTORES.


Una vez que se han llevado a cabo los pasos A, B y C, y slo en los casos que lo requieran (en general en
conectores de tipo segmento), hay que acabar de acomodar los dos conectores.
Dado un conector esttico CS y otro de dinmico CD en las combinaciones Axle Axle Hole y Axle
Cylindrical Hole (ya que este paso de assembling solo se realiza en tales casos) habr que acomodar
S

ambos conectores. Para ello solo se deber elegir la longitud mnima Lmin = min ( Llibre , Llibre ) entre la
longitud libre de los dos conectores que participan en el proceso de asssembling (ver Figura 5.23).

CD

Pieza 32064
Pieza 3704
CS

Llibre

Llibre

Ltotal

Ltotal

Figura 5.23. Seleccin de la longitud mnima Lmin, entre los dos conectores a ensamblar.
Vista lateral. Comparar con la Figura 5.23.
Una vez elegida la longitud mnima Lmin, solo har falta aplicar una traslacin T(Lmin) a la pieza dinmica
y a las conectadas a ella, tanto de forma directa como indirecta (ver apartado 5.5 Transformaciones a
realizar sobre piezas ensambladas). Tal traslacin tiene la peculiaridad que se tendr que realizar en el
eje Z del conector esttico. Para los dos casos en el que se aplica el paso en el que nos encontramos, el
vector T sera el siguiente:

T = ( 0, 0,-Lmin ) en el caso de que el conector esttico sea un Axle, ya que el eje Z+ va hacia
fuera del conector (ver apartado 5.1.3 Sistema de referencia de los conectores) y nosotros
queremos acomodar el conector dinmico hacia dentro del conector esttico, que en este caso
sera un Axle, y por lo tanto lo acomodaramos en la direccin contraria.

T = ( 0, 0, Lmin ) en el caso de que el conector esttico sea un Axle Hole o un Cylindrical Hole,
ya que el eje Z+ va hacia dentro de dichos conectores del conector (ver apartado 5.1.3 Sistema de
referencia de los conectores) y lo que queremos es acomodar el conector dinmico en tal
direccin.

Una vez aplicada la traslacin T, tendramos a los conectores tal y como se muestra en la Figura 5.24.

88

EPS

CAD Mecnico para piezas Lego

CD

Pieza 32064
Pieza 3704
CS

Llibre
Figura 5.24. Ejemplo de piezas despus de aplicar el paso D. Vista lateral. Comparar con la Figura 5.22.
PASO E. ACTUALIZACIN DE LA LISTA DE CONECTORES CONECTADOS.
Despus de haber realizado los pasos de assembling necesarios para cada tipo de conexin entre
conectores, hay que actualizar las listas de conectores conectados de los dos que han intervenido en el
ensamblaje. Simplemente hay que introducir en la lista de conectores conectados del conector esttico el
conector dinmico, y viceversa.
Con esto, sabremos en cada momento que conectores estn conectados a uno de determinado (ver Figura
5.25).

Stud Inlet

Pieza 3005

Stud

Pieza 3005

Figura 5.25. Todo conector conoce en todo momento los conectores conectados a l. Vista lateral.

PASO F. ACTUALIZACIN DE LA LISTA DE CONECTORES LIBRES Y OCUPADOS DE


LAS PIEZAS.
Este ltimo paso se basa en actualizar las listas de conectores libres y ocupados de las piezas que han
intervenido en el proceso de assembling. Lgicamente, todo conector que se vea involucrado en un
proceso de conexin se convertir automticamente en un conector ocupado (ver captulo 2. Piezas y
conectores Lego). Como consecuencia de esto, los conectores que han ensamblado debern comunicar a
sus respectivas piezas que deben ser introducidos en las listas de conectores ocupados y a la vez
eliminados de las listas de conectores libres.

UdG

89

Captulo 5. Diseo

Una vez especificados todos los pasos de assembling necsarios para que dos piezas, mediante sus
conectores, ensamblen de forma correcta vamos a determinar, para cada posible asembling entre cada par
de conectores, cuales de dichos pasos se deben realizar y cuales no. Hay que destacar que los pasos de
assembling no conmutan, ya que las matrices de las piezas tampoco, y por lo tanto debe seguirse el orden
prestablecido.
As pues tendremos, para las cuatro posibles conexiones identificadas en el proyecto, los siguientes pasos:

Stud Stud Inlet.


Paso A. Coincidencia de normales.
Paso B. Coincidencia de posiciones.
Paso E. Actualizacin de la lista de conectores conectados.
Paso F. Actualizacin de la lista de conectores libres y ocupados de las piezas.

Stud Cylindrical Hole


Paso A. Coincidencia de normales.
Paso B. Coincidencia de posiciones.
Paso E. Actualizacin de la lista de conectores conectados.
Paso F. Actualizacin de la lista de conectores libres y ocupados de las piezas.

Axle Axle Hole


Paso A. Coincidencia de normales.
Paso B. Coincidencia de posiciones.
Paso C. Coincidencia en forma de cruz.
Paso D. Acomodar los conectores.
Paso E. Actualizacin de la lista de conectores conectados.
Paso F. Actualizacin de la lista de conectores libres y ocupados de las piezas.

Axle Cylindrical Hole


Paso A. Coincidencia de normales.
Paso B. Coincidencia de posiciones.
Paso D. Acomodar los conectores.
Paso E. Actualizacin de la lista de conectores conectados.
Paso F. Actualizacin de la lista de conectores libres y ocupados de las piezas.

Todos estos pasos necesarios para llevar a cabo la conexin entre dos conectores, se podran llevar a cabo
de la siguiente forma:

90

EPS

CAD Mecnico para piezas Lego

Conector

virtual void assembling(Conector dinamico)=0

La clase Conector posee un mtodo virtual puro [10], con el objetivo de que cada tipologa de ellos
realice los pasos necesarios, segn con el conector con el que vaya a ensamblar.
Conector

void assemblingStudStudInlet(Conector dinamico)


coincidenciaNormales(dinamico);
coincidenciaPosiciones(dinamico);
actualizarConectoresConectados(dinamico);
dinamico.actualizarConectoresConectados(this);
actualizarListasPieza();
dinamico.actualizarListasPieza();

En la clase Conector tenemos un mtodo llamado assemblingStudStudInlet que realiza los pasos
necesarios para ensamblar conectores Stud y Stud Inlet entre si. El motivo de poner este mtodo en la
clase base Conector se debe a que es utilizado tanto por un conector de tipo puntual como es el Stud, as
como el conector de tipo Segmento Cylindrical Hole, que cabe recordar que puede ensamblar con
conectores de tipo Stud y por lo tanto se comporta como un Stud Inlet en dicho caso.

Stud

void assembling(Conector dinamico)

Figura 5.26. Ejemplo de assembling


Stud Stud Inlet.

assemblingStudStudInlet(dinamico);

Figura 5.27. Ejemplo de assembling


Stud Cylindrical Hole.
UdG

91

Captulo 5. Diseo

El conector de tipo Stud solo puede ensamblar con el Stud Inlet y con el Cylindrical Hole. Debido a que
los pasos para conectar al Stud con cualquiera de sus dos compatibles para ensamblar son exactamente los
mismos, simplemente ser necesario realizar la llamada al mtodo indicado.
Stud Inlet

void assembling(Conector dinamico)


assemblingStudStudInlet(dinamico);

Figura 5.28. Ejemplo de assembling


Stud Stud Inlet.
Por su parte, el Stud Inlet, debido a que solo puede ensamblar con conectores de tipo Stud, solo deber
llamar al mtodo que realiza los pasos de assembling necesarios para conectar a un determinado Stud
Inlet con un conector de tipo Stud.

void assemblingAxleAxleHole(Conector dinamico)


coincidenciaNormales(dinamico);
coincidenciaPosiciones(dinamico);
coincidenciaCruz(dinamico);
acomodarConectores(dinamico);
actualizarConectoresConectados(dinamico);
dinamico.actualizarConectoresConectados(this);
actualizarListasPieza();
dinamico.actualizarListasPieza();

Segmento
void assemblingAxleCylindricalHole(Conector dinamico)
coincidenciaNormales(dinamico);
coincidenciaPosiciones(dinamico);
acomodarConectores(dinamico);
actualizarConectoresConectados(dinamico);
dinamico.actualizarConectoresConectados(this);
actualizarListasPieza();
dinamico.actualizarListasPieza();

Figura 5.29. Ejemplo de assembling


Axle Axle Hole.
92

Figura 5.30. Ejemplo de assembling


Axle Cylindrical Hole.
EPS

CAD Mecnico para piezas Lego

Dentro de la clase Segmento encontramos dos mtodos: Uno de ellos el que se encarga de la conexin
entre el Axle y el Axle Hole, y otro que ensambla a un conector de tipo Axle con otro de tipo Cylindrical
Hole.
Axle

void assembling(Conector dinamico)


if(dinamico.obtenerNombre()==axleHole)
{
assemblingAxleAxleHole(dinamico);
}
else
{
assemblingAxleCylindricalHole(dinamico);
}

El conector Axle solo deber preguntar por la tipologa del conector con el que se va a ensamblar y llamar
al mtodo necesario.
Axle Hole

void assembling(Conector dinamico)


assemblingAxleAxleHole(dinamico);

En el caso del Axle Hole, y al igual que ocurre con el Stud Inlet, solo hace falta llamar el mtodo que se
encarga de la conexin entre el propio conector y su compatible, es decir, el Axle, ya que solo ensambla
con los de este tipo.
Cylindrical Hole

void assembling(Conector dinamico)


if(dinamico.obtenerNombre()==stud)
{
assemblingStudCylindricalHole(dinamico);
}
else
{
assemblingAxleCylindricalHole(dinamico);
}

Para un conector de tipo Cylindrical Hole hay que preguntar qu tipo de conector compatible con l se le
intenta ensamblar y actuar en consecuencia llamando al mtodo correspondiente.

UdG

93

Captulo 5. Diseo

5.3.7 Propagacin del assembling


Despus de realizar el assembling entre el conector esttico CS y el conector dinmico CD pueden
aparecer, como resultado del propio assembling, nuevas conexiones entre los conectores de la parte
dinmica del modelo en construccin y los conectores de la parte esttica (ver Figura 5.31).

Stud
Inlet

Stud
Inlet

Conectores ensamblados
por el usuario

Pieza 3004
Pieza 3004
Conectores a propagar el
assembling

Stud

Stud

Figura 5.31. Ejemplo de conexin resultante de la realizacin del assembling entre dos
conectores. Vista lateral.
Como consecuencia de este hecho, que es lo que se ha denominado propagacin del assembling, hay
que detectar posibles nuevas conexiones como resultado de una de previa.
Las conexiones que son realizadas explcitamente por el usuario, es decir, las que intervienen el conector
dinmico y el esttico a ensamblar, las denominaremos conexiones principales y las conexiones
resultantes de las principales las llamaremos conexiones secundarias.
As pues, el objetivo de la propagacin del assembling, ser el de encontrar posibles conexiones
secundarias entre la parte dinmica y esttica del modelo que se est creando (ver apartado 5.1.1
Definiciones tiles).
Para poder dar como vlida a una conexin secundaria se deben cumplir unas condiciones, que tal y como
se puede comprobar son las mismas que se exigen par poder llevar a cabo el proceso de assembling. La
diferencia radica en que ahora nicamente hace falta comprobar dichas condiciones y en el momento de
ensamblar hay que llevarlas a cabo. Veamos pues, cuales son las condiciones:

94

Condicin A. Igualdad de normales.

Condicin B. Igualdad de posiciones.

Condicin C. Longitud libre Cylindrical Hole

Condicin D. Coaxialidad.

Condicin E. Coincidencia de segmentos.

Condicin F. Segmento libre.

Condicin G. Coincidencia en cruz.

longitud Stud.

EPS

CAD Mecnico para piezas Lego

CONDICIN A. IGUALDAD DE NORMALES.


Para saber si dos conectores poseen la misma normal hay que realizar los siguientes pasos:
1

Convertir la normal del primer conector C1 y del segundo conector C2 a coordenadas de mundo
(ver apartado 5.1.2 Sistemas de coordenadas del conector, de la pieza y del mundo).
C

donde

N1 = ( 0, 0, 1 )

donde

N2 = ( 0, 0, 1 )

N1 = C12W * N1
N2 = C22W * N2
2

Normalizar ambas normales.

Comprobar que N1 es igual a N2.

N1 = N2

Con estas premisas podremos asegurar que ambos conectores poseen la misma normal.
CONDICIN B. IGUALDAD DE POSICIONES.
Esta condicin se basa en comprobar que los dos conectores a ensamblar, como resultado de una
conexin secundaria, se encuentran en la misma posicin. Dos conectores C1 y C2 se encuentran en la
misma posicin si POSC1 = POSC2.
CONDICIN C. LONGITUD LIBRE CYLINDRICAL HOLE >= LONGITUD STUD.
En el caso de la propagacin del assembling entre dos conectores, uno de ellos de tipo Stud y otro de tipo
Cylindrical Hole, hay que comprobar que la longitud libre del Cylindrical Hole sea como mnimo, igual a
la longitud del Stud, la cual es constante, cosa que en el caso del Cylindrical Hole no tiene por que ser as.
Para realizar tal comprobacin solo har falta calcular la distancia mnima de todas las distancias entre el
punto inicial del Cylindrical Hole y el de los conectores conectados a l. Si la distancia mnima de todas
ellas es ms grande o igual a la longitud del stud entonces si se verificar esta condicin, en caso
contrario no (ver Figura 5. 32)

UdG

95

Captulo 5. Diseo

Stud

Axle

Stud

Axle

Axle

CH CH

Axle

CH CH

Longitud libre < Longitud Stud


Cylindrical Hole

Longitud libre >= Longitud


Cylindrical Hole
Stud

Pieza 32064

Pieza 3704

Figura 5.32. Ejemplos donde se cumple la premisa de la condicin C (derecha) y donde no (izquierda).
CONDICIN D. COAXIALIDAD.
Dos conectores sern coaxiales, si el eje Z de ambos es el mismo (ver Figura 5.33).

C1

. 1.

Eje coaxial

Z1

C2
Pieza 3704

Pieza 32064

Figura 5.33. Ejemplo de conectores coaxiales. Vista lateral.


Para ello, solo har falta obtener el punto inicial y final del primer conector I1, F1 y el punto inicial del
segundo conector I2. Con esto, tendremos que calcular la distancia mnima [8] entre el punto I2 y la recta
formada por r (I1, F1). Si tal distancia es nula, entonces podremos decir que los dos conectores son
coaxiales, en caso contrario, los conectores no lo sern (ver Figura 5.34).

96

EPS

CAD Mecnico para piezas Lego

C1

. 1.

Eje coaxial

Z1

C2

F1

I1

I2

Figura 5.34. Clculo de la distancia entre la recta r ( I1, F1 ) y el punto I2. Vista lateral
CONDICIN E. COINCIDENCIA DE SEGMENTOS.
Despus de saber si los conectores son coaxiales hay que comprobar que el segmento del primer conector
se encuentre posicionado sobre el segmento del segundo conector o viceversa (esta condicin solo se
exige en assemblings secundarios entre conectores de tipo segmento), ya que dos conectores sean
coaxiales no nos garantiza que se encuentren el uno sobre el otro (ver Figura 5.35).

C1

. Z1

. Z1

Eje coaxial

C2
Pieza 32064

Pieza 3704

Figura 5.35. Ejemplo de conectores coaxiales pero que no coinciden en el espacio. Vista lateral.
As pues, tenemos que calcular la superposicin de los segmentos S1 y S2 que forman los conectores C1 y
C2 respectivamente (ver Figura 5.36). Para ello vamos a realizar unos pasos previos que facilitarn en
gran medida dichos clculos.

C1
Pieza 32064
Pieza 3704

C2
F1

S1

I1

I2

S2

F2

Figura 5.36. Segmentos S1 y S2 resultantes, de los conectores C1 y C2, respectivamente. Vista lateral.
UdG

97

Captulo 5. Diseo

Primer paso. Obtenemos el segmento S1 perteneciente al conector C1, en coordenadas del


propio conector. Tal segmento ser S1 = [ 0, L1 ] , donde L1 es la longitud de dicho conector.

Segundo paso. Obtenemos el segmento de C2 en coordenadas del conector C1. Para obtener tal
segmento tenemos que llevar a cabo los siguientes pasos:
1

Obtener la matriz W2C1 = ( C2W1 )-1.

Componer las matrices W2C1 y C22W para obtener la matriz de transformacin de


coordenadas del conector C2 al conector C1.

C22C1 = W2C1 * C22W

Tercer paso. Ahora ya estaremos en disposicin de crear el segmento S2 del segundo conector,
para comprobar la superposicin o no de C1 y C2.
Z

S2 = [ A2, B2 ] donde,
Z

A2 es la componente Z del vector resultante (componente del eje coaxial) de componer el punto
inicial del segundo conector y la matriz de transformacin del segundo al primer conector
Z

A2 = C22C1 * I2 , y B2 es la componente Z del vector resultante de componer el punto final del


Z

segundo conector y la matriz de transformacin del segundo al primer conector B2 = C22C1 * F2

Cuarto paso. Comprovar la superposicin de los segmentos S1 y S2.

En resumen, el mtodo que se encargara de la verificacin de la condicin en la que nos encontramos


sera el que se muestra a continuacin:
Segmento

bool coincidencia(Conector con)


Matrix C2W;
SEGMENTO S1,S2;
C2W=obtenerC2W();
S1=obtenerSegmento();
S2=con.obtenerSegmento(C2W-1);
return (entre(S1, S2) or entre(S2, S1));

98

EPS

CAD Mecnico para piezas Lego

Como se puede comprobar, los dos segmentos se superponen si son el mismo segmento o si uno est
parcial o totalmente dentro del otro. En el caso en que solo coincida un extremo entre ambos conectores
los segmentos no se superpondrn. En el resto de casos tampoco. As pues, la funcin coincidencia
devolver cierto en los casos 1

y falso en los casos 2

, tal y como se puede comprobar en la Figura

5.37.
S1

S1

S2

S2

S2

S1

S1

S1

S2

S2

S1
S2

S1
S2

S1

S2

Figura 5.37. Casos en los que dos conectores coinciden y casos en los que no.
Con todos estos pasos previos evitamos realizar clculos de superposicin de segmentos en tres
dimensiones, los cuales seran bastante ms complejos, con lo que acabamos trabajando con una nica
componente perteneciente al eje Z que es el eje coaxial, la cual nos facilita mucho la verificacin de la
condicin.
CONDICIN F. SEGMENTO LIBRE.
Una vez que nos hemos asegurado que los segmentos que forman los conectores se superponen, hay que
comprobar que tal superposicin se realice sobre la parte libre del conector.
Para resolver esta condicin tendremos, para los dos conectores en los que estamos buscando conexiones
secundaria, que:
1

Comprobar que el segmento formado por el primer conector C1 no coincida con ninguno de los
conectores conectados a C2.

UdG

99

Captulo 5. Diseo

Comprobar que el segmento formado por el segundo conector C2 no coincida con ninguno de los
conectores conectados a C1.

Con esto lo que evitamos es que dos conectores, que pueden conectar a un mismo conector, se ensamblen,
ya que estaran ocupando la misma posicin y por lo tanto superponindose.
CONDICIN G. COINCIDENCIA EN CRUZ.
Para comprobar si el ngulo entre los ejes X1 de un conector C1 y el X2, -X2, Y2, -Y2 es 0, 90, 180 o 270
hay que:
1

Obtener el eje X1, el X2 y el Y2 en coordenadas de mundo. Cabe destacar que no hace falta
calcular X2 y Y2, ya que con X2 y Y2 podemos obtenerlos fcilmente.
w

X1 = C2W1 * X1 = C2W1 *

X2 = C2W2 * X2 = C2W2 *
2

1
0
0
1
0
0

Y2 = C2W2 * Y2 = C2W2 *

0
1
0

Obtener el mnimo ngulo entre min (angulo( X1,X2 ), angulo( X1, -X2 ), angulo( X1, Y2 ),
angulo( X1, -Y2 ) ).

Comprobar que el ngulo mnimo min, encontrado anteriormente, sea uno de los que producen
que se ensamble en forma de cruz, es decir, 0, 90, 180, 270, ya que esta condicin nicamente
se exige entre la conexin secundaria Axle Axle Hole.

Hay que aclarar que, al igual que el proceso de assembling, no todas las condiciones se deben cumplir
para cada posible conexin secundaria entre cada par de conectores secundarios. Veamos pues, cules se
necesitan para cada conexin entre conectores:

Stud Stud Inlet


Condicin A. Igualdad de normales.
Condicin B. Igualdad de posiciones.

100

EPS

CAD Mecnico para piezas Lego

Stud Cylindrical Hole


Condicin A. Igualdad de normales.
Condicin B. Igualdad de posiciones.
Condicin C. Longitud libre Cylindrical Hole >= longitud Stud.

Axle Axle Hole


Condicin D. Coaxialidad en el eje Z.
Condicin E. Coincidencia de segmentos.
Condicin F. Segmento libre.
Condicin G. Coincidencia en cruz.

Axle Cylindrical Hole


Condicin D. Coaxialidad en el eje Z.
Condicin E. Coincidencia de segmentos.
Condicin F. Segmento Libre.

Todos estos pasos necesarios para llevar a cabo las conexiones secundarias entre dos conectores
compatibles, se podran llevar a cabo de la siguiente forma:
Tal y como se ha comentado en este mismo apartado, deberemos intentar propagar el assembling, es
decir, buscar conexiones secundarias entre la parte dinmica y esttica (ver apartado 5.1.1 Definiciones
tiles) del modelo en construccin.

void propagarAssembling()
ListaPieza piezaDinamicas, piezasEstaticas;
Pieza actualDinamica, actualEstatica, actual;
piezasDinamicas=parteDinamicaModelo();
piezasEstaticas=parteEstaticaModelo();
for each actualDinamica in piezasDinamicas do
{
for each actualEstatica in piezasEstaticas do
{
actualDinamica.propagarAssembling(actualEstatica);
}
}
for each actual in piezasModelo do
{
actual.actualizarListasConectores();
}

UdG

101

Captulo 5. Diseo

Para llevar a cabo la propagacin del assembling, primero deberemos obtener la lista de piezas que
forman la parte dinmica del modelo y la lista de piezas que forma la parte esttica del mismo. A
continuacin hay que buscar conexiones secundarias entre cada par de piezas (piezaDinamica,
piezaEstatica), donde piezaDinamica es una pieza perteneciente a la parte dinmica y piezaEstatica es
una pieza de la parte esttica del modelo en construccin.
En los casos en los que se hayan detectado conexiones secundarias se debern actualizar las listas de los
conectores conectados de cada uno de los implicados en dicha conexin, as como las listas de conectores
libres y ocupados de sus respectivas piezas.
Cabe comentar que esta ltima accin, la de actualizacin de las listas de conectores libres y ocupados de
las piezas involucradas, no se realiza a la vez que actualizamos las listas de conectores conectados al
encontrar una conexin secundaria, ya que un conector de tipo segmento puede ensamblar con ms de un
conector al mismo tiempo. Si actualizaramos las listas de conectores libres y ocupados de las respectivas
piezas para un conector de tipo Axle, por ejemplo, al encontrar una sola conexin secundaria con otro
conector compatible a l se eliminara de la lista de conectores libres, pasando a la de conectores
ocupados de su pieza y por lo tanto ya no podramos propagar ms el assembling con dicho conector.

Pieza

void propagarAssembling(Pieza pPieza)


Conector con1, con2;
for each con1 in conectoresLibres do
{
for each con2 in conectoresLibres from pPieza do
{
if(con1.puedeConectar(con2) and con1.conexionSecundaria(con2))
{
con1.introducirConector(con2);
con2.introducirConector(con1);
introducirConectorOcupado(con1);
pPieza.introducirConectorOcupado(con2);
}
}
}

Cuando una pieza desea buscar conexiones secundarias entre ella y otra dada, deber intentar propagar el
assembling entre cada par de conectores de ambas piezas. Esto se basa en verificar la compatibilidad entre
los dos conectores a conectar y las propiedades de conexiones secundarias para cada par de conectores.

102

EPS

CAD Mecnico para piezas Lego


Conector

virtual bool conexionSecundaria(Conector con)=0

La comprobacin de la conexin secundaria entre dos conectores se ha llevado a cabo de la siguiente


forma: La clase abstracta Conector posee un mtodo virtual puro [10] llamado conexionSecundaria
que devolver cierto en caso de que tal conexin sea posible y falso en caso contrario. Este mtodo, al ser
virtual puro, debe ser implementado en cada una de las clases que derivan de la clase Puntual y
Segmento, que a su vez son abstractas.
Conector

bool conexionSecundariaStudStudInlet(Conector con)


return (igualdadPosiciones(con) and igualdadNormales(con));

En la clase Conector se encuentra el mtodo que confirma la conexin entre un Stud y cualquiera de sus
dos conectados: el Stud Inlet y el Cylindrical Hole. Hay que destacar que el mtodo recibe el nombre del
primer tipo de conexin secundaria (Stud Stud Inlet) debido a que cuando se intenta propagar el
assembling entre un conector de tipo Stud y uno de Cylindrical Hole consideramos que ste ltimo se
comporta como un Stud Inlet, debido a que debe cumplir exactamente las mismas condiciones que para el
caso Stud Stud Inlet.
Segmento

bool conexionSecundariaAxleAxleHole(Conector con)


return (coaxiales(con) and coincidenciaSegmentos(con)
and segmentoLibre(con) and coincidenciaCruz(con));

Ya en la clase segmento, nos encontramos con los mtodos que utilizarn la clase Axle, Alxe Hole y
Cylindrical Hole para verificiar las conexiones secundarias correspondientes.

UdG

103

Captulo 5. Diseo
Segmento

bool conexionSecundariaAxleCylindricalHole(Conector con)


return (coaxiales(con) and coincidenciaSegmentos(con)
and segmentoLibre(con));

En el ltimo nivel de herencia, cada tipo de conector solo deber llamar a cada mtodo de verificacin de
la conexin secundaria, dependiendo de los conectores que se pretendan propagar. En el caso de la
conexin secundaria entre el Stud y el Cylindrical Hole hay que observar que aparte de preguntar por la
validacin de la conexin secundaria se verifica que la longitud libre del Cylindrical Hole sea ms grande
o igual que la del Stud, la cual es constante a diferencia de la del Cylindrical Hole que puede variar.
Stud

bool conexionSecundaria(Conector con)


if(con.obtenerNombre()==StudInlet)
{
return conexionSecundariaStudStudInlet(con);
}
else //Cylindrical Hole
{
return (conexionSecundariaStudStudInlet(con) and
suficienteLongitudLibre());
}

Donde suficienteLongitudLibre es obtenerLongitudLibre()

LONGITUD_STUD.

Un conector de tipo Stud Inlet, debido a que solo ensambla con el conector de tipo Stud, preguntar
nicamente por la posibilidad de la conexin secundaria con dicho conector.

Stud Inlet

bool conexionSecundaria(Conector con)


return conexionSecundariaStudStudInlet(con);

104

EPS

CAD Mecnico para piezas Lego

El conector de tipo segmento Axle preguntar por el tipo de conector con el que se le intenta propagar y
actuar en consecuencia llamando al mtodo de verificacin de conexiones secundarios correspondiente.

Axle

bool conexionSecundaria(Conector con)


if(con.obtenerNombre()==axleHole) return conexionSecundariaAxleAxleHole(con);
else return conxeionSecundariaAxleCylindricalHole(con);

El Axle Hole nicamente deber verifcar si la propagacin de la conexin con el conector de tipo Axle es
vlida o no, ya que solo ensambla con tal conector.
Axle Hole

bool conexionSecundaria(Conector con)


return conexionSecundariaAxleAxleHole(con);

El Cylindrial Hole, de forma anloga al Stud y al Axle, preguntar por a tipologa del conector con el que
se le intenta ensamblar para llamar al mtodo pertinente. Fijarse que en el caso de la propagacin con un
conector de tipo Stud, hay que comprobar que la longitud libre del Cylidrical Hole sea como mnimo la
misma que la longitud del Stud.
Cylindrical Hole

bool conexionSecundaria(Conector con)


if(con.obtenerNombre()==stud)
{
return (conexionSecundariaStudStudInlet(con)
and suficienteLongitudLibre()));
}
else return conexionSecundariaAxleCylindricalHole(con);

UdG

105

Captulo 5. Diseo

5.4

Transformaciones a realizar sobre piezas ensambladas

Sobre toda pieza que se encuentre ensamblada con otra u otras, se le puede llevar a cabo tres grandes
tipos de transformaciones:
1

Rotaciones. Debido a que las piezas se encuentra fsicamente conectadas, rotar (ver apartado
5.6.1 Comunicacin de la rotacin) una pieza ensamblada supone rotar tambin todas las
conectadas, tanto de forma directa como indirecta, a las primera que se rot.

Traslaciones. Al igual que las rotaciones, trasladar (ver apartado 5.6.2 Comunicacin de la
traslacin) una pieza ensamblada, supone trasladar a su vez las piezas conectadas a ella, tanto
directa como indirectamente.

Deslizamientos. Toda pieza que se encuentre en disposicin de deslizar (ver apartado 5.6.3
Comunicacin del deslizamiento) debe a su vez deslizar todas los piezas conectadas a ella,
directa o indirectamente, excepto sobre la que se encuentra realizando el proceso de
deslizamiento.

Las tres transformaciones descritas se pueden dividir en dos grandes fases:

Fase 1. Fase de comunicacin de la transformacin. Esta fase es la parte no comn a los tres
tipos de transformaciones y es en la que se le comunicar a todas las pieza ensambladas, tanto
directa o indirectamente, a la pieza que originalmente se la pretenda rotar, trasladar o deslizar;
que a posteriori se les aplicar una de las tres posibles transformaciones. Con esta primera fase
solo se pretende informar a las propias piezas, cuales de ellas van a ser rotadas, trasladadas o
deslizadas posteriormente (ver apartado 5.5 Comunicacin de transformaciones sobre piezas
ensambladas).

Fase 2. Fase de aplicacin de la transformacin. Esta fase es comn a los tres tipos de
transformaciones posibles y se basa en aplicar la transformacin realizada sobre las piezas a la
que se les ha comunicado (ver apartado 5.6 Apliacacin de transformaciones sobre piezas
ensambladas).

Cabe aclarar que el motivo de separar la comunicacin de las transformaciones a realizar de la aplicacin
de las mismas. La razn se basa en que si aplicramos las transformaciones durante la comunicacin nos
encontraramos en momentos en que existieran piezas transformadas y no transformadas al mismo
tiempo, lo que nos perjudicara en los clculos de deteccin de colisiones, ya que estaramos mezclando
datos de piezas rotadas, trasladadas o deslizadas con piezas que an no lo han sido y por lo tanto dichos
clculos no seran reales.

106

EPS

CAD Mecnico para piezas Lego

5.5

Comunicacin de transformaciones sobre piezas ensambladas

Esta es la primera fase a llevar a cabo en toda transformacin (rotacin, traslacin y deslizamiento) que se
aplique sobre una pieza ensamblada a otra u otras. Esta fase se puede clasificar en:
1

Comunicacin de la rotacin.

Comunicacin de la traslacin.

Comunicacin del deslizamiento

5.5.1 Comunicacin de la rotacin


El proceso de comunicacin de rotaciones a piezas ensambladas se produce de la siguiente forma:
Pieza

comunicarRotacion(Matrix R)
Conector ocupado;
if(not visitada)
{
visitada=true;
transformada=true;
transformacin=R;
for each ocupado in conectoresOcupados do
{
ocupado.comunicarRotacionConector(R);
}
}

Toda pieza que desee rotarse primero modificar su estado a visitada, para que en futuras llamadas de
comunicacin de rotacin a la pieza, sta no lleve a cabo ninguna operacin, con lo que evitamos posibles
bucles infinitos provocados por sucesivas llamadas de comunicacin de rotacin entre piezas conectadas.
A continuacin la pieza pone el flag transformada a cierto y guarda la rotacin R, para que
posteriormente en el proceso de transformacin de piezas ensambladas (ver apartado 5.7 Transformacin
de pieza ensambladas), dicha rotacin le sea aplicada. Para finalizar, la pieza le comunicar a todos sus
conectores ocupados que tienen que llevar a cabo el proceso de comunicacin de la rotacin R.

UdG

107

Captulo 5. Diseo

Conector

virtual comunicarRotacionConector(Matrix R)
Conector actual;
for each actual in conectados do
{
actual.comunicarRotacion(R);
}

Cuando los conectores reciben tal mensaje, actan en consecuencia. Esto es, comunicar a todos sus
conectores conectados que tiene que comunicar la rotacin.
Conector

virtual comunicarRotacion(Matrix R)
madre.comunicarRotacion(R);

Este ltimo mensaje de comunicacin de rotacin entre conectores, es diferente al mensaje que utiliza la
pieza para comunicarse con sus conectores ocupados, ya que con el primero lo que conseguimos es que
cada conector que recibe un mensaje de comunicacin de rotacin a travs de un conector conectado a l,
informe a la pieza a la que pertenece que tiene que llevar a cabo el proceso de comunicacin de la
rotacin R y con el segundo lo que conseguimos es que la pieza comunique tal rotacin a sus conectores
ocupados.
Este proceso se repetir hasta que todas las piezas conectadas, tanto de forma directa como indirecta a la
primera a la que se rot, sean visitadas y por lo tanto sepan que posteriormente seran rotadas.
Cabe comentar dos aspectos importantes:
1

Una vez aplicado el proceso de comunicacin de rotacin de piezas ensambladas, habr que
volver a modificar el estado, tanto de la pieza rotada originalmente como el de las conectadas a
ella, de forma directa o indirecta, a no visitada. Con esto lo que conseguimos es que despus de
comunicar la rotacin a una pieza ensamblada, podamos volver a comunicrselo sin perder las
conexiones.

108

EPS

CAD Mecnico para piezas Lego

La rotacin a almacenar en las piezas ensambladas, tanto directa como indirectamente, a la pieza
a la que originalmente se le aplica la rotacin, es diferente de la que se le aplica a sta ltima. La
diferencia radica en que a las conectadas directa o indirectamente hay que rotarlas respecto al
centro de la primera pieza que se rot, ya que si no sucederan cosas como las que se muestran
en la Figura 5.38.

Pieza 3005
Pieza 3004

Correcto

Pospieza

Piezas conectadas rotadas respecto al


centro de la pieza rotada originalmente.

Incorrecto

Piezas conectadas rotadas


respecto a su propis centro.

Figura 6.38. Ejemplo de rotacin de piezas ensambladas de forma correcta e


incorrecta. Vista lateral.
Para conseguir que tal rotacin se realice respecto al centro de la pieza que originalmente se rot,
tendremos que aplicar la siguiente matriz de rotacin R:

R = M centro + * Rotacion * M centro donde

UdG

R es la matriz de rotacin a aplicar a la primera pieza a rotar.

M centro + =

1
0
0
0

0
1
0
0

0
0
1
0

PosXpieza
PosYpieza
PosZpieza
1

M centro - =

1
0
0
0

0
1
0
0

0
0
1
0

-PosXpieza
-PosYpieza
-PosZpieza
1
109

Captulo 5. Diseo

PECULIARIDADES
La comunicacin de la rotacin de piezas ensambladas mediante conectores Axle-Cylindrical Hole es el
nico caso que hay que diferenciar y destacar del resto. Dicho caso se caracteriza, en que el conector de
tipo Axle (ver Captulo 2. Piezas y conectores Lego) puede rotar libremente sobre un conector de tipo
Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego), y viceversa, siempre y cuando la rotacin se
produzca en el eje Z de los conectores, es decir, en el eje coaxial del assembling (ver apartado 5.4.7
Propagacin del assembling) entre ambos (ver Figura 5.39).
1

Figura 5.39. Secuencia de rotacin que muestra como el Axle puede rotar libremente sobre el
Cylindrical Hole.

As pues, la excepcin en lo que se refiere al comportamiento de los conectores en la comunicacin de


rotaciones de piezas ensambladas hasta ahora explicada, la encontramos en el conector de tipo Cylindrical
Hole. Dicho conector ver redefinidos los mtodos que todo conector posee para comunicar la rotacin,
siendo la nica diferencia la comprobacin del eje en el que se realiza dicha rotacin. Si la rotacin se
lleva a cabo en el eje Z del conector, ste no propagar la comunicacin y por lo tanto ni la pieza a la que
pertenece ni las conectadas a sta directa o indirectamente, sern rotadas. En caso contrario, si propagar
la comunicacin de rotacin recibida y por lo tanto se la transmitir la rotacin R a sus conectores
conectados o a la pieza a la que pertenece el Cylindrical Hole, dependiendo del mtodo.
Es ahora que se puede comprender el porqu de la definicin del mtodo comnicarRotacion y
comunicarRotacionConector, dentro de la clase Conector como virtual: La clase Cylindrical
Hole necesita redefinirlo, ya que su comportamiento en relacin a dicho mtodo, es diferente que el del
resto de conectores.

110

EPS

CAD Mecnico para piezas Lego

Segmento

Cylindrical Hole

comunicarRotacionConector(Matrix R)

comunicarRotacion(Matrix R)

if(not rotarEjeZ(R))
{
Segmento::comunicarRotacionConector(R);
}

if(not rotarEjeZ(R))
{
Segmento::comunicarRotacion(R);
}

Para comprobar si la rotacin se est realizando en el eje Z del conector hay que llevar a cabo los
siguientes pasos:
1

Obtener el punto inicial Iw y el final Fw del conector, en coordenadas de mundo (ver apartado
5.1.2 Sistemas de referencia del conector, de la pieza y del mundo).

Iw = C2W * Ic

donde

Fw = C2W * Fc

donde

Iw es el punto inicial del conector en coordenadas de mundo.


Ic es el punto inicial del conector en coordenadas de conector.
C2W = P2W * C2P.

Fw es el punto final del conector en coordenadas de mundo.


Fc es el punto final del conector en coordenadas de conector.
C2W = P2W * C2P.

Aplicarle a la matriz P2W de la pieza a la que pertenece el conector, la rotacin R.


P2WR = R * P2W

Volver a obtener el punto inicial y final del conector en coordenadas de mundo, una vez aplicada
la rotacin a la matriz de la pieza.
IwR = C2WR * Ic donde

UdG

IwR es el punto inicial del conector en coordenadas de mundo.


Ic es el punto inicial del conector en coordenadas de conector.
C2WR = P2WR * C2P.

111

Captulo 5. Diseo

FwR = C2WR * Fc donde

FwR es el punto final del conector en coordenadas de mundo.


Fc es el punto final del conector en coordenadas de conector.
C2WR = P2WR * C2P.

Una vez realizados estos tres pasos previos, solo har falta comprobar que el punto inicial y final del
conector, antes y despus de la rotacin, sean el mismo.
Segmento

bool rotarEjeZ(Matrix R)
return((Iw == IwR) and (Fw = FwR));

Cabe comentar, que el motivo de realizar la comprobacin utilizando dos puntos, el inicial y final del
conector, en vez de uno de solo se debe a que podemos tener rotaciones que se realicen respecto al punto
del conector seleccionado para realizar la comprobacin y por lo tanto tendramos que la rotacin se est
llevando a cabo en el eje Z del conector, cuando realmente no es as. Por el contrario, con los dos puntos
del conector, evitamos tal problema.
EJEMPLO
Veamos el ejemplo de la Figura 5.40 para comprender la problemtica que supone comunicar la rotacin
de una pieza ensamblada y la solucin utilizada.

Figura 5.40. Ejemplo de rotacin de una pieza ensamblada.

112

EPS

CAD Mecnico para piezas Lego

Las piezas que interviene en la rotacin son las que se muestran a continuacin:

A2

A1

B1

B3

Pieza
3704

Conector
A1
A2

Tipo Conector
Axle
Axle

Pieza
6541

Conector
B1
B2
B3
B4

Tipo Conector
Stud
Stud Inlet
Cylindrical Hole
Cylindrical Hole

Pieza
32064

Conector
C1
C2
C3
C4
C5
C6

Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet
Axle Hole
Axle Hole

B1

B3

B4

B4
B
B2

B2

C1 C2

C5

C6

C1

C5
C3

C3 C4

C2

C6
C4

Tal y como se puede comprobar, la pieza A est conectada a la pieza B y C mediante sus dos conectores
de tipo Axle. Ms en concreto, el Axle A1 est conectado al Axle Hole C5 y el Axle A2 est conectado al
Cylindrical Hole B3 y B4.
El diagrama de secuencia asociado sera el que se muestra a continuacin:

UdG

113

Captulo 5. Diseo

La pieza A recibe el mensaje que le informa que debe iniciar el proceso de comunicacin de rotacin.
sta modifica su estado a visitada, actualiza el flan transformada a cierto y almacena la rotacin R para
acabar comunicando a sus conectores ocupados que deben informar de dicha rotacin. El primer conector
en recibir tal mensaje es el A1, que le comunicar a sus conectados, en este caso el conector C5, que debe
informar de la rotacin que se pretende llevar a cabo. ste se lo comunicar a su vez a la pieza C, que es a
la que pertenece, y tal pieza iniciar el proceso de comunicacin de rotacin. La pieza C cambia su estado
a visitada, actualiza su flag para saber, posteriormente, que debe ser transformada, guarda la rotacin R y
le comunica a su conector ocupado C5 que debe propagar la comunicacin de rotacin a los conectores
conectados a l. A continuacin el conector A1 recibe dicha propagacin y se lo comunica a su pieza, la
A. sta como ya ha sido visitada con anterioridad no realiza ningn tipo de operacin. Siguiendo con el
proceso, a la pieza A le falta por propagar la comunicacin de la rotacin mediante su otro conector
ocupado A2. ste enva el mensaje a los conectores conectados a l. En este caso, el B3 y el B4. Tanto el
primero como el segundo, al recibir la propagacin del mensaje de comunicacin de rotacin, debido a
que pertenecen a la tipologa de los conectores Cylindrical Hole, comprueban si la rotacin R se realiza en
su eje Z. Como dicha rotacin se lleva a cabo en el eje Z de los Cylindrical Hole, ambos no la propagan y
por lo tanto la pieza B, que es a la que pertenecen tanto B3 como B4, no se ver rotada.

114

EPS

CAD Mecnico para piezas Lego

5.5.2 Comunicacin de la traslacin


El proceso de comunicacin de la traslacin de piezas ensambladas es anlogo al de la comunicacin de
la rotacin (ver apartado 5.6.1 Comunicacin de la rotacin):
Pieza

comunicarTraslacion(Vector T)
Conector ocupado;
if(not visitada)
{
visitada=true;
transformada=true;
transformacin.trasladar(T);
for each ocupado in conectoresOcupados do
{
ocupado.comunicarTraslacionConector(R);
}
}

Toda pieza que desee trasladarse primero modificar su estado a visitada, para que en futuras llamadas de
comunicacin de traslacin a la pieza, sta no lleve a cabo ninguna operacin, con lo que evitamos
posibles bucles infinitos provocados por sucesivas llamadas de comunicacin de traslaciones entre piezas
conectadas. A continuacin la pieza pone el flag transformada a cierto y guarda la traslacion T, para
que posteriormente en el proceso de transformacin de piezas ensambladas (ver apartado 5.7 Aplicacin
de transformcaciones sobre piezas ensambladas), dicha traslacin le sea aplicada. Para finalizar, la pieza
le comunicar a todos sus conectores ocupados que tienen que llevar a cabo el proceso de comunicacin
de la traslacin T.
Conector

virtual comunicarTraslacionConector(Vector T)
Conector actual;
for each actual in conectados do
{
actual.comunicarTraslacion(R);
}

Cuando los conectores reciben tal mensaje, actuarn en consecuencia. Esto es, comunicar a todos sus
conectores conectados que deben informar de la traslacin que se pretende realizar.
UdG

115

Captulo 5. Diseo

Conector

comunicarTraslacion(Vector T)
madre.comunicarTraslacion(T);

Este ltimo mensaje de comunicacin de la traslacin entre conectores, difiere con el mensaje que utiliza
la pieza para comunicarse con sus conectores ocupados, ya que con el primero lo que conseguimos es que
cada conector que recibe un mensaje para informar de la traslacin a travs de un conector conectado a l,
comunique a la pieza a la que pertenece, que tiene que llevar a cabo el proceso de comunicacin de la
traslacin T.
Este proceso se repetira hasta que todas las piezas conectadas, tanto directa como indirectamente a la
primera que trasladamos, sean visitadas y por lo tanto sepan que en cualquier momento se les aplicar una
traslacin.
Cabe comentar que una vez finalizado el proceso de comunicacin de la traslacin de piezas
ensambladas, habr que volver a modificar el estado, tanto de la pieza trasladada como el de las
conectadas a ella, de forma directa o indirecta, a no visitada. Con esto lo que se consigue es que despus
de informar de la traslacin a llevar a cabo por una pieza ensamblada, podamos a volver a aplicar dicho
proceso sin perder las conexiones.
PECULIARIDADES
Dentro del proceso de comunicacin de la traslacin de piezas ensambladas, hay que aclarar ciertos casos
en el que los conectores, dependiendo del tipo que sean, no se comportan de la forma descrita
anteriormente.
Caso1. Todo conector de tipo segmento redefine el mtodo que permite a la pieza a la que pertenece,
comunicarse con l en un proceso de informacin de traslacin de piezas ensambladas. ste es el motivo
por el que el mtodo comunicarTraslacionConector(Vector T) de la clase Conector, est definido
como virtual. En este primer nivel de herencia el mtodo comunicarTraslacionConector(Vector
T), solo sufre una pequea modificacin. Tal modificacin se basa en preguntarle al conector si se

encuentra realizando un deslizamiento sobre otro conector (ver apartado 5.6.3 Comunicacin del
deslizamiento). Tal pregunta hay que realizarla, ya que si el conector de tipo segmento al que se le
comunica que tiene que llevar a cabo un proceso de informacin de traslacin, mediante la pieza a la que
pertenece, se encuentra deslizndose sobre otros conectores, no debe propagar dicha traslacin al conector
o conectores sobre los que se encuentra realizando tal proceso, precisamente para poderse deslizar.

116

EPS

CAD Mecnico para piezas Lego

Segmento

comunicarTraslacionConector(Vector T)
if(not deslizando) Conector::comunicarTraslacionConector(T);

Caso 2. En un segundo nivel de herencia, el nico tipo de conector que debe redefinir los mtodos de
comunicacin de traslaciones es el conector de tipo Cylindrical Hole.
Tal y como se ha comentado en este mismo captulo (ver apartado 5.4.4 Verificacin de compatibilidad
entre conectores), el Cylindrical Hole puede ensamblar tanto con el Stud como con el Axle. En el caso
del Axle y debido a las caractersticas tanto geomtricas del propio Cylindrical Hole como a la forma de
ensamblar que tienen ambos conectores, cuando uno de los dos lleva a cabo un proceso de traslacin,
sucede que el conector que se traslad primero, en vez de trasladarse se desliza sobre el otro.
Una vez explicado esto, se podra pensar que el conector de tipo Axle (ver Captulo 2. Piezas y
conectores Lego) tambin debera redefinir los mtodos que permiten la comunicacin de traslacin.
Realmente no hace falta, ya que debe ser el propio Cylindrical Hole el que al recibir el mensaje de
comunicacin de una determinada traslacin T acte en consecuencia debido a que, tal y como se ha
dicho, es l el que tiene la geometra la que, al interaccionar con el Axle en una traslacin, produce que se
deslice y por lo tanto no propague la misma.
A todo esto hay que aadirle la deteccin de colisiones que se ha implementado en el proceso de
comunicacin de traslacin, en el caso de conectores de tipo segmento.
Tal colisin se basa en detectar cual es la distancia mnima que el Cylindrical Hole permanecer quieto
sin propagar la traslacin, deslizndose, hasta que se encuentre con un conector conectado al mismo Axle
al que se encuentra ensamblado el Cylindrical Hole y por lo tanto le empuje, o hasta que se desconecte,
debido a que no encontr ningn obstculo en su camino.
Tal deteccin solo se llevar a cabo si la traslacin se realiza en el eje Z de los conectores, el cual es el eje
coaxial de assembling entre ambos (ver apartado 5.4.7 Propagacin del assembling).
As pues los mtodos de traslacin del Cylindrical Hole quedaran de la siguiente forma:

UdG

117

Captulo 5. Diseo

Cylindrical Hole

comunicarTraslacionConector(Vector T)
Conector conectorColision;
int direccion;
double distanciaColision,normaTraslacion;
if(esAssembling or mensajeAStud()) Segmento::comunicarTraslacionConector(T);
else if(not visitado)
{
visitado=true;
if(not moverEjeZ(T)) Segmento::comunicarTraslacionConector(T);
else
{
direccion=calcularDireccionTraslacion();
distanciaColision=distanciaColision(abs(direccion));
conectorColision=conectorColision(direccion);
if(distanciaColision==0) conectorColision.comunicarTraslacion(T);
else if(distanciaColision==+- ) recalcularConexiones();
else
{
moduloTraslacion=T.modulo();
if(moduloTraslacion==distanciaColision) recalcularConexiones();
else if(moduloTraslacion>distanciaColision)
{
Segmento::comunicarTraslacionConector(T-distanciaColision);
}
}
}
}

Como se puede comprobar un conector de tipo Cylindrical Hole deber comportarse como cualquier
conector de tipo Segmento si se encuentra realizando un proceso de assembling o si el mensaje va a ser
propagado a un conector de tipo Stud. Los motivos de obligar a un conector Cylindrical Hole a propagar
la comunicacin de la traslacin se deben a que en el momento del asssembling se pueden producir
traslaciones en el eje Z del conector y por lo tanto ste se deslizara y no se trasladara conjuntamente con
sus conectores conectados. Esto puede a llegar a ser molesto ya que se perderan las conexiones realizadas
anteriormente por el usuario. Por este motivo se decidido obligar a todo Cylindrical Hole a propagar la
comunicacin de la traslacin siempre que se lleve a cabo un proceso de assembling. El segundo motivo
para obligar a un Cylindrical Hole a comportarse como el resto de conectores Segmento es si se va a
propagar la comunicacin de la traslacin a un Stud. La explicacin es sencilla: las propiedades de la
conexin entre Stud Cylindrical Hole no permiten que uno se deslice sobre el otro, con lo que si el Stud
se traslada, tambin debe de hacerlo el Cylindrical Hole y viceversa, evitando as el deslizamiento entre
ambos.

118

EPS

CAD Mecnico para piezas Lego

Continuando con el mtodo comunicarTraslacion(Vector T) del Cylindrical Hole, y si no nos


encontramos en ninguno de los dos casos explicados (assembling o comunicacin de la traslacin
Cylindrical Hole Stud), comprobaremos que el conector no se encuentre visitado. Si no lo est
modificar su estado a visitado, para que en sucesivas llamadas de comunicacin de la traslacin al
mismo conector, ste no lleve a cabo ninguna operacin. A continuacin comprobar si la traslacin se
pretende llevar a cabo en su eje Z. Si no es as, propagar la traslacin y todo ocurrir tal y como vena
siendo normal en la comunicacin de traslaciones. Por el contrario, en el caso de una traslacin en el eje
Z, el Cylindrical Hole deber calcular la distancia de colisin (ver Captulo 6. Implementacin) con los
otros posibles conectores conectados al conector o conectores sobre los que se encuentra ensamblado. Si
la distancia de colisin es nula, querr decir que el Cylindircal Hole ha colisionado con otro conector y
por lo tanto deber informar a ste que debe propagar la comunicacin de la traslacin. En el caso en
que la distancia de colisin sea infinita, entonces el Cylindrical Hole podr deslizarse hasta desconectarse
del conector o conectores sobre los que estaba conectados, debido que no ha encontrado obstculos en su
camino y por lo tanto se deber llevar a cabo un proceso de reclculo de conexiones entre conectores, ya
que al deslizar un conector se pueden crear nuevas conexiones y destruir de viejas (ver apartado 5.6.3
Comunicacin del deslizamiento).
En un ltimo caso, tendramos que la distancia de colisin no es ni nula, ni infinita. Esto quiere decir que
hay algn conector proclive a colisionar pero que an se encuentra a una distancia prudencial que impide
tal colisin. Aqu deberemos comprobar si la distancia de colisin es igual al mdulo de la traslacin. Si
se da el caso querr decir que el conector puede trasladarse la traslacin T sin colisionar con ningn otro.
En caso de que el mdulo de la traslacin a aplicar sea ms grande que la distancia de colisin, querr
decir que no podemos trasladar (realmente deslizar) el conector la traslacin T, pero si
TdistanciaColision. As pues, en este ltimo caso propagaramos la traslacin (TdistanciaColision).
Cabe destacar que cuando la traslacin es recibida por parte de la pieza a la que pertenece el Cylindrical
Hole, la deteccin de colisiones debe realizarse en la direccin de la traslacin. (ver Figura 5.41).
Direccin traslacin == Direccin deteccin colsiones
P2 a trasladar

P3

P1. Esquema pieza 3704.

P1
A1

A2
AH1

AH2

CH1

CH2

P2. Esquema pieza 6541.


P3. Esquema pieza 32064.

dcolision
Figura 5.41. Esquema de la direccin de la deteccin de colisiones al recibir un conector
Cylindrical Hole el mensaje traslacin por parte de la pieza a la que pertenece.

UdG

119

Captulo 5. Diseo

En el caso del mtodo comunicarTraslacion(Vector T) del Cylindrical Hole, el procedimiento a


llevar a cabo es bastante parecido al mtodo comunicarTraslacionConector(Vector T) de la
misma clase, aunque con sutiles pero sustanciales diferencias.

Cylindrical Hole

comunicarTraslacion(Vector T)
Conector conectorColision;
int direccion;
double distanciaColision,normaTraslacion;
if(esAssembling() or mensajeParaStud()) Segmento::comunicarTraslacion(T);
else if(not visitado)
{
visitado=true;
if(not moverEjeZ(T)) Segmento::comunicarTraslacion(T);
else
{
direccion=calcularDireccionTraslacion();
distanciaColision=distanciaColision(-abs(direccion));
conectorColision=conectorColision(direccion);
if(distanciaColision==0) comunicarTraslacion(T);
else if(distanciaColision==+- ) recalcularConexiones();
else
{
moduloTraslacion=T.modulo();
if(moduloTraslacion==distanciaColision) recalcularConexiones();
else if(moduloTraslacion>distanciaColision)
{
Segmento::comunicarTraslacion(T-distanciaColision);
}
}
}
}

Tal y como se ha dicho solo se deber a obligar la propagacin de la comunicacin de la traslacin en


caso de que se vaya a realizar un assembling o si el mensaje proviene de un Stud (recordar que el mtodo
comunicarTraslacion(Vector T) es el que utilizan los conectores para comunicarse entre si y el

mtodo comunicarTraslacionConector(Vector T) es el que utilizan las piezas para ponerse en


contacto con sus conectores ocupados. Por ello en este mtodo preguntamos si el mtodo ha sido llamado
por parte de un Stud y no si se le va a enviar a un Stud). Si no nos encontramos en ninguno de estos dos
casos comprobaremos el estado del conector. Si no se encuentra visitado, lo modificaremos y
empezaremos a realizar los mismos clculos de deteccin de colisiones que en el mtodo
comunicarTraslacionConector(Vector T) con la nica diferencia que la direccin de deteccin de

colisiones (ver Captulo 6. Implementacin) debe ser la contraria a la direccin de traslacin, ya que la
ieza que pretende trasladarse es tra diferente a la que pertenece el Cylindrical Hole, debido a que la

120

EPS

CAD Mecnico para piezas Lego

comunicacin de la traslacin le lleg al propio Cylindrical Hole mediante un conector conectado a l (


ver Figura 5.42).

Direccin traslacin
Direccin deteccin colisiones
P2

P3 a trasladar

P1. Esquema pieza 3704.

P1
A1

A2
AH1

AH2

CH1

CH2

P2. Esquema pieza 6541.


P3. Esquema pieza 32064.

dcolision
Figura 5.42. Esquema de la direccin de la deteccin de colisiones al recibir un conector
Cylindrical Hole el mensaje traslacin por parte de un conector conectado a l.

Cabe comentar tres aspectos de los mtodos de comunicacin de la traslacin del Cylindrical Hole:
1

Tal y como se puede observar en los mtodos, el conector cambia su estado de no visitado a
visitado. Esto se realiza para que en prximas llamadas a ste mtodo de un mismo conector, no
se produzcan bucles infinitos de llamadas de traslacin entre conectores conectados entre si o
llamadas de piezas a sus conectores que a la vez propagan la traslacin a sus conectados y as
sucesivamente.

Para saber si la traslacin se est llevando a cabo en el eje Z del conector tenemos que realizar
los siguientes pasos:

Paso 1. Obtener la matriz W2C que nos permite realizar la transformacin de


coordenadas de mundo a coordenadas de conector (ver apartado 5.1.2 Sistemas de
referencia del conector, de la pieza y del mundo) donde W2C = ( C2W ) -1 .

Paso 2. Aplicarle la matriz W2C al vector de traslacin T, con lo que tendremos el


vector de traslacin a aplicar en coordenadas de conector.
Tc = W2C * Tw donde
Tw es el vector de traslacin en coordenadas de mundo.
Tc es el vector de traslacin en coordenadas de conector.
W2C la matriz de transformacin del mundo al conector.

UdG

121

Captulo 5. Diseo

Paso 3. Normalizar el vector Tc y realizar la siguiente comprobacin:

bool moverEjeZ(Vector T)
return (T==Z);

donde Z = ( 0, 0, 1 ).
Como se puede observar, la comprobacin debe realizarse tanto en la direccin positiva
del eje Z como en la direccin negativa del mismo.
3

En el caso en el que la distancia de colisin sea diferente de cero, habr que recalcular las
conexiones entre conectores, ya que es como si nos encontrramos en un proceso de
deslizamiento (ver apartado 5.7 Comunicacin del deslizamiento) y por lo tanto pueden haberse
producido cambios de conexiones entre los conectores participantes en la traslacin.

Para ms informacin acerca de la deteccin de colisiones dirigirse al captulo de implmentacin de


lamemoria.
EJEMPLO
Veamos el ejemplo de la Figura 5.43 para comprender mejor la problemtica que supone comunicar la
futura traslacin de una pieza ensamblada y la solucin adoptada.

( xi, yi, zi )
A

B
( xf, yf, zf )
C

Figura 5.43. Ejemplo de traslacin de una pieza ensamblada.

Las piezas que intervienen en la traslacin son las que se muestran a continuacin:

122

EPS

CAD Mecnico para piezas Lego

A1

A2

A
A3

A4

B1

B2

B
B3

B4

C1

C2

C
C3

C4

Pieza
3004

Conector
A1
A2
A3
A4

Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet

Pieza
3004

Conector
B1
B2
B3
B4

Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet

Pieza
3004

Conector
C1
C2
C3
C4

Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet

Como se puede comprobar, la pieza A, mediante sus dos Stud Inlets, est conectada a las piezas B y C.
Ms en concreto, el conector A3 est ensamblado con el B2 y el A4 con el C1. As pues, el diagrama de
secuencia que estara asociado a la comunicacin de la traslacin de la pieza A sera el que se muestra a
continuacin:

UdG

123

Captulo 5. Diseo

La pieza A recibe la seal de comunicacin de la traslacin T. sta modifica su estado a visitada,


almacena la traslacin y pone el flan de transformacin a cierto para que ms tarde le sea aplicada dicha
traslacin. A continuacin propaga a sus conectores ocupados la comunicacin de la traslacin, en este
caso, al A3 y al A4. El A3 propagar la comunicacin de la traslacin a los conectores conectados a l. El
conector B2, recibe el mensaje del conector A3 y se lo enva a la pieza B. Dicha pieza modifica su estado
a visitada, almacena la traslacin T, modifica su flan de transformacin y propaga la comunicacin de la
traslacin T a su nico conector ocupado, el B2. ste sigue propagando al conector A3, que es el que se
encuentra conectado a l y ste ltimo a la pieza a la que pertenece. Debido a que la pieza A ya ha sido
visitada no realiza ningn tipo de operacin. A continuacin la pieza A sigue propagando la
comunicacin de la traslacin por el conector ocupado que le falta por informarle del proceso que se est
llevando a cabo, el conector A4. ste enva dicho mensaje al conector C1 con el que se encuentra
ensamblando. El conector C1 se lo enviar a su vez a la pieza C y sta realizar lo que toda pieza:
modificar su estado a visitada, guardar la traslacin, modificar su flan de transformacin y propagar la
comunicacin de la traslacin a travs de sus conectores ocupados. El conector C1 le enviar el mensaje
al conector A4 y ste a su pieza, la cual ya ha sido visitada y por lo tanto no debe llevar a cabo ningn
tipo de operacin, porque ya lo ha hecho anteriormente.

124

EPS

CAD Mecnico para piezas Lego

5.5.3 Comunicacin del deslizamiento


El proceso de deslizamiento (ver Figura 5.44) es aqul que todo conector de tipo segmento puede llevar a
cabo sobre otro conector del mismo tipo al que est conectado. Se basa en:
1

Traslaciones (Comunicacin de la traslacin + Transformacin de piezas) a travs del eje coaxial


de assembling (ver apartado 5.4.7 Propagacin del assembling) o lo que es lo mismo,
traslaciones en el eje tanto Z+ como Z- del conector a deslizar.

Reclculo de conexiones debido a la creacin de nuevas conexiones y destruccin de las


antiguas, as como la actualizacin de las listas de conectores conectados de cada conector y las
listas de conectores ocupados y libres de las piezas, siempre que haga falta.

Figura 5.44. Ejemplo de deslizamiento de conectores de tipo segmento.


Hay que destacar que el deslizamiento es la nica forma que poseen los conectores de tipo Axle Hole para
poder situarse en el lugar deseado del conector con el que se encuentren ensamblando, ya que las
conexiones entre los conecectores de tipo segmento solo se pueden llevar a cabo a travs de los extremos
de los mismos. Destacar la diferencia entre los conectores de tipo Axle Hole y los de tipo Cylindrical
Hole, debido a que estos ltimos poseen dos formas de situarse en la parte deseada sobre los conectores
de tipo Axle con los que se encuentren ensamblados: una de ellas es deslizndose y la otra trasladndose a
travs del eje de assembling.

UdG

125

Captulo 5. Diseo

El proceso de comunicacin del deslizamiento es bastante parecido al proceso de comunicacin de la


traslacin de piezas ensambladas (ver apartado 5.6.2 Comunicacin de la traslacin) y hay que realizar
ciertos pasos, de forma ordenada, para llevarlo a cabo:
Paso 1 Determinar el conector a deslizar. Primero hay que detectar si la pieza seleccionada por
el usuario posee algn conector que se encuentre en disposicin de deslizar. Para ello habr que
comprobar si algn conector de la pieza cumple las siguientes propiedades:
1

Es un conector de tipo segmento.

Se encuentra como conector ocupado dentro de la pieza a la que pertenece, es decir que est
ensamblado a otro u otros conectores.

Se encuentra conectado solo a conectores (uno o ms) de tipo segmento. Hay que recordar
que el Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego) puede ensamblar con
conectores de tipo Stud, que es un conector de tipo puntual (ver apartado 5.4.4 Verificacin
de compatibilidad entre conectores) y ste no posee la propiedad de deslizamiento.

Una vez seleccionado uno de los conectores que cumplen tales condiciones, ya tenemos al conector
a deslizar CD y por lo tanto podremos pasar al siguiente paso.
Paso 2 Captura del deslizamiento. Debido a que el deslizamiento es una traslacin en el eje Z del
conector y a que el usuario la lleva a cabo mediante el ratn o el teclado (ver Captulo 6.
Implementacin), deberemos capturar la traslacin de tal forma que se aplique en dicho eje.
Supongamos que la traslacin a aplicar para deslizar el conector CD es la formada por el vector
T =( F-I ) y el centro del conector CD es CC (ver Figura 5.45).
F

T
I

CC

Figura 5.45. Esquema de la deteccin de la traslacin a aplicar para deslizar a un conector.

126

EPS

CAD Mecnico para piezas Lego

Como se puede comprobar el vector d es el que nos marca la direccin de la traslacin, que es la
direccin del eje Z del conector CD. As pues, partiendo del esquema de la Figura 5.45, la traslacin
T a aplicar en la direccin del eje Z del conector sera:

T = d ||T|| cos( )
0
donde d = C2W * 0
1

con norma unitaria ||d|| = 1 y ||T|| es el mdulo del vector traslacin.

Utilizando la propiedad del producto escalar entre el vector T

.
cos( ) =

d obtendremos el coseno del ngulo

|| T ||

Substituyendo en la frmula anterior de la traslacin el valor del coseno, tendremos que la traslacin
final a aplicar para deslizar el conector en su eje Z sera la siguiente:

T =d(T d)
Paso 3 Comunicacin del deslizamiento. Todo conector posee un mtodo virtual que le permite
deslizarse. Tal mtodo, en el caso de un conector de tipo puntual no debe ser implementado debido a
que no pueden deslizarse, pero para uno de tipo segmento si, ya que estos ltimos si que pueden
llevar a cabo dicho proceso. El motivo de que este mtodo sea virtual con una implementacin base
que no lleve a cabo ningn tipo de operacin y no virtual puro, sin implementacin base, se debe a
que todo conector debe tener accesible tal mtodo sea cual sea su tipologa. En el caso de los
conectores de tipo Puntual no se llevar a cabo ninguna operacin y por el contrario en los
conectores de tipo segmento si, ya que reimplementan dicho mtodo.
Conector

virtual deslizar(Vector T)

El proceso de comunicacin deslizamiento sucedera de la siguiente forma: El conector de tipo


segmento activar el modo de deslizamiento tanto de l, como del hermano, en el caso de que tenga.
Con esto lo que se consigue es que ms tarde no se propague el deslizamiento a los conectores
conectados al conector a deslizar CD y al hermano de ste, en caso de tener.
UdG

127

Captulo 5. Diseo

Segmento

deslizar(Vector T)
activarModoDeslizar(); //deslizando=true;
if(existeHermano) hermano.activarModoDeslizar();
madre.comunicarTraslacion(T);
madre.piezasNoVisitadas();
desactivarModoDeslizar();
if(existeHermano) hermano desactivarModoDeslizar();

A continuacin el conector CD informar a la pieza a la que pertenece que debe deslizarse. Como se
puede comprobar se ha utilizado el mismo mtodo y por lo tanto proceso que el utilizado para la
comunicacin de la traslacin de piezas ensambladas para deslizar a la pieza perteneciente al
conector CD. El motivo es muy sencillo: un deslizamiento no es ms que una traslacin en el eje Z
de un determinado conector, con lo que a partir de este punto el proceso continuara igual que el
descrito en el de comunicacin de la traslacin de piezas ensambladas (ver apartado 5.6.2
Comunicacin de la traslacin).
En estos momentos si que se puede comprender mejor la restriccin que todo conector de tipo
segmento pone en su mtodo comunicarTraslacionConector(T), que es l mtodo que utiliza
la pieza para propagar una comunicacin de futura traslacin a travs de sus conectores ocupados.
Segmento

comunicarTraslacionConector(Vector T)
if(not deslizando) Conector::comunicarTraslacionConector(T);

Tal restriccin se basa en preguntar nicamente si el conector se encuentra realizando un proceso de


deslizamiento. Si es as, el conector no tendr que propagar la traslacin, ya que deslizar no implica
mover las piezas que tengan conectores conectados, de forma directa, al conector a deslizar.
Una vez finalizada toda la comunicacin entre conectores y piezas, habr que desactivar el modo de
deslizamiento del conector a deslizar y el del hermano, en el caso de que tenga, para que podamos
realizar procesos de traslacin ms tarde sin ningn tipo de problemas y poner como no visitadas a

128

EPS

CAD Mecnico para piezas Lego

todas las piezas participantes en el proceso de deslizamiento para as no perder las conexiones en
futuros procesos de traslacin, rotacin y deslizamiento.
Cabe destacar del proceso de comunicacin del deslizamiento, que al igual que en la comunicacin
de la traslacin de piezas ensambladas (ver apartado 5.6.2 Comunicacin de la traslacin) se ha
llevado a cabo gestin de colisiones una vez decidido, por parte del usuario, el deslizamiento a
aplicar. Debido a que la comunicacin del deslizamiento utiliza los mismos mtodos que la
comunicacin de la traslacin, la deteccin de colisiones es tambin la misma (para ms
informacin acerca de la deteccin de colisiones ver el Captulo 7. Implementacin).
Paso 4 Propagacin del assembling. La propagacin se llevara a cabo entre la parte dinmica,
que en este caso estara formada por la pieza a la que pertenece el conector a deslizar y las
conectadas a ella, tanto directa como indirectamente, y la parte esttica, formada por el resto de la
escena (ver apartado 5.1.1 Definiciones tiles). Con esto lo que conseguimos es recalcular las
conexiones entre la parte dinmica y el resto del modelo en construccin, ya que hay que entender
que en el proceso de deslizamiento se pueden crear y destruir conexiones entre conectores (variar la
lista de conectores conectados de los mismos), as como la actualizacin del contenido de las listas
de conectores libres y ocupados de las piezas, como consecuencia de la propia creacin y
destruccin de assemblings (ver Figura 5.46). hay que dejar bien claro que este proceso de
propagacin de debe realizar una vez se ha aplicado la transformacin, en este caso, el
deslizamiento, ya que es despus de la aplicacin de dicha transformacin cuando se habrn
efectuado los cambios de posciones en las piezas afectadas y no en el proceso de comunicacin.

Figura 5.46. Ejemplo de deslizamiento donde se podran crear y destruir conexiones.


En la anterior figura, cuando deslizamos el Axle azul en la direccin indicada, el assembling entre
ste y el Axle Hole rojo se pierde, pero se crea una nueva conexin entre el Cylindrical Hole verde y
el Axle azul. Tambin observar que el estado del Axle rojo pasara de ocupado a libre y el del
Cylindrical Hole y el del Axle azul, de libre a ocupado, con las consecuencias que ello provocara en
las listas de conectores libres y ocupados de las respectivas piezas.

UdG

129

Captulo 5. Diseo

La opcin de deslizamiento es muy til, ya que debido a que el assembling entre conectores de tipo
segmento se puede realizar nica y exclusivamente mediante los extremos de los mismos, ser utilizando
esta propiedad que posicionaremos a los conectores en el lugar deseado. Hay que destacar que en el caso
del Cylindrical Hole no hara falta el proceso de deslizamiento ya que pueden deslizarse libremente sobre
conectores de tipo Axle si se trasladan en su eje Z, pero en el caso de los Axle Hole, el deslizamiento es la
nica forma de posicionarlos en el lugar adecuado, ya el Axle Hole no puede deslizarse sobre un conector
de tipo Axle trasladndose en la direccin de su eje Z, tal y como lo hacen los Cylindrical Holes.

5.6

Aplicacin de transformaciones sobre piezas ensambladas

Una vez llevado a cabo uno de los tres procesos de comunicacin de transformaciones sobre una pieza
ensamblada a otra u otras, se deber aplicar dicha transformacin. Para ello, tanto la clase Pieza como la
clase Conector nos proporcionan unos mtodos. Veamos pues, como se producira la transformacin
previamente comunicada:
Pieza

transformar()
Conector ocupado;
if(not visitada)
{
visitada=true;
if(transformada) P2W=transformacin*P2W;
transformada=false;
transformacin=identidad();
for each ocupado in conectoresOcupados do
{
ocupado.transformarConector();
}
}

La pieza comprobara su estado. Si no ha sido visitada entonces procedera a comprobar si a la pieza se le


debe aplicar la transformacin almacenada en el atributo transformacin. En caso de que se le debe
aplicar, querr decir que previamente se le ha comunicado que se iba a proceder a aplicarle una cierta
transformacin. Una vez hecho esto, volveremos a poner el flan que nos indica de la aplicacin o no de
transformaciones sobre la pieza a falso y la matriz de transformacin la sustituiremos por la matriz
identidad, para que en futuras transformaciones no se produzcan conflictos.
A continuacin, se proceder a comunicar a todos los conectores ocupados de la pieza que deben
propagar la transformacin.

130

EPS

CAD Mecnico para piezas Lego

Conector

transformarConector()

Conector actual;

transformar()

madre.transformar();

for each actual in conectados do


{
actual.transformar();
}

Los conectores ocupados de la pieza actuarn comunicando a cada uno de los conectados a ellos, que
deben, a su vez, propagar la transformacin 1 .Cada uno de los conectados comunicar a la pieza a la
que pertenece, que debe llevar a cabo el proceso de transformacin

. A partir de este punto se

volvera a repetir el proceso de transformacin antes explicado para toda pieza.


EJEMPLO
Basndonos en el ejemplo expuesto en el apartado 5.5.2 Comunicacin de la traslacin el proceso de
transformacin se llevara de la siguiente forma:

UdG

131

Captulo 5. Diseo

La pieza A recibe el mensaje de transformacin, modifica su estado a visitada para evitar posteriores
llamadas al mismo mtodo y se le aplicar la translacin previamente comunicada. A continuacin vuelve
a modificar el flag que nos indica de la aplicacin o no de la transformacin a falso a la vez que la matriz
de transformacin a aplicar pasa a ser la matriz identidad. A continucacin propaga la transformacin a
sus dos conectores ocupados: el A3 y el A4. El A3 le comunica a su conectado, el B2, que debe propagar
la transformacin. ste ltimo informa a la pieza B, que es a la que pertenece, que comprube si debe
transformarse. La pieza B lleva a cabo los mismos pasos que los descritos para la pieza A, para acabar
propagando la transformacin mediante sus conectores ocupados. El conector B2 recibe el mensaje y se
lo comunica al A3, su nico conectado. ste a su vez informa a la pieza A. Tal pieza no lleva a cabo
ningn tipo de proceso, puesto que ya ha sido visitada con anterioridad.
La pieza A contina propagando la tranformacin mediante el otro conector ocupado que le falta por
propagar: el A4. El conector A4 comunica al conector C1 que debe informar a la pieza a la que pertenece,
la C, que le informe del proceso de transformacin. sta lleba a cabo todos los pasos descritos,
anteriormente, para la pieza A y comunica a sus conectores ocupados que deben propagar la
transformacin. El conector C1 recibe el mensaje y lo propaga a su conectado: el conector A4. ste
informa a la pieza A, pero esta no lleba a cabo ningn tipo de opracin, ya que fue visitada con
anterioridad.
Hay que destacar que una vez finalizado este proceso se deben volver a poner los flags que nos informan
del estado de la pieza (visitada o no visitada) a su valor por defecto, es decir, a no visitada.

132

EPS

CAD Mecnico para piezas Lego

5.7

Otros

5.7.1 Desconexin de conectores y piezas ensambladas


Cuando una pieza se encuentra ensamblada a otra u otras en la construccin de un cierto modelo,
podemos decidir desconectar un conector CD de los muchos que la pieza puede tener ensamblados con
otros de otras piezas o decidir desconectar la pieza PD entera.
Conector

1
desconectar()

desconectarConector(Conector con)

Conector conActual;

conectados.Esborrar(con);

for each conActual in conectados do


{
1 conActual.desconectarConector(this);
}

if(libre())
{
madre.introducirConectorLibre(this);
}

for each conActual in conectados do


{
conectados.Borrar(); 2
}

if(not ocupado())
{
madre.borrarConectorOcupado(this);
}

madre.borrarConectorOcupado(this);
madre.introducirConectorLibre(this);

Para desconectar un cierto conector CD ocupado de una determinada pieza hay que:
1

Eliminar de todo conector CC conectado a CD , el propio conector CD y actualizar las listas de


conectores libres y ocupados de la pieza a la que pertenece CC. En el ejemplo de la Figura 5.47
sera eliminar de la lista de conectores conectados a Cc, el conector CD y actualizar las listas de
conectores libres y ocupados de la pieza PC.

Eliminar todos los conectores conectados al conector a desconectar CD . En el ejemplo de la


Figura 5.47 eliminaramos de la lista de conectores conectados a CD, el conector CC.

Actualizar las listas de conectores libres y ocupados de la pieza a la que pertenece CD , es decir,
PD . Esta actualizacin consistir en eliminar de la lista de conectores ocupados a CD e introducir
como conector libre a dicho conector (para ms informacin acerca de los posibles estados de un
conector ver el Captulo 2. Piezas y conectores Lego).

UdG

133

Captulo 5. Diseo

PD
CD
PC

CC

Pieza 3005
Pieza 3622

Figura 5.47. Esquema de una desconexin de un conector de tipo Stud Inlet. Vista lateral.

En el caso de la desconexin de una pieza entera PD , deberemos realizar el proceso anteriormente


descrito, para cada conector ocupado de la pieza a desconectar.
Conector

desconectar()
Conector conActual;
for each conActual in conectoresOcupados do
{
conActual.desconectar();
}

5.7.2 Eliminacin de piezas en un modelo ensamblado


Una vez hemos construido un cierto modelo, el cual se encuentra totalmente ensamblado, podemos
eliminar cualquier pieza del mismo. Tal eliminacin produce que se actualicen las listas de conectores
conectados de cada conector ensamblado con alguno de la pieza eliminada, as como la actualizacin de
las listas de conectores libres y ocupados, si hace falta, de las piezas a la que pertenecen los conectores
conectados a algunos de los que posea la pieza suprimida, ya que el estado de los mismos puede verse
modificado por la supresin de sus conexiones.
El proceso se basa en la utilizar la desconexin de conectores (ver apartado 5.7.1 Desconexin de
conectores y piezas ensambladas), para desensamblar a todos los de la pieza a eliminar, antes de
suprimirla (ver Figura 5.48 donde eliminamos la pieza del medio).

134

EPS

CAD Mecnico para piezas Lego

Pieza 3005
Pieza 3004
Pieza 3004

Figura 5.48. Ejemplo de eliminacin de piezas. Vista lateral.

5.7.3 Cargar un modelo con y sin piezas LCI


Los fichero que el LeoCAD [1] almacena con toda la informacin necesaria del modelo que el usuario
haya decidido crear no contienen informacin extra de assembling, as pues los ficheros que se intentan
cargar tampoco contendrn tal informacin.
Entonces, la pregunta es: como podemos ensamblar un modelo, guardarlo y despus abrirlo manteniendo
las conexiones sin guardar ningn tipo de informacin de ellas? La verdad es que es bastante ms sencillo
de lo que en un principio puede parecer. La solucin adoptada se basa en intentar propagar el assembling
(ver aparatdo 5.3.7 Propagacin del assembling) entre todo par de conectores pertenecientes a piezas LCI
existentes en el fichero cargado por el LeoCAD, es decir, intentamos buscar conexiones secundarias entre
cada par de conectores. Con ello lo que conseguimos es volver a tener las mismas conexiones que
tenamos antes de guardar el modelo, pero con la ventaja de no tener que aadir informacin adicional en
los propios ficheros almacenados por la aplicacin.

5.8

Parser

El parser es aqul mdulo encargado de la lectura del contenido de los ficheros LCI (ver Anexo 6. Piezas
LCI y Anexo 2. Formato, sintaxis y semntica de los ficheros LCI). Tal rutina se encarga de crear lo que
se ha llamado un diccionario (ver Anexo 9. Clase diccionario) con la informacin asociada a cada
conector dentro del fichero LCI correspondiente. El diccionario no es ms que una estructura de datos
funcional en el que la clave es uno de los tags que puede tener todo conector (ver Anexo 2. Formato,
sintaxis y semntica de los ficheros LCI) y el contenido es el conjunto de caracteres formado por la
informacin asociada a dicho tag (ver Figura 5.49).

UdG

135

Captulo 5. Diseo

<connector>
<name>stud</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1
</connector>
<connector>
<name>studInlet</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1
</connector>
<connector>
<name>cylindricalHole</name>
<matrix>-1 0 0 0 0 0 1 0 0 -1
<parameters>
<lenght>10</lenght>
<id>0</id>
<brother>1</brother>
</parameters>
</connector>
<connector>
<name>cylindricalHole</name>
<matrix>1 0 0 0 0 0 -1 0 0 -1
<parameters>
<lenght>10</lenght>
<id>1</id>
<brother>0</brother>
</parameters>
</connector>

0 0 0 0 1</matrix>

0 0 24 0 1</matrix>

0 0 0 10 10 1</matrix>

0 0 0 10 -10 1</matrix>

Diccionario
<name>

stud

<matrix>

1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1

Diccionario

<name>

studInlet

<matrix>

1 0 0 0 0 1 0 0 0 0 1 0 0 24 0 1

Diccionario

<name>

cylindricalHole

<matrix>

1 0 0 0 0 1 0 0 0 0 1 0 0 24 0 1

<lenght>

10

<id>

<brother>

Diccionario

<name>

cylindricalHole

<matrix>

1 0 0 0 0 0 -1 0 0 -1 0 0 0 10 -10 1

<lenght>

10

<id>

<brother>

Figura 5.49. Fichero 6541.lci y esquema de los diccionarios creados para cada conector.

136

EPS

CAD Mecnico para piezas Lego

Una vez creado el diccionario con la informacin del conector actual, ser el momento de realizar la
instancia del conector con dicha informacin. Ser el propio conector que decidir que informacin
utiliza, dependiendo del tipo que sea.
Conector

virtual init(Diccionario d)

La clase abstracta Conector posee un mtodo virtual que se encarga de inicializar la parte comn a todo
conector con la informacin del diccionario. Esta parte comn es la que corresponde al tag <name>, que
nos informa de la tipologa del conector, y al tag <matrix>, que nos permite conocer la matriz de
transformacin 3D del conector.
Con esto tenemos que los conecotres de tipo puntual no debern implementar el mtodo de inicializacin
de todo conector, ya que esta tipologa de conectores solo necesitan del tipo y de la matriz de
transformacin 3D para inicializarse. Adems conseguimos que si en el diccionario hubiera ms
informacin de la que corresponde al tipo de conector a inicializar (por ejemplo introducirle parmetros a
un conector de tipo puntual), l mismo la ignorara.
Por lo que concierne a los conectores de tipo segmento, intentarn buscar la informacin referente a los
tags <name>, <matrix>, y dentro de <parameters> la informacin del tag <lenght> y en el caso de
que tenga hermano el conector, el contenido de los tags <id> y <brother>.

Segmento

init(Diccionario d)
Tag t1("<lenght>"),t2("<id>"),t3("<brother>");
Conector::init();
longitud=leerNumeroParametro(d,t1);
if(d.Existe(t2))
{
idLCI=leerNumeroParametro(d,t2);
idHermanoLCI=leerNumeroParametro(d,t3);
existeHermano=true;
}
else existeHermano=false;

UdG

137

Captulo 5. Diseo

Para ello solo debern volver a implementar el mtodo de inicializacin de la informacin del conector
realizando una llamada al mismo mtodo, pero de la clase Conector, para inicializar la parte comn a todo
conector independientemente de la tipologa a la que pertenezcan. Una vez hecho esto, deber inicializar
la parte de informacin exclusiva a todo conector de tipo segmento. sta es: la longitud y los
identificadores tanto del propio conector a inicializar como el de su hermano, en caso de tener.
As pues tenemos que el proceso de parseo de los ficheros LCI, los cuales contienen toda la informacin
referente a los conectores de una determinada pieza, es el que se muestra a continuacin:

Figura 5.50. Secuenia de pasos a seguir en el parseo de un fichero LCI.


Una vez instanciado todos los conectores de una determinada pieza con la informacin obtenida de su
correspondiente fichero LCI (ver Anexo 2. Formato, sintaxis y semntica de los ficheros LCI), se deben
llevar a cabo la bsqueda de hermanos. Tal bsqueda se basa en encontrar, para cada conector que posea
hermano, dicho hermano para que en todo momento todo conector con relacin de hermandad con otro lo
conozca y pueda comunicarse con l.
Para cada conector con hermano, el cual posee su identificador LCI y el de su hermano, deberemos buscar
aqul conector que tenga el mismo identificador LCI que el que posee el primer conector para su hermano
y viceversa. Repitiendo este proceso para cada conector con hermanos tendremos que todo conector con
ese tipo de relacin con otro, lo conocer y por lo tanto podr comunicarse con l. Obviamente este
porceso presupone la correctividad de la informacin referente a los identificadores en el fichero LCI.

138

EPS

'

*'

CAD Mecnico para piezas Lego

UdG

140

CAD Mecnico para piezas Lego

IMPLEMENTACIN

Dentro de este captulo se pretende profundizar en los aspectos de diseo ms relevantes, con la
implementacin llevada a cabo para ello. Cabe destacar que no se ha pretendido llegar al cdigo final
implementado, ya que para tales efectos tenemos el manual tcnico del proyecto. As pues, este captulo
pretende ser una ampliacin de ciertos aspectos del captulo de diseo que en se no son idispensables
para su comprensin.

6.1

Assembling

6.1.1 Pasos para realizar el assembling


Tal y como se ha comentado en el captulo anterior (ver Captulo 5. Diseo) el assembling est
compuesto por una serie de pasos a seguir para que la conexin entre dos conectores se lleve a cabo. A
continuacin se pretende dar una visin ms concreta de como se han implementado dichos pasos.

6.1.2 Seleccin de conectores a ensamblar.


Para detectar cual es el conector seleccionado por el usuario para ensamblar, debe ser la propia pieza
seleccionada que decida cual de sus conectores libres se encuentra ms cerca de la recta r. Recordar que
la recta r la crea el propio LeoCAD [2] a partir del lugar donde el usuario hace clic con el dispositivo
(ratn).
Pieza

Conector conectorCercano(Recta r)
Conector conector,cercano;
double distmin,aux;
conLibres.Primero();
if(not conLibres.Fin())
{
conector=conLibres.Actual();
cercano=conector;
distmin=cercano.distanciaMinima2(r);
conLibres.Siguiente();
while(not conLibres.Fin())
{
conector=conLibres.Actual();
aux=conector.distanciaMinima2(linea);
if(aux<distmin)
{
distmin=aux;
cercano=conector;
}
conLibres.Siguiente();
}
}
return cercano;

UdG

141

Captulo 6. Implementacin

Como se puede comprobar solo hace falta calcular las distancia entre la recta r y la posicin de los
conectores libres de la pieza.El conector seleccionado para participar en el proceso de assembling ser
aqul que posea la distancia al cuadrado menor entre l y la recta r. Este clculo lo realiza el propio
conector mediante el mtodo distanciaMinima2(Recta r). Recordar que la utilizacin de la
distancia al cuadrado (ver Anexo 7. Distancia Punto Recta) se debe a motivos de practicidad.
Para conocer la informacin base acerca de la seleccin de conectores para ensamblar ver el captulo de
diseo de esta memoria.

6.1.3 Verificacin de compatibilidad entre conectores


No todos los conectores que ha implementado el proyecto pueden ensamblar entre s. Por eso, tal y como
se ha comentado en anteriores captulos, debe ser cada conector que decida si puede conectarse o no con
otro de dado. Para ello se ha provisto de un mtodo virtual puro en la clase abstracta Conector que debe
ser implementado por cada una de las clases que representa a cada una de las diferentes tipologias de
conectores. As pues, tendremos en la clase base Conector el siguiente mtodo:

Conector

virtual bool puedeConectar(Conector con)=0;

En las clases Stud, Stud Inlet, Axle, Axle Hole y Cylindrical Hole se implementar dicho mtodo de
verificacin de compatibilidad entre conectores de diferentes formas, dependiendo de cada tipo de
conector.
Stud

bool puedeConectar(Conector con)


return ((con.obtenerNombre()==studInlet) or
(con.obtenerNombre()==cylindricalHole));

Como ya habamos visto en el captulo de diseo, los conectores de tipo Stud son compatibles, para
ensamblar, con los conectores de tipo Stud Inlet y con los de tipo Cylindrical Hole.

142

EPS

CAD Mecnico para piezas Lego

Stud Inlet

bool puedeConectar(Conector con)


return (con.obtenerNombre()==stud);

Por otro lado, los conectores de tipo Stud Inlet nicamente pueden conectarse con conectores de tipo
Stud.

Axle

bool puedeConectar(Conector con)


return ((con.obtenerNombre()==axleHole) or
(con.obtenerNombre()==cylindricalHole));

Para el caso de los de tipo Axle, tos pueden ensamblar tanto con los conectores de tipo Axle Hole como
con los de tipo Cylindrical Hole.
Axle Hole

bool puedeConectar(Conector con)


return (con.obtenerNombre()==axle);

Un conector perteneciente a la tipologa de conector Axle Hole podr ensamblar nicamente con los
conectores de tipo Axle.

UdG

143

Captulo 6. Implementacin

Cylindrical Hole

bool puedeConectar(Conector con)


return ((con.obtenerNombre()==stud) or
(con.obtenerNombre()==axle));

En el caso de los Cylindrical Hole, slo podrn ensamblar con conectores pertenecientes a las categoras
Stud o Axle.

6.1.4 Realizacin del assembling


En esta seccin explicaremos con ms profundidad lo visto en el captulo cinco de la memoria.
Una vez seleccionados los conectores a ensamblar y verificada su compatibilidad se tienen que realizar
los pasos necesarios segn los conectores a ensamblar para conectarlos.
Los cinco pasos de assembling eran:

Paso A. Coincidencia de Normales.

Paso B. Coincidencia de posiciones.

Paso C. Coincidencia en forma de cruz.

Paso D. Acomodar los conectores.

Paso E. Actualizacin de la lista de conectores conectados.

Paso F. Actualizacin de la lista de conectores libres y ocupados de las piezas.

A continuacin se va a especificar el cdigo para cada uno de dichos pasos.


PASO A. COINCIDENCIA DE NORMALES.
Para obligar a que coincidan las normales del conector esttico y dinmico a ensamblar se ha creado un
mtodo que devuelve la matriz de rotacin a aplicar a la pieza dinmica y a las conectadas a ella, tanto
deforma directa como indirecta, para llevar a cabo dicha tarea.

144

EPS

CAD Mecnico para piezas Lego

Conector

Matrix coincidenciaNormales(Conector dinamico)


Vector normalEstatico,normalDinamico,normal;
Vector productoVectorial;
Matrix resultado,S2W,D2W;
float productoEscalar,angulo;
S2W=obtenerC2W();
D2W=dinamico.obtenerC2W();
normal=(0,0,1);
normalEstatico=S2W*normal;
normalDinamico=D2W*normal;

normalEstatico.normalizar();
normalDinamico.normalizar();
productoVectorial=normalDinamco X normalEstatico;
productoVectorial.normalizar();
normaProductoVectorial=productoVectorial.norma();

productoEscalar=normalDinamico*normalEstatico;
angulo=angulo(normaProductoVectorial,productoEscalar);

resultado=formulaRodrigues(productoVectorial,angulo);
return resultado;

Los pasos a seguir por el mtodo son (ver Captulo 5. Diseo apartado 5.3.6 Realizacin del assembling):
1

Obtener las normales del conector esttico y dinmico en coordenadas de mundo. Normalizar
ambas.

Obtener el producto vectorial entre la normal del conector esttico y dinmico. Con ello
obtenemos un vector perpendicular a las dos.

Calcular la norma del producto vectorial y el producto escalar de las normales de los dos
conectores. Con estos dos elementos podremos calcular el ngulo entre ambas.

Con el vector producto vectorial, el ngulo entre las normales de los conectores y la frmula de
Rodrigues (ver Anexo 5. Rotaciones y frmula de Rodrigues), podremos pasar la rotacin de su
forma vectorial a su forma matricial.

UdG

145

Captulo 6. Implementacin

Con todos estos pasos tendremos la matriz que se le deber aplicar a la pieza dinmica y a las conectadas
a ella para que las normales de los conectores esttico y dinmico coincidan (ver Figura 6.1)
w

ND

NS

PS

ND
CD

CS

Pieza 3005
Figura 6.45.
Pieza 3004
Pieza 3005

Figura 6.1. Esquema de coincidencia de normales del conector esttico y el conector dinmico. Vista lateral.

PASO B. COINCIDENCIA DE POSICIONES.


Tal y como se comentaba en el captulo de diseo de la memoria, para que dos conectores se encuentren
en la misma poscin basta con aplicar una traslacin. Para calcular tal traslacin haramos lo que se
muestra en el sigiuente cdigo:

Conector

Vector coincidenciaPosiciones(Conector dinamico)


Vector posEstatico,posDinamico;
posEstatico=obtenerPosicionC2W();
posDinamico=dinamico.obtenerPosicionC2W();
return (posEstatico-posDinamico);

Simplemente hay que obtener las posiciones del conector esttico y dinmico en coordenadas de mundo y
restar la posicin inicial de la final, que en este coso corresponden a la posicin del conector dinmico y a
la del conector esttico respectivamente.

146

EPS

CAD Mecnico para piezas Lego

PASO C. COINCIDENCIA EN CRUZ.


La conexin entre los conectores de tipo Axle y Axle Hole se caracteriza por la forma de cruz de la
misma. Para poder llevar a cabo el assembling con tal caracterstica hay que aplicarle la matriz de
rotacin necesaria a la pieza dinmica y, en consecuencia, a la conectadas a ella tanto directa como
indirectamente. El mtodo que se encarga de ello se encuentra en la clase Segmento debido a que solo es
utilizado por este tipo de conectores, ms en concreto por los de tipo Axle y Axle Hole.
Segmento

Matrix coincidenciaCruz(Conector dinamico)


Matrix S2W,D2W,resultado;
Vector ejeXDinamico,ejeXEstatico,ejeYDinamico,ejeMinimoEstatico;
float angulo;
S2W=obtenerC2W();
D2W=dinamico.obtenerC2W();
ejeXDinamico=(1,0,0);
ejeXEstatico=(1,0,0);
ejeYEstatitco=(0,1,0);
ejeXDinamico=D2W*ejeXDinamico;
ejeXEstatico=S2W*ejeXEstatico;
ejeYEstatico=S2W*jeYEstatico;
angulo=anguloEntreEjes(ejeXDinamico,ejeXEstatico);
ejeMinimoEstatico=ejeXEstatico;
ejeXEstatico=-ejeXEstatico;
aux=anguloEntreEjes(ejeXDinamico,ejeXEstatico);
if(aux<angulo)
{
angulo=aux;
ejeMinimoEstatico=ejeXEstatico;
}
aux=anguloEntreEjes(ejeXDinamico,ejeYEstatico);
if(aux<angulo)
{
angulo=aux;
ejeMinimoEstatico=ejeYEstatico;
}
ejeYEstatico=-ejeYEstatico;
aux=anguloEntreEjes(ejeXDinamico,ejeYEstatico);
if(aux<angulo)
{
angulo=aux;
ejeMinimoEstatico=ejeYEstatico;
}
productoVectorial=ejeXDinamico X ejeMinimoEstatico;
resultado=formulaRodrigues(productoVectorial,angulo);
return resultado;

UdG

147

Captulo 6. Implementacin

El mtodo coincidenciaCruz(Conector dinamico) se encarga de calcular la matriz de rotacin a


aplicar a la pieza dinmica y a las conectadas a ella para que el assembling en forma de cruz entre los dos
conectores implicados se lleve a cabo. Para ello se alcula el vector producto vectorial entre el eje X del
conector dinmico y el eje del mnimo ngulo entre el propio eje X del conector dinmico y los ejes X, -X,
Y, -Y del conector esttico (el proceso tambin se podra llevar a cabo con el eje Y del conector dinmico).
Una vez obtenido tal vector producto vectorial y el menor ngulo podremos, con la ayuda de la frmula
de Rodrigues (ver Anexo 5. Rotaciones y frmula de Rodrigues), obtener la matriz de rotacin a aplicar a
la pieza dinmica y a las conectadas a ella.

Y
Y

ND

w
NS

X
Figura 6.2. Pieza 32064 con un
conector de tipo AxleHole.

X
Figura 6.3. Pieza 3704 con un conector
de tipo Axle.

PS

Pieza 32064
Pieza 3704

PD
Figura 6.4. Piezas dinmica PD y esttica PS antes de aplicarles el paso de C de assembling.
PASO D. ACOMODAR LOS CONECTORES.
Tal y como se ha explicado en el captulo de diseo (ver Captulo 5.Diseo) de la memoria existen casos
en los que hay que acomodar los dos conectores a ensamblar. Para ello en la clase Segmento existe un
mtodo que nos permite acomodar dos conectores. La primera tarea del mismo es comprobar cual de los
dos conectores que pretenden ensamblar posee una longitud libre menor, a partir de su extremo. Una vez
seleccionada tal longitud libre procedemos a preguntar al conector a que tipologia pertenece. Esto solo
influye en el caso de que el conector esttico sea un conector de tipo Axle, ya que estos poseen el eje de
assembling (eje Z en coordenadas de conector), hacia fuera del cuerpo del conector (ver Captulo 5.
Diseo apartado 5.1.3 Sistema de referencia de los conectores) y nosotros pretendemos acomodar la pieza
del conector dinmico hacia el interior del conector esttico, que en este caso es un conector de tipo Axle.

148

EPS

CAD Mecnico para piezas Lego

Para acabar de determinar la traslacin para acomodar los conectores hay que convertirla a coordenadas
de mundo (ver Captulo 5. Diseo apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del
mundo) para obtener el vector a aplicar a la pieza dinmica y a las conectadas a ella, tanto directa como
indirectamente, para que el conector dinmico y esttico encajen.

Segmento

Vector acomodarConectores(Conector dinamico)


Matrix S2W;
Vector resultado;
float longLibreEstatico,longLibreDinamico;
longLibreEstatico=obtenerLongitudLibre();
longLibreDinamico=dinamico.obtenerLongitudLibre();
if(longLibreDinamico>=longLibreEstatico) resultado=(0,0,longLibreEstatico);
else resultado=(0,0,longLibreDinamico);
if(obtenerNombre()=Axle) resultado=-resultado;
S2W=obtenerC2W();
resultado=S2W*resultado;
return resultado;

6.1.5 Propagacin del assembling


En este apartado se va a proceder a mostrar, de forma ms detallada, como se han implementado las
condiciones para considerar la existencia de una conexin secundaria entre dos conectores (ver Captulo
5. Diseo apartado 5.3.7 Propagacin del assembling). Cabe destacar que solo se va a profundizar en las
condiciones que lo requieran, ya que hay algunas de ellas que ya han sido lo suficientemente explicadas
en el captulo anterior.
CONDICIN A. IGUALDAD DE NORMALES.
Para determinar si las normales de dos conectores son la misma debemos llevar a cabo ciertos pasos.
Primero hay que obtener las normales de los conectores en coordenadas de mundo (ver Captulo 5.Diseo
apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del mundo). Recordar que la normal de
los conectores coincide con el eje Z de los mismos en sus propios sistemas de coordenadas (ver Captulo
5. Diseo apartado 5.1.3 Sistema de referencia de los conectores), por eso la normal en coordenadas de
conector es el vector (0,0,1). A continuacin bastar con normalizar las normales y comprobar la igualdad
entre ellas.
UdG

149

Captulo 6. Implementacin

Conector

bool igualdadNormales(Conector con)


Matrix C12W,C22W;
Vector normal1(0,0,1,0),normal2(0,0,1,0);
C12W=obtenerC2W();
C22W=con.obtenerC2W();
normal1=C12W*normal1;
normal2=C22W*normal2;
normal1 .normalizar();
normal2 .normalizar();
return iguales(normal1, normal2);

Como se puede observar, en el mtodo que lleva a cabo la implementacin de esta condicin, no se ha
utilizado el operador de igualdad clsico, sin que se ha llevado a cabo mediante la utilizacin de un
mtodo que permite un cierto error

para considerar que dos vectores son el mismo (ver apartado 6.5

Robustez).
bool iguales(Vector v1,Vector v2)
Vector diferencia;
float distancia;
diferencia=v1-v2;
distancia=diferencia.modulo();
return (distancia<= );

Para ello, bastar calcular el mdulo del vector diferencia, en este caso el vector diferencia entre ambas
normales, para comprobar si es menor o igual que el margen de error que permitimos para considerarlas
iguales.
El motivo de utilizar este mtodo de igualdad en vez de la utilizacin del operador de igualdad
tradicional, =,se debe a motivos de robustez en la utilizacin de nmeros en coma flotante (ver apartado
6.5 Robustez).

150

EPS

CAD Mecnico para piezas Lego

CONDICIN B. IGUALDAD DE POSICIONES.


Para considerar que dos conectores se ecuentren en la misma posicin no alcanza con utilizar el operador
de igualdad usual, ya que tal y como se explica en el apartado de robustez de este mismo captulo (ver
apartado 6.5 Robustez), podemos tener problemas al utilizar nmeros en coma flotante.
Conector

bool igualdadPosiciones(Conector con)


Vector posEstatico,posDinamico,diferencia;
posEstatico=obtenerPosicionC2W();
posDinamico=dinamico.obtenerPosicionC2W();
return iguales(posEstatico,posDinamico);

Para ello bastar con calcular el mdulo del vector resultante de restar la posicin, en coordenadas de
mundo (ver Captulo 5. Diseo apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del
mundo), de un conector a la del otro. Si dicho mdulo es ms pequeo o igual que el error permitido
entonces podremos decir que ambos conectores se encuentran en la misma posicin. En caso contrario las
posiciones de los conectores no coincidirn. Todas estas operaciones son llevadas a cabo por el mtodo
bool iguales(Vector v1,Vector v2) expuesto en la condicin anterior.
CONDICIN C. LONGITUD LIBRE CYLINDRICAL HOLE >= LONGITUD STUD.
Esta condicin se exige cuando se intenta buscar una conexin secundaria entre un conector de tipo Stud
y otro de tipo Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego) y se basa en comprobar si la
longitud libre de este ltimo es, como mnimo, igual a la del Stud. Tal comprobacin es trivial, ya que la
longitud libre de un conector de tipo Stud es constante y, por lo tanto, todo depende de la longitud libre
del Cylindrical Hole. Pero cmo se determina la longitud libre no slo de un conector de tipo Cylindrical
Hole, sino de todo conector de tipo segmento? Veamos la manera en que se ha calculado tal longitud libre
para los conectores de tipo segmento.

UdG

151

Captulo 6. Implementacin

Segmento

float obtenerLongitudLibre()
Conector actual;
Vector pos,posActual;
float distMin,aux;
if(conectados.Vacia()) return longitud;
else if(libre())
{
pos=obtenerPosicionC2W();
conectados.Primero();
actual=conectados.Actual();
posActual=actual.obtenerC2W();
distMin=distanciaPuntos(pos,posActual);
conectados.Siguiente();
while(not conectados.Fin())
{
actual=conectados.Actual();
posActual=actual.obtenerPosicionC2W();
aux=distanciaPuntos(pos,posActual);
if(aux<distMin) distMin=aux;
conectados.Siguiente();
}
return distMin;
}
else return 0;

Si el conector de tipo segmento no se encuentra conectado a ningn conector, la longitud libre del mismo
ser su propia longitud. Si tiene algn conector conectado a l, primero comprobaremos si se encuentra
libre, es decir, si su extremo no se encuentra ocupado. Si el extremo del conector se encuentra ocupado
entonces la longitud libre ser nula, en caso contrario se deber calcular la distancia mnima entre las
distancias del extremo del conector y cada uno de los conectores conectados a l (ver Figura 6.5).
longitud C1

distancia libre C1

longitud C2

distancia libre C2

Figura 6.5. Esquema ejemplificando la longitud libre de un conector de tipo segmento.

152

EPS

CAD Mecnico para piezas Lego

CONDICIN D. COAXIALIDAD.
Dos conectores son coaxiales si el eje de assembling, el eje Z en coordenadas de conector (ver Captulo 5.
Diseo apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del mundo), de ambos coincide.
Para su comprobacin creamos una recta r con los puntos iniciales y finales de uno de los dos conectores
sobre los que se pretende comprobar su coaxialidad, para acabar calculando la distancia entre el punto
inicial del otro conector y la propia recta r. Si la distancia entre la recta y el punto es nula entonces
diremos que ambos son coaxiales, en caso contrario no.
Al igual que en las condiciones anteriores, se permite un cierto error para decidir la coaxialidad entre
conectores, o lo que es lo mismo, un cierto error para considerar la distancia entre la recta r y el punto
inicial del conector que no forma dicha recta nula o no nula (ver apartado 6.5 Robustez).

Conector

bool coaxiales(Conector con)


Recta r;
Vector inicial,final,inicialCon;
inicial=obtenerPuntoInicial();
final=obtenerPuntoFinal();
inicialCon=con.obtenerPuntoInicial();
r.punto1=inicial;
r.punto2=final;
return iguales(r.distanciaPuntoRecta(inicialCon),0);

CONDICIN F. SEGMENTO LIBRE.


Esta condicin intentaba comprobar que los conectores que intentamos conectar, debido a la propagacin
del assembling, no se encuentran superponindose sobre otros ya conectados a ellos. Esto quiere decir que
si tenemos un conector C1 y otro C2, que C1 no se encuentre situado sobre la parte ocupada por otros
conectores conectados al propio C2 y viceversa. Para ello tenemos el mtodo correspondiente de la clase
Segmento, ya que esta condicin solo es necesitada por esta tipologa de conectores.

UdG

153

Captulo 6. Implementacin

Segmento

bool segmentoLibre(Conector con)


Conector actual;
bool coinciden=false;
conectados.Primero();
while(not conectados.Fin() and not coinciden)
{
actual=conectados.Actual();
if(con.coincidencia(actual)) coinciden=true;
else conectados.Siguiente();
}
return not coinciden;

Tal y como se puede observar, debemos comprobar que el conector con no se encuentra en el mismo
lugar que alguno de los conectores conectados al conector del que se realiza la llamada a este mtodo.
Para ello debemos comprobar si alguno de los conectados coinciden con el conector con. Si es as no har
falta continuar buscando, ya que con encontrar una superposicin es suficiente.
Una vez finalizado el mtodo, por coincidencia con algn conectado o por no coincidencia con ninguno,
se proceder a devolver el valor correspondiente. ste es: cierto en caso de que no se produzcan
superposiciones entre el conector y con (condicin cumplida) y falso en caso contrario (condicin no
cumplida).

154

EPS

CAD Mecnico para piezas Lego

CONDICIN G. COINCIDENCIA EN CRUZ.


Para comprobar si un conector de tipo Axle se encuentra ensamblando en forma de cruz con otro de tipo
Axle Hole o viceversa, se ha implementado el siguiente mtodo perteneciente a la clase Segmento:
Segmento

bool coincidenciaCruz(Conector con)


float angulo;
angulo=anguloEntreConectores(con);
return (iguales(angulo,0) or iguales(angulo,90) or iguales(angulo,180) or
iguales(angulo,270));

Como se puede observar, solo es necesario comprobar el ngulo entre ambos conectores, mtodo que nos
devolver el mnimo ngulo entre el eje X de un conector con los X, -X, Y y Y del otro. Si el ngulo es
uno de los que provoca el assembling en forma de cruz, entonces podremos dar como vlida esta
condicin. En caso contrario no (ver Figura 6.6).

Figura 6.6. Ejemplo de dos conectores ensamblando en forma de cruz.

UdG

155

Captulo 6. Implementacin

Segmento

float anguloEntreConectores(Conector con)


Matrix C12W,C22W;
Vector ejeX2,ejeX2,ejeY2;
float angulo;
C12W=obtenerC2W();
C22W=con.obtenerC2W();
ejeX2=(1,0,0);
ejeX1=(1,0,0);
ejeY1=(0,1,0);
ejeX2=C22W*ejeX2;
ejeX1=C12W*ejeX1;
ejeY1=C12W*jeY1;
angulo=anguloEntreEjes(ejeX2,ejeX1);
ejeMinimoEstatico=ejeX1;
ejeX1=-ejeX1;
aux=anguloEntreEjes(ejeX2,ejeX1);
if(aux<angulo) angulo=aux;
aux=anguloEntreEjes(ejeX2,ejeY1);
if(aux<angulo) angulo=aux;
ejeY1=-ejeY1;
aux=anguloEntreEjes(ejeX2,ejeY1);
if(aux<angulo) angulo=aux;
return angulo;

Para comprobar el mnimo ngulo simplemente hay que calcular cul es el menor ngulo entre el eje X
del conector pasado como parmetro y los ejes X, -X, Y y Y del conector al que se le llama este mtodo.
Para ello basta con calcular el ngulo entre cada una de la cuatro combinaciones de los ejes y devolver el
mnimo de ellos.

6.2

Comunicacin de transformaciones sobre piezas ensambladas

En este apartado se va a ampliar cierta informacin que se ha explicado en el captulo anterior de diseo
respecto a la comunicacin de transformaciones a realizar sobre piezas ensambladas. En particular, se va
a ampliar nicamente las explicaciones de la comunicacin de la traslacin y del deslizamiento realizadas
en el captulo anterior (ver Captulo 5. Diseo).

156

EPS

CAD Mecnico para piezas Lego

6.2.1 Comunicacin de la traslacin


En la comunicacin de la traslacin el nico elemento que hay que acabar de destacar para comprender
completamente dicho proceso es la forma en que se puede realizar la comprobacin de si la traslacin se
est llevando a cabo en el eje Z del conector o no. Tal y como se comentaba en el captulo anterior a ste,
los pasos a seguir eran los siguiente:
1

Obtener la matriz W2C, que nos permite transformar de coordenadas de mundo a coordenadas
de conector. Tal matriz es la inversa de la C2W, que es la que nos permite trasnformar las
coordenadas de conector a las de mundo.

Aplicar la matriz W2C al vector traslacin t, para obtener dicha traslacin en coordenadas de
conector.

Normlaizar el vector traslacin en coordenadas de conector.

Si el vector traslacin, en coordenadas de conector, es el Z+=(0,0,1) o el Z-=(0,0,-1) entonces


podremos decir que la traslacin se est llevando a cabo en el eje Z del conector. De otro modo
no.
Cylindrical Hole

bool moverEjeZ(Vector t)
Matrix C2W,W2C;
Vector traslacion,Z+,Z-;
Z+=(0,0,1);
Z-=(0,0,-1);
C2W=obtenerC2W();
W2C=C2W.inversa();

traslacion=t;
traslacion=W2C*traslacion;

traslacion.normalizar();

return (iguales(traslacion,Z+) or iguales(traslacion,Z-))

Como se puede apreciar, el mtodo que se encarga de verificar si la traslacin se realiza en el eje Z del
conector, se encuentra en la clase Cylindrical Hole, ya que es la nica que lo necesita.

UdG

157

Captulo 6. Implementacin

6.2.2 Comunicacin del deslizamiento


En el caso del deslizamiento hay un par de aspectos que simplemente se explicaron en su momento en el
captulo de diseo y que ahora se va a profundizar en su implementacin. Estos dos aspectos son la forma
en la que determinamos el conector a deslizar y la manera en que capturamos el deslizamiento indicado
por el usuario. Vayamos por partes:
1

Determinar el conector a deslizar. Para considerar un conector proclive a deslizar debe


cumplir las propiedades descritas en el captulo de diseo. Estas eran: ser un conector de tipo
segmento, estar conectado a otro u otros conectores y por lo tanto ser un conector ocupado de
la pieza a la que pertenece, y encontrarse conectado slo a conectores de tipo segmento. Para
ello slo har falta preguntar a la pieza seleccionada por el usuario a deslizar cul de sus
conectores ocupados es el ms cercano al lugar donde clic el usuario, lugar este representado
por el propio LeoCAD [2] mediante una recta r.
Pieza

Conector conectorCercanoDeslizar(Recta r)
Conector actual,cercano;
float aux,distMin;
ListaConectores deslizan;
if(conectoresOcupados.Vacia()) return NULL;
else
{
conectoresOcupados.Primero();
while(not conectoresOcupados.Fin())
{
actual=conectoresOcupados.Actual();
if(actual.puedeDeslizar()) deslizan.Introducir(actual);
conectoresOcupados.Siguiente();
}
if(deslizan.Vacia()) return NULL;
else
{
actual=deslizan.Actual();
cercano=actual;
distMin=cercano.distanciaMinima2(r);
deslizan.Siguiente();
while(not deslizan.Fin())
{
actual=deslizan.Actual();
aux=actual.distanciaMinima2(r);
if(aux<distMin)
{
distMin=aux;
cercano=actual;
}
deslizan.Siguiente();
}
return cercano;
}
}

158

EPS

CAD Mecnico para piezas Lego

Veamos con un poco ms de rigor las acciones llevadas por el mtodo de la pieza que detecta
el conector ms cercano a la recta r para deslizar. Primero se crea un a lista de los conectores
que pueden deslizar. Un conector podr deslizar si cumple las popiedrades descritas
anteriormente y en el captulo de diseo. Tales propiedades se plasman en la implementacin
de la siguiente forma:
Conector

virtual bool puedeDeslizar()=0

En la clase Conector se ha creado un mtodo virtual puro [10]. Tal y como antes se ha
explicado los conectores de tipo puntual no pueden deslizarse, as la implementacin que se
lleva a cabo de ste mtodo por parte de la clase Puntual es simple: debe devolver siempre
falso.
Puntual

bool puedeDeslizar()
return false;

Por contra para los conectores de tipo segmento la implementacin del mtodo sera la que se
muestra a continuacin:
Segmento

bool puedeDeslizar()
Conector actual;
bool desliza=false;
conectados.Primero();
while(not conectados.Fin() and not desliza)
{
actual=conectados.Actual();
if(actual.obtenerNombre()==(axle,axleHole,cylindricalHole))
{
desliza=true;
}
else conectados.Siguiente();
}
return desliza;

UdG

159

Captulo 6. Implementacin

Si un conector de tipo segmento se encuentra conectado a algn otro conector de tipo


segmento, entonces con encontrar uno de tal tipologa ya bastar, ya que no hace falta detectar
a todos los conectores de tipo segmento a los que se encuentra conectados.
Despus de crear la lista de conectores que son proclives a deslizar bastar con calcular el
conector ms cercano, de los que pueden deslizar, a la recta r. Para ello se ha utilizado el
clculo de la distancia al cuadrado entre la posicin del conector y la recta r (ver Anexo 7.
Distancia Punto Recta).
2

Captura del deslizamiento. Para capturar el deslizamiento realizado por el usuario a travs
del ratn o teclado del ordenador, debemos realizar los clculo necesarios para que la traslacin
realizada se pueda aplicar en el eje de deslizamiento (eje Z del conector). Tal y como se ha
explicado en el captulo de diseo la traslacin a llevar a cabo ser la siguiente:

T =d(T d)

donde

0
d = C2W * 0
1

con norma unitaria ||d|| = 1.

T es el vector traslacin capturado va mouse o teclado.

. . .
Conector conectorDeslizar;
Matrix C2W;
Vector traslacionDeslizar,direccion;
// Obtenemos el conector a deslizar
// r es la recta creada por el propio LeoCAD
// piezaSeleccionada la pieza a deslizar por el usuario
conectorDeslizar=piezaSeleccionada.conectorCercanoDeslizar(r);
if(conectorDeslizar NULL) //Tenemos conector para deslizar
{
C2W=conectorDeslizar.obtenerC2W();
direccion=(0,0,1);
direccion=C2W*direccion;

//Producto escalar entre dos vectores


productoEscalar=traslacinUsuario*direccion;

//Producto de un nmero por un vector


traslacionDeslizar=productoEscalar*direccion;

}
. . .

160

EPS

CAD Mecnico para piezas Lego

Como se puede observar primero obtenemos el conector a deslizar de la pieza que pretende a
su vez deslizar el usuario. Una vez hecho, si tenemos conector en disposicin de deslizarse
realizaremos tres pasos:
1

Obtener el vector que nos informa de la direccin de deslizamiento (eje Z del conector)
en coordenadas de mundo (ver Captulo 5. Diseo apartado 5.1.2 Sistemas de
referencia del conector, de la pieza y del mundo).

Obtener el producto escalar entre el vector traslacin realizado por el usuario y el vector
direccin.

Finalmente habr que obtener el valor de producto del producto escalar anterior y el
vector direccin. Con todo esto tendremos la traslacin a aplicar a la pieza a la que
pertenece el conector a deslizar, para que se deslize.

6.3

Deteccin de colisiones

Para detectar colisiones en la traslacin o deslizamiento donde intervengan conectores de tipo Cylindrical
Holes (recordar que, tal y como se ha dicho en el captulo anterior, son ellos los que deben decidir que
hacer, es decir, si chocan o no con otros conectores) hay que:
1

Obtener la lista de conectores conectados al conector sobre el que se encuentra el Cylindrical


Hole trasladndose o deslizndose. Tal lista Lcolisiones contendr los conectores que podemos
considerar proclives a colisionar con el Cylindrical Hole en la direccin contraria de traslacin,
en el caso de que el mensaje de traslacin provenga de un conector conectado al Cylindrical
Hole y en la direccin de la traslacin, si el mensaje proviene de la pieza a la que pertenece el
Cylindrical Hole. En el caso del ejemplo mostrado en la Figura 6.7, la lista estara formada por
Lcolisiones=[ AH1, AH2].
P1 a trasladar
P2

P3

P1. Esquema pieza 3704.

P1
A1

A2
AH1

AH2

CH1

CH2

P2. Esquema pieza 6541.


P3. Esquema pieza 32064.

dcolision
Figura 6.7. Esquema de posible colisin en la traslacin de conectores Cylindrical Holes.

UdG

161

Captulo 6. Implementacin

Dividir dicha lista de conectores Lcolisiones en dos: Una donde tendremos a los conectores que se
encuentran conectados a la pieza que pertenece el Cylindrical Hole, tanto de una forma directa
como indirecta, y otra donde tendremos al resto de conectores. A la primera lista la llamaremos
lista de conectores dinmicos Ldinmicos y a la segunda lista la llamaremos lista de conectores
estticos Lestticos. En el caso de la Figura 6.7 Ldinmicos=[ CH1, CH2 ] y Lestticos=[ AH1, AH2 ] y en
el caso de la Figura 6.8 Ldinmicos=[ CH1 , CH2, CH3, CH4 ] y Lestticos=[ AH1, AH2 ].

P4

AH1

P3

P1

P5

A1

CH3

AH2

P1. Esquema pieza 3704.


P2. Esquema pieza 6541.

P2

A2

CH4

P3. Esquema pieza 6541.


P4. Esquema pieza 3622.

CH1 CH2

P5. Esquema pieza 32064.

dcolision

P2 a trasladar
Figura 6.8. Esquema de colisin en la traslacin de un Cylindrical Hole que tiene conectado
indirectamente, a la pieza a la que pertenecen, otros Cylindricals Holes.
3

Ahora solo har falta calcular la distancia mnima de todas las distancias de cada par de
conectores dmin(Ldinmicos, Lestticos) (ver Figura 6.9).
P4

P1. Esquema pieza 3704.


P1

P5

A1
AH1

P3
CH3

AH2
d1
d2
d3
d4
d5
d6
d7

P2

A2

CH4

P2. Esquema pieza 6541.


P3. Esquema pieza 6541.
P4. Esquema pieza 3622.

CH1 CH2

P5. Esquema pieza 32064.


dcolision = min( d1, d2, d3, d4, d5, d6, d7, d8 ) = d1

d8
Figura 6.9. Esquema del clculo de la distancia dcolision de traslacin.
Una vez realizados estos tres pasos, el Cylindrical Hole podr determinar si la distancia de colisin dcolision
es o no nula y con que conector colisiona en caso de hacerlo.

162

EPS

CAD Mecnico para piezas Lego

Tambin habra que aclarar un ltimo aspecto. Tal y como se ha comentado en el Captulo 2. Piezas y
conectores Lego de la memoria, hay conectores de tipo segmento con y sin hermanos. La deteccin de
colisiones tambin tiene en cuenta este ltimo caso ya que se incluye en la lista de posibles conectores a
colisionar Lcolisiones, el extremo de los conectores de tipo segmento sin hermanos, con lo cual, la deteccin
de colisiones podr solucionar problemas como el de la Figura 6.10, donde el Cylindrical Hole2
colisionaria con el extremo del conector de tipo Axle, que en este caso no tiene hermano. As pues, en el
momento en que la dcolision==0, el extremo del Axle colisionara con el CH2 y entonces el propio CH2
comenzara a propagar la traslacin o deslizamiento hacia el conector de colisin, en este caso el Axle
mediante su extremo. Mientras la dcolision>0, la pieza que posee a los Cylindrical Holes, permanecera
quieta sin propagar la traslacin deslizndose, pero recalculando las conexiones.

P1 a trasladar
P2
A
P1

P1. Esquema pieza 6587.


CH1

CH2

P2. Esquema pieza 6541.


Lcolisiones=[ Aextremo, CH1, CH2 ]
Ldinmicos=[ CH1, CH2 ]
Lestticos=[ Aextremo ]

dcolision
Figura 6.10. Esquema de colisin de Cylindrical Holes con el extremo de un conector sin hermano.
Vemos pues el cdigo utilizado para llevar a cabo esta deteccin de colisiones.
Tal y como se mostraba en el captulo de diseo de la memoria el mtodo que se encargaba del clculo de
la distancia de colision era el mtodo float distanciaColision(int direccion). Vemos pues,
como opera para llevar en prctica la teora explicada. Observar que la numeracin al lado del cdigo se
corresponde con las explicaciones anteriores.

UdG

163

Captulo 6. Implementacin
Segmento

float distanciaColision(int direccion)


Conector actual,hermanoActual,dinamico,estatico;
Pieza madreActual();
ListaConectores dinamicos,estaticos;
ListaDistancias distancias;
float distMin,aux;
conectados.Primero();
while(not conectados.Fin())
{
conectados.Actual();
colisiones=colisiones+actual.conectadosColision(direccion,this);
if(actual.tengoHermano())
{
hermanoActual=actual.obtenerHermano();
colisiones=colisiones+hermanoActual.conectadosColision(direccion,this);
}
else
{
if(extremoColisiona(direccion,this))
{
colisiones.Introducir(actual);
}
}
conectados.Siguiente();
}
colisiones.Primero();
while(not colisiones.Fin())
{
actual=colisiones.Actual();
madreActual=actual.obtenerMadre();
if(caminoDeAssemblings(this)) dinamicos.Introducir(actual);
else estaticos.Introducir(actual);

colisiones.Siguiente();
}
dinamicos.Introducir(this);
dinamicos.Primero();
while(not dinamicos.Fin())
{
dinamico=dinamicos.Actual();
estaticos.Primero();
while(not estaticos.Fin())
{
estatico=estaticos.Actual();
distancias.Introducir(distanciaMinima(dinamico,estatico));
estaticos.Siguiente();
}
dinamicos.Siguiente();
}
if(distancias.Nelementos==0) return -1; //Seal de que no hay colisin.
else
{
distancias.Primero();
distMin=distancias.Actual();
distancias.Siguiente();
while(not distancias.Fin())
{
aux=distancias.Actual();
if(aux<distMin) distMin=aux;
distancias.Siguiente();
}
return distMin;
}

164

EPS

CAD Mecnico para piezas Lego

6.4

Parser

Tal y como se haba explicado en el captulo anterior (ver Captulo 5. Diseo apartado 5.8 Parser) el
parser es el mdulo que se encarga de la lectura de los ficheros LCI (ver Anexo 2. Formato, sintaxis y
semntica de los ficheros LCI). El proceso que sigue tal mdulo es el que se muestra en el siguiente
grfico ya presentado anteriormente.

Figura 6.11. Proceso de parseo de los ficheros LCI.


A la pieza se le ordena que inicie el proceso de parseo de la informacin relacionada con el fichero LCI
asociado a ella. sta comienza el proceso. Este proceso se basa nicamente en ir identificando las lneas
con informacin para detectar el tag correspondienete en cada momento y la informacin asociada a los
tags. Si el tag es el que debera leerse en ese momento se parsea la informacin asociada a dicho tag y se
crea el elemento del diccionario asociado. Si el tag parseado no es el pertinente en esos momentos se
devuelve una seal de error sintctico. Este proceso se repite hasta que se encuentra el tag que nos
informa del final de la informacin del conector actual, el tag </connector>. En estos momentos se deber
crear la instancia de uno de los posibles tipos de conectores (Stud, Stud Inlet, Axle, Axle Hole o
Cylindrical Hole) con la informacin introducida en el diccionario.
Tal y como se coment en su momento en el captulo de diseo (ver Captulo 5. Diseo apartado 5.8
Parser), al inicializar al conector con el diccionario, ser ste que dependiendo de la tipologa a la que
pertenezca deber obtener la informacin asociada a unos tags o a otros, ya que los conectores de tipo
Puntual solo necesitan el tipo y su matriz de transformacin, y por contra, los conectores de tipo segmento
necesitan, adems del tipo dado por el nombre y de la matriz de transformacin 3D, la longitud y el id
dentro del fichero LCI tanto suyo como el de su hermano, en caso de tenerlo.

UdG

165

Captulo 6. Implementacin

Pieza

int leerFicheroLCI(char path)


Fichero f;
Diccionario d;
Tag t1(<name>),t2(<matrix>),t3(<lenght>),t4(<id>),t5(<brother>),
Contenido c ;
char linea[150],tag[20],tipo[20],matriz[50];
char longitud[20],id[10],idBrother[10];
f.abrir(path)
if(f.fallo()) f.cerrar();
else
{
while(not f.finDeFichero())
{
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==<connector>)
{
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea,<name>);
if(tag=<name>)
{
linea=f.obtenerLineaConInformacion();
tipo=obtenerTipoConector(linea);
c.introducirContenido(tipo);
d.Introducir(t1,c);
linea=f.obtenerLineaConInformacion();
tag=detectarag(linea,</name>);
if(tag==</name>)
{
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea,<matrix>);
if(tag==<matrix>)
{
linea=f.obtenerLineaConInformacion();
matriz=obtenerMatriz(linea);
c.introducirContenido(matriz);
d.Introducir(t2,c);
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==</matrix>)
{
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea,</matrix>);
if(tag==<parameters>)
{
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea,);
if(tag==<length>)
{
longitud=leerNumero();
c.introducirContenido(longitud);
d.Introducir(t3,longitud);
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==<id>)
{
id=leerNumero();
c.introducirContenido(id);
d.Introducir(t4,id);
linea=f.obtenerLineaConInformacion();
tag=detectarTag(linea);
. . .

166

EPS

CAD Mecnico para piezas Lego

. . .

if(tag==</id>)
{
//Si tiene el tag <id> tambin yiene el tag <brother>
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==<brother>)
{
linea=obtenerLineaConInformacion();
idBrother=leerNumero();
c.introducirContenido(idBrother);
d.Introducir(t5,c);
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==</brother>)
{
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==</parameters>)
{
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag </connector>)
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1;
}
}
else
{
f.cerrar():
return -1; //Fallo sintctico
}
}
else if(tag </connector>)
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else if(tag==</connector>)
{
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}

. . .

UdG

167

Captulo 6. Implementacin

. . .
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
//Creamos la instancia del tipo de conectort que indica el fichero
//con la informacin introducida en el diccionario
crearConector(d); //Creamos la instancia del conector que indica el tipo
}
return 1; //Seal de que el parseo se llev a cabo sin herrores
}

Cabe destacar que una vez realizado el parseo de un determinado fichero LCI se deber proceder a la
bsqueda de hermanos dentro de una misma pieza, es decir, cada conector con hermano buscar a otro
conector, dentra de la misma pieza a la que pertenece, que posea el id que el primero tiene para su
hermano. Con esto tendremos que todos los conectores con relacin de hermandad con otro, se conocern
mtuamente en todo momento, lo cual es muy til para diversos aspectos de la aplicacin como la
propagacin del assembling y el deslizamiento (ver Captulo 5.Diseo).

168

EPS

CAD Mecnico para piezas Lego

6.5

Robustez

La robustez informtica podramos definirla como la caracterstica que hace que una cierta aplicacin sea
fuerte o robusta a posibles errores de precisin numrica. En nuestro caso no solo se ha intentado que el
programa desarrollado sea robusto en cuanto a posibles bugs en la implementacin, si no que se ha
intentado que la aplicacin sea tambin robusta respecto al tratamiento que las computadoras llevan a
cabo con los nmeros en coma flotante. ste tratamiento puede provocar que hasta una simple
comparacin entre dos nmeros en coma flotante, que tericamente debieran ser iguales, no lo sean
debido a la precisin con la que las computadoras procesan dicha tipologa de nmeros.
Durante todo este captulo se ha hecho incapi en la robustez en la implementacin de ciertos mtodos,
as pues veamos las medidas llevadas a cabo para evitar problemas de robustez al tratar con nmeros en
coma flotante.
La principal medida se ha basado en la sustitucin del operador de igualdad por un mtodo que
permita un cierto error

para determinar si dos elementos son iguales. Decimos elementos porque estae

tipo de mtodo se ha implementado tanto para vectores como para simples nmeros.
Para determinar si dos vectores son el mismo (por ejemplo para determinar si dos conectores se
encuentran en la misma posicin (x,y,z)) se ha llevado a cabo el clculo del mdulo del vector diferencia
entre ambos vectores para comprobar si dicho mdulo es menor o igual que el error que permitimos. Si es
as entonces consideraremos a ambos vectores iguales, en caso contrario no ya que la distancia entre
ambos vectores sera tan grande que no se debera a un error computacional.
bool iguales(Vector v1,Vector v2)
Vector diferencia;
float modulo;
diferencia=v1-v2;
modulo=diferencia.modulo();
return (iguales(modulo,0));

Para el caso de nmeros se ha realizado algo muy similar. Simplemente se ha calculado la distancia entre
los dos valores numricos a comprobar su igualdad. Una vez calculada, se comprueba si tal distancia es
igual o menor que el margen de error . Si es as diremos que ambos valores numricos son el mismo, en
caso contrario no.
bool iguales(float valor1,float valor2)
float diferencia;
diferencia=valor1-valor2;
if(diferencia<0) diferencia=-diferencia;
return (diferencia<= );

UdG

169

Captulo 6. Implementacin

Veamos a continuacin un ejemplo sencillo a la vez que explcito, donde se puede comprobar la
necesidad de rebestir a la aplicacin de un nivel ms de robustez.
EJEMPLO
Supongmos que conectamos al Stud1 y el Stud Inlet1 de la Figura 6.12. Como consecuencia de esta
conexin principal necesitamos propagar el assembling entre el Stud2 y el Stud Inlet2 (ver Captulo 5.
Diseo apartado 5.3.7 Propagacin del assembling).

Stud
Inlet1
Conexin principal
Stud1

Stud
Inlet2
Conexin secundaria
Stud2

Stud
Inlet1

Stud
Inlet2

Stud1

Stud2

Pieza 3004
Pieza 3004

Figura 6.12. Ejemplo de robustez al propagar el assembling entre dos conectores.

Tal y como se ha comentado en anteriores apartados, para que se produzcan conexiones secundarias entre
un conector de tipo Stud y otro de tipo Stud Inlet deben cumplirse dos condiciones (ver Captulo 5.
Diseo apartado 5.3.7 Propagacin del assembling):
1

Igualdad de posiciones.

Igualdad de normales.

Ambos conectores, el Stud2 y el Stud Inlet2, deberan encontrarse en la misma posicin. Al obtener el
valor de la misma del Stud obtenemos el vector POSStud=(0,2.000904567, 0.500098704) y para el Stud
Inlet POSStudInlet =(0, 2.000935789, 0.500089954).
Si utilizamos el operador de igualdad obtendramos que los dos conectores no se encuentran en la misma
posicin, cuando realmente si que lo estn. Para solucionar tal problema bastar con utilizar el mtodo de
igualdad antes descrito.

170

EPS

CAD Mecnico para piezas Lego

6.6

Interfaz de usuario

En este apartado del captulo de implementacin se va a explicar la interfice que el usuario tiene a su
disposicin para poder llevar a cabo el proceso de assembling (ver Captulo 5. Diseo apartado 5.3
Assembling), as como otras caractersticas aadidas para facilitar la interaccin del mismo con la
aplicacin.
Para facilitar las tareas relacionadas con la opcin de assembling aadida al LeoCAD [1] se ha
implementado una barra de herramientas exclusiva para tales opciones (ver Figura 6.13). Durante todo
este apartado relacionado con la interfaz de usuario, se har referencia a ella de forma constante. Por este
motivo se recomienda al lector referenciarse a la Figura 6.13 en todo momento.

Habilitar / Deshabilitar assembling

Realizacin del assembling

Desconexin de conectores ensamblados

Desconexin de piezas ensambladas

Deslizamiento de piezas

Seleccin del directorio LCI

Figura 6.13. Barra de herramientas con las opciones de assembling.

6.6.1 Habilitar y deshabilitar la opcin de assembling


La primera opcin que el usuario debe tener a su alcance, cuando utilice el CAD Mecnico para piezas
Lego, debe ser la opcin de habilitar o deshabilitar el assembling entre piezas. Esta propiedad es ms que
necesaria ya que no se le puede obligar al usuario a utilizar una caracterstica del programa, pese a que
sta lo mejore sustancialmente, desde nuestro punto de vista.
La manera de hacerlo es muy sencilla. Solo se deber presionar el botn

de la barra de

herramientas, para habilitar o deshabilitar la opcin de assembling.


Hay que comentar que cuando el usario intente instanciar una pieza y esta no se encuentre disponible
dentro del catlogo de piezas LCI (ver Anexo 6. Piezas con ficheros LCI asociados y Anexo 2. Formato,
sintaxis y semntica de los ficheros LCI), la aplicacin le avisar con un mensaje como el que se muestra
en la Figura 6.14, siempre y cando la opcin de assembling se encuentre activada.

UdG

171

Captulo 6. Implementacin

Figura 6.14. Mensaje de error producido al instanciar una pieza inexistente en el directorio
LCI teniendo la opcin de assembling activada.

6.6.2 Realizacin del assembling


Cuando el usuario quiera llevar a cabo el proceso de assembling entre dos conectores de dos piezas
distintas, lo primero que tiene que hacer es seleccionar los conectores que intervendrn en la conexin. La
forma de elegir los conectores es bastante sencilla, puesto que el usuario solo deber clicar con el botn
izquierdo del ratn sobre el conector deseado. Este proceso deber ser repetido tantas veces como haga
falta, hasta seleccionar los dos conectores a conectar (ver Figura 6.15)

Figura 6.15. Ejemplo de seleccin de dos conectores a ensamblar.

172

EPS

CAD Mecnico para piezas Lego

Para modificar el conector seleccionado solo har falta escoger otro conector, que podr ser tanto de la
misma como de otra pieza diferente y para anular la seleccin de los conectores, el usuario nicamente
deber clicar sobre una parte de la pantalla que se encuentre vaca, es decir, sin piezas a seleccionar.
Cabe comentar que todo conector seleccionado ser destacado mediante un smbolo con el fin de informar
al usuario cul es el conector seleccionado. El smbolo asociado a cada tipo de conector se muestra en la
Tabla 6.1.
Smbolo

Tipo de conector

Crculo

Stud, Cylindrical Hole

Cuadrado

Stud Inlet

Cruz

Axle, Axle Hole

Tabla 6.1. Smbolo asignado a cada tipo de conector.


Una vez seleccionado los conectores a ensamblar hay dos maneras de confirmar el assembling y por lo
tanto de llevarlo a cabo:
1

La primera forma es realizando un doble clic sobre uno de los dos conectores seleccionados
previamente. Hay que destacar que el conector sobre el que se realiza el doble cliqueo asumir el
papel de conector esttico y el otro conector el papel de conector dinmico (ver Captulo 5.
Diseo apartado 5.1.1 Definiciones tiles).

La segunda forma de llevar a cabo el assembling es utilizando el botn de assembling

del

que viene provista la barra de herramientas de assembling aadida al LeoCAD [1] (ver Figura
6.13).
Una vez confirmado el assembling, si ste no puede llevarse a cabo porque los conectores no sean
compatibles (ver Captulo 5. Diseo apartado 5.3.4 Verificacin de compatibilidad entre conectores) o
porque exista un lazo o cadena entre ambos (ver Captulo 5. Diseo apartado 5.3.5 Evitar lazos y
cadenas), se informar al usuario con el siguiente mensaje:

Figura 6.16. Mensaje de error producido al intentar ensamblar dos conectores no


compatibles o entre los cules existe un lazo o cadena.
En caso contrario, se realizar el assembling entre los dos conectores seleccionados.
UdG

173

Captulo 6. Implementacin

6.6.3 Desconexin de conectores ensamblados


El proceso de desconexin de un conector ensamblado (ver Captulo 5. Diseo apartado 5.7.1
Desconexin de conectores y piezas ensambladas) es muy sencillo. Basta con apretar el botn de la barra
de herramientas de assembling (ver Figura 6.13) correspondiente

. Una vez apretado dicho botn

aparecer en el cursor del ratn el mismo smbolo y solo har falta clicar, con el botn izquierdo del
ratn, sobre el conector deseado. El conector seleccionado para desconectar ser destacado con su
correspondiente smbolo en color rojo (ver Figura 6.17).

Figura 6.17. Ejemplo de seleccin de conector a desconectar.


Cabe destacar que si el conector seleccionado se encuentra libre y en la pieza a la que pertenece tal
conector no existe ningn conector ocupado ms que desconectar, se informar al usuario con el
consiguiente mensaje (ver Figura 6.18).

Figura 6.18. Mensaje producido al intentar desconectar un conector libre, en la pieza del
cual no existen ms conectores ocupados.
174

EPS

CAD Mecnico para piezas Lego

6.6.4 Desconexin de una pieza ensamblada


El proceso de desconexin de una pieza ensamblada (ver Captulo 5. Diseo apartado 5.7.1 Desconexin
de conectores y piezas ensambladas), o lo que es lo mismo, el proceso de desconexin de todos los
conectores conectados de una pieza es anlogo al de desconexin de conectores. Solo hay que presionar el
botn de desconexin de piezas ensambladas

de la barra de herramientas que contiene las opciones

de assembling (ver Figura 6.13) y seleccionar, mediante el botn izquierdo del ratn, la pieza a
desconectar. Inmediatamente esta pieza ser destacada para informar al usuario de que el proceso de
desconexin ha sido satisfactorio.
Si la pieza a desconectar no tiene ningn conector ocupado para desconectar, se infromar al usuario con
el correspondiente mensaje (ver Figura 6.19).

Figura 6.19. Mensaje producido al intentar desconectar una pieza sin conectores ocupados.

6.6.5 Deslizamiento de piezas ensambladas


Para deslizar una pieza con uno o ms conectores en disposicin de ello (ver Captulo 5. Diseo apartado
5.5.3 Comunicacin del deslizamiento), hay que realizar diversos pasos:
1

Primero tenemos que seleccionar la pieza que pretendemos deslizar.

A continuacin hay que presionar el botn de deslizamiento de piezas

disponible en la

barra de herramientas con las opciones de assembling (ver Figura 6.13).


3

Ahora solo har falta deslizar la pieza. Tal deslizamiento se puede realizar de dos formas:
A

Desplazar el ratn con el botn izquierdo presionado.


Utilizar las teclas direccionales

para deslizar la pieza. Con dichas teclas se

desliza la pieza seleccionada una cierta distancia de deslizamiento constante (0.4 en


unidades), cada vez que las presionamos. Ahora bien, si queremos deslizar a la pieza
unidades ms pequeas (0.1 en unidades), solo deberemos presionar la tecla

la vez que las direccionales.


UdG

175

Captulo 6. Implementacin

6.6.6 Seleccin de la ubicacin del directorio LCI


El usuario puede elegir en cualquier momento la localizacin del directorio LCI, directorio ste donde se
encuentran todos los ficheros LCI (ver Anexo 6. Piezas con ficheros LCI asociados y Anexo 2. Formato,
sintaxis y semntica de los ficheros LCI), mediante el bton

de la barra de herramientas con las

opciones de assembling (ver Figura 6.13). Una vez presionado dicho botn aparecer un ventana como la
que a continuacin se muestra:

Figura 6.20. Ventana de seleccin del directorio LCI.


Tal ventana posee tres botones:
Nos permite activar una ventana como la de la Figura 6.21 con la que podremos seleccionar
el sitio donde se encuentra ubicado el directorio LCI.

Figura 6.21. Ventana de seleccin de la ubicacin del directorio LCI.


Con este botn podemos confirmar la ubicacin seleccionada.
Con este botn cancelamos la seleccin realizada.
Cabe destacar que si el usuario no especifica la ubicacin del directorio donde se encuentran los ficheros
LCI disponibles de las piezas Lego, se asume por defecto que tal directorio se encuentra en el mismo sitio
que el ejecutable de la aplicacin.

176

EPS

"

)'

)
"

)'

CAD Mecnico para piezas Lego

UdG

178

CAD Mecnico para piezas Lego

RESULTADOS Y CONCLUSIONES

7.1

Resultados obtenidos

Desde el inicio del proyecto los objetivos del mismo eran claros y concisos: intentar implantar en una
herramienta de CAD la posibilidad de ensamblar objetos los unos con los otros, sin obligar al usuario a
definir restricciones geomtricas sobre el modelo en construccin, sino seleccionando las partes de los
mismos, que por su naturaleza permiten llevar a cabo el proceso de assembling. Para ello se ha intentado
aprovechar la propia informacin que poseen los objetos para poder determinar que partes de ellos son los
encargados de realizar la conexin, y de que forma.
Partiendo de un CAD existente, el LeoCAD [2], el cual utiliza el sistema de ladrillos de Lego
proporcionado por el paquete LDraw (ver Captulo 3. LDraw) como objetos para modelar, se ha creado
una nueva versin del mismo donde se pueden ensamblar las piezas, mediante el concepto ms
importante del proyecto: sus conectores (ver Captulo 2. Piezas y conectores Lego). stos son los que
permiten ensamblar unas piezas con otras de formas especficas. Partiendo del concepto de conector y de
la identificacin de un subconjunto de ellos, para demostrar la posibilidad de llevar a cabo la conexin de
dos piezas sin la necesidad de definir restricciones geomtricas sobre las mismas, se ha llevado a cabo el
proceso de assembling.
Una vez finalizado el proyecto podemos demostrar como resultados ms importantes del mismo los
siguientes:
1

Dentro de los conectores de piezas Lego se ha identificado la existencia de dos grandes


tipologas: los de tipo puntual y los de tipo segmento. La gran diferencia entre ambos radica en
el nmero de conectores que pueden estar conectados a ellos, de forma simultnea, ya que para
los primeros solo se pueden ensamblar un conector al mismo tiempo y para los de tipo segmento
tantos como su propia longitud les permita.

Identificacin de los pasos a seguir para ensamblar por cada par de conectores compatibles para
ello. Algunos de los pasos son comunes en los cuatro posibles assemblings diferenciados (Stud
Stud Inlet, Stud Cylindrical Hole, Axle Axle Hole y Axle Cylindrical Hole) y otros no.

Implementacin del mecanismo de assembling mencionado.

Dos piezas ensambladas no pueden desconectarse si no se indica de forma explcita, es decir, una
vez conectadas permanecen ensambladas hasta que se proceda a su desconexin.

La rotacin y traslacin de una pieza ensamblada provoca la rotacin y traslacin de todas las
piezas conectadas a la misma, tanto de forma directa como indirecta.

UdG

179

Captulo 7. Resultdos y conclusiones

Los conectores de tipo Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego) ensamblados
a conectores de tipo Axle pueden trasladarse libremente sobre ellos si tal traslacin se lleva a
cabo sobre el eje principal de ambos (ver Figura 7.1).

Figura 7.1. Ejemplo de traslacin libre de conectores de tipo Cylindrical Hole sobre los
de tipo Axle y viceversa.
7

El deslizamiento es un proceso que permite a un conector de tipo segmento deslizarse sobre otro
del mismo tipo, para as situarse en la posicin deseada una vez realizado el assembling.
Recordar que el assembling de conectores segmento se puede realizar nicamente a travs de los
extremos, por lo que esta opcin es muy til para conectores de tipo Axle Hole , ya que debido a
las propiedades del assembling entre ellos y sus compatibles, los Axles, el deslizamiento es la
nica forma que poseen para situarse en otra parte del conector con el que ensamblan que no sea
su extremo (ver Figura 7.2).

Figura7.2. Ejemplo de deslizamiento de conectores de tipo segmento.

180

EPS

CAD Mecnico para piezas Lego

La rotacin de piezas donde se vean implicados conectores de tipo Cylindrical Hole ensamblados
a conectores de tipo Axle o viceversa posee una propiedad especial: dichos conectores pueden
rotar de forma libre el uno sobre el otro, siempre y cuando la rotacin se lleve a cabo en el eje
principal de los mismos (ver Figura 7.3).
1

Figura 7.3. Secuencia de rotacin que muestra como el Axle puede rotar libremente sobre el
Cylindrical Hole y viceversa.
9

Tanto en la traslacin como en el deslizamiento donde intervengan conectores de tipo segmento


se ha implementado deteccin de colisiones entre los mismos, con lo que conseguimos no solo
implantar el assembling entre piezas, sino que dotamos a la aplicacin de cierta fsica (ver
Figura 7.4).

distancia
colisin
distancia
colisin
distancia
colisin

distancia
colisin

Figura 7.4. Ejemplo de colisiones entre conectores de tipo segmento.

UdG

181

Captulo 7. Resultdos y conclusiones

10 La colision entre dos conectores de tipo Cylindrical Hole tambin se producir pero con la
peculiaridad de que cuando uno colisione con el otro no movern a todo el resto del conjunto de
piezas conectadas hasta que uno de los dos choque con algn otro conector que no sea de tipo
Cylindrical Hole (ver Figura 7.5).
En el ejemplo de la Figura 7.5 la pieza verde, la
cual posee conectores de tipo Cylindrical Hole, al
trasladarse en la direccin especificada, empujara
a la pieza amarilla, ya que sta tambin posee
conectores de tipo Cylindrical Hole, hasta que sta
ltima colisionara con la pieza azul, que est
conectada a la pieza roja con Axles mediante Alxe
Figura 7.5. Ejemplos de colisin entre
conectores de tipo Cylindrical Hole.

Holes. Sera en ese momento en el que


comenzara a trasladarse todo el conjunto.

11 Una vez realizado un modelo utilizando la opcin de assembling podemos guardar tal modelo
sin necesidad de aadir informacin extra en el fichero a guardar. Al cargar dicho fichero,
bastar con buscar conexiones secundarias entre todas las piezas de la escena para volver a tener
el modelo ensamblado.
12

Posibilidad de crear modelos complejos de forma mucho ms sencilla debido a la mejora que
supone el concepto de assembling y todo lo que se deriva de ello.

13 Se han creado una tipologia de ficheros denominados LCI (Lego Connectors Information) (ver
Anexo 2. Formato, sintaxis y semntica de los ficheros LCI) de donde se puede obtener toda la
informacin de los conectores asociada a una cierta pieza. Estos fichero han sido creados
utilizando el estndar XML [14].
14 Actualmente est disponible un web site con toda la informacin referente al proyecto del CAD
Mecnico para piezas Lego. Tal informacin consiste en el manual de usuario includo en este
proyecto, todos los elementos necesarios para la utilizacin del CAD (ejecutables, piezas
LCI), as como un completo ejemplo de creacin de un autombil. Cabe destacar que dicha
web y en consecuencia el CAD, se encuentran en uso por parte de toda la comunidad Lego.

182

EPS

CAD Mecnico para piezas Lego

7.2

Conclusiones del proyecto

Con la implementacin del proceso de assembling y todo lo que sello supone se ha conseguido:
1

Mejorar la facilidad de uso de la aplicacin original, ya que ahora la construccin de un cierto


modelo consiste, simplemente, en ir seleccionando los conectores de las piezas que deben llevar
a cabo el proceso de assembling.

Mejorar la ergonoma del CAD original. Ahora es mucho ms cmodo crear un modelo
medianamente complejo, debido a que no hace falta comprobar continuamente si la situacin de
las piezas es la deseada, ya que con el assembling entre ellas, podemos asegurar que las piezas
quedan situadas tal y como ocurrira empricamente en el montaje de un modelo Lego real (ver
Figura 7.6).

Figura 7.6. Ejemplos de piezas bin (derecha) y mal ensambladas (izquierda).


3

Simplificar el manejo del nuevo CAD como consecuencia de la similitud entre la interfaz
utilizada y la real para ensamblar piezas Lego. Con esto lo que conseguimos es que el proceso de
creacin de un modelo sea mucho ms intuitivo.

Como consecuencia de la mejora en la facilidad de uso y de la comodidad al utilizar el CAD


Mecnico para piezas Lego, la creacin de modelos es mucho ms rpida que anteriormente. En
comprobaciones llevadas a cabo se han obtenido los siguientes resultados:
Modelo

Tiempo sin assembling

45min 37seg

Tiempo con assembling

15min 59seg

Figura 7.7. Tiempos de creacin de un modelo con y sin la opcin de assembling activada.
UdG

183

Captulo 7. Resultdos y conclusiones

Como se puede comprobar tales resultados son muy significativos, ya que la reduccin del
tiempo necesario para crear el modelo de la Figura 7.7 con la opcin de assembling activada
supone el 33%, aproximadamente, en el tiempo de creacin en relacin a la construccin del
mismo modelo, pero sin la utilizacin de la opcin de assembling.
5

La posibilidad de poder jugar con el modelo tal y como haramos realmente.

Grandes posibilidades de amplicacin del proyecto con ms conectores como los engranajes
(gears) y por lo tanto la introduccin de nuevas y ms complejas interacciones.

184

EPS

Captulo 7. Resultdos y conclusiones

( 7 8)
-

185

" " ()
' )

EPS

CAD Mecnico para piezas Lego

UdG

186

CAD Mecnico para piezas Lego

8
8.1

TRABAJOS FUTUROS Y AGRADECIMIENTOS


Trabajos futuros

Partiendo de la base realizada con el CAD Mecnico para piezas Lego podramos destacar cuatro grandes
proyectos que se podrian llevar a cabo, alguno de ellos complementaran el presente proyecto mientras
que otros simplemente se aprovecharan de las ventajas del mismo.
Lenguaje de Scripting
Este proyecto sera, de los cuatro expuestos, el que mejorara y generalizara la implementacin actual del
assembling. Para ello sera conveniente mantener nicamente los dos primeros niveles de la jerarqua de
clases del conector (ver Captulo 5. Diseo apartado 5.2.2 Jerarqua de clases del conector) aadiendo,
en caso de que hiciera falta, alguna tipologa ms de conectores. Una vez hecho esto se creara un
lenguaje de scripting donde se especificaran los datos necesarios para cualquier tipo de assembling, como
los conectores compatibles para ensamblar y los pasos de assembling que no se encontraran en la
implementacin base... Con todo esto conseguiramos generalizar la aplicacin y evitar la modificacin
del cdigo cada vez que se quisiera introducir un nuevo conector no identificado anteriormente.
El camino a seguir ya se encuentra delineado en este trabajo: mediante la identificacin de los elementos
comunes y los elementos diferentes para cada caso de conexin, desconexin, conexiones secundarias,
rotaciones y translaciones, puede obtenerse un esquema general. Por ejemplo, hemos visto en el captulo
de diseo que para realizar el assembling entre dos conectores se deben seguir un cierto nmero pasos
claramente diferenciados (Paso A, Paso B, Paso C, etc.) seguidos por dos pasos estndar entre todas las
conexiones. Por lo tanto, podra definirse un mecanismo genrico donde se especifiquen pares ordenados
del tipo
(Conectores, Lista de pasos)
donde Conectores es, a su vez, el par de conectores a ensamblar: (Stud, StudInlet) (estos pares NO son
ordenados, es decir que el par (StudInlet, Stud) es el mismo que el anterior). De la misma manera, Lista
de Pasos sera una simple cadena especificando los pasos a seguir para realizar la conexin. En este caso,
bastara con una simple cadena del tipo ABC (si los pasos DE son los obligatorios para todas las
conexiones, stos pueden obviarse). De esta forma, podra almacenarse en una base de datos este tipo de
estructura que facilitara enormemente la codificacin de nuevos conectores, ya que slo debera
recompilarse la aplicacin en el caso de la creacin de un nuevo paso de conexin (por ejemplo, K).
Un razonamiento similar debe utilizarse para poder generalizar los comportamientos en los casos del
deslizamiento, translacin y rotacin.

UdG

187

Captulo 8. Conclusiones y resultados

LCI Editor
Tal y como se ha comentado en la memoria, toda pieza con la que se desee ensamblar debe tener asociado
un fichero LCI (Lego Connectors Information) (ver Anexo 2. Formato, Sintaxis y semntica de los
ficheros LCI), en el que encontramos la informacin referente a los conectores de la propia pieza. Los 141
ficheros LCI que corresponden a las 141 piezas disponibles para poder utilizar con la opcin de
assembling han sido creados manualmente.
El objetivo de este proyecto sera el de intentar automatizar la creacin de los ficheros LCI a partir de la
informacin obtenida de los ficheros originales DAT del paquete LDraw. Este proceso se llevara a cabo
en 3 fases:
1

Deteccin de conectores. En esta fase se generaran todos los ficheros LCI asociados a cada una
de las piezas del paquete LDraw [1] (ver Captulo 3. LDraw), es decir, un fichero LCI por cada
fichero DAT que represente a una pieza Lego. Si una pieza ya tuviese un fichero LCI asociado,
slo se ampliara la lista de conectores presentes.

Visualizacin de la pieza y sus conectores. Una vez generados los ficheros LCI el editor
debera permitir la visualizacin de la pieza que representa a cada uno de ellos y as poder
observar los conectores detectados por la aplicacin.

Creacin de conectores no detectados por el editor. Toda pieza del paquete LDraw puede ser
creada utilizando nicamente geometra o mediante las subpartes que el propio paquete
proporciona. Si la pieza posee subpartes, la bsqueda de conectores se realizar con xito, ya que
es muy fcil identificar los conectores a partir de las subpartes que los modelan, pero en caso
contrario ser el usuario que deber informar al editor de la localizacin de los conectores no
detectados dentro de una determinada pieza. Todo este proceso debera hacerse de forma grfica.

Photogrametric LeoMCAD (Photogrametric Mechanical LeoCAD)


Este proyecto sera uno de los que se aprovechara de las ventajas que posee el utilizar el CAD Mecnico
para piezas Lego. Tal y como su nombre indica, introducira el concepto de fotogrametra en el CAD, el
cual se basa en la obtencin de medidas a partir de fotos. Con ello lo que se pretende es poder crear piezas
Lego (ver Captyulo 2. Piezas y conectores Lego) con la ayuda de imgenes en vez de crear los ficheros
DAT correspondientes a cada pieza de forma manual. Tal proceso de creacin de piezas Lego debera
utilizar imgenes de diferentes perspectivas de la pieza a construir, tanto para la creacin de la propia
pieza como para la deteccin de conectores dentro de la misma. Cabe destacar que los conectores
deberan ser detectados por el usuario dentro de las imgenes, es decir, simplemente situando el lugar
dentro de las diferentes imgenes de la pieza donde se localiza el conector. A partir de toda esta
informacin el programa debera ser capaz de crear el modelo 3D de la pieza y por lo tanto el fichero

188

EPS

CAD Mecnico para piezas Lego

DAT para su posterior utilizacin como parte del paquete LDraw, as como el correspondiente fichero
LCI para, a posteriori, poder ensamblar la pieza con otras.
LeoMCAD Studio (Mechanical LeoCAD Studio)
Una vez se ha conseguido que podamos ensamblar las piezas nicamente identificando las partes de ellas
que nos lo permiten sera muy til tener la opcin de llevar a cabo animaciones utilizando el CAD
Mecnico para piezas Lego. La idea se basara en crear frames de animacin para cada transformacin
significativa que se le aplique a alguna de las piezas que formen el modelo a construir. Para cada una de
estas transformaciones se creara un fichero de datos. Una vez tuviramos el conjunto de ficheros de datos
que formaran nuestra animacin podramos exportarlos tanto a POV-Ray como a VRML para poder
visualizar la animacin con gran calidad de imagen.

8.2

Agradecimientos

Como cierre al proyecto querra dedicar unas lneas a un conjunto de personas que me han ayudado, de
una forma u otra, antes y durante la realizacin del mismo:

A dos de las personas ms importantes de mi vida: mi madre y mi hermana. Sin su apoyo,


comprensin y paciencia todo hubiera sido mucho ms difcil. Os quiero con locura.

A ti papa, donde quiera que ests, porque me demostraste que hay que luchar hasta el final.
Espero que ests orgullosos de tu hijo.

Al resto de mi familiasois los mejores!!!

A mis amigos, por aguantarme y precisamente por eso, por ser mis amigos.

A ti Silvia por ser ms que una amiga, una segunda hermana para mi.

Y a mi tutor, Gustavo Patow, no tan solo por soportar las continuas y largas sesiones de consulta,
sino tambin por implicarse tanto en el proyecto y por ser ms que un tutor, un compaero.

UdG

189

CAD Mecnico para piezas Lego

"

()
-

UdG

"(
7

191

CAD Mecnico para piezas Lego

UdG

192

CAD Mecnico para piezas Lego

CUADRO DE FIGURAS Y TABLAS


Figura 1.1

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

Figura 2.1

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

18

Figura 2.2

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

19

Figura 2.3

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

20

Figura 2.4

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

21

Figura 2.5

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

22

Figura 3.1

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

27

Figura 3.2

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

28

Figura 3.3

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

34

Figura 3.4

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

34

Figura 3.5

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

35

Figura 3.6

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

37

Figura 3.7

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

37

Figura 3.8

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

38

Figura 3.9

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

39

Figura 4.1

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

42

Figura 4.2

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

43

Figura 4.3

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

44

Figura 4.4

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

45

Figura 4.5

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

46

Figura 4.6

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

47

Figura 4.7

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

47

Figura 4.8

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

48

Figura 4.9

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

48

Figura 4.10

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

49

Figura 4.11

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

50

Figura 4.12

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

50

Figura 5.1

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

55

Figura 5.2

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

55

Figura 5.3

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

56

Figura 5.4

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

58

Figura 5.5

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

58

Figura 5.6

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

67

Figura 5.7

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

70

Figura 5.8

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

70

Figura 5.9

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

70

Figura 5.10

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

70

UdG

193

Cudro de Figuras y Tablas

Figura 5.11

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

72

Figura 5.12

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

76

Figura 5.13

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

77

Figura 5.14

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

77

Figura 5.15

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

78

Figura 5.16

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

78

Figura 5.17

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

79

Figura 5.18

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

79

Figura 5.19

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

79

Figura 5.20

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

79

Figura 5.21

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

80

Figura 5.22

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

80

Figura 5.23

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

81

Figura 5.24

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

82

Figura 5.25

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

82

Figura 5.26

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

84

Figura 5.27

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

84

Figura 5.28

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

85

Figura 5.29

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

85

Figura 5.30

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

85

Figura 5.31

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

87

Figura 5.32

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

89

Figura 5.33

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

89

Figura 5.34

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

90

Figura 5.35

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

90

Figura 5.36

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

90

Figura 5.37

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

92

Figura 5.38

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

102

Figura 5.39

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

103

Figura 5.40

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

105

Figura 5.41

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

112

Figura 5.42

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

114

Figura 5.43

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

115

Figura 5.44

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

118

Figura 5.45

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

119

Figura 5.46

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

122

Figura 5.47

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

127

Figura 5.48

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

128

194

EPS

CAD Mecnico para piezas Lego

Figura 5.49

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

129

Figura 5.50

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

131

Figura 6.1

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

139

Figura 6.2

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

141

Figura 6.3

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

141

Figura 6.4

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

141

Figura 6.5

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

145

Figura 6.6

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

148

Figura 6.7

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

154

Figura 6.8

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

155

Figura 6.9

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

155

Figura 6.10

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

156

Figura 6.11

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

158

Figura 6.12

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

163

Figura 6.13

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

164

Figura 6.14

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

165

Figura 6.15

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

165

Figura 6.16

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

166

Figura 6.17

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

167

Figura 6.18

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

167

Figura 6.19

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

168

Figura 6.20

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

169

Figura 6.21

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

169

Figura 7.1

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

173

Figura 7.2

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

173

Figura 7.3

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

174

Figura 7.4

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

174

Figura 7.5

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

175

Figura 7.6

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

176

Figura 7.7

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

176

Tabla 3.1

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

28

Tabla 3.2

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

36

Tabla 3.3

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

38

Tabla 5.1

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

69

Tabla 6.1

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

166

UdG

195

Cudro de Figuras y Tablas

196

EPS

CAD Mecnico para piezas Lego

UdG

) (

197

CAD Mecnico para piezas Lego

UdG

198

CAD Mecnico para piezas Lego

BIBLIOGRAFA
La bibliografa ha estado creada siguiendo el estndard MLA (Modern Language Association of
America).
[1]

LDraw Organization. LDraw. En lnea. Internet. 1998. Accesible a http://www.ldraw.org

[2]

Zide, Leonardo. LeoCAD 0.73. En lnea. Internet. 1996. Accesible a http://www.leocad.org

[3]

Lachmann, Mike. MLCAD. En lnea. Internet. 1999. Accesible a http://www.mlcad.org.

[4]

Attila, Lng y Attila Kiss. LDraw Connection Database Version 1.04. En lnea. Internet. 2002.
Accesible a http://www.ldraw.org/reference/specs/lcd/

[5]

Booch, Grady et al. El Lenguaje Unificado de Modelado. 1999

[6]

Taubin, Gabriel y Savarese, Silvio. Rotations. En lnea. Internet. 2001

[7]

Shabana, Ahmed. Computational Dynamics. Department of Mechanical Engineering, University


of Illinois. Illinois : Wiley-Interscience JHON WILEY & SONS, INC, 1994

[8]

Sainz, Miguel A. et al. algebra. Girona : Miguel ngel Sainz, Joan Llus Serarols, Anna Maria
Prez y Palah, A.G, 1994

[9]

Garca, Javier et al. Aprenda C++ como si estuviera en primero. En lnea. Internet. Abril 1998.
Accesible a http://www.abcdatos.com/tutoriales/tutorial/l2525.html

[10]

Liberty, Jesse y B. Horvath, David. Aprendiendo C++ para Linux en 21 das. Primera edicin.
NaucaldPaud de Jurez : Prentice Hall, 2000

[11]

Gamma, Erich et al. Design Patterns. Elements of Reusable Object-Oriented Software. 1995

[12]

Woo, Mason et al. OpenGL programming guide. Segunda edicin. Addison Wesley, Enero 1997

[13]

Van Heesch, Dimitri. doxygen Manual for version 1.2.12. En lnea. Internet. 1997. Accesible a
http://www.doxygen .org

UdG

199

Bibliografa

[14]

Bray, Tim et al. Extensible Markup Language (XML) 1.0 (Second Edition). En lnea. Internet.
Octubre 2000. Accesible a http://www.w3.org/TR/2000/REC-xml-20001006

[15]

Franch, X. Estructures de dades. Especificaci, disseny i implementaci. Barcelona : Edicions


U.P.C, 1993

[16]

Bobic, Nick. Advance Collision Detection Techniques. En lnea. Internet. Mayo 1999. Accesible
a http://www.gamedev.net/reference/articles/article974.asp

[17]

Fowler, Martin. Refactoring; Improving the Design of Existing Code. USA : Addison-Wesley,
Octubre 2002

200

EPS

Bibliografa

' ;)

201

EPS

CAD Mecnico para piezas Lego

UdG

202

CAD Mecnico para piezas Lego

ANEXO 1. ESTRUCTURA DE DIRECTORIOS DEL PAQUETE LDRAW


La estructura de directorios utilizada por el paquete LDraw [1] es la que se muestra a continuacin:

Figura A1.1. Estructura de directorios del paquete LDraw.

Ldraw. ste es el directorio raiz del paquete LDraw y en l se encuentran el resto de directorios.
Tambin podemos encontrar otros elementos como el visualizador que nos provee el propio
paquete (ldraw.exe), el editor de piezas Lego para MS-DOS, el Ledit, y un programa que nos
permite ordenar las piezas tanto por su nmero de referencia como por su nombre.

Bitmap. En el directorio Bitmap se guardan los bitmaps que el visualizador del paquete LDraw
crea como consecuencia de la ejecucin de los metacomandos PASO y SAVE (ver Captulo 2.
Piezas y conectores Lego).

Htmimage. En este directorio se encuentran un conjunto de ficheros utilizados por el


visualizador del paquete y por el editor LEdit.

P. En el directorio P podemos encontrar las subpartes (conectores o geometra a dibujar) que


forman las piezas del paquete LDraw.

Parts. En ste directorio se ubican todas las piezas Lego includas en el paquete LDraw.

Models. Directorio disponible para almacenar los modelos creados mediante las piezas que
ofrece el propio paquete LDraw.

UdG

203

Anexos

ANEXO 2. FORMATO, SINTAXIS Y SEMNTICA DE LOS FICHEROS LCI


1

Formato, sintaxis y semntica de los ficheros LCI

Todo fichero con extensin LCI posee un nombre que corresponde con el nmero de serie de la pieza a la
que est asociado tal fichero. As pues, el nombre de todo fichero LCI tendr el siguiente formato:

numero_pieza.lci

donde
numero_pieza es el nmero de serie real de la pieza a la que est asociado el fichero LCI.
En cuanto al contenido de los ficheros LCI cabe destacar que estan formados por texto ASCII, que cada
lnea del fichero es totalmente independiente del resto del mismo y que sigue la sintaxis basada en el
estndar XML.
La sintaxis de los ficheros LCI es la que se especifica a continuacin:

<connector>
<name>nombre_conector</name>
<matrix>a b c d e f g h i j k l m n o p</matrix>
<parameters>
<lenght>longitud</lenght>
<id>identificadorLCI_conector</id>
<brother>identificadorLCI-hermano</brother>
</parameters>
</connector>

donde

nombre_conector es el nombre del conector segn su clasificacin por tipologa (ver Captulo

2. Piezas y conectores Lego). Los valores posibles, en la implementacin actual, son: stud,
studInlet, axle, axleHole y cylindricalHole.

a b c d e f g h i j k l m n o p forman una matriz de transformacin 3D en

coordenadas homogneas (ver Figura A2.1), que nos indica la posicin y rotacin del conector
respecto a la pieza (ver Captulo 6. Implementacin) a la que pertenece. Las coordenadas de esta
matriz se encuentran en coordenadas LDraw [1] (ver Anexo 4. Sistemas de coordenadas Ldraw y
LeoCAD).

204

EPS

CAD Mecnico para piezas Lego

C2P
=

Posicin
Rotacin
Coordenadas
homogneas

Figura A2.1. Matriz de transformacin 3D de los ficheros LCI.

longitud es el largor del conector.

identificadorLCI_conector es el identificador, dentro del propio fichero LCI, del conector

actual.

identificadorLCI_hermano es el identificador, dentro del mismo fichero LCI, del hermano

(ver Captulo 2. Piezas y conectores Lego) del conector actual.


Como se puede comprovar por los tags utilizados, la sintaxis de los ficheros LCI ha sido creada siguiendo
el estndar XML [14]. Tales tags tienen el siguiente significado:
<connector>

tag que nos informa el inicio de la informacin del conector.

</connector>

tag que nos indica el fin de la informacin asociada al conector.

<matrix>

tag que nos indica el inicio de la matriz de transformacin 3D del conector.

</matrix>

tag que nos indica el fin de la matriz de transformacin 3D del conector.

<parameters>

tag que nos indica el inicio de los parmetros del conector.

</parameters> tag que nos indica el fin de los parmetros del conector.
<lenght>

tag que nos indica el inicio de la longitud del conector.

</lenght>

tag que nos informa del fin de la longitud del conector.

<id>

tag que nos informa del inicio de la longitud del conector.

</id>

tag que nos informa del fin de la longitud del conector.

<brother>

tag que nos informa del inicio del identificadorLCI del hermano.

</brother>

tag que nos informa del fin del identificadorLCI del hermano.

En cuanto al contenido de los ficheros LCI habra que destacar tres aspectos realmente importantes:
1

El tag <parameters> solo ser necesario en el caso de los conectores que pertenezcan a los de
tipo segmento (ver Captulo 2. Piezas y conectores Lego), es decir, que los nicos conectores
que necesitarn de parmetros extras sern el Axle, Axle Hole y el Cylindrical Hole. As pues,
todo conector de tipo puntual que posea parmetros, los ignorar.

Para los conectores de tipo segmento, que tengan hermanos (ver Captulo 2. Piezas y conectores
Lego), se tendr que incluir como parmetros su identificador y el del hermano, dentro del

UdG

205

Anexos

fichero LCI. Lgicamente, los conectores de tipo segmento que no posean hermano, no
necesitarn de tales parmetros extras.
Esta informacin es necesaria por dos motivos:
A

Todo conector de tipo segmento sabr si tiene hermano o no, y en el caso de tenerlo,
cul es.

Para el proceso de assembling y propagacin del mismo (ver Captulo 5. Diseo) que
involucre a conectores de tipo segmento.

Por ltimo, hay que comentar el motivo que ha llevado a la decisin de utilizar la sintaxis y
formato utilizados en los ficheros LCI en vez de otros. Tal motivo se basa principalmente en la
semntica, es decir, en el significado de los tags. Con esto quiero decir que una vez parseado el
fichero LCI, cada conector leer la informacin que realmente necesite, segn el tipo de conector
que sea. Por ejemplo, el Stud nicamente parsear el tag <name> y <matrix>, y por lo tanto
ignorar el resto de inforamcin que el usuario pueda haber includo de forma equivocada. Por el
contrario, un Axle necesitar leer los tags <name>, <matrix> y <parameters> (ver Captulo
5. Diseo).

Ejemplo de fichero LCI

Supongamos la pieza de la Figura A2.2. Esta pieza es un Technic Brick 1 x 2 with Axle Hole y se
encuentra definida en el fichero 32064.dat, por lo que tendr asociada un fichero 32064.lci.

Stud
Stud

Axle Hole

Axle Hole

Stud Inlet
Stud Inlet

Figura A2.2. Pieza 32064 con los ficheros asociados 32064.dat y 32064.lci.
Tal fichero LCI contiene la siguiente informacin:

206

EPS

CAD Mecnico para piezas Lego

<connector>
<name>stud</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 10 0 0 1</matrix>

</connector>

<connector>
<name>stud</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 -10 0 0 1</matrix>

</connector>

<connector>
<name>studInlet</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 10 24 0 1</matrix>

</connector>

<connector>
<name>studInlet</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 -10 24 0 1</matrix>

</connector>

<connector>
<name>axleHole</name>
<matrix>-1 0 0 0 0 0 1 0 0 -1 0 0 0 10 10 1</matrix>
<parameters>

<lenght>10</lenght>
<id>0</id>
<brother>1</brother>
</parameters>
</connector>

<connector>
<name>axleHole</name>
<matrix>1 0 0 0 0 0 -1 0 0 -1 0 0 0 10 -10 1</matrix>
<parameters>
<lenght>10</lenght>

<id>1</id>
<brother>0</brother>
</parameters>
</connector>

Los datos de este fichero nos estn informando de tres aspectos muy importantes:

UdG

207

Anexos

Tenemos seis conectores: 2 Stud, 2 Stud Inlet y 2 Axle Hole.

Cada conector tiene la siguiente matriz de transformacin 3D:

Z+

1
0
0
0

0
1
0
0

X+

0 10
0 0
1 0
0 1

Vista frontal

Y+
Z+

1
0
0
0

0
1
0
0

0 -10
0 0
1 0
0 1

1
0
0
0

0
1
0
0

0 10
0 24
1 0
0 1

X+
Y+

Vista frontal

Vista frontal
+

X+

Y+

1
0
0
0

0
1
0
0

0 -10
0 24
1 0
0 1

Vista frontal

Z+
X+
Y+
Z+

208

-1
0
0
0

1
0
0
0

0 0 0
0 -1 10
1 0 10
0 0 1

0 0 0
0 -1 10
-1 0 -10
0 0 1

Y+

Vista lateral

Z+
X+

Vista lateral

Y+

Los dos Axle Hole son hermanos y tienen una longitud de 10 unidades cada uno.

EPS

CAD Mecnico para piezas Lego

ANEXO 3. DTD Y XML SCHEMA DE LOS FICHEROS LCI


1

Qu es un DTD?

El propsito de un DTD (Document Type Definition) [14] es el de definir los bloques permitidos de un
documento XML. Esta definicin puede ser incluida dentro de cada fichero XML de forma explcita o
mediante una referencia dentro del fichero XML a otro fichero que contenga el DTD.

DTD de los ficheros LCI


< ! DOCTYPE connector [
< ! ELEMENT connector ( name, matrix, parameters ? ) >
< ! ELEMENT name ( #PCDATA ) >
< ! ELEMENT matrix ( #PCDATA ) >
< ! ELEMENT parameters ( lenght , (id , brother ) ? ) >
< ! ELEMENT parameters ( lenght , id ?, brother ? ) >
< ! ELEMENT id ( #PCDATA ) >
< ! ELEMENT lenght ( #PCDATA ) >
< ! ELEMENT brother ( #PCDATA ) >
] >

Qu es un XML Schema?

El XML Schema [14] es una alternativa al DTD que intenta describir la estructura de un documento
XML. El propsito de un XML Schema es, al igual que el de un DTD, el de definir los bloques que son
permitidos dentro de un determinado documento XML.
Pero que mejoras aportan respecto a los DTD? Las principales mejoras, a grandres rasgos, son las cinco
que se citan a continuacin:
1

Los XML Schemas sn ampliables.

Los XML Schemas sn ms ricos y ms tiles que los DTDs.

Los XML Schemas estn escritos en XML.

Los XML Schemas soportan tipos de datos.

Los XML Schemas soportan espacios de nombres.

UdG

209

Anexos

XML Schema de los ficheros LCI

< xs : element name="connector" >


< xs : complexType >
< xs : sequence >
< xs : element name="name" type="nameType" />
< xs : element name="matrix" type="matrixType" />
< xs : element name="parameters" type="parametersType" minOccuers="0" />
< / xs : sequence >
< /xs : complexType >
< / xs : element >

< xs : simpleType name="nameType" >


< xs : restriction base="xs : string" >
< xs : enumeration value="stud" / >
< xs : enumeration value="studInlet" / >
< xs : enumeration value="axle" / >
< xs : enumeration value="axleHole" / >
< xs : enumeration value="cylindricalHole" / >
< /xs : restriction >
< / xs : simpleType >
< xs : simpleType name="matrixType" >
< xs : restriction base="xs : decimal" >
< xs : pattern value="\d{16}" / >
< /xs : restriction >
< / xs : simpleType >

< xs : simpleType name="lenghtType" >


< xs : restriction base="xs : decimal" >
< xs : minInclusive value="0" / >
< /xs : restriction >
< / xs : simpleType >

< xs : complexType name="parametersType" >


< xs : sequence >
< xs : element name="lenght" type="lenghtType" / >
< xs : element name="id" type="xs : integer" / >
< xs : element name="brother" type="xs : integer" / >
< /xs : sequence >
< / xs : complexType >

210

EPS

CAD Mecnico para piezas Lego

ANEXO 4. SISTEMAS DE COORDENADAS LDRAW Y LEOCAD


1

Sistema de coordenadas Ldraw

El paquete LDraw [1], a parte de tener unos ficheros con una sintaxis un tanto peculiar, tiene un sistema
de coordenadas tambin bastante especial y poco comn (ver Figura A4.1). Es importante su
conocimiento puesto que todas las componentes numricas de los ficheros DAT donde se alberga la
informacin de las piezas y conectores, se encuentran expresados respecto a l.

X+
Z+

Y+
Figura A4.1. Sistema de coordenadas LDraw.

Sistema de coordenadas LeoCAD

El sistema de coordenadas utilizado por el LeoCAD [2] es totalmente diferente al que se utiliza en todos
los ficheros del paquete LDraw, tal y como se puede ver en la Figura A4.2.
Z+

X+

Y+

Figura A4.2. Sistema de coordenadas utilizado por el LeoCAD.

As pues, el LeoCAD deber realizar un proceso de transformacin, de la informacin obtenida de los


ficheros DAT, del sistema de coordenadas LDraw anteriormente descrito al sistema de coordenadas que
utiliza el LeoCAD.

UdG

211

Anexos

ANEXO 5. ROTACIONES Y FRMULA DE RODRIGUES


Hay muchas maneras de representar rotaciones en 3D. En este anexo se proponen dos formas: como
matrices 3 x 3 y como vectores.

Matrices de rotacin

Una rotacin 3D puede ser representada como una matriz 3 x 3


rxx rxy rxz
ryx ryy r yz
rzx rzy rzz

R=

la cual es ortogonal R R t=I1 y tiene el determinante unitario | R | = 1. En particular, la rotacin inversa se


representa por la matriz transpuesta R

= R t. El resultado de aplicar la rotacin representada por la

matriz R a un vector

v=

vx
vy
vz

se calcula multiplicando la matriz por el vector:

Rv =

rxx vx + rxy vy + rxz vz


ryx vx + ryyvy + ryz vz
rzx vx + rzy vy + rzz vz

I es la matriz identidad 3 x 3.

212

EPS

CAD Mecnico para piezas Lego

Vectores de rotacin

Otra forma de representar una rotacin 3D es especificar un eje de rotacin con un vector r de longitud
unitaria, y un ngulo de rotacin en radianes. Normalmente, estos dos valores se especifican
conjuntamente como un solo vector = r. El ngulo de rotacin es la longitud de y el eje de rotacin
se determina normalizando r = / ||1. Pese a que esta forma de representar rotaciones 3D es ms
intuitiva que la anterior, para aplicar esta rotacin a un vector necesitamos convertir el vector r a la
representacin matricial.

z
r

y
3

La frmula de Rodrigues

La conversin de la representacin vectorial de la rotacin a la matricial es dada por la frmula de


Rodrigues [6]
R = cI + ( 1 - c ) rrt + s r,

(1)

donde I es la matriz identidad ( 3 x 3 ), c=cos(), s=sin() y

r =

0 -rz ry
rz
0 -rx
-ry rx 0

donde rx, ry y rz son las componentes de la representacin vectorial de la rotacin.


Esta matriz r es antisimtrica ( r ) t = -r. y cuando la multiplicamos por un vector v obtenemos el vector
resultante del producto r x v.

r v = r x v =

ryvz rzv y
rzvx rxvz
rxv y ryvx

Utilizamos | . | para denotar tanto el determinante de una matriz, como la norma de un vector.

UdG

213

Anexos

La frmula inversa de Rodrigues

Para realizar la conversin de la representacin matricial de la rotacin, a su representacin vectorial,


primero denotamos que desde que cI + ( 1 - c ) rrt es simtrico, y sr antisimtrico, la transpuesta de la
matriz R en la equacin (1) es
Rt= cI + ( 1 - c ) rrt s r,
Y por lo tanto, la parte antisimtrica de R es 1
( R R t ) / 2 = s r = ( s r ) .
El valor de s se obtiene del clculo de la longitud del vector sr. El valor de c se obtiene calculando la raiz
cuadrada c = 1 s2. Con c y s podemos determinar . La longitud unitaria del vector r se obtiene
normalizando.

Toda matriz A puede ser descompuesta como la suma de la parte simtrica, la matriz ( A + At ) / 2, y la
parte antisimtrica, la matriz ( A At ) / 2.

214

EPS

CAD Mecnico para piezas Lego

ANEXO 6. PIEZAS CON FICHEROS LCI ASOCIADOS

UdG

215

Anexos

216

EPS

CAD Mecnico para piezas Lego

UdG

217

Anexos

218

EPS

CAD Mecnico para piezas Lego

ANEXO 7. DISTANCIA PUNTO RECTA


Una recta en el espacio tridimensional puede definirse mediante dos puntos x1 = ( x1, y1, z1 ) y x2 = ( x2,
y2, z2 ) ( ver Figura A7.1 ).
r

Figura A7.1. Esquema de la distancia mnima entre un punto xo y una recta r.


As pues, un vector v que pertenezca a la lnea r formada por los dos puntos anteriores, vendr dado de la
siguiente forma:

con t entre [ 0, 1 ]

La distancia entre un punto que pertenezca a la lnea r y otro x0 = ( x0, y0, z0 ) es el mdulo del vector
v(x0x1, con lo que la distancia al cuadrado es la suma de las componentes de dicho vector al cuadrado.
Por lo tanto tenemos:

Para minimizar la distancia hay que derivar d2 respecto de t e igualarla a cero


obteniendo el siguiente valor de t:

d(d2)
dt

= 0 para acabar

donde denota el producto escalar .


La distancia mnima al cuadrado puede encontrarse de forma sencilla sustituyendo la t que hemos
encontrado en la frmula de la d2 anterior:

UdG

219

Anexos

Utilizando la siguiente propiedad

donde

220

especifica el producto vectorial, obtenemos la frmula final:

EPS

CAD Mecnico para piezas Lego

ANEXO 8. LISTA GENRICA


La clase Lista es un template [10] que implementa una lista dinmica simplemente encadenada. Dicho
template ha sido instanciado con punteros a la clase Conector tanto para la gestin de los conectores
conectados a cada conector, como para la gestin de los conectores libres y ocupados de toda pieza.

ATRIBUTOS

primero. Primer elemento de la lista.

ultimo. ltimo elemento de la lista.

actual. Elemento de la lista sobre el que nos encontramos durante una iteracin.

nElemenetos. Nmero de elementos de la lista.

MTODOS

Elemento

Actual(). Mtodo que nos devuelve el elemento actual sobre el que nos

encontramos, durante un proceso iterativo.

UdG

221

Anexos

Introducir(Elemento e). Introduce un nuevo elemento en la lista.

Borrar(). Elimina el elemento actual de la lista.

Borrar(Elemento e). Elimina al elemento e de la lista.

Primero(). Nos sita sobre el primer elemento de la lista.

Siguiente(). Nos sita sobre el siguiente elemento, respecto al actual de la lista.

Ultimo(). Mtodo que nos sita en el ltimo elemento de la lista.

bool Fin(). Mtodo que devuelve cierto en caso de que nos encontremos al final de la lista.

bool Vacia(). Mtodo que devuelve cierto en caso de que la lista se encuentre vaca.

bool Llena(). Devuelve cierto en caso de que la lista se encuentre llena. Al ser una lista

implementada de forma dinmica, devolver cierto cuando no haya suficiente memoria para
introducir un nuevo elemento en la lista.

int NElementos(). Devuelve el nmero de elementos de la lista.

bool Existe(Elemento e). Mtodo que devuelve cierto en caso de que exista el elemento e

dentro de la lista.

222

EPS

CAD Mecnico para piezas Lego

ANEXO 9. CLASE DICCIONARIO


La clase Diccionario no es ms que un template de una estructura de datos funcional [15] con una
capacidad de N elementos. La instanciacin llevada a cabo se ha realizado con el tag correspondiente del
fichero LCI (ver Anexo 2.Formato, sintaxis y semntica de los ficheros LCI) como clave y el elemento
asociado a dicha clave es el conjunto de caracteres pertenecientes al tag.
La utilizacin de este diccionario se explica de forma ms detallada en el Captulo 5. Diseo, ms en
concreto en el apartado 5.9 Parser.

ATRIBUTOS

datos. Vector donde se almacenan los elementos introducidos.

actual. Punto de inters de la estructura de datos, utilizado en procesos de recorridos

iterativos.

nDatos. Nos indica el nmero de datos guardados en el diccionario.

MTODOS

Introducir(Clave c,Elemento e). Introduce en el diccionario la clave c y el elemento

asociado a ella e.

UdG

Borrar(Clave c). Elimina del diccionario la clave c y su elemento asociado.

223

Anexos

bool Existe(Calve c). Devuelve cierto en caso de que exista un elemento en el diccionario

con la clave c.

224

Elemento Consultar(Clave c). Devuelve el elemento asociado a la clave c.

Clave ClaveActual(). Mtodo que devuelve la clave actual.

Elemento ElementoActual(). Mtodo que devuelve el elemento asociado a la clave actual.

Primero(). Nos sita en la primera clave del diccionario.

Siguiente(). Nos permite trasladarnos a la siguiente clave del diccionario.

bool Fin(). Devuelve cierto si nos encontramos al final del diccionario.

bool Vacia(). Mtodo que nos devuelve cierto si el diccionario se encuentra vaco.

bool Llena(). Mtodo que nos devuelve cierto si el diccionario se encuentra lleno.

int NElementos(). Nos devuelve el nmero de elementos introducidos en el diccionario.

EPS

You might also like