25.10.2014 Views

Tesis Simulador Circuitos 3D.pdf - Maestría en Ciencias de la ...

Tesis Simulador Circuitos 3D.pdf - Maestría en Ciencias de la ...

Tesis Simulador Circuitos 3D.pdf - Maestría en Ciencias de la ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSIDAD AUTONOMA METROPOLITANA - AZCAPOTZALCO<br />

DIVISION DE CIENCIAS BASICAS E INGENIERIA<br />

MAESTRIA EN CIENCIAS DE LA COMPUTACION<br />

REPORTE DE PROYECTO TERMINAL II<br />

“SIMULADOR DIDÁCTICO EN <strong>3D</strong> DE CIRCUITOS ELECTRICOS Y<br />

ELECTRONICOS”<br />

Pres<strong>en</strong>ta: FERNANDO RAMIREZ ROJAS<br />

Asesor: DR. CARLOS AVILÉS CRUZ<br />

Octubre, 2010<br />

i


CONTENIDO<br />

I. INTRODUCCIÓN 1<br />

II. DESCRIPCION DEL PROYECTO 7<br />

II.1 Modo <strong>de</strong> EDICION ..................................................................................9<br />

II.1.1 M<strong>en</strong>ú Principal ...........................................................................9<br />

II.1.2 Barra <strong>de</strong> Estado .......................................................................10<br />

II.1.3 Area <strong>de</strong> Dibujo .........................................................................11<br />

II.1.4 M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes ...........................................................13<br />

II.1.5 M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong> ....................................................................14<br />

II.2 Modo <strong>de</strong> SIMULACIÓN EN DC .............................................................15<br />

II.3 Modo <strong>de</strong> SIMULACIÓN EN AC .............................................................17<br />

III. ESTRUCTURA DEL PROYECTO 23<br />

III.1 L<strong>en</strong>guaje <strong>de</strong> Programación ..................................................................24<br />

III.2 Estructura Básica: Mo<strong>de</strong>lo – Vista – Contro<strong>la</strong>dor (MVC) .....................24<br />

III. 3 Primera Estructura Auxiliar: Patrón <strong>de</strong>l Método <strong>de</strong> <strong>la</strong> Fábrica (FMP) .25<br />

III.4 Segunda Estructura Auxiliar: Patrón <strong>de</strong> Composición (CP) .................26<br />

III.5 Diagrama a bloques <strong>de</strong>l proyecto ........................................................27<br />

IV. FUNCIONAMIENTO 33<br />

IV.1 Dibujo y edición <strong>de</strong>l circuito .................................................................35<br />

IV.2 Validación <strong>de</strong>l dibujo <strong>de</strong>l circuito .........................................................36<br />

IV.3 Simu<strong>la</strong>ción <strong>de</strong>l circuito .........................................................................38<br />

IV.4 Pres<strong>en</strong>tación <strong>de</strong> resultados .................................................................40<br />

IV.4.1 Simu<strong>la</strong>ción <strong>en</strong> DC ..................................................................40<br />

IV.4.2 Simu<strong>la</strong>ción <strong>en</strong> AC ..................................................................42<br />

V. Patrón <strong>de</strong> Programación METODO DE LA FABRICA (FMP) 45<br />

V.1 Diagrama <strong>de</strong> c<strong>la</strong>ses ..............................................................................47<br />

V.1.1 La Fábrica ...............................................................................47<br />

V.1.2 Los botones <strong>de</strong>l M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes ................................50<br />

V.1.3 Los botones <strong>de</strong>l M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong> .........................................51<br />

V.1.4 Los objetos compon<strong>en</strong>tes .......................................................53<br />

V.2 La c<strong>la</strong>se abstracta Compon<strong>en</strong>te ...........................................................55<br />

V.3 Las c<strong>la</strong>ses concretas Compon<strong>en</strong>te1T, Compon<strong>en</strong>te2T,<br />

A<strong>la</strong>mbre Corto2T y Compon<strong>en</strong>te3T ......................................................57<br />

V.4 La c<strong>la</strong>se v<strong>en</strong>tanaEdicion ......................................................................59<br />

V.5 Las c<strong>la</strong>ses <strong>de</strong> los compon<strong>en</strong>tes ...........................................................62<br />

VI. Patrón <strong>de</strong> Programación MODELO - VISTA – CONTROLADOR (MVC) . 66<br />

VI.1 Diagrama <strong>de</strong> c<strong>la</strong>ses .............................................................................67<br />

VI.2 La c<strong>la</strong>se Mo<strong>de</strong>lo ...................................................................................69<br />

VI.3 Las c<strong>la</strong>ses auxiliares <strong>de</strong> <strong>la</strong> c<strong>la</strong>se Mo<strong>de</strong>lo .............................................70<br />

VII. Patrón <strong>de</strong> Programación COMPOSICION (CP)<br />

xx<br />

ii


VIII. Resultados 73<br />

IX. Conclusiones 75<br />

BIBLIOGRAFÍA B - 1<br />

ANEXOS:<br />

FMP – Código <strong>de</strong> C<strong>la</strong>ses<br />

CrearBotonesCompon<strong>en</strong>tes............................................................FMP – 1<br />

botonA<strong>la</strong>mbreLargo.........................................................................FMP - 7<br />

botonA<strong>la</strong>mbreCorto.........................................................................FMP - 9<br />

botonCapacitor................................................................................FMP - 11<br />

botonResist<strong>en</strong>cia.............................................................................FMP - 13<br />

botonFu<strong>en</strong>teVoltajeDC....................................................................FMP - 15<br />

botonFu<strong>en</strong>teVoltajeAC....................................................................FMP - 17<br />

botonFu<strong>en</strong>teCorri<strong>en</strong>teDC................................................................FMP - 19<br />

botonOpAmp...................................................................................FMP - 21<br />

botonTierra......................................................................................FMP – 23<br />

CrearBotones<strong>Circuitos</strong>....................................................................FMP – 25<br />

botonDivisor1...................................................................................FMP - 31<br />

botonFiltroActivo1............................................................................FMP – 33<br />

Compon<strong>en</strong>te....................................................................................FMP - 35<br />

Compon<strong>en</strong>te1T................................................................................FMP - 43<br />

Compon<strong>en</strong>te2T................................................................................FMP - 47<br />

A<strong>la</strong>mbreCorto2T..............................................................................FMP - 53<br />

Compon<strong>en</strong>te3T................................................................................FMP - 59<br />

FabricarCompon<strong>en</strong>te.......................................................................FMP - 63<br />

FabricarA<strong>la</strong>mbre1............................................................................FMP - 65<br />

FabricarA<strong>la</strong>mbre2............................................................................FMP - 66<br />

FabricarCapacitor............................................................................FMP - 67<br />

FabricarResist<strong>en</strong>cia.........................................................................FMP - 68<br />

FabricarVDC....................................................................................FMP - 69<br />

FabricarVAC....................................................................................FMP - 70<br />

FabricarIDC.....................................................................................FMP - 71<br />

FabricarOpAmp...............................................................................FMP - 72<br />

FabricarTierra..................................................................................FMP - 73<br />

A<strong>la</strong>mbre1.........................................................................................FMP - 75<br />

A<strong>la</strong>mbre2.........................................................................................FMP - 79<br />

Capacitor.........................................................................................FMP - 83<br />

iii


Resist<strong>en</strong>cia......................................................................................FMP - 87<br />

Fu<strong>en</strong>teVDC......................................................................................FMP - 91<br />

Fu<strong>en</strong>teVAC......................................................................................FMP - 95<br />

Fu<strong>en</strong>teIDC.......................................................................................FMP - 99<br />

OpAmp............................................................................................FMP - 103<br />

Tierra...............................................................................................FMP - 107<br />

manejadorCircuito...........................................................................FMP - 109<br />

circuitoDivisor1...............................................................................FMP - 113<br />

filtroActivo1.....................................................................................FMP - 117<br />

v<strong>en</strong>tanaEdicion...............................................................................FMP - 121<br />

rectangulo.......................................................................................FMP - 129<br />

campoTexto....................................................................................FMP - 131<br />

covertidorPrefijosDecimal...............................................................FMP - 133<br />

botonCircuito...................................................................................FMP - 137<br />

boton...............................................................................................FMP - 139<br />

MVC – Código <strong>de</strong> C<strong>la</strong>ses<br />

Main................................................................................................MVC - 1<br />

Mo<strong>de</strong>loCircuito................................................................................MVC - 3<br />

contro<strong>la</strong>dor......................................................................................MVC - 15<br />

tab<strong>la</strong>Cos<strong>en</strong>oidal...............................................................................MVC - 23<br />

manejadorRed.................................................................................MVC - 25<br />

nodoDC...........................................................................................MVC - 33<br />

nodoAC...........................................................................................MVC - 35<br />

simu<strong>la</strong>dorDC....................................................................................MVC - 39<br />

Analisis_Nodal_Modificado_DC......................................................MVC - 43<br />

Metodo_Gauss_Jordan_Real..........................................................MVC - 49<br />

simu<strong>la</strong>dorAC....................................................................................MVC - 53<br />

G<strong>en</strong>erador_Lista_Datos..................................................................MVC - 57<br />

Analisis_Nodal_Modificado_Complejo............................................MVC -63<br />

Metodo_Gauss_Jordan_Complejo..................................................MVC - 71<br />

Operaciones_Numeros_Complejos.................................................MVC - 77<br />

CP – Código <strong>de</strong> C<strong>la</strong>ses<br />

VistasDC.........................................................................................CP - 1<br />

motor<strong>3D</strong>_dc.....................................................................................CP - 3<br />

iv


graficaBarras...................................................................................CP - 11<br />

listaDatos.........................................................................................CP - 17<br />

VistasAC..........................................................................................CP - 19<br />

motor<strong>3D</strong>_ac.....................................................................................CP - 23<br />

Graficador_Respuesta_Frecu<strong>en</strong>cia.................................................CP - 31<br />

Cursor_Respuesta_Frecu<strong>en</strong>cia.......................................................CP - 43<br />

CURSOR.........................................................................................CP - 49<br />

v


I. INTRODUCCION.<br />

En <strong>la</strong> actualidad los dispositivos electrónicos basados <strong>en</strong> procesadores<br />

(computadoras personales, teléfonos, ag<strong>en</strong>das, etc.), permit<strong>en</strong> manejar <strong>la</strong><br />

información <strong>de</strong> manera interactiva, <strong>de</strong>bido a <strong>la</strong> rapi<strong>de</strong>z con que dichos dispositivos<br />

procesan <strong>la</strong> información.<br />

Tomando <strong>en</strong> cu<strong>en</strong>ta este hecho, se pue<strong>de</strong> tomar v<strong>en</strong>taja <strong>de</strong> estos<br />

dispositivos como herrami<strong>en</strong>tas <strong>de</strong> apr<strong>en</strong>dizaje.<br />

Comparando el tipo <strong>de</strong> información “estática” que pres<strong>en</strong>ta un libro, con <strong>la</strong><br />

posibilidad <strong>de</strong> pres<strong>en</strong>tar esa misma información <strong>de</strong> manera dinámica, interactiva y<br />

agradable, como por ejemplo los mapas interactivos <strong>de</strong> “google”, se pue<strong>de</strong><br />

experim<strong>en</strong>tar <strong>la</strong> v<strong>en</strong>taja <strong>de</strong> “moverse”, “acercarse”, “alejarse” e incluso “meterse”<br />

literalm<strong>en</strong>te <strong>en</strong> dichos mapas, a<strong>de</strong>más <strong>de</strong> po<strong>de</strong>r observar <strong>en</strong> tres dim<strong>en</strong>siones<br />

algunos <strong>de</strong> ellos.<br />

Esta es <strong>la</strong> i<strong>de</strong>a simi<strong>la</strong>r que se pret<strong>en</strong><strong>de</strong> lograr con el proyecto que se<br />

<strong>de</strong>scribe <strong>en</strong> este reporte. Realizar un “mapa <strong>en</strong> <strong>3D</strong>” para los circuitos eléctricos y<br />

electrónicos, que nos permita captar <strong>de</strong> un solo golpe <strong>de</strong> vista, <strong>la</strong> información<br />

particu<strong>la</strong>r y <strong>en</strong> contexto, <strong>de</strong> los principales conceptos que se manejan <strong>en</strong> los<br />

circuitos eléctricos: voltaje y corri<strong>en</strong>te. Sin embargo, “un extra” que conti<strong>en</strong>e este<br />

proyecto, es que no solo proporciona dichos parámetros, sino que muestra su<br />

comportami<strong>en</strong>to “dinámico”, esto es, po<strong>de</strong>mos observar tanto el flujo <strong>de</strong> <strong>la</strong><br />

corri<strong>en</strong>te <strong>en</strong> un circuito <strong>en</strong> corri<strong>en</strong>te directa, como el “movimi<strong>en</strong>to o vibración” <strong>de</strong><br />

todo el circuito, cuando se le golpea con una señal s<strong>en</strong>oidal, lo que permite<br />

observar, por ejemplo, el concepto <strong>de</strong>l “<strong>de</strong>fasami<strong>en</strong>to” <strong>en</strong>tre señales <strong>de</strong> corri<strong>en</strong>te<br />

alterna. Es aquí, <strong>en</strong> <strong>la</strong> dinámica <strong>en</strong> <strong>3D</strong>, don<strong>de</strong> radica lo novedoso <strong>de</strong> este<br />

simu<strong>la</strong>dor, aplicado a los circuitos eléctricos y electrónicos.<br />

Con el fin <strong>de</strong> apoyar <strong>la</strong> <strong>en</strong>señaza <strong>de</strong> los circuitos eléctricos y electrónicos,<br />

mediante <strong>la</strong> utilización <strong>de</strong> materiales didácticos visuales e interactivos que integr<strong>en</strong><br />

a <strong>la</strong> geometría espacial con dichos circuitos, se pres<strong>en</strong>ta el sigui<strong>en</strong>te simu<strong>la</strong>dor<br />

didáctico que permite <strong>la</strong>s sigui<strong>en</strong>tes funciones:<br />

1. Dibujar un circuito eléctrico ó electrónico <strong>en</strong> un editor gráfico <strong>en</strong> dos<br />

dim<strong>en</strong>siones.<br />

2. Simu<strong>la</strong>r el circuito <strong>en</strong> corri<strong>en</strong>te directa (DC) y <strong>en</strong> corri<strong>en</strong>te alterna (AC) a<br />

una frecu<strong>en</strong>cia <strong>de</strong>terminada.<br />

3. Pres<strong>en</strong>tar los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC, voltajes nodales y<br />

corri<strong>en</strong>tes <strong>en</strong> cada elem<strong>en</strong>to, <strong>en</strong> un esc<strong>en</strong>ario <strong>de</strong> tres dim<strong>en</strong>siones.<br />

4. Pres<strong>en</strong>tar los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC, magnitu<strong>de</strong>s y fases <strong>de</strong><br />

voltajes nodales, <strong>en</strong> un esc<strong>en</strong>ario <strong>de</strong> tres dim<strong>en</strong>siones.<br />

1


El diagrama a bloques <strong>de</strong>l proyecto se muestra <strong>en</strong> <strong>la</strong> Figura I.1.<br />

COMPUTADORA<br />

EDITOR GRAFICO DE<br />

CIRCUITOS EN DOS<br />

DIMENSIONES<br />

USUARIO<br />

TIPO DE SIMULACIÓN:<br />

• DC<br />

• AC (“f” fija)<br />

PRESENTACIÓN DE<br />

RESULTADOS EN <strong>3D</strong><br />

Figura I.1. Diagrama a bloques <strong>de</strong>l <strong>Simu<strong>la</strong>dor</strong> Didáctico <strong>en</strong> <strong>3D</strong> <strong>de</strong> <strong>Circuitos</strong><br />

Eléctricos y Electrónicos<br />

Los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong>l circuito <strong>en</strong> corri<strong>en</strong>te directa, se<br />

pres<strong>en</strong>tan <strong>en</strong> una imag<strong>en</strong> animada e interactiva <strong>en</strong> tres dim<strong>en</strong>siones (<strong>3D</strong>). El<br />

usuario podrá “girar” <strong>la</strong> imag<strong>en</strong> para observar el circuito <strong>de</strong>s<strong>de</strong> difer<strong>en</strong>tes ángulos,<br />

como se muestra <strong>en</strong> <strong>la</strong> Figura I.2.<br />

En dicha figura, se pres<strong>en</strong>tan varias vistas <strong>en</strong> <strong>3D</strong> <strong>de</strong> un circuito resistivo. El<br />

p<strong>la</strong>no mostrado repres<strong>en</strong>ta el p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong> pot<strong>en</strong>cial “cero” volts o tierra.<br />

Las uniones <strong>en</strong>tre los compon<strong>en</strong>tes <strong>de</strong>l circuito, repres<strong>en</strong>tan los nodos <strong>de</strong>l mismo<br />

a difer<strong>en</strong>tes pot<strong>en</strong>ciales (alturas) con respecto al p<strong>la</strong>no <strong>de</strong> tierra, mi<strong>en</strong>tras que el<br />

flujo <strong>de</strong> flechas repres<strong>en</strong>tan los flujos <strong>de</strong> corri<strong>en</strong>te <strong>en</strong> cada rama <strong>de</strong> éste.<br />

La altura o distancia <strong>de</strong> los nodos respecto al p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia es<br />

proporcional al valor <strong>de</strong>l voltaje nodal asociado a dicho nodo, mi<strong>en</strong>tras que el<br />

ancho <strong>de</strong>l flujo <strong>de</strong> flechas, es proporcional al valor <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te <strong>de</strong> rama <strong>en</strong> cada<br />

elem<strong>en</strong>to <strong>de</strong>l circuito.<br />

2


Figura I.2. Difer<strong>en</strong>tes vistas <strong>de</strong> <strong>la</strong> repres<strong>en</strong>tación <strong>en</strong> <strong>3D</strong> <strong>de</strong> los voltajes nodales y<br />

<strong>de</strong> <strong>la</strong>s corri<strong>en</strong>tes <strong>en</strong> un circuito formado por dos resist<strong>en</strong>cias y una fu<strong>en</strong>te <strong>de</strong><br />

voltaje <strong>de</strong> corri<strong>en</strong>te directa.<br />

A<strong>de</strong>más <strong>de</strong> <strong>la</strong>s graficas anteriores, <strong>en</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC se pres<strong>en</strong>ta una<br />

gráfica <strong>de</strong> barras, <strong>la</strong> cual repres<strong>en</strong>ta el valor <strong>de</strong> los voltajes nodales <strong>en</strong> forma <strong>de</strong><br />

barras interactivas, es <strong>de</strong>cir, cuando se coloca el mouse sobre alguna barra, ésta<br />

se ilumina, se reporta el valor <strong>de</strong> dicho voltaje y el número <strong>de</strong> nodo asignado a<br />

éste, mi<strong>en</strong>tras que, al mismo tiempo, se resalta mediante un círculo concéntrico, el<br />

nodo correspondi<strong>en</strong>te <strong>en</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>. En <strong>la</strong> Figura I.3 se muestra un ejemplo<br />

<strong>de</strong> lo explicado anteriorm<strong>en</strong>te.<br />

3


Figura I.3. Gráfica <strong>de</strong> barras interactiva y conectada con <strong>la</strong> repres<strong>en</strong>tación <strong>de</strong>l<br />

circuito <strong>en</strong> <strong>3D</strong>.<br />

Los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong>l circuito <strong>en</strong> corri<strong>en</strong>te alterna, también se<br />

pres<strong>en</strong>tan <strong>en</strong> una imag<strong>en</strong> animada e interactiva <strong>en</strong> tres dim<strong>en</strong>siones (<strong>3D</strong>). El<br />

usuario podrá “girar” <strong>la</strong> imag<strong>en</strong> para observar el circuito <strong>de</strong>s<strong>de</strong> difer<strong>en</strong>tes ángulos,<br />

como se muestra <strong>en</strong> <strong>la</strong> Figura I.4.<br />

Figura I.4. Difer<strong>en</strong>tes “vistas” <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC (magnitud<br />

y fase <strong>de</strong> los voltajes nodales) <strong>de</strong> un filtro activo pasa bajas <strong>de</strong> primer ord<strong>en</strong>.<br />

En dicha figura, se pres<strong>en</strong>tan varias vistas <strong>en</strong> <strong>3D</strong> <strong>de</strong> un filtro activo pasa<br />

bajas <strong>de</strong> primer ord<strong>en</strong> construido con un amplificador operacional. El p<strong>la</strong>no<br />

mostrado repres<strong>en</strong>ta nuevam<strong>en</strong>te el p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong> pot<strong>en</strong>cial “cero” volts o<br />

tierra. Las uniones <strong>en</strong>tre los compon<strong>en</strong>tes <strong>de</strong>l circuito, repres<strong>en</strong>tan los nodos <strong>de</strong>l<br />

mismo a difer<strong>en</strong>tes pot<strong>en</strong>ciales (alturas) con respecto al p<strong>la</strong>no <strong>de</strong> tierra, mi<strong>en</strong>tras<br />

4


que el difer<strong>en</strong>te movimi<strong>en</strong>to <strong>de</strong> cada nodo con respecto al tiempo, repres<strong>en</strong>ta el<br />

<strong>de</strong>fasami<strong>en</strong>to respectivo.<br />

La altura o distancia <strong>de</strong> los nodos respecto al p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia es<br />

proporcional a <strong>la</strong> magnitud <strong>de</strong>l voltaje nodal complejo asociado a dicho nodo,<br />

mi<strong>en</strong>tras que el movimi<strong>en</strong>to <strong>de</strong> cada nodo con respecto al tiempo, se <strong>en</strong>cu<strong>en</strong>tra<br />

asociado con <strong>la</strong> fase <strong>de</strong> dicho nodo.<br />

A<strong>de</strong>más <strong>de</strong> <strong>la</strong>s gráficas anteriores, <strong>en</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC se pres<strong>en</strong>ta <strong>la</strong><br />

misma gráfica <strong>de</strong> barras explicada anteriorm<strong>en</strong>te, <strong>en</strong> <strong>la</strong> cual, ahora se repres<strong>en</strong>ta<br />

el valor <strong>de</strong> <strong>la</strong> magnitud <strong>de</strong> los voltajes nodales complejos para cada barra. De igual<br />

forma, como ya se explicó, cuando se coloca el mouse sobre alguna barra, ésta se<br />

ilumina, se reporta el valor <strong>de</strong> dicha magnitud <strong>de</strong> voltaje y el número <strong>de</strong> nodo<br />

asignado a éste, mi<strong>en</strong>tras que, al mismo tiempo, se resalta mediante un círculo<br />

concéntrico, el nodo correspondi<strong>en</strong>te <strong>en</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>.<br />

También, <strong>en</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC, se pres<strong>en</strong>ta una gráfica <strong>de</strong> respuesta <strong>en</strong><br />

frecu<strong>en</strong>cia asociada al nodo seleccionado <strong>en</strong> <strong>la</strong> gráfica <strong>de</strong> barras. En <strong>la</strong> Figura I.5<br />

se muestra un ejemplo <strong>de</strong> lo explicado anteriorm<strong>en</strong>te.<br />

Figura I.5. Ejemplo <strong>de</strong> selección <strong>de</strong> <strong>la</strong> barra correspondi<strong>en</strong>te al nodo “V6” <strong>de</strong>l<br />

circuito. Obsérvese el circulo concéntrico que aparece <strong>en</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>,<br />

indicando <strong>la</strong> ubicación <strong>de</strong> dicho nodo seleccionado. Obsérvese también que <strong>la</strong><br />

gráfica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia mostrada <strong>en</strong> <strong>la</strong> parte inferior, es <strong>la</strong> que<br />

correspon<strong>de</strong> a dicho nodo seleccionado.<br />

5


En este reporte se pres<strong>en</strong>ta el proyecto terminal “SIMULADOR DIDÁCTICO<br />

EN <strong>3D</strong> DE CIRCUITOS ELÉCTRICOS Y ELECTRÓNICOS”, cuyos objetivos<br />

propuestos fueron los sigui<strong>en</strong>tes:<br />

OBJETIVO GENERAL:<br />

• Realizar un simu<strong>la</strong>dor didáctico <strong>en</strong> <strong>3D</strong> <strong>de</strong> circuitos eléctricos y electrónicos,<br />

que permita analizar circuitos <strong>en</strong> CD y CA a una frecu<strong>en</strong>cia <strong>de</strong>terminada.<br />

OBJETIVOS PARTICULARES:<br />

• Mediante técnicas <strong>de</strong> Programación Ori<strong>en</strong>tada a Objetos, crear un sistema<br />

basado <strong>en</strong> el patrón <strong>de</strong> programación MVC (Mo<strong>de</strong>lo – Vista – Contro<strong>la</strong>dor) .<br />

El reporte se divi<strong>de</strong> <strong>en</strong> los sigui<strong>en</strong>tes capítulos<br />

I. Introducción.<br />

II. Descripción <strong>de</strong>l Proyecto.<br />

III. Estructura <strong>de</strong>l Proyecto.<br />

IV. Funcionami<strong>en</strong>to.<br />

V. Patrón <strong>de</strong> Programación METODO DE LA FABRICA (FMP)..<br />

VI. Patrón <strong>de</strong> Programación MODELO - VISTA – CONTROLADOR (MVC).<br />

VII. Patrón <strong>de</strong> Programación COMPOSICION (CP).<br />

VIII. Resultados obt<strong>en</strong>idos<br />

IX. Conclusiones<br />

Bibliografía<br />

Anexos:<br />

FMP - Código <strong>de</strong> C<strong>la</strong>ses<br />

MVC - Código <strong>de</strong> C<strong>la</strong>ses<br />

CP - Código <strong>de</strong> C<strong>la</strong>ses<br />

6


II. DESCRIPCIÓN DEL PROYECTO.<br />

En el “SIMULADOR DIDÁCTICO EN <strong>3D</strong> DE CIRCUITOS ELÉCTRICOS Y<br />

ELECTRÓNICOS”, se pued<strong>en</strong> realizar tres acciones:<br />

1. Dibujar un circuito <strong>en</strong> el editor gráfico <strong>en</strong> 2D <strong>en</strong> el modo <strong>de</strong> EDICIÓN<br />

(<strong>de</strong>fault).<br />

2. Simu<strong>la</strong>r el circuito dibujado <strong>en</strong> corri<strong>en</strong>te directa (DC) <strong>en</strong> el modo<br />

SIMULAR EN DC. En este modo también se pres<strong>en</strong>tan <strong>de</strong> manera<br />

automática los resultados <strong>de</strong> dicha simu<strong>la</strong>ción <strong>en</strong> dos formatos: una<br />

gráfica <strong>de</strong> barras y una gráfica dinámica <strong>en</strong> <strong>3D</strong>. Ambas gráficas son<br />

interactivas.<br />

3. Simu<strong>la</strong>r el circuito dibujado <strong>en</strong> corri<strong>en</strong>te alterna (AC) <strong>en</strong> el modo<br />

SIMULAR EN AC. En este modo también se pres<strong>en</strong>tan <strong>de</strong> manera<br />

automática los resultados <strong>de</strong> dicha simu<strong>la</strong>ción <strong>en</strong> tres formatos: una<br />

gráfica <strong>de</strong> barras, una gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia (Bo<strong>de</strong>) y<br />

una gráfica dinámica <strong>en</strong> <strong>3D</strong>. Las tres gráficas son interactivas.<br />

La interactividad <strong>en</strong> <strong>la</strong>s gráficas consiste <strong>en</strong> los sigui<strong>en</strong>tes procesos:<br />

• Gráfica <strong>de</strong> barras – Al colocar el puntero <strong>de</strong>l “mouse” sobre una “barra”,<br />

se selecciona automáticam<strong>en</strong>te el “nodo” correspondi<strong>en</strong>te <strong>en</strong> <strong>la</strong> gráfica<br />

dinámica <strong>en</strong> <strong>3D</strong> y <strong>la</strong> función <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia correspondi<strong>en</strong>te.<br />

• Gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia (Bo<strong>de</strong>) – Existe un cursor sobre<br />

esta gráfica, el cual pue<strong>de</strong> <strong>de</strong>sp<strong>la</strong>zarse sobre <strong>la</strong> curva proporcionando<br />

los valores “x” y “y” <strong>de</strong> dicha curva.<br />

• Grafica dinámica <strong>en</strong> <strong>3D</strong> – Estas gráficas pued<strong>en</strong> girar alre<strong>de</strong>dor <strong>de</strong> sus<br />

tres ejes. El giro, para seleccionar el ángulo <strong>de</strong> vista mas a<strong>de</strong>cuado para<br />

el circuito, se pue<strong>de</strong> realizar <strong>de</strong> dos maneras: mediante el movimi<strong>en</strong>to<br />

<strong>de</strong>l puntero <strong>de</strong>l “mouse” sobre <strong>la</strong> misma gráfica <strong>en</strong> <strong>3D</strong>, o bi<strong>en</strong>, mediante<br />

tres “controles <strong>de</strong>slizantes” (uno para cada eje).<br />

La información que se pres<strong>en</strong>ta <strong>en</strong> cada gráfica es <strong>la</strong> sigui<strong>en</strong>te:<br />

• Gráfica <strong>de</strong> barras:<br />

o En DC: <strong>la</strong>s “barras” repres<strong>en</strong>ta el valor <strong>de</strong>l voltaje nodal <strong>de</strong> cada<br />

uno <strong>de</strong> los nodos <strong>de</strong>l circuito.<br />

o En AC: <strong>la</strong>s “barras” repres<strong>en</strong>tan <strong>la</strong>s magnitu<strong>de</strong>s <strong>de</strong> los valores<br />

complejos <strong>de</strong> los voltajes nodales <strong>de</strong>l circuito.<br />

• Gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia (Bo<strong>de</strong>):<br />

o Gráfica <strong>de</strong> Magnitud: Muestra el comportami<strong>en</strong>to, como una<br />

curva continua, <strong>de</strong> <strong>la</strong> magnitud <strong>de</strong>l valor complejo <strong>de</strong> los voltajes<br />

nodales <strong>de</strong>l circuito <strong>en</strong> función <strong>de</strong> <strong>la</strong> frecu<strong>en</strong>cia.<br />

7


o Gráfica <strong>de</strong> Fase: Muestra el comportami<strong>en</strong>to, como una curva<br />

continua, <strong>de</strong> <strong>la</strong> fase <strong>de</strong>l valor complejo <strong>de</strong> los voltajes nodales <strong>de</strong>l<br />

circuito <strong>en</strong> función <strong>de</strong> <strong>la</strong> frecu<strong>en</strong>cia.<br />

• Graficas dinámica <strong>en</strong> <strong>3D</strong>:<br />

o En DC: Muestra los voltajes nodales <strong>de</strong>l circuito y <strong>la</strong>s corri<strong>en</strong>tes<br />

<strong>de</strong> rama <strong>de</strong>l mismo, <strong>en</strong> el mismo dibujo <strong>de</strong>l circuito e<strong>la</strong>borado, <strong>en</strong><br />

<strong>3D</strong>.<br />

o En AC: Muestra <strong>la</strong>s magnitu<strong>de</strong>s y fases, <strong>en</strong> función <strong>de</strong>l tiempo, <strong>de</strong><br />

los voltajes nodales <strong>de</strong>l circuito, <strong>en</strong> el mismo dibujo <strong>de</strong>l circuito<br />

e<strong>la</strong>borado, <strong>en</strong> <strong>3D</strong>.<br />

La interactividad <strong>en</strong> <strong>la</strong>s gráficas dinámicas <strong>en</strong> <strong>3D</strong> consiste, como ya se<br />

m<strong>en</strong>cionó, <strong>en</strong> que el usuario podrá seleccionar el “ángulo <strong>de</strong> observación” <strong>de</strong>l<br />

circuito, girando éste sobre cualquier eje <strong>en</strong> el espacio <strong>3D</strong>.<br />

En el sigui<strong>en</strong>tes secciones se pres<strong>en</strong>tan <strong>la</strong>s <strong>de</strong>scripciones mas <strong>de</strong>tal<strong>la</strong>das<br />

<strong>de</strong> cada uno <strong>de</strong> los modos <strong>de</strong> operación <strong>de</strong>l simu<strong>la</strong>dor.<br />

8


II.1 Modo <strong>de</strong> EDICION<br />

El editor grafico <strong>en</strong> 2D permite dibujar un circuito eléctrico o electrónico <strong>en</strong><br />

un área específica <strong>de</strong> <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l monitor <strong>de</strong> una computadora. En <strong>la</strong> Figura II.1<br />

se muestra <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l editor, así como su estructura dividida <strong>en</strong> cinco áreas<br />

principales.<br />

M<strong>en</strong>ú<br />

Barra <strong>de</strong><br />

Area <strong>de</strong> Dibujo para<br />

circuitos eléctricos ó<br />

electrónicos<br />

M<strong>en</strong>ú <strong>de</strong><br />

Compon<strong>en</strong>tes<br />

M<strong>en</strong>ú <strong>de</strong><br />

<strong>Circuitos</strong><br />

Figura II.1. Editor gráfico <strong>en</strong> 2D<br />

Este modo <strong>de</strong> edición es el modo por <strong>de</strong>fault al arrancar el simu<strong>la</strong>dor, sin<br />

embargo, al cambiar el modo <strong>de</strong> funcionami<strong>en</strong>to a SIMULAR EN DC o SIMULAR<br />

EN AC, es posible regresar a este modo presionando el botón EDICIÓN.<br />

A continuación se pres<strong>en</strong>ta una breve explicación <strong>de</strong> cada una <strong>de</strong> <strong>la</strong>s áreas.<br />

II.1.1 M<strong>en</strong>ú Principal<br />

El m<strong>en</strong>ú principal está formado por tres botones que permit<strong>en</strong> seleccionar<br />

uno <strong>de</strong> los tres estados <strong>de</strong>l sistema, como se muestra <strong>en</strong> <strong>la</strong> Figura II.2<br />

9


Figura II.2. M<strong>en</strong>ú principal<br />

• EDICIÓN –En este estado se pue<strong>de</strong> dibujar un circuito <strong>en</strong> el área <strong>de</strong><br />

dibujo y editar los valores <strong>de</strong> los compon<strong>en</strong>tes utilizados <strong>en</strong> éste.<br />

• SIMULAR EN DC – Realiza <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong>l circuito <strong>en</strong> corri<strong>en</strong>te<br />

directa (DC), calcu<strong>la</strong>ndo los voltajes nodales y <strong>la</strong>s corri<strong>en</strong>tes <strong>de</strong> rama <strong>en</strong><br />

el circuito.<br />

• SIMULAR EN AC - Realiza <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong>l circuito <strong>en</strong> corri<strong>en</strong>te<br />

alterna (AC), calcu<strong>la</strong>ndo <strong>la</strong> magnitud y fase <strong>de</strong> los voltajes nodales .<br />

II.1.2 Barra <strong>de</strong> Estado<br />

En <strong>la</strong> Figura II.3 se muestra <strong>la</strong> barra <strong>de</strong> estado, <strong>la</strong> cual le indica al usuario<br />

el estado que ti<strong>en</strong><strong>en</strong> el simu<strong>la</strong>dor <strong>de</strong> acuerdo al botón seleccionado <strong>en</strong> el m<strong>en</strong>ú<br />

principal.<br />

Figura II.3. Barra <strong>de</strong> estado<br />

Los m<strong>en</strong>sajes que pued<strong>en</strong> aparecer <strong>en</strong> dicha barra son los que se indican a<br />

continuación:<br />

• “>>> EDITANDO” – Dibujando un circuito y/o editando los valores <strong>de</strong><br />

algún compon<strong>en</strong>te.<br />

• “NO EXISTE CIRCUITO QUE SIMULAR” – Se presionó el botón<br />

“SIMULAR EN DC” ó “SIMULAR EN AC” sin t<strong>en</strong>er dibujado algún<br />

circuito <strong>en</strong> el área <strong>de</strong> dibujo.<br />

• ”CERRAR VENTANAS DE EDICION DE CADA COMPONENTE” – Se<br />

<strong>en</strong>cu<strong>en</strong>tra abierta una o mas v<strong>en</strong>tanas <strong>de</strong> edición <strong>de</strong> algun(os)<br />

compon<strong>en</strong>te(s).<br />

• “NO SE HA DEFINIDO EL NODO DE TIERRA” – No está dibujado el<br />

símbolo <strong>de</strong> “tierra” <strong>en</strong> el área <strong>de</strong> dibujo.<br />

• “CIRCUITO NO CONECTADO A TIERRA” – El circuito dibujado no ti<strong>en</strong>e<br />

algún nodo conectado a “tierra”.<br />

• “ELEMENTOS DESCONECTADOS DEL CIRCUITO” – Existe uno o<br />

mas elem<strong>en</strong>tos que no están conectados <strong>en</strong>tre sí.<br />

10


• “FUENTES EN CONEXION NO VALIDA” – Fu<strong>en</strong>te <strong>de</strong> voltaje <strong>en</strong> “corto<br />

circuito” ó fu<strong>en</strong>te <strong>de</strong> corri<strong>en</strong>te <strong>en</strong> “circuito abierto”.<br />

• “SIMULANDO EN DC” – Se presionó el botón “SIMULAR EN DC”.<br />

• “SIMULACION VALIDA EN > DC AC


abri<strong>en</strong>do <strong>la</strong>s v<strong>en</strong>tanas <strong>de</strong> edición <strong>de</strong> cada compon<strong>en</strong>te y escribi<strong>en</strong>do, <strong>en</strong> dicha<br />

v<strong>en</strong>tana, los valores requeridos por el usuario, como se pue<strong>de</strong> observar <strong>en</strong> <strong>la</strong><br />

Figura II.5.<br />

Figura II.4. V<strong>en</strong>tanas <strong>de</strong> edición <strong>de</strong> los valores <strong>de</strong> los compon<strong>en</strong>tes <strong>de</strong> un circuito<br />

dibujado <strong>en</strong> el Area <strong>de</strong> Dibujo <strong>de</strong>l editor <strong>de</strong> circuitos<br />

12


II.1.4 M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes<br />

El M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes consiste <strong>en</strong> una colección <strong>de</strong> símbolos<br />

(botones) <strong>de</strong> compon<strong>en</strong>tes eléctricos y electrónicos, con difer<strong>en</strong>tes ori<strong>en</strong>taciones,<br />

que podrán ser seleccionados por el usuario para dibujar un <strong>de</strong>terminado circuito<br />

<strong>en</strong> el Area <strong>de</strong> Dibujo. En <strong>la</strong> Figura II.5 se pres<strong>en</strong>ta <strong>la</strong> pantal<strong>la</strong> correspondi<strong>en</strong>te a<br />

este m<strong>en</strong>ú.<br />

Figura II.5. M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes<br />

Los compon<strong>en</strong>tes disponibles <strong>en</strong> este m<strong>en</strong>ú son los sigui<strong>en</strong>tes:<br />

• Fu<strong>en</strong>tes <strong>de</strong> Voltaje <strong>de</strong> DC<br />

• Fu<strong>en</strong>tes <strong>de</strong> Corri<strong>en</strong>te <strong>de</strong> DC<br />

• Fu<strong>en</strong>tes <strong>de</strong> Voltaje <strong>de</strong> AC<br />

• Resist<strong>en</strong>cias<br />

• Capacitores<br />

• A<strong>la</strong>mbres “<strong>la</strong>rgo” y “corto”<br />

• Tierra<br />

• Amplificador Operacional<br />

Cada compon<strong>en</strong>te, con su respectiva ori<strong>en</strong>tación, constituye un botón que,<br />

al presionarlo, <strong>la</strong>nza el compon<strong>en</strong>te respectivo al Area <strong>de</strong> Dibujo <strong>de</strong>l editor. Una<br />

vez ahí, el símbolo <strong>de</strong>l compon<strong>en</strong>te se pue<strong>de</strong> tras<strong>la</strong>dar colocando el mouse sobre<br />

el símbolo, presionar el botón izquierdo <strong>de</strong>l mouse y arrastrarlo a <strong>la</strong> posición<br />

<strong>de</strong>seada. Aplicando un “doble clic” sobre el símbolo <strong>de</strong>l compon<strong>en</strong>te, se abre una<br />

13


v<strong>en</strong>tana <strong>de</strong> edición <strong>de</strong>l compon<strong>en</strong>te, <strong>en</strong> don<strong>de</strong> se pue<strong>de</strong> editar o cambiar algunos<br />

valores <strong>de</strong> éste.<br />

II.1.5 M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong><br />

El M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong> consiste <strong>en</strong> una colección <strong>de</strong> circuitos eléctricos y<br />

electrónicos (botones), que podrán ser seleccionados por el usuario para <strong>la</strong>nzar<br />

un <strong>de</strong>terminado circuito al Area <strong>de</strong> Dibujo. En <strong>la</strong> Figura II.6 se pres<strong>en</strong>ta <strong>la</strong> pantal<strong>la</strong><br />

correspondi<strong>en</strong>te a este m<strong>en</strong>ú.<br />

Figura II.6. M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong><br />

Los circuitos disponibles <strong>en</strong> este m<strong>en</strong>ú, al mom<strong>en</strong>to <strong>de</strong> <strong>la</strong> e<strong>la</strong>boración <strong>de</strong><br />

este reporte, son los sigui<strong>en</strong>tes:<br />

• Divisor <strong>de</strong> voltaje resistivo<br />

• Filtro Activo Pasa Bajas <strong>de</strong> 1er ord<strong>en</strong><br />

Al igual que <strong>en</strong> el m<strong>en</strong>ú <strong>de</strong> compon<strong>en</strong>tes, al presionar un botón se <strong>la</strong>nza el<br />

circuito respectivo al Area <strong>de</strong> Dibujo <strong>de</strong>l editor. Una vez ahí, el circuito se pue<strong>de</strong><br />

simu<strong>la</strong>r, alterar, redibujar o editar como el usuario lo requiera.<br />

14


II.2 Modo <strong>de</strong> SIMULACION EN DC<br />

Cuando el usuario presiona el botón SIMULAR EN DC, el simu<strong>la</strong>dor analiza<br />

el circuito dibujado <strong>en</strong> el Area <strong>de</strong> Dibujo. Si existe algún problema con dicho<br />

dibujo, el simu<strong>la</strong>dor lo reportará al usuario a través <strong>de</strong> <strong>la</strong> Barra <strong>de</strong> Estado,<br />

informándole <strong>de</strong>l posible error exist<strong>en</strong>te <strong>en</strong> el circuito. Una vez corregido el dibujo<br />

<strong>de</strong> éste, al presionar nuevam<strong>en</strong>te el botón SIMULAR EN DC, el simu<strong>la</strong>dor calcu<strong>la</strong><br />

todos los voltajes nodales y <strong>la</strong>s corri<strong>en</strong>tes <strong>de</strong> rama <strong>de</strong>l circuito, <strong>de</strong>splegando<br />

automáticam<strong>en</strong>te los resultados <strong>en</strong> dos formatos: una gráfica <strong>de</strong> barras y una<br />

gráfica dinámica <strong>en</strong> <strong>3D</strong>, como se muestra <strong>en</strong> <strong>la</strong> Figura II.7<br />

Figura II.7. Simu<strong>la</strong>ción <strong>de</strong> un circuito <strong>en</strong> DC. Se observa a <strong>la</strong> izquierda <strong>la</strong> gráfica<br />

dinámica <strong>en</strong> <strong>3D</strong>, al c<strong>en</strong>tro <strong>la</strong> gráfica <strong>de</strong> barras y a <strong>la</strong> <strong>de</strong>recha los controles<br />

<strong>de</strong>slizantes para girar <strong>la</strong> gráfica <strong>en</strong> sus tres ejes<br />

La gráfica dinámica <strong>en</strong> <strong>3D</strong> pres<strong>en</strong>ta los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC<br />

como se explica a continuación. Los voltajes nodales están repres<strong>en</strong>tados por <strong>la</strong><br />

“altura” <strong>de</strong> éstos al p<strong>la</strong>no <strong>de</strong> pot<strong>en</strong>cial “0 volts”, el cual constituye el p<strong>la</strong>no <strong>de</strong><br />

refer<strong>en</strong>cia para todos los nodos y está repres<strong>en</strong>tado <strong>en</strong> <strong>la</strong> gráfica con el cuadrado<br />

sobre el cual está realzado el circuito. Las corri<strong>en</strong>tes <strong>de</strong> cada rama están<br />

repres<strong>en</strong>tadas por un ”flujo <strong>de</strong> flechas”, es <strong>de</strong>cir, son flechas que se muev<strong>en</strong> <strong>en</strong> el<br />

s<strong>en</strong>tido conv<strong>en</strong>cional <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te: <strong>de</strong> pot<strong>en</strong>ciales mayores (alturas mayores) a<br />

pot<strong>en</strong>ciales m<strong>en</strong>ores (alturas m<strong>en</strong>ores), cuyo ancho correspon<strong>de</strong>, <strong>de</strong> manera<br />

repres<strong>en</strong>tativa, con el valor <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te <strong>de</strong> rama para cada compon<strong>en</strong>te.<br />

Esta gráfica es interactiva <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que pue<strong>de</strong> “girarse” <strong>en</strong><br />

cualquiera <strong>de</strong> sus tres ejes x-y-z, colocando el puntero <strong>de</strong>l mouse sobre el Area <strong>de</strong><br />

Dibujo, presionando el botón izquierdo <strong>de</strong>l mouse, y arrastrando éste hasta lograr<br />

el giro <strong>de</strong>seado. Otra forma <strong>de</strong> girar esta grafica consiste <strong>en</strong> utilizar los controles<br />

<strong>de</strong>slizantes que aparec<strong>en</strong> <strong>en</strong> el extremo <strong>de</strong>recho <strong>de</strong> <strong>la</strong> pantal<strong>la</strong>. Cada uno <strong>de</strong> ellos<br />

permite el giro <strong>de</strong> <strong>la</strong> gráfica alre<strong>de</strong>dor <strong>de</strong>l eje indicado <strong>en</strong> dicho control.<br />

15


En <strong>la</strong> Figura II.8 se muestran tres ángulos difer<strong>en</strong>tes <strong>de</strong> giro <strong>de</strong> <strong>la</strong> gráfica <strong>en</strong><br />

<strong>3D</strong> para un circuito divisor <strong>de</strong> voltaje resistivo, simu<strong>la</strong>do <strong>en</strong> DC.<br />

Figura II.8. Difer<strong>en</strong>tes “vistas” <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC (voltajes<br />

nodales y corri<strong>en</strong>tes <strong>de</strong> rama) <strong>de</strong> un circuito divisor <strong>de</strong> voltaje resistivo.<br />

La gráfica <strong>de</strong> barras muestra los voltajes nodales <strong>de</strong> cada nodo <strong>de</strong>l<br />

circuito. El id<strong>en</strong>tificador <strong>de</strong> cada nodo aparece <strong>en</strong> el eje horizontal <strong>de</strong> <strong>la</strong> gráfica,<br />

mi<strong>en</strong>tras que <strong>en</strong> el eje vertical aparece <strong>la</strong> acotación, <strong>en</strong> voltaje, correspondi<strong>en</strong>te al<br />

circuito que se muestra <strong>en</strong> <strong>la</strong> grafica <strong>en</strong> <strong>3D</strong>. La altura <strong>de</strong> cada barra repres<strong>en</strong>ta el<br />

voltaje nodal correspondi<strong>en</strong>te a cada nodo.<br />

Esta gráfica también es interactiva, <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que al colocar el<br />

puntero <strong>de</strong>l mouse “sobre” alguna barra, ésta se ilumina y, a<strong>de</strong>más <strong>de</strong> mostrar el<br />

valor numérico <strong>de</strong>l voltaje nodal correspondi<strong>en</strong>te (<strong>la</strong> altura <strong>de</strong> <strong>la</strong> barra), <strong>en</strong> <strong>la</strong><br />

gráfica <strong>de</strong>l circuito <strong>en</strong> <strong>3D</strong>, aparece un circulo dinámico concéntrico alre<strong>de</strong>dor <strong>de</strong>l<br />

nodo correspondi<strong>en</strong>te, indicando <strong>de</strong> este modo al usuario, <strong>la</strong> localización, <strong>en</strong> el<br />

circuito, <strong>de</strong>l nodo correspondi<strong>en</strong>te a <strong>la</strong> barra que se selecciona.<br />

En <strong>la</strong> Figura II.9 se muestra un ejemplo <strong>en</strong> el que se ha seleccionado <strong>la</strong><br />

barra correspondi<strong>en</strong>te al nodo “V2”. Obsérvese como dicha barra se ilumina,<br />

pres<strong>en</strong>ta el valor numérico <strong>de</strong>l voltaje <strong>de</strong> ese nodo y, a<strong>de</strong>más, aparece un círculo<br />

concéntrico <strong>en</strong> uno <strong>de</strong> los nodos <strong>de</strong> <strong>la</strong> parte superior izquierda <strong>de</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>.<br />

16


Figura II.9. Ejemplo <strong>de</strong> selección <strong>de</strong> <strong>la</strong> barra correspondi<strong>en</strong>te al nodo “V2” <strong>de</strong>l<br />

circuito. Obsérvese el circulo concéntrico que aparece <strong>en</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>,<br />

indicando <strong>la</strong> ubicación <strong>de</strong> dicho nodo seleccionado.<br />

II.3 Modo <strong>de</strong> SIMULACION EN AC<br />

De manera simi<strong>la</strong>r al modo anterior, cuando el usuario presiona el botón<br />

SIMULAR EN AC, el simu<strong>la</strong>dor analiza el circuito dibujado <strong>en</strong> el Area <strong>de</strong> Dibujo. Si<br />

existe algún problema con dicho dibujo, el simu<strong>la</strong>dor lo reportará al usuario a<br />

través <strong>de</strong> <strong>la</strong> Barra <strong>de</strong> Estado, informándole <strong>de</strong>l posible error exist<strong>en</strong>te <strong>en</strong> el<br />

circuito. Una vez corregido el dibujo <strong>de</strong> éste, al presionar nuevam<strong>en</strong>te el botón<br />

SIMULAR EN AC, el simu<strong>la</strong>dor calcu<strong>la</strong> todos los valores complejos <strong>de</strong> los voltajes<br />

17


nodales <strong>de</strong>l circuito, consi<strong>de</strong>rando a todas <strong>la</strong> fu<strong>en</strong>tes <strong>de</strong> voltaje “s<strong>en</strong>oidal” que<br />

estén conectadas al circuito, <strong>de</strong>splegando automáticam<strong>en</strong>te los resultados <strong>en</strong> tres<br />

formatos: una gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia (Bo<strong>de</strong>), una gráfica <strong>de</strong><br />

barras y una gráfica dinámica <strong>en</strong> <strong>3D</strong>, como se muestra <strong>en</strong> <strong>la</strong> Figura II.10<br />

Figura II.10. Simu<strong>la</strong>ción <strong>de</strong> un circuito <strong>en</strong> AC. Se observa a <strong>la</strong> izquierda <strong>la</strong> gráfica<br />

dinámica <strong>en</strong> <strong>3D</strong>, al c<strong>en</strong>tro <strong>la</strong> gráfica <strong>de</strong> barras y a <strong>la</strong> <strong>de</strong>recha los controles<br />

<strong>de</strong>slizantes para girar <strong>la</strong> gráfica <strong>en</strong> sus tres ejes. El parte inferior se <strong>en</strong>cu<strong>en</strong>tra <strong>la</strong><br />

gráfica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia (Bo<strong>de</strong>): magnitud y fase.<br />

La gráfica dinámica <strong>en</strong> <strong>3D</strong> pres<strong>en</strong>ta los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC<br />

como se explica a continuación. En este gráfica se hace uso <strong>de</strong> <strong>la</strong> variable<br />

“tiempo” para repres<strong>en</strong>tar el comportami<strong>en</strong>to dinámico <strong>de</strong>l circuito. La excitación<br />

<strong>de</strong>l circuito lo constituy<strong>en</strong> <strong>la</strong>s fu<strong>en</strong>tes <strong>de</strong> voltaje s<strong>en</strong>oidales conectadas a éste. La<br />

respuesta <strong>de</strong>l circuito a dicha excitación, se repres<strong>en</strong>ta con el “movimi<strong>en</strong>to” <strong>de</strong> <strong>la</strong>s<br />

alturas <strong>de</strong> los nodos respecto al p<strong>la</strong>no <strong>de</strong> pot<strong>en</strong>cial “0 volts”, el cual constituye el<br />

p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia para todos los nodos y está repres<strong>en</strong>tado <strong>en</strong> <strong>la</strong> gráfica con el<br />

cuadrado sobre el cual está osci<strong>la</strong>ndo el circuito. Al utilizar el tiempo como variable<br />

<strong>de</strong> esta gráfica, se pued<strong>en</strong> observar fácilm<strong>en</strong>te los difer<strong>en</strong>tes <strong>de</strong>fasami<strong>en</strong>tos que<br />

pres<strong>en</strong>tan los nodos <strong>de</strong>l circuito <strong>en</strong>tre si.<br />

Esta gráfica es interactiva <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que pue<strong>de</strong> “girarse” <strong>en</strong><br />

cualquiera <strong>de</strong> sus tres ejes x-y-z, colocando el puntero <strong>de</strong>l mouse sobre el Area <strong>de</strong><br />

Dibujo, presionando el botón izquierdo <strong>de</strong>l mouse, y arrastrando éste hasta lograr<br />

el giro <strong>de</strong>seado. Otra forma <strong>de</strong> girar esta grafica consiste <strong>en</strong> utilizar los controles<br />

18


<strong>de</strong>slizantes que aparec<strong>en</strong> <strong>en</strong> el extremo <strong>de</strong>recho <strong>de</strong> <strong>la</strong> pantal<strong>la</strong>. Cada uno <strong>de</strong> ellos<br />

permite el giro <strong>de</strong> <strong>la</strong> gráfica alre<strong>de</strong>dor <strong>de</strong>l eje indicado <strong>en</strong> dicho control.<br />

En <strong>la</strong> Figura II.11 se muestran tres ángulos difer<strong>en</strong>tes <strong>de</strong> giro <strong>de</strong> <strong>la</strong> gráfica<br />

<strong>en</strong> <strong>3D</strong> para un circuito que funciona como filtro activo pasa bajas <strong>de</strong> primer ord<strong>en</strong>,<br />

simu<strong>la</strong>do <strong>en</strong> AC.<br />

Figura II.11. Difer<strong>en</strong>tes “vistas” <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC<br />

(magnitud y fase <strong>de</strong> los voltajes nodales) <strong>de</strong> un filtro activo pasa bajas <strong>de</strong> primer<br />

ord<strong>en</strong>.<br />

La gráfica <strong>de</strong> barras muestra únicam<strong>en</strong>te <strong>la</strong>s magnitu<strong>de</strong>s <strong>de</strong> los voltajes<br />

nodales <strong>de</strong> cada nodo <strong>de</strong>l circuito. El id<strong>en</strong>tificador <strong>de</strong> cada nodo aparece <strong>en</strong> el eje<br />

horizontal <strong>de</strong> <strong>la</strong> gráfica, mi<strong>en</strong>tras que <strong>en</strong> el eje vertical aparece <strong>la</strong> acotación, <strong>en</strong><br />

voltaje, correspondi<strong>en</strong>te al circuito que se muestra <strong>en</strong> <strong>la</strong> grafica <strong>en</strong> <strong>3D</strong>. La altura <strong>de</strong><br />

cada barra repres<strong>en</strong>ta <strong>la</strong> magnitud <strong>de</strong>l voltaje nodal correspondi<strong>en</strong>te a cada nodo.<br />

Esta gráfica también es interactiva, <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que al colocar el<br />

puntero <strong>de</strong>l mouse “sobre” alguna barra, ésta se ilumina y, a<strong>de</strong>más <strong>de</strong> mostrar el<br />

valor numérico <strong>de</strong> <strong>la</strong> magnitud <strong>de</strong>l voltaje nodal correspondi<strong>en</strong>te (<strong>la</strong> altura <strong>de</strong> <strong>la</strong><br />

barra), <strong>en</strong> <strong>la</strong> gráfica <strong>de</strong>l circuito <strong>en</strong> <strong>3D</strong>, aparece un circulo dinámico concéntrico<br />

alre<strong>de</strong>dor <strong>de</strong>l nodo correspondi<strong>en</strong>te, indicando <strong>de</strong> este modo al usuario, <strong>la</strong><br />

localización, <strong>en</strong> el circuito, <strong>de</strong>l nodo correspondi<strong>en</strong>te a <strong>la</strong> barra que se selecciona.<br />

En <strong>la</strong> Figura II.12 se muestra un ejemplo <strong>en</strong> el que se ha seleccionado <strong>la</strong><br />

barra correspondi<strong>en</strong>te al nodo “V6”. Obsérvese como dicha barra se ilumina,<br />

pres<strong>en</strong>tando el valor numérico <strong>de</strong> <strong>la</strong> magnitud <strong>de</strong>l voltaje <strong>de</strong> ese nodo y, a<strong>de</strong>más,<br />

aparece un círculo concéntrico <strong>en</strong> uno <strong>de</strong> los nodos <strong>de</strong> <strong>la</strong> parte superior <strong>de</strong>recha<br />

<strong>de</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>.<br />

19


Figura II.12. Ejemplo <strong>de</strong> selección <strong>de</strong> <strong>la</strong> barra correspondi<strong>en</strong>te al nodo “V6” <strong>de</strong>l<br />

circuito. Obsérvese el circulo concéntrico que aparece <strong>en</strong> <strong>la</strong> gráfica <strong>en</strong> <strong>3D</strong>,<br />

indicando <strong>la</strong> ubicación <strong>de</strong> dicho nodo seleccionado. Obsérvese también que <strong>la</strong><br />

gráfica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia mostrada <strong>en</strong> <strong>la</strong> parte inferior, es <strong>la</strong> que<br />

correspon<strong>de</strong> a dicho nodo seleccionado.<br />

La gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia (Bo<strong>de</strong>), muestra <strong>la</strong> magnitud y <strong>la</strong><br />

fase <strong>de</strong> los voltajes nodales <strong>de</strong> cada nodo <strong>de</strong>l circuito. El id<strong>en</strong>tificador <strong>de</strong> cada<br />

nodo aparece <strong>en</strong> <strong>la</strong> parte superior izquierda, tanto <strong>de</strong> <strong>la</strong> gráfica <strong>de</strong> magnitud como<br />

<strong>de</strong> <strong>la</strong> gráfica <strong>de</strong> fase. En <strong>la</strong> parte inferior <strong>de</strong> ambas gráficas, se pres<strong>en</strong>ta <strong>la</strong><br />

acotación <strong>de</strong>l eje <strong>de</strong> frecu<strong>en</strong>cia (eje horizontal) <strong>en</strong> “Hertz” y <strong>en</strong> una esca<strong>la</strong><br />

logarítmica, mi<strong>en</strong>tras que <strong>en</strong> el eje vertical se pres<strong>en</strong>ta una acotación <strong>en</strong> “dB” para<br />

<strong>la</strong> gráfica <strong>de</strong> magnitud y <strong>en</strong> “grados” para <strong>la</strong> gráfica <strong>de</strong> <strong>la</strong> fase.<br />

Esta gráfica también es interactiva, <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que al colocar el<br />

puntero <strong>de</strong>l mouse “sobre” el cursor <strong>de</strong> cualquiera <strong>de</strong> <strong>la</strong>s gráficas, éste se podrá<br />

<strong>de</strong>sp<strong>la</strong>zar al mover el mouse t<strong>en</strong>i<strong>en</strong>do presionado su botón izquierdo. Al moverse<br />

el cursor, irá apareci<strong>en</strong>do <strong>en</strong> el cuadro correspondi<strong>en</strong>te, el valor tanto <strong>de</strong> <strong>la</strong><br />

frecu<strong>en</strong>cia como <strong>de</strong> <strong>la</strong> magnitud y <strong>la</strong> fase respectiva.<br />

En <strong>la</strong> Figura II.13 se pres<strong>en</strong>tan dos ejemplos <strong>en</strong> los cuales el cursor <strong>de</strong> <strong>la</strong><br />

gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia, se pres<strong>en</strong>ta <strong>en</strong> dos posiciones difer<strong>en</strong>tes.<br />

20


Figura II.13. Ejemplo <strong>de</strong> selección <strong>de</strong> dos difer<strong>en</strong>tes puntos <strong>de</strong> <strong>la</strong> grafica <strong>de</strong><br />

Respuesta <strong>en</strong> Frecu<strong>en</strong>cia mediante el movimi<strong>en</strong>to <strong>de</strong>l cursor<br />

21


III. ESTRUCTURA DEL PROYECTO.<br />

Las tres funciones básica que ti<strong>en</strong>e el proyecto son:<br />

1. Permitir dibujar un circuito eléctrico o electrónico <strong>en</strong> un “editor” <strong>de</strong><br />

circuitos.<br />

2. Simu<strong>la</strong>r el circuito <strong>en</strong> corri<strong>en</strong>te directa (CD) y <strong>en</strong> corri<strong>en</strong>te alterna (CA).<br />

3. Mostrar los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> difer<strong>en</strong>tes formatos <strong>de</strong><br />

gráficas: gráfica <strong>de</strong> barras, gráfica <strong>de</strong> línea continua y gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong>.<br />

Para <strong>la</strong> e<strong>la</strong>boración <strong>de</strong>l proyecto se eligió un l<strong>en</strong>guaje <strong>de</strong> programación<br />

ori<strong>en</strong>tado a objetos, por todas <strong>la</strong>s características inher<strong>en</strong>tes a éste, como <strong>la</strong><br />

abstracción, el <strong>en</strong>capsu<strong>la</strong>mi<strong>en</strong>to, <strong>la</strong> her<strong>en</strong>cia y el polimorfismo, <strong>la</strong>s cuales<br />

facilitaron <strong>la</strong> e<strong>la</strong>boración <strong>de</strong>l mismo. Sin embargo, uno <strong>de</strong> los puntos mas difíciles<br />

<strong>en</strong> el <strong>de</strong>sarrollo <strong>de</strong>l proyecto, fue <strong>la</strong> elección <strong>de</strong> cómo estructurar el proyecto, que<br />

“forma” darle, que objetos crear y como conectarlos <strong>en</strong>tre sí para construir el<br />

editor, el simu<strong>la</strong>dor, <strong>la</strong>s repres<strong>en</strong>taciones <strong>en</strong> <strong>3D</strong> y todos los <strong>de</strong>talles que se fueron<br />

pres<strong>en</strong>tando, como <strong>la</strong> integración <strong>de</strong> todos los objetos para que funcionaran<br />

sincronizados y <strong>en</strong> armonía.<br />

La elección <strong>de</strong> <strong>la</strong> estructura se basó <strong>en</strong> los objetivos <strong>de</strong>l campo <strong>de</strong> <strong>la</strong><br />

programación conocido como “diseño <strong>de</strong> patrones”: El “diseño <strong>de</strong> patrones” es un<br />

conjunto <strong>de</strong> herrami<strong>en</strong>tas que permite hacer fr<strong>en</strong>te a los constantes “cambios” <strong>en</strong><br />

el diseño <strong>de</strong> software, permiti<strong>en</strong>do al programador re-usar <strong>la</strong> mayoría <strong>de</strong>l software<br />

ya <strong>de</strong>sarrol<strong>la</strong>do, y realizar los cambios necesarios sin alterar el código ya<br />

exist<strong>en</strong>te, es <strong>de</strong>cir, permite un alto grado <strong>de</strong> ”flexibilidad” <strong>en</strong> <strong>la</strong> r<strong>en</strong>ovación <strong>de</strong> <strong>la</strong>s<br />

interconexiones <strong>en</strong>tre los objetos ya exist<strong>en</strong>tes y los objetos nuevos necesarios<br />

para realizar el cambio o actualización requerido <strong>en</strong> <strong>la</strong> aplicación. En el caso <strong>de</strong>l<br />

simu<strong>la</strong>dor que se <strong>de</strong>sarrolló, estos “cambios” se refier<strong>en</strong> a <strong>la</strong> adición <strong>de</strong> nuevos<br />

compon<strong>en</strong>tes que no se <strong>en</strong>cu<strong>en</strong>tran actualm<strong>en</strong>te <strong>en</strong> el proyecto.<br />

Con este criterio, se eligió un patrón <strong>de</strong> programación l<strong>la</strong>mado Mo<strong>de</strong>lo-<br />

Vista-Contro<strong>la</strong>dor (MVC), como <strong>la</strong> estructura base principal sobre <strong>la</strong> cual se<br />

com<strong>en</strong>zó a construir el proyecto. Este patrón se eligió por dos razones: 1) por ser<br />

el más utilizado <strong>en</strong> el <strong>de</strong>sarrollo <strong>de</strong> <strong>la</strong> instrum<strong>en</strong>tación virtual (instrum<strong>en</strong>tos<br />

analógicos y digitales <strong>de</strong>sarrol<strong>la</strong>dos alre<strong>de</strong>dor <strong>de</strong> un procesador o computadora) y<br />

simu<strong>la</strong>dores (por ejemplo simu<strong>la</strong>dores <strong>de</strong> vuelo); y 2) por ser el que más se adapta<br />

a <strong>la</strong>s necesida<strong>de</strong>s <strong>de</strong>l proyecto.<br />

Durante el <strong>de</strong>sarrollo <strong>de</strong>l proyecto se vió <strong>la</strong> necesidad <strong>de</strong> incorporar también<br />

otros dos patrones <strong>de</strong> programación mas: 1) el l<strong>la</strong>mado “método <strong>de</strong> <strong>la</strong> fabrica” para<br />

el diseño <strong>de</strong>l editor <strong>de</strong> circuitos; y 2) el patrón conocido como “composición” para<br />

el diseño <strong>de</strong> <strong>la</strong>s difer<strong>en</strong>tes “vistas” <strong>en</strong> <strong>la</strong> pres<strong>en</strong>tación visual <strong>de</strong> los resultados (por<br />

ejemplo <strong>la</strong> gráfica <strong>de</strong> barras y <strong>la</strong>s gráficas dinámicas <strong>en</strong> <strong>3D</strong>).<br />

23


Como se explicará mas a<strong>de</strong><strong>la</strong>nte, exist<strong>en</strong> otros patrones <strong>de</strong> programación<br />

incorporados (<strong>en</strong> forma tras<strong>la</strong>pada) a <strong>la</strong>s estructuras <strong>de</strong>scritas <strong>en</strong> este capítulo.<br />

Para mayor c<strong>la</strong>ridad <strong>en</strong> <strong>la</strong> <strong>de</strong>scripción <strong>de</strong> <strong>la</strong> estructura <strong>de</strong>l proyecto, dichos<br />

patrones <strong>de</strong> programación se m<strong>en</strong>cionarán y explicarán <strong>en</strong> los sigui<strong>en</strong>tes<br />

capítulos.<br />

En este capítulo se <strong>de</strong>scribe <strong>la</strong> estructura <strong>de</strong>l simu<strong>la</strong>dor <strong>en</strong> <strong>3D</strong>, basada <strong>en</strong><br />

los tres patrones <strong>de</strong> programación m<strong>en</strong>cionados anteriorm<strong>en</strong>te.<br />

III.1 L<strong>en</strong>guaje <strong>de</strong> Programación<br />

Aunque <strong>en</strong> <strong>la</strong> propuesta <strong>de</strong> este proyecto, se eligió como l<strong>en</strong>guaje <strong>de</strong><br />

programación ActionScript 3.0 para F<strong>la</strong>sh (CS3), se optó por cambiar a<br />

ActionScript 3.0 para F<strong>la</strong>sh (CS4), <strong>de</strong>bido a <strong>la</strong> mayor facilidad y flexibilidad que<br />

ti<strong>en</strong>e F<strong>la</strong>sh CS4 para manejar objetos <strong>en</strong> <strong>3D</strong>, así como el manejo <strong>de</strong> ev<strong>en</strong>tos <strong>de</strong><br />

difer<strong>en</strong>tes tipos, lo que permite crear ambi<strong>en</strong>tes interactivos muy variados.<br />

A<strong>de</strong>más, es posible insta<strong>la</strong>r <strong>la</strong>s aplicaciones g<strong>en</strong>eradas, ya sea <strong>en</strong> servidores para<br />

su acceso remoto a través <strong>de</strong> internet, o <strong>en</strong> máquinas individuales para su acceso<br />

<strong>en</strong> forma local. El único requisito para accesar dichas aplicaciones, es t<strong>en</strong>er<br />

insta<strong>la</strong>do el F<strong>la</strong>sh P<strong>la</strong>yer 10.0 o superior.<br />

III.2 Estructura Básica: Mo<strong>de</strong>lo-Vista-Contro<strong>la</strong>dor (MVC)<br />

La estructura básica <strong>de</strong>l proyecto se basa <strong>en</strong> el patrón <strong>de</strong> programación<br />

Mo<strong>de</strong>lo-Vista-Contro<strong>la</strong>dor (MVC), cuyo diagrama a bloques se muestra <strong>en</strong> <strong>la</strong><br />

Figura III.1.<br />

Mo<strong>de</strong>lo<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Figura III.1. Patrón <strong>de</strong> programación Mo<strong>de</strong>lo-Vista-Contro<strong>la</strong>dor (MVC)<br />

Cada módulo repres<strong>en</strong>ta una c<strong>la</strong>se <strong>de</strong> <strong>la</strong> cual se obti<strong>en</strong>e un objeto al<br />

“instanciar” dicha c<strong>la</strong>se, así que el diagrama a bloques <strong>de</strong> <strong>la</strong> Figura II.1 repres<strong>en</strong>ta<br />

también <strong>la</strong> “conexión” que se establece <strong>en</strong>tre los objetos creados a partir <strong>de</strong>l<br />

mismo diagrama <strong>de</strong> c<strong>la</strong>ses. A partir <strong>de</strong> aquí, se usará indistintam<strong>en</strong>te el término<br />

“bloque” o “módulo” para referirse ya sea a una c<strong>la</strong>se o a un objeto.<br />

24


El patrón MVC, como se observa <strong>de</strong> <strong>la</strong> figura, consiste <strong>de</strong> tres bloques:<br />

• Mo<strong>de</strong>lo - Conti<strong>en</strong>e el mo<strong>de</strong>lo matemático <strong>de</strong>l circuito y todos los datos<br />

necesarios para <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong> éste, así como <strong>la</strong> lógica que maneja el<br />

estado <strong>de</strong> todo el proyecto.<br />

• Vista - Pres<strong>en</strong>ta al usuario los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción, <strong>en</strong> el monitor<br />

<strong>de</strong> <strong>la</strong> computadora, con difer<strong>en</strong>tes formatos: grafica <strong>de</strong> barras, gráfica <strong>de</strong><br />

respuesta <strong>en</strong> frecu<strong>en</strong>cia y grafica dinámica <strong>en</strong> <strong>3D</strong>.<br />

• Contro<strong>la</strong>dor - Maneja los botones que activa el usuario para cambiar el<br />

estado <strong>de</strong> <strong>la</strong> aplicación: edición, simu<strong>la</strong>ción <strong>en</strong> DC y simu<strong>la</strong>ción <strong>en</strong> AC.<br />

La v<strong>en</strong>taja <strong>de</strong> este mo<strong>de</strong>lo radica <strong>en</strong> <strong>la</strong> separación <strong>de</strong> “responsabilida<strong>de</strong>s”<br />

<strong>en</strong> cada uno <strong>de</strong> los bloques, sin que ninguno <strong>de</strong> ellos se interfiera. A<strong>de</strong>más, se<br />

observa que satisface completam<strong>en</strong>te <strong>la</strong> funcionalidad requerida por el proyecto.<br />

III.3 Primera Estructura Auxiliar: Patrón <strong>de</strong>l Método <strong>de</strong> <strong>la</strong> Fábrica (FMP)<br />

El nombre <strong>de</strong> este patrón <strong>de</strong> programación Método <strong>de</strong> <strong>la</strong> Fábrica, <strong>de</strong>scribe<br />

muy bi<strong>en</strong> <strong>la</strong> función <strong>de</strong> esta estructura, pues efectivam<strong>en</strong>te se <strong>en</strong>carga <strong>de</strong> fabricar<br />

difer<strong>en</strong>tes objetos a través <strong>de</strong> una línea <strong>de</strong> producción previam<strong>en</strong>te <strong>de</strong>finida.<br />

En el proyecto, este patrón se aplicó <strong>en</strong> el diseño <strong>de</strong>l editor. En éste, el<br />

usuario solicita, al presionar un botón, <strong>la</strong> fabricación <strong>de</strong> un <strong>de</strong>terminado<br />

compon<strong>en</strong>te o circuito eléctrico o electrónico (objeto) que será utilizado para<br />

dibujar (construir) un circuito.<br />

El diagrama a bloques <strong>de</strong>l patrón <strong>de</strong> programación Método <strong>de</strong> <strong>la</strong> Fábrica<br />

(FMP), se muestra <strong>en</strong> <strong>la</strong> Figura III.2.<br />

Producto<br />

Concreto1<br />

Producto<br />

Concreto2<br />

Producto<br />

Concreto3<br />

Método <strong>de</strong> <strong>la</strong> Fábrica<br />

Cli<strong>en</strong>te1<br />

Cli<strong>en</strong>te2<br />

Cli<strong>en</strong>te3<br />

Figura III.2. . Patrón <strong>de</strong> programación Método <strong>de</strong> <strong>la</strong> Fábrica (FMP).<br />

Como se observa <strong>en</strong> <strong>la</strong> figura, el FMP consiste <strong>de</strong> tres bloques (dos <strong>de</strong> ellos<br />

son un grupo <strong>de</strong> bloques cada uno).<br />

25


• Cli<strong>en</strong>te - Conti<strong>en</strong>e un grupo <strong>de</strong> “botones” (M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes o<br />

M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong>) con los cuales el usuario solicita <strong>la</strong> fabricación <strong>de</strong> un<br />

<strong>de</strong>terminado compon<strong>en</strong>te eléctrico o electrónico, o un circuito completo.<br />

• Método <strong>de</strong> <strong>la</strong> Fábrica - Fabrica con capacidad <strong>de</strong> producir<br />

compon<strong>en</strong>tes eléctricos y electrónicos <strong>de</strong> una terminal, dos terminales y<br />

tres terminales, o un circuito completo.<br />

• Producto Concreto – Objeto con <strong>la</strong>s propieda<strong>de</strong>s específicas <strong>de</strong>l<br />

compon<strong>en</strong>te o circuito fabricado<br />

Este patrón <strong>de</strong> programación ti<strong>en</strong>e <strong>la</strong> característica y v<strong>en</strong>taja, <strong>de</strong><br />

<strong>de</strong>sacop<strong>la</strong>r <strong>la</strong> re<strong>la</strong>ción tan “rígida” que se pudiera pres<strong>en</strong>tar <strong>en</strong>tre el cli<strong>en</strong>te y el<br />

producto, si <strong>la</strong> fábrica tuviera una línea <strong>de</strong> producción fija para producir<br />

<strong>de</strong>terminados productos. El patrón <strong>de</strong> programación <strong>de</strong>l Método <strong>de</strong> <strong>la</strong> Fábrica,<br />

permite integrar <strong>la</strong> producción <strong>de</strong> nuevos compon<strong>en</strong>tes <strong>de</strong> 1, 2 ó 3 terminales, sin<br />

necesidad <strong>de</strong> alterar el código <strong>de</strong> programación <strong>de</strong> <strong>la</strong> línea <strong>de</strong> producción <strong>de</strong> <strong>la</strong><br />

fábrica. Unicam<strong>en</strong>te se agrega, al código ya <strong>de</strong>sarro<strong>la</strong>do <strong>de</strong> <strong>la</strong> fábrica, <strong>la</strong><br />

<strong>de</strong>finición, especificaciones y dibujo <strong>de</strong>l nuevo elem<strong>en</strong>to que se va a producir. Esto<br />

hace muy flexible y adaptable a <strong>la</strong> fábrica, pues no se t<strong>en</strong>drá que modificar el<br />

código si se quiere que un nuevo compon<strong>en</strong>te esté disponible <strong>en</strong> el editor <strong>de</strong><br />

circuitos.<br />

Cabe ac<strong>la</strong>rar que, aunque <strong>en</strong> el FMP se pudo lograr <strong>la</strong> característica<br />

m<strong>en</strong>cionada <strong>en</strong> el párrafo anterior, existe actualm<strong>en</strong>te <strong>en</strong> el proyecto un objeto que<br />

no lo permite: el simu<strong>la</strong>dor (DC y AC). Este bloque si ti<strong>en</strong>e que modificar su código<br />

para aceptar nuevos compon<strong>en</strong>tes.<br />

III.4 Segunda Estructura Auxiliar: Patrón <strong>de</strong> Composición (CP)<br />

El Patrón <strong>de</strong> Composición es simi<strong>la</strong>r a un “móvil” colgado <strong>de</strong>l techo <strong>de</strong> una<br />

habitación. Si con <strong>la</strong> mano movemos algún elem<strong>en</strong>to, dicho movimi<strong>en</strong>to afectará a<br />

todos los <strong>de</strong>más.<br />

Este patrón se aplicó <strong>en</strong> el diseño <strong>de</strong>l módulo Vista <strong>de</strong> <strong>la</strong> estructura básica<br />

MVC, es <strong>de</strong>cir, este patrón se <strong>en</strong>cu<strong>en</strong>tra inmerso <strong>en</strong> el módulo Vista. Cuando se<br />

toca con el “mouse” una barra <strong>de</strong> <strong>la</strong> gráfica <strong>de</strong> barras mostrada <strong>en</strong> este módulo,<br />

<strong>la</strong>s <strong>de</strong>más gráficas (gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia y gráfica dinámica <strong>en</strong> <strong>3D</strong>),<br />

respon<strong>de</strong>rán a dicho ev<strong>en</strong>to <strong>en</strong> difer<strong>en</strong>tes formas. Esta es <strong>la</strong> analogía con el<br />

“móvil” colgado <strong>de</strong>l techo, y <strong>de</strong> cómo el movimi<strong>en</strong>to se transmite a los <strong>de</strong>más<br />

elem<strong>en</strong>tos. Este método es el que permite <strong>la</strong> interactividad con <strong>la</strong>s gráficas <strong>en</strong> el<br />

bloque Vista.<br />

El diagrama a bloques <strong>de</strong>l patrón <strong>de</strong> programación Composición (CP), se<br />

muestra <strong>en</strong> <strong>la</strong> Figura III.3.<br />

26


Nodo<br />

Vista<br />

Hoja 1 Hoja 2 Hoja 3<br />

Figura III.3. Patrón <strong>de</strong> programación Composición (CP).<br />

El patrón <strong>de</strong> Composición ti<strong>en</strong>e dos bloques (uno <strong>de</strong> ellos es un grupo <strong>de</strong><br />

bloques).<br />

• Nodo - Constituye el manejador <strong>de</strong> <strong>la</strong>s graficas (hojas), <strong>en</strong>viándoles <strong>la</strong><br />

información que éstas requier<strong>en</strong>, y sirvi<strong>en</strong>do <strong>de</strong> “pu<strong>en</strong>te” <strong>en</strong>tre el<strong>la</strong>s<br />

mismas cuando suce<strong>de</strong> un “ev<strong>en</strong>to” <strong>en</strong> alguna <strong>de</strong> <strong>la</strong>s hojas.<br />

• Hoja – Gráfica <strong>de</strong> barras, gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia y/o gráfica<br />

dinámica <strong>en</strong> <strong>3D</strong> (DC o AC).<br />

III.5 Diagrama a bloques <strong>de</strong>l proyecto<br />

En <strong>la</strong> Figura III.4 se pres<strong>en</strong>ta un diagrama a bloques completo <strong>de</strong>l<br />

SIMULADOR DIDÁCTICO EN <strong>3D</strong> DE CIRCUITOS ELÉCTRICOS Y<br />

ELECTRÓNICOS, <strong>en</strong> don<strong>de</strong> se muestra <strong>la</strong> ubicación <strong>de</strong> los tres patrones <strong>de</strong><br />

programación utilizados <strong>en</strong> el proyecto: MVC, FMP y CP.<br />

El MVC constituye <strong>la</strong> base <strong>de</strong>l proyecto. Su objetivo es el manejo,<br />

coordinación y control <strong>de</strong> todos los elem<strong>en</strong>tos <strong>de</strong>l simu<strong>la</strong>dor.<br />

Como ya se m<strong>en</strong>cionó, el FMP se utiliza <strong>en</strong> el editor para manejar tanto el<br />

M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes como el M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong> y el Area <strong>de</strong> Dibujo. Su<br />

objetivo es fabricar los compon<strong>en</strong>tes o circuitos con <strong>la</strong>s especificaciones<br />

particu<strong>la</strong>res <strong>de</strong> cada uno <strong>de</strong> ellos.<br />

El CP se <strong>en</strong>carga <strong>de</strong>l manejo visual <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción<br />

27


Compon<strong>en</strong>te 1<br />

FMP<br />

Botón 1<br />

Compon<strong>en</strong>te 2<br />

Fabrica<br />

Botón 2<br />

Compon<strong>en</strong>te n<br />

Botón n<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

Figura III.4. Diagrama a bloques <strong>de</strong> <strong>la</strong> estructura <strong>de</strong>l proyecto (integración <strong>de</strong> los<br />

patrones <strong>de</strong> programación: MVC, FMP y CP).<br />

La re<strong>la</strong>ción <strong>de</strong> los patrones <strong>de</strong> programación <strong>en</strong> cada una <strong>de</strong> <strong>la</strong>s pantal<strong>la</strong>s<br />

que observa el usuario es <strong>la</strong> que se muestra <strong>en</strong> <strong>la</strong>s Figuras III.5 a <strong>la</strong> III.8<br />

28


Compon<strong>en</strong>te 1<br />

FMP<br />

Botón 1<br />

Compon<strong>en</strong>te 2<br />

Fabrica<br />

Botón 2<br />

Compon<strong>en</strong>te n<br />

Botón n<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

Figura III.5. Re<strong>la</strong>ción <strong>de</strong>l patrón <strong>de</strong> programación FMP con <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l modo<br />

<strong>de</strong> EDICION<br />

29


Compon<strong>en</strong>te 1<br />

FMP<br />

Botón 1<br />

Compon<strong>en</strong>te 2<br />

Fabrica<br />

Botón 2<br />

Compon<strong>en</strong>te n<br />

Botón n<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

Gráfica <strong>de</strong><br />

Barras<br />

Figura III.6. Re<strong>la</strong>ción <strong>de</strong>l patrón <strong>de</strong> programación CP con <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l modo <strong>de</strong><br />

SIMULACIÓN EN DC<br />

30


Compon<strong>en</strong>te 1<br />

FMP<br />

Botón 1<br />

Compon<strong>en</strong>te 2<br />

Fabrica<br />

Botón 2<br />

Compon<strong>en</strong>te n<br />

Botón n<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

Gráfica <strong>de</strong><br />

Barras<br />

Figura III.7. Re<strong>la</strong>ción <strong>de</strong>l patrón <strong>de</strong> programación CP con <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l modo <strong>de</strong><br />

SIMULACIÓN EN AC<br />

31


Compon<strong>en</strong>te 1<br />

FMP<br />

Botón 1<br />

Compon<strong>en</strong>te 2<br />

Fabrica<br />

Botón 2<br />

Compon<strong>en</strong>te n<br />

Botón n<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

Figura III.8. Re<strong>la</strong>ción <strong>de</strong>l módulo Contro<strong>la</strong>dor con <strong>la</strong> pantal<strong>la</strong> <strong>de</strong>l simu<strong>la</strong>dor.<br />

Los módulos Fabrica, Mo<strong>de</strong>lo y Vista son módulos que no ti<strong>en</strong><strong>en</strong> una<br />

repres<strong>en</strong>tación gráfica <strong>en</strong> <strong>la</strong>s pantal<strong>la</strong>s <strong>de</strong>l simu<strong>la</strong>dor. Estos módulos se <strong>en</strong>cargan<br />

<strong>de</strong> difer<strong>en</strong>tes funciones que contro<strong>la</strong>n todo el proyecto.<br />

En el sigui<strong>en</strong>te capítulo se explica el funcionami<strong>en</strong>to global <strong>de</strong> todo el<br />

proyecto, así como el <strong>de</strong> cada una <strong>de</strong> <strong>la</strong>s estructuras pres<strong>en</strong>tadas.<br />

32


IV. FUNCIONAMIENTO<br />

El funcionami<strong>en</strong>to <strong>de</strong>l proyecto se pue<strong>de</strong> repres<strong>en</strong>tar como se muestra <strong>en</strong> el<br />

diagrama a bloques <strong>de</strong> <strong>la</strong> Figura IV.1 para <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC y <strong>en</strong> el diagrama a<br />

bloques <strong>de</strong> <strong>la</strong> Figura IV.2 para <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC.<br />

EDICION<br />

Dibujo y edición<br />

<strong>de</strong>l circuito<br />

Validación <strong>de</strong>l<br />

dibujo <strong>de</strong>l circuito<br />

SIMULAR EN DC<br />

Simu<strong>la</strong>ción <strong>de</strong>l<br />

circuito <strong>en</strong> DC<br />

Pres<strong>en</strong>tación <strong>de</strong> los resultados (voltajes<br />

nodales y corri<strong>en</strong>tes <strong>de</strong> rama) <strong>en</strong> dos<br />

gráficas: gráfica <strong>de</strong> barras y gráfica<br />

dinámica <strong>en</strong> <strong>3D</strong><br />

Figura IV.1. Diagrama a bloques <strong>de</strong>l funcionami<strong>en</strong>to <strong>de</strong>l proyecto para <strong>la</strong><br />

simu<strong>la</strong>ción <strong>de</strong> un circuito <strong>en</strong> DC.<br />

º<br />

EDICION<br />

Dibujo y edición<br />

<strong>de</strong>l circuito<br />

Validación <strong>de</strong>l<br />

dibujo <strong>de</strong>l circuito<br />

SIMULAR EN AC<br />

Simu<strong>la</strong>ción <strong>de</strong>l<br />

circuito <strong>en</strong> AC<br />

Pres<strong>en</strong>tación <strong>de</strong> los resultados(magnitud<br />

y fase <strong>de</strong> los voltajes nodales) <strong>en</strong> tres<br />

gráficas: gráfica <strong>de</strong> barras, gráfica <strong>de</strong><br />

respuesta <strong>en</strong> frecu<strong>en</strong>cia y gráfica<br />

dinámica <strong>en</strong> <strong>3D</strong><br />

Figura IV.2. Diagrama a bloques <strong>de</strong>l funcionami<strong>en</strong>to <strong>de</strong>l proyecto para <strong>la</strong><br />

simu<strong>la</strong>ción <strong>de</strong> un circuito <strong>en</strong> AC.<br />

En ambas figuras se observa que el funcionami<strong>en</strong>to <strong>de</strong>l proyecto es<br />

básicam<strong>en</strong>te el mismo, <strong>la</strong>s únicas difer<strong>en</strong>cias son: el tipo <strong>de</strong> simu<strong>la</strong>ción y <strong>la</strong><br />

pres<strong>en</strong>tación <strong>de</strong> los resultados <strong>en</strong> forma gráfica.<br />

En cada gráfica el flujo <strong>de</strong> información siempre inicia <strong>en</strong> el modo <strong>de</strong><br />

EDICIÓN, que es <strong>en</strong> don<strong>de</strong> el usuario dibuja y edita el circuito que <strong>de</strong>sea<br />

simu<strong>la</strong>r. Posteriorm<strong>en</strong>te, <strong>en</strong> el bloque <strong>de</strong> validación <strong>de</strong>l dibujo <strong>de</strong>l circuito, se<br />

33


comprueba que dicho dibujo cump<strong>la</strong> con ciertos requisitos para po<strong>de</strong>r simu<strong>la</strong>rse,<br />

ya sea <strong>en</strong> DC o <strong>en</strong> AC. Una vez validado dicho circuito, el bloque simu<strong>la</strong>ción se<br />

<strong>en</strong>carga <strong>de</strong> aplicar los algoritmos correspondi<strong>en</strong>tes para realizar <strong>la</strong> simu<strong>la</strong>ción<br />

<strong>de</strong>seada y, finalm<strong>en</strong>te, el bloque <strong>de</strong> pres<strong>en</strong>tación <strong>de</strong> resultados, muestra los<br />

resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> difer<strong>en</strong>tes formatos gráficos, si<strong>en</strong>do <strong>la</strong>s gráficas<br />

dinámicas <strong>en</strong> <strong>3D</strong>, <strong>la</strong>s mas novedosas <strong>en</strong> este proyecto.<br />

Se hace notar que, <strong>de</strong>spués <strong>de</strong> haber realizado alguna <strong>de</strong> <strong>la</strong>s simu<strong>la</strong>ciones<br />

disponibles, se pue<strong>de</strong> regresar al estado <strong>de</strong> EDICIÓN, ya sea para modificar el<br />

circuito simu<strong>la</strong>do, o dibujar un nuevo circuito, y com<strong>en</strong>zar nuevam<strong>en</strong>te el ciclo.<br />

El flujo <strong>de</strong> información m<strong>en</strong>cionado anteriorm<strong>en</strong>te, se realiza <strong>en</strong> realidad<br />

<strong>en</strong>tre <strong>la</strong>s estructuras básicas <strong>de</strong>l proyecto pres<strong>en</strong>tadas <strong>en</strong> el capítulo anterior.<br />

Consi<strong>de</strong>rando <strong>la</strong>s tres estructuras principales MVC, FMP y CP, <strong>la</strong> g<strong>en</strong>eración e<br />

intercambio <strong>de</strong> información <strong>en</strong>tre estas estructuras se realiza como se muestra <strong>en</strong><br />

<strong>la</strong> Figura IV.3.<br />

1. Dibujo y<br />

edición <strong>de</strong>l<br />

circuito<br />

Compon<strong>en</strong>te 1<br />

Compon<strong>en</strong>te 2<br />

Compon<strong>en</strong>te n<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

2. Validación y<br />

simu<strong>la</strong>ción <strong>de</strong>l<br />

circuito<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

3. Pres<strong>en</strong>tación<br />

gráfica <strong>de</strong><br />

resultados<br />

Figura IV.3. G<strong>en</strong>eración e intercambio <strong>de</strong> información <strong>en</strong>tre <strong>la</strong>s estructuras MVC,<br />

FMP y CP.<br />

34


IV.1 Dibujo y edición <strong>de</strong>l circuito<br />

Cuando el usuario dibuja un circuito <strong>en</strong> el Area <strong>de</strong> Dibujo, <strong>la</strong> estructura FMP<br />

se <strong>en</strong>carga <strong>de</strong> g<strong>en</strong>erar tantos objetos como compon<strong>en</strong>tes t<strong>en</strong>ga el dibujo. Cada<br />

objeto compon<strong>en</strong>te guarda <strong>en</strong> si mismo <strong>la</strong> información sobre sus coord<strong>en</strong>adas <strong>de</strong><br />

localización <strong>en</strong> el Area <strong>de</strong> Dibujo, así como sus parámetros asociados al<br />

compon<strong>en</strong>te <strong>en</strong> particu<strong>la</strong>r (id<strong>en</strong>tificador único, valor, tipo, etc.). También cada<br />

objeto compon<strong>en</strong>te, al aparecer dibujado <strong>en</strong> el Area <strong>de</strong> Dibujo, forma parte,<br />

automáticam<strong>en</strong>te, <strong>de</strong> un arreglo <strong>de</strong> objetos gráficos, el cual podrá ser<br />

consultado por <strong>la</strong>s estructuras MVC y CP cuando así lo requieran.<br />

En <strong>la</strong> Figura IV.4 se muestra gráficam<strong>en</strong>te, como ejemplo, el dibujo <strong>de</strong> un<br />

circuito y el arreglo <strong>de</strong> objetos gráficos g<strong>en</strong>erado para dicho circuito <strong>de</strong><br />

ejemplo, mi<strong>en</strong>tras que <strong>en</strong> <strong>la</strong> Figura IV.5 se pres<strong>en</strong>ta el diagrama a bloques <strong>de</strong> <strong>la</strong><br />

estructura <strong>de</strong>l proyecto, indicando <strong>la</strong> ubicación <strong>de</strong>l arreglo <strong>de</strong> objetos gráficos<br />

g<strong>en</strong>erado por <strong>la</strong> estructura FMP.<br />

Arreglo <strong>de</strong> objetos gráficos<br />

OBJETO: FUENTE DE VOLTAJE DC<br />

R1<br />

- Id<strong>en</strong>tificador único: VDC1<br />

- Información <strong>de</strong> coord<strong>en</strong>adas: x,y,z<br />

- Valor <strong>de</strong> <strong>la</strong> fu<strong>en</strong>te: 10 volts<br />

- Tipo <strong>de</strong> Fu<strong>en</strong>te: DC<br />

OBJETO: RESISTENCIA<br />

VDC1<br />

R2<br />

- Id<strong>en</strong>tificador único: R1<br />

- Información <strong>de</strong> coord<strong>en</strong>adas: x,y,z<br />

- Valor <strong>de</strong> <strong>la</strong> resist<strong>en</strong>cia: 1 Kohm<br />

OBJETO: RESISTENCIA<br />

G1<br />

G2<br />

- Id<strong>en</strong>tificador único: R2<br />

- Información <strong>de</strong> coord<strong>en</strong>adas: x,y,z<br />

- Valor <strong>de</strong> <strong>la</strong> resist<strong>en</strong>cia: 1 Kohm<br />

OBJETO: TIERRA<br />

- Id<strong>en</strong>tificador único: G1<br />

- Información <strong>de</strong> coord<strong>en</strong>adas: x,y,z<br />

OBJETO: TIERRA<br />

- Id<strong>en</strong>tificador único: G2<br />

- Información <strong>de</strong> coord<strong>en</strong>adas: x,y,z<br />

Figura IV.4. Dibujo <strong>de</strong> un circuito y el arreglo <strong>de</strong> objetos gráficos<br />

correspondi<strong>en</strong>te g<strong>en</strong>erado por <strong>la</strong> estructura FMP.<br />

35


Compon<strong>en</strong>te 1<br />

Compon<strong>en</strong>te 2<br />

Compon<strong>en</strong>te n<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

1<br />

Mo<strong>de</strong>lo<br />

El patrón FMP g<strong>en</strong>era un<br />

arreglo <strong>de</strong> objetos gráficos<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta<br />

<strong>en</strong><br />

Gráfica<br />

Barras<br />

<strong>de</strong><br />

Gráfica<br />

dinámica <strong>en</strong><br />

<strong>3D</strong><br />

Figura IV.5. Ubicación <strong>de</strong>l el arreglo <strong>de</strong> objetos gráficos g<strong>en</strong>erado por <strong>la</strong><br />

estructura FMP.<br />

IV.2 Validación <strong>de</strong>l dibujo <strong>de</strong>l circuito<br />

Al mom<strong>en</strong>to <strong>de</strong> presionar el botón SIMULAR EN DC ó SIMULAR EN AC, el<br />

mo<strong>de</strong>lo lee el arreglo <strong>de</strong> objetos gráficos y lo analiza para buscar algún error<br />

<strong>en</strong> el circuito antes <strong>de</strong> simu<strong>la</strong>rlo. En <strong>la</strong> Figura IV.6 se muestra gráficam<strong>en</strong>te este<br />

proceso. Para este análisis, el Mo<strong>de</strong>lo se apoya <strong>en</strong> una c<strong>la</strong>se l<strong>la</strong>mada Manejador<br />

<strong>de</strong> red, <strong>la</strong> cual realiza el análisis <strong>de</strong>tal<strong>la</strong>do <strong>de</strong> <strong>la</strong> red <strong>de</strong>l circuito, reportando<br />

cualquier error al mo<strong>de</strong>lo, qui<strong>en</strong>, a su vez, escribe un m<strong>en</strong>saje <strong>en</strong> <strong>la</strong> barra <strong>de</strong><br />

estado, informando al usuario <strong>de</strong> <strong>la</strong> exist<strong>en</strong>cia <strong>de</strong> un error y su posible causa<br />

Los m<strong>en</strong>sajes <strong>de</strong> error que pued<strong>en</strong> aparecer <strong>en</strong> <strong>la</strong> barra <strong>de</strong> estado son los<br />

que se indican a continuación:<br />

• “NO EXISTE CIRCUITO QUE SIMULAR” – Se presionó el botón<br />

“SIMULAR EN DC” ó “SIMULAR EN AC” sin t<strong>en</strong>er dibujado algún<br />

circuito <strong>en</strong> el área <strong>de</strong> dibujo.<br />

• ”CERRAR VENTANAS DE EDICION DE CADA COMPONENTE” – Se<br />

<strong>en</strong>cu<strong>en</strong>tra abierta una o mas v<strong>en</strong>tanas <strong>de</strong> edición <strong>de</strong> algun(os)<br />

compon<strong>en</strong>te(s).<br />

36


• “NO SE HA DEFINIDO EL NODO DE TIERRA” – No está dibujado el<br />

símbolo <strong>de</strong> “tierra” <strong>en</strong> el área <strong>de</strong> dibujo.<br />

• “CIRCUITO NO CONECTADO A TIERRA” – El circuito dibujado no ti<strong>en</strong>e<br />

algún nodo conectado a “tierra”.<br />

• “ELEMENTOS DESCONECTADOS DEL CIRCUITO” – Existe uno o<br />

mas elem<strong>en</strong>tos que no están conectados <strong>en</strong>tre sí.<br />

• “FUENTES EN CONEXION NO VALIDA” – Fu<strong>en</strong>te <strong>de</strong> voltaje <strong>en</strong> “corto<br />

circuito” ó fu<strong>en</strong>te <strong>de</strong> corri<strong>en</strong>te <strong>en</strong> “circuito abierto”.<br />

Co<br />

Co<br />

Co<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

Manejador <strong>de</strong> red<br />

Mo<strong>de</strong>lo<br />

MVC<br />

2<br />

El Mo<strong>de</strong>lo analiza el arreglo<br />

<strong>de</strong> objetos gráficos<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta<br />

<strong>en</strong><br />

Gráfica<br />

Barras<br />

<strong>de</strong><br />

Gráfica<br />

dinámica <strong>en</strong><br />

<strong>3D</strong><br />

Figura IV.6. Análisis <strong>de</strong>l arreglo <strong>de</strong> objetos gráficos por el bloque Mo<strong>de</strong>lo,<br />

auxiliado por el bloque Manejador <strong>de</strong> red<br />

Si no hay errores o ya se corrigieron, <strong>la</strong> c<strong>la</strong>se auxiliar, Manejador <strong>de</strong> red,<br />

g<strong>en</strong>era un archivo <strong>de</strong>scriptor <strong>de</strong>l circuito con un formato simi<strong>la</strong>r al <strong>de</strong> SPICE,<br />

como el mostrado <strong>en</strong> <strong>la</strong> Figura IV.7:<br />

C[0] id: V1 c: 1,0 valor: 10 tipo: “DC”<br />

C[1] id: R1 c: 1,2 valor: 1000<br />

C[2] id: R2 c: 2,0 valor: 1000<br />

Figura IV.7. Archivo <strong>de</strong>scriptor <strong>de</strong>l circuito g<strong>en</strong>erado por el bloque Manejador<br />

<strong>de</strong> red<br />

37


En <strong>la</strong> Figura IV.8 se pres<strong>en</strong>ta <strong>la</strong> ubicación <strong>de</strong> este archivo <strong>en</strong> el diagrama <strong>de</strong><br />

<strong>la</strong> estructura <strong>de</strong>l simu<strong>la</strong>dor.<br />

Co<br />

Co<br />

Co<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

Manejador <strong>de</strong> red<br />

Mo<strong>de</strong>lo<br />

C[0] id: V1 c: 1,0 valor: 10 tipo: “DC”<br />

C[1] id: R1 c: 1,2 valor: 1000<br />

C[2] id: R2 c: 2,0 valor: 1000<br />

MVC 3<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

El Mo<strong>de</strong>lo g<strong>en</strong>era el archivo<br />

<strong>de</strong>scriptor <strong>de</strong>l circuito<br />

Gráfica <strong>de</strong><br />

Respuesta<br />

<strong>en</strong><br />

Gráfica<br />

Barras<br />

<strong>de</strong><br />

Gráfica<br />

dinámica <strong>en</strong><br />

<strong>3D</strong><br />

Figura IV.8. Archivo <strong>de</strong>scriptor <strong>de</strong>l circuito g<strong>en</strong>erado por el bloque Mo<strong>de</strong>lo,<br />

auxiliado por el bloque Manejador <strong>de</strong> red<br />

Parale<strong>la</strong>m<strong>en</strong>te con <strong>la</strong> g<strong>en</strong>eración <strong>de</strong>l archivo <strong>de</strong>scriptor <strong>de</strong>l circuito el<br />

Mo<strong>de</strong>lo autoriza al Contro<strong>la</strong>dor para po<strong>de</strong>r realizar el cambio <strong>de</strong> estado a<br />

SIMULAR EN DC ó SIMULAR EN AC, según lo haya solicitado el usuario.<br />

IV.3 Simu<strong>la</strong>ción <strong>de</strong>l circuito<br />

Una vez g<strong>en</strong>erado el archivo <strong>de</strong>scriptor <strong>de</strong>l circuito, el Mo<strong>de</strong>lo lo <strong>en</strong>vía a<br />

<strong>la</strong> c<strong>la</strong>ses auxiliares <strong>Simu<strong>la</strong>dor</strong> <strong>en</strong> DC o <strong>Simu<strong>la</strong>dor</strong> <strong>en</strong> AC, según corresponda,<br />

para realizar <strong>la</strong> simu<strong>la</strong>ción respectiva, como se observa <strong>en</strong> <strong>la</strong> Figura IV.9.<br />

La simu<strong>la</strong>ción se realiza a través <strong>de</strong> un algoritmo l<strong>la</strong>mado Análsis Nodal<br />

Modificado (MNA), el cual es un método <strong>de</strong> análisis <strong>de</strong> circuitos eléctricos<br />

adaptado para su procesami<strong>en</strong>to <strong>en</strong> una computadora. También se hace uso <strong>de</strong>l<br />

algoritmo <strong>de</strong> Gauss Jordan para resolver el sistema <strong>de</strong> ecuaciones resultante.<br />

38


Co<br />

Co<br />

Co<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

<strong>Simu<strong>la</strong>dor</strong> <strong>en</strong> DC o<br />

AC<br />

4<br />

El Mo<strong>de</strong>lo simu<strong>la</strong> el archivo<br />

<strong>de</strong>scriptor <strong>de</strong>l circuito<br />

Mo<strong>de</strong>lo<br />

MVC<br />

C[0] id: V1 c: 1,0 valor: 10 tipo: “DC”<br />

C[1] id: R1 c: 1,2 valor: 1000<br />

C[2] id: R2 c: 2,0 valor: 1000<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta<br />

<strong>en</strong><br />

Gráfica<br />

Barras<br />

<strong>de</strong><br />

Gráfica<br />

dinámica <strong>en</strong><br />

<strong>3D</strong><br />

Figura IV.9. Simu<strong>la</strong>ción <strong>de</strong>l archivo <strong>de</strong>scriptor <strong>de</strong>l circuito por el bloque<br />

Mo<strong>de</strong>lo, auxiliado por el bloque <strong>Simu<strong>la</strong>dor</strong> <strong>en</strong> DC o AC<br />

Si existe algún error <strong>en</strong> <strong>la</strong> simu<strong>la</strong>ción, el Mo<strong>de</strong>lo lo reportará <strong>en</strong> <strong>la</strong> barra <strong>de</strong><br />

estado. Los posibles errores <strong>de</strong> simu<strong>la</strong>ción pued<strong>en</strong> ser los sigui<strong>en</strong>tes:<br />

• “01:: ERROR EN LA SIMULACION: REVISAR EL CIRCUITO” – Un<br />

voltaje nodal no pudo ser calcu<strong>la</strong>do.<br />

• “02:: ERROR EN LA SIMULACION: REVISAR EL CIRCUITO” – Una<br />

corri<strong>en</strong>te <strong>de</strong> rama no pudo ser calcu<strong>la</strong>da.<br />

• “03:: ERROR EN LA SIMULACION: REVISAR EL CIRCUITO” - Un<br />

valor <strong>de</strong> magnitud y fase <strong>de</strong> algún voltaje nodal no pudo ser calcu<strong>la</strong>do.<br />

Si se pres<strong>en</strong>ta alguno <strong>de</strong> estos errores, el Mo<strong>de</strong>lo no autorizará al<br />

Contro<strong>la</strong>dor para realizar el cambio <strong>de</strong> pantal<strong>la</strong> a Vista para <strong>de</strong>splegar los<br />

resultados, ya que éstos no exist<strong>en</strong>, por lo que el estado <strong>de</strong>l proyecto<br />

permanecerá <strong>en</strong> EDICIÓN, para que se pueda modificar el circuito<br />

Si <strong>la</strong> simu<strong>la</strong>ción resultó exitosa, el Mo<strong>de</strong>lo autorizará el cambio <strong>de</strong> pantal<strong>la</strong><br />

a Vista, a través <strong>de</strong>l Contro<strong>la</strong>dor.<br />

39


IV.4 Pres<strong>en</strong>tación <strong>de</strong> resultados<br />

La pres<strong>en</strong>tación <strong>de</strong> los resultados se realiza mediante <strong>la</strong> estructura CP<br />

cuando el Mo<strong>de</strong>lo <strong>en</strong>vía los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción al bloque Vista. Este<br />

bloque Vista constituye el nodo <strong>de</strong> <strong>la</strong> estructura CP, al cual se conectan dos o tres<br />

hojas <strong>de</strong> acuerdo al tipo <strong>de</strong> simu<strong>la</strong>ción: gráfica <strong>de</strong> barras y gráfica dinámica <strong>en</strong><br />

<strong>3D</strong> para <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC y, gráfica <strong>de</strong> barras, gráfica <strong>de</strong> respuesta <strong>en</strong><br />

frecu<strong>en</strong>cia y gráfica dinámica <strong>en</strong> <strong>3D</strong> para <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC.<br />

IV.4.1 Simu<strong>la</strong>ción <strong>en</strong> DC<br />

El bloque Vista g<strong>en</strong>era dos gráficas para repres<strong>en</strong>tar los resultados <strong>de</strong> esta<br />

simu<strong>la</strong>ción: una gráfica <strong>de</strong> barras y una grafica dinámica <strong>en</strong> <strong>3D</strong>, como se<br />

muestra <strong>en</strong> <strong>la</strong> Figura IV.10.<br />

Co<br />

Co<br />

Co<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

5<br />

La Vista pres<strong>en</strong>ta los<br />

resultados <strong>de</strong> <strong>la</strong><br />

simu<strong>la</strong>ción <strong>en</strong> DC<br />

Mo<strong>de</strong>lo<br />

MVC<br />

C[0] id: V1 c: 1,0 valor: 10 tipo: “DC”<br />

C[1] id: R1 c: 1,2 valor: 1000<br />

C[2] id: R2 c: 2,0 valor: 1000<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta<br />

<strong>en</strong><br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica<br />

dinámica<br />

Figura IV.10. Pres<strong>en</strong>tación <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC<br />

La gráfica <strong>de</strong> barras muestra los valores <strong>de</strong> los voltajes nodales <strong>en</strong> cada<br />

nodo <strong>de</strong>l circuito. Es una gráfica interactiva. Al pasar el puntero <strong>de</strong>l mouse sobre<br />

alguna barra suced<strong>en</strong> tres acciones: <strong>la</strong> barra se ilumina, el id<strong>en</strong>tificador <strong>de</strong>l nodo<br />

correspondi<strong>en</strong>te y el valor <strong>de</strong>l voltaje nodal correspondi<strong>en</strong>te aparec<strong>en</strong> resaltados<br />

<strong>en</strong> dicha gráfica y, finalm<strong>en</strong>te, el nodo correspondi<strong>en</strong>te a <strong>la</strong> barra seleccionada,<br />

aparece resaltado <strong>en</strong> <strong>la</strong> gráfica dinámica <strong>en</strong> <strong>3D</strong>, mediante un círculo concéntrico<br />

alre<strong>de</strong>dor <strong>de</strong> dicho nodo, para indicarle al usuario <strong>la</strong> ubicación <strong>de</strong> éste <strong>en</strong> el<br />

40


circuito. Esta gráfica permite visualizar <strong>en</strong> conjunto, los voltajes nodales <strong>de</strong> todo el<br />

circuito.<br />

La gráfica dinámica <strong>en</strong> <strong>3D</strong> muestra, al mismo tiempo y <strong>en</strong> forma dinámica,<br />

<strong>la</strong> repres<strong>en</strong>tación espacial <strong>de</strong> los voltajes nodales, y el flujo repres<strong>en</strong>tativo <strong>de</strong> <strong>la</strong>s<br />

corri<strong>en</strong>tes <strong>de</strong> rama <strong>en</strong> todo el circuito. Los voltajes nodales se repres<strong>en</strong>tan con <strong>la</strong><br />

altura <strong>de</strong> dicho nodos con respecto al p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong> pot<strong>en</strong>cial 0 volts,<br />

mi<strong>en</strong>tras que <strong>la</strong>s corri<strong>en</strong>tes <strong>de</strong> rama se repres<strong>en</strong>tan como un flujo <strong>de</strong> flechas, cuyo<br />

“ancho” repres<strong>en</strong>ta el valor comparativo <strong>de</strong> <strong>la</strong>s corri<strong>en</strong>tes <strong>en</strong> el contexto <strong>de</strong> todo el<br />

circuito. Como ya se m<strong>en</strong>cionó <strong>en</strong> el párrafo anterior, al seleccionar una barra <strong>en</strong><br />

<strong>la</strong> gráfica <strong>de</strong> barras, se g<strong>en</strong>era un círculo concéntrico <strong>en</strong> el nodo respectivo <strong>de</strong><br />

esta gráfica (<strong>la</strong> gráfica dinámica <strong>en</strong> <strong>3D</strong>).<br />

Ambas gráficas se muestran <strong>en</strong> <strong>la</strong> Figura IV.11. En esta figura <strong>de</strong> ejemplo,<br />

se pue<strong>de</strong> observar <strong>la</strong> selección <strong>de</strong> una barra con el puntero <strong>de</strong>l mouse y su efecto<br />

<strong>en</strong> ambas gráficas.<br />

Figura IV.11. Pres<strong>en</strong>tación <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC, <strong>en</strong> una<br />

gráfica <strong>de</strong> barras y <strong>en</strong> una gráfica dinámica <strong>en</strong> <strong>3D</strong><br />

Obsérvese que <strong>la</strong> gráfica dinámica <strong>en</strong> <strong>3D</strong> conti<strong>en</strong>e, a<strong>de</strong>más <strong>de</strong>l p<strong>la</strong>no <strong>de</strong><br />

refer<strong>en</strong>cia <strong>de</strong> pot<strong>en</strong>cial 0 volts, una línea vertical perp<strong>en</strong>dicu<strong>la</strong>r a dicho p<strong>la</strong>no. Esta<br />

línea repres<strong>en</strong>ta el s<strong>en</strong>tido <strong>de</strong> valores positivos <strong>de</strong> los voltajes nodales<br />

correspondi<strong>en</strong>tes al circuito que se pres<strong>en</strong>ta.<br />

41


IV.4.2 Simu<strong>la</strong>ción <strong>en</strong> AC<br />

El bloque Vista g<strong>en</strong>era tres gráficas para repres<strong>en</strong>tar los resultados <strong>de</strong> esta<br />

simu<strong>la</strong>ción: una gráfica <strong>de</strong> barras, una gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia y<br />

una grafica dinámica <strong>en</strong> <strong>3D</strong>, como se muestra <strong>en</strong> <strong>la</strong> Figura IV.12.<br />

Co<br />

Co<br />

Co<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

6<br />

La Vista pres<strong>en</strong>ta los<br />

resultados <strong>de</strong> <strong>la</strong><br />

simu<strong>la</strong>ción <strong>en</strong> AC<br />

Mo<strong>de</strong>lo<br />

MVC<br />

C[0] id: V1 c: 1,0 valor: 10 tipo: “DC”<br />

C[1] id: R1 c: 1,2 valor: 1000<br />

C[2] id: R2 c: 2,0 valor: 1000<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica<br />

dinámica<br />

Figura IV.12. Pres<strong>en</strong>tación <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC<br />

La gráfica <strong>de</strong> barras muestra los valores <strong>de</strong> <strong>la</strong>s magnitu<strong>de</strong>s <strong>de</strong> los voltajes<br />

nodales <strong>en</strong> cada nodo <strong>de</strong>l circuito. Es una gráfica interactiva. Al pasar el puntero<br />

<strong>de</strong>l mouse sobre alguna barra suced<strong>en</strong> cuatro acciones: <strong>la</strong> barra se ilumina, el<br />

id<strong>en</strong>tificador <strong>de</strong>l nodo correspondi<strong>en</strong>te y el valor <strong>de</strong> <strong>la</strong> magnitud <strong>de</strong>l voltaje nodal<br />

correspondi<strong>en</strong>te aparec<strong>en</strong> resaltados <strong>en</strong> dicha gráfica, se muestra <strong>la</strong> gráfica <strong>de</strong> <strong>la</strong><br />

respuesta <strong>en</strong> frecu<strong>en</strong>cia <strong>de</strong>l nodo seleccionado y, finalm<strong>en</strong>te, el nodo<br />

correspondi<strong>en</strong>te a <strong>la</strong> barra seleccionada, se resalta <strong>en</strong> <strong>la</strong> gráfica dinámica <strong>en</strong> <strong>3D</strong>,<br />

mediante un círculo concéntrico alre<strong>de</strong>dor <strong>de</strong> dicho nodo.<br />

La grafica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia muestra <strong>la</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia<br />

<strong>de</strong>l nodo seleccionado <strong>en</strong> <strong>la</strong> gráfica <strong>de</strong> barras. Esta respuesta <strong>en</strong> frecu<strong>en</strong>cia<br />

correspon<strong>de</strong> al diagrama <strong>de</strong> Bo<strong>de</strong>, es <strong>de</strong>cir, está formada por una gráfica <strong>de</strong><br />

magnitud vs. frecu<strong>en</strong>cia y otra gráfica <strong>de</strong> fase vs. frecu<strong>en</strong>cia.<br />

La gráfica dinámica <strong>en</strong> <strong>3D</strong> muestra, al mismo tiempo y <strong>en</strong> forma dinámica,<br />

<strong>la</strong> repres<strong>en</strong>tación espacial <strong>de</strong> los voltajes nodales complejos, mediante <strong>la</strong><br />

repres<strong>en</strong>tación <strong>de</strong> <strong>la</strong> magnitud a través <strong>de</strong> <strong>la</strong> altura <strong>de</strong> dicho nodos con respecto al<br />

42


p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong> pot<strong>en</strong>cial 0 volts, y <strong>la</strong> fase mediante su osci<strong>la</strong>ción o<br />

movimi<strong>en</strong>to cíclico <strong>en</strong> función <strong>de</strong>l tiempo. Como ya se m<strong>en</strong>cionó <strong>en</strong> el párrafo<br />

anterior, al seleccionar una barra <strong>en</strong> <strong>la</strong> gráfica <strong>de</strong> barras, se g<strong>en</strong>era un círculo<br />

concéntrico <strong>en</strong> el nodo respectivo <strong>de</strong> esta gráfica (<strong>la</strong> gráfica dinámica <strong>en</strong> <strong>3D</strong>).<br />

Las tres gráficas se muestran <strong>en</strong> <strong>la</strong> Figura IV.13. En esta figura <strong>de</strong> ejemplo,<br />

se pue<strong>de</strong> observar <strong>la</strong> selección <strong>de</strong> una barra con el puntero <strong>de</strong>l mouse y su efecto<br />

<strong>en</strong> ambas gráficas.<br />

Figura IV.13. Pres<strong>en</strong>tación <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC: gráfica<br />

<strong>de</strong> barras, gráfica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia y gráfica dinámica <strong>en</strong> <strong>3D</strong><br />

Nuevam<strong>en</strong>te se hace notar que <strong>la</strong> gráfica dinámica <strong>en</strong> <strong>3D</strong> conti<strong>en</strong>e, a<strong>de</strong>más<br />

<strong>de</strong>l p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong> pot<strong>en</strong>cial 0 volts, una línea vertical perp<strong>en</strong>dicu<strong>la</strong>r a<br />

dicho p<strong>la</strong>no. Esta línea repres<strong>en</strong>ta el s<strong>en</strong>tido <strong>de</strong> valores positivos <strong>de</strong> <strong>la</strong>s<br />

magnitu<strong>de</strong>s <strong>de</strong> los voltajes nodales correspondi<strong>en</strong>tes al circuito que se pres<strong>en</strong>ta.<br />

43


1. Dibujo y<br />

edición <strong>de</strong>l<br />

circuito<br />

Compon<strong>en</strong>te 1<br />

Compon<strong>en</strong>te 2<br />

Compon<strong>en</strong>te n<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Botón n<br />

2. Validación y<br />

simu<strong>la</strong>ción <strong>de</strong>l<br />

circuito<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

3. Pres<strong>en</strong>tación<br />

gráfica <strong>de</strong><br />

resultados<br />

44


V. Patrón <strong>de</strong> Programación METODO DE LA FABRICA (FMP).<br />

El FMP se <strong>en</strong>cu<strong>en</strong>tra asociado al editor <strong>de</strong>l circuito, como se ha explicado<br />

<strong>en</strong> los capítulos anteriores.<br />

La función <strong>de</strong> esta estructura <strong>de</strong> programación es <strong>la</strong> <strong>de</strong> “fabricar” los<br />

compon<strong>en</strong>tes o circuitos solicitados por el usuario mediante el m<strong>en</strong>ú <strong>de</strong><br />

compon<strong>en</strong>tes (fabricación <strong>de</strong> compon<strong>en</strong>tes) ó el m<strong>en</strong>ú <strong>de</strong> circuitos (fabricación <strong>de</strong><br />

circuitos)<br />

El proceso <strong>de</strong> fabricación se divi<strong>de</strong> <strong>en</strong> tres etapas, como se muestra <strong>en</strong> <strong>la</strong><br />

Figura V.1.<br />

Objeto compon<strong>en</strong>te<br />

Fabricación <strong>de</strong>l objeto<br />

compon<strong>en</strong>te<br />

Solicitud <strong>de</strong> fabicación <strong>de</strong><br />

un compon<strong>en</strong>te o<br />

circuito<br />

Figura V.1. Proceso <strong>de</strong> fabricación <strong>de</strong> un compon<strong>en</strong>te o circuito.<br />

El proceso comi<strong>en</strong>za con una solicitud, por parte <strong>de</strong>l usuario, para fabricar<br />

algún compon<strong>en</strong>te o circuito. La fábrica se <strong>en</strong>carga <strong>en</strong>tonces <strong>de</strong> fabricar dicho<br />

compon<strong>en</strong>te, g<strong>en</strong>erando como producto final el objeto compon<strong>en</strong>te solicitado<br />

La fabricación <strong>de</strong> compon<strong>en</strong>tes (<strong>en</strong> <strong>la</strong> cual está basada también <strong>la</strong><br />

fabricación <strong>de</strong> circuitos) se realiza, <strong>de</strong> manera mas <strong>de</strong>tal<strong>la</strong>da, como se muestra <strong>en</strong><br />

<strong>la</strong> Figura V.2.<br />

Arreglo <strong>de</strong> objetos<br />

gráficos<br />

Refer<strong>en</strong>cias a cada<br />

uno <strong>de</strong> los objetos<br />

compon<strong>en</strong>tes que<br />

se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el<br />

Area <strong>de</strong> Dibujo<br />

Area <strong>de</strong><br />

Dibujo<br />

4<br />

Fábrica<br />

Fabricación <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

CODIGO COMUN<br />

2<br />

M<strong>en</strong>ú <strong>de</strong><br />

Compon<strong>en</strong>tes<br />

REFERENCIA<br />

5<br />

3<br />

CODIGO PARTICULAR<br />

1<br />

Usuar<br />

io<br />

Figura V.2. Proceso <strong>de</strong>tal<strong>la</strong>do <strong>de</strong> fabricación <strong>de</strong> compon<strong>en</strong>tes.<br />

En esta figura se lleva a cabo <strong>la</strong> sigui<strong>en</strong>te secu<strong>en</strong>cia <strong>de</strong> acciones:<br />

45


46<br />

1. El usuario solicita <strong>la</strong> fabricación <strong>de</strong> un compon<strong>en</strong>te presionando un<br />

botón <strong>de</strong>l M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes.<br />

2. El botón presionado, a su vez, solicita a <strong>la</strong> fábrica, <strong>la</strong> producción <strong>de</strong><br />

dicho compon<strong>en</strong>te.<br />

3. La fábrica produce el objeto compon<strong>en</strong>te solicitado, creando un objeto<br />

cuyo código está formado por el código común que compart<strong>en</strong> todos<br />

los compon<strong>en</strong>tes, mas el código particu<strong>la</strong>r <strong>de</strong>l compon<strong>en</strong>te solicitado.<br />

4. El símbolo gráfico <strong>de</strong>l compon<strong>en</strong>te se coloca <strong>en</strong> el Area <strong>de</strong> Dibujo,<br />

para que el usuario lo arrastre con el mouse y lo coloque <strong>en</strong> el lugar<br />

<strong>de</strong>seado para construir un <strong>de</strong>terminado circuito. Se hace notar que,<br />

<strong>de</strong>s<strong>de</strong> este mom<strong>en</strong>to, el objeto compon<strong>en</strong>te ti<strong>en</strong>e todas <strong>la</strong>s<br />

propieda<strong>de</strong>s necesarias para comportarse como tal, es <strong>de</strong>cir, si el<br />

símbolo es <strong>de</strong> una resist<strong>en</strong>cia o un capacitor o una fu<strong>en</strong>te, se<br />

comportará como tal al mom<strong>en</strong>to <strong>de</strong> simu<strong>la</strong>r el circuito<br />

5. Las refer<strong>en</strong>cias a cada compon<strong>en</strong>te colocado <strong>en</strong> el Area <strong>de</strong> Dibujo, se<br />

guardan <strong>en</strong> el arreglo <strong>de</strong> objetos gráficos, para su uso posterior por<br />

los bloques Mo<strong>de</strong>lo y Vista.


V.1 Diagrama <strong>de</strong> c<strong>la</strong>ses<br />

La <strong>de</strong>finición e interconexión <strong>de</strong> c<strong>la</strong>ses <strong>en</strong> <strong>la</strong> estructura FMP, <strong>la</strong> cual permite<br />

g<strong>en</strong>erar <strong>la</strong> secu<strong>en</strong>cia anterior, es muy interesante por el hecho <strong>de</strong> que dicha<br />

estructura reutiliza el mismo código común para todos los compon<strong>en</strong>tes que se<br />

manejan, a<strong>de</strong>más <strong>de</strong> permitir también, mediante <strong>la</strong> ext<strong>en</strong>sión <strong>de</strong>l código común,<br />

proporcionar <strong>la</strong>s características y funcionalida<strong>de</strong>s particu<strong>la</strong>res <strong>de</strong> cada<br />

compon<strong>en</strong>te. Así por ejemplo, una resist<strong>en</strong>cia, un capacitor, una fu<strong>en</strong>te <strong>de</strong> voltaje<br />

y una fu<strong>en</strong>te <strong>de</strong> corri<strong>en</strong>te, compart<strong>en</strong> un código común por ser compon<strong>en</strong>tes <strong>de</strong><br />

dos terminales, sin embargo, cada uno <strong>de</strong> ellos ti<strong>en</strong>e un comportami<strong>en</strong>to particu<strong>la</strong>r<br />

<strong>de</strong>p<strong>en</strong>di<strong>en</strong>do <strong>de</strong> su función, lo cual hace necesario que cada compon<strong>en</strong>te exti<strong>en</strong>da<br />

el código común mediante un código particu<strong>la</strong>r <strong>de</strong> éste.<br />

Para lograr lo anterior, <strong>la</strong> estructura FMP cu<strong>en</strong>ta con un mecanismo <strong>de</strong><br />

selección <strong>de</strong>l código correspondi<strong>en</strong>te a cada compon<strong>en</strong>te <strong>en</strong> particu<strong>la</strong>r, pero si se<br />

quiere agregar al simu<strong>la</strong>dor un compon<strong>en</strong>te nuevo, <strong>la</strong> fábrica también ti<strong>en</strong>e <strong>la</strong><br />

flexibilidad necesaria para adaptarse a este cambio sin necesidad <strong>de</strong> modificar el<br />

código ya exist<strong>en</strong>te <strong>en</strong> <strong>la</strong> fábrica, sino so<strong>la</strong>m<strong>en</strong>te agregar el nuevo código <strong>de</strong>l<br />

nuevo compon<strong>en</strong>te.<br />

Este mecanismo se pue<strong>de</strong> visualizar mediante el diagrama <strong>de</strong> c<strong>la</strong>ses<br />

pres<strong>en</strong>tado <strong>en</strong> <strong>la</strong> Figura V.3, para <strong>la</strong> fabricación <strong>de</strong> una resist<strong>en</strong>cia como ejemplo.<br />

Compon<strong>en</strong>te<br />

Fabrica<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

Area <strong>de</strong><br />

Dibujo<br />

4<br />

C<strong>la</strong>se Abstracta<br />

Compon<strong>en</strong>te2T<br />

C<strong>la</strong>se Concreta<br />

FabricarCompon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

M<strong>en</strong>ú <strong>de</strong><br />

Compon<strong>en</strong>tes<br />

REFERENCIA<br />

5<br />

3<br />

Resist<strong>en</strong>cia<br />

2 1<br />

FabricarResist<strong>en</strong>cia<br />

botonResist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Figura V.3. Proceso <strong>de</strong> fabricación <strong>de</strong> una resist<strong>en</strong>cia mediante <strong>la</strong> estructura FMP.<br />

V.1.1 La Fábrica<br />

En <strong>la</strong> Figura V.4 se muestra exclusivam<strong>en</strong>te el diagrama <strong>de</strong> c<strong>la</strong>ses<br />

necesario para <strong>la</strong> fabricación <strong>de</strong> un objeto resist<strong>en</strong>cia.<br />

47


Código común para compon<strong>en</strong>tes <strong>de</strong> 2 Terminales<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Objeto<br />

Resist<strong>en</strong>cia<br />

Compon<strong>en</strong>te2T<br />

C<strong>la</strong>se Concreta<br />

FabricarCompon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Resist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

FabricarResist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

botonResist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

Código particu<strong>la</strong>r específico <strong>de</strong> <strong>la</strong> Resist<strong>en</strong>cia<br />

Figura V.4. Diagrama <strong>de</strong> c<strong>la</strong>ses <strong>de</strong> <strong>la</strong> estructura FMP, para <strong>la</strong> fabricación <strong>de</strong> un<br />

objeto resist<strong>en</strong>cia.<br />

En esta figura se repres<strong>en</strong>tan <strong>la</strong>s c<strong>la</strong>ses utilizadas mediante un rectángulo,<br />

cuyo nombre <strong>de</strong> c<strong>la</strong>se se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> <strong>la</strong> parte superior <strong>de</strong> éste, mi<strong>en</strong>tras que el<br />

tipo <strong>de</strong> c<strong>la</strong>se se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> <strong>la</strong> parte inferior <strong>de</strong>l mismo.<br />

La c<strong>la</strong>se botonResist<strong>en</strong>cia está asociada con el botón que aparece <strong>en</strong> el<br />

M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes con el símbolo <strong>de</strong> una resist<strong>en</strong>cia. Cuando el usuario<br />

presiona dicho botón, esta c<strong>la</strong>se g<strong>en</strong>era una petición <strong>de</strong> fabricación <strong>de</strong> una<br />

resist<strong>en</strong>cia mediante el código que se muestra <strong>en</strong> <strong>la</strong> Figura V.5.<br />

:: botonResist<strong>en</strong>cia – C<strong>la</strong>se CONCRETA<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarResist<strong>en</strong>cia();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

Figura V.5. Código <strong>de</strong><strong>la</strong> respuesta <strong>de</strong> <strong>la</strong> c<strong>la</strong>se botonResist<strong>en</strong>cia al ser<br />

presionado dicho botón por el usuario.<br />

En <strong>la</strong> segunda línea <strong>de</strong> este código, se <strong>de</strong>fine una variable “compon<strong>en</strong>te”<br />

cuyo tipo <strong>de</strong> variable se asocia a <strong>la</strong> c<strong>la</strong>se abstracta FabricarCompon<strong>en</strong>te. A <strong>la</strong><br />

variable compon<strong>en</strong>te se le asigna el objeto FabricarResist<strong>en</strong>cia, el cual se<br />

g<strong>en</strong>era al “instanciar” <strong>la</strong> c<strong>la</strong>se <strong>de</strong>l mismo nombre. Lo importante aquí es el hecho<br />

<strong>de</strong> que <strong>la</strong> c<strong>la</strong>se FabricarResist<strong>en</strong>cia es una c<strong>la</strong>se concreta que “exti<strong>en</strong><strong>de</strong>” a <strong>la</strong><br />

c<strong>la</strong>se abstracta Fabricar Compon<strong>en</strong>te, es <strong>de</strong>cir, FabricarCompon<strong>en</strong>te es el<br />

tipo <strong>de</strong> variable y Fabricar Resist<strong>en</strong>cia es el objeto asignado a dicha variable.<br />

En esta <strong>de</strong>finición y asignación cruzada radica <strong>la</strong> c<strong>la</strong>ve <strong>de</strong> que esta estructura<br />

48


FMP sea capaz <strong>de</strong> permitir <strong>la</strong> adición <strong>de</strong> cualquier otro compon<strong>en</strong>te nuevo sin<br />

modificar su código <strong>de</strong> fabricación, sino únicam<strong>en</strong>te agregando el nuevo<br />

código <strong>de</strong> dicho compon<strong>en</strong>te. Esto es así, porque todos los compon<strong>en</strong>tes serán<br />

<strong>de</strong>l mismo tipo (FabricarCompon<strong>en</strong>te), pero se les asociará un objeto difer<strong>en</strong>te<br />

según el compon<strong>en</strong>te.<br />

De <strong>la</strong> Figura V.4 se observa que, a su vez, <strong>la</strong> c<strong>la</strong>se concreta<br />

FabricarResist<strong>en</strong>cia, “instancia” a <strong>la</strong> c<strong>la</strong>se concreta Resist<strong>en</strong>cia, <strong>la</strong> cual<br />

constituye el conjunto <strong>de</strong> propieda<strong>de</strong>s gráficas y <strong>de</strong> propieda<strong>de</strong>s eléctricas<br />

propias <strong>de</strong> una resist<strong>en</strong>cia física real. Este proceso se lleva a cabo mediante <strong>la</strong><br />

tercera línea <strong>de</strong> código <strong>de</strong> <strong>la</strong> Figura V.5. En esta línea se hace un l<strong>la</strong>mado al<br />

método local <strong>de</strong> <strong>la</strong> c<strong>la</strong>se Fabricar Resist<strong>en</strong>cia l<strong>la</strong>mado Fabricar, que, como se<br />

observa <strong>en</strong> el código <strong>de</strong> <strong>la</strong> Figura V.6, es el <strong>en</strong>cargado <strong>de</strong> inicializar a <strong>la</strong> c<strong>la</strong>se<br />

concreta Resist<strong>en</strong>cia.<br />

En <strong>la</strong> Figura V.6 se pres<strong>en</strong>ta un resum<strong>en</strong> gráfico <strong>de</strong> <strong>la</strong> secu<strong>en</strong>cia <strong>de</strong><br />

fabricación <strong>de</strong> una resist<strong>en</strong>cia. Las secu<strong>en</strong>cias (1) y (2) se <strong>en</strong>cargan <strong>de</strong> construir<br />

<strong>la</strong> estructura <strong>de</strong> <strong>la</strong> resist<strong>en</strong>cia, mi<strong>en</strong>tras que <strong>la</strong>s secu<strong>en</strong>cias (3) y (4) se <strong>en</strong>cargan<br />

<strong>de</strong> inicializar <strong>la</strong>s propieda<strong>de</strong>s gráficas y <strong>la</strong>s propieda<strong>de</strong>s eléctricas <strong>de</strong> <strong>la</strong><br />

resist<strong>en</strong>cia.<br />

:: FabricarCompon<strong>en</strong>te – C<strong>la</strong>se<br />

public c<strong>la</strong>ss FabricarCompon<strong>en</strong>te {<br />

public function Fabricar(target:Sprite, parametros:Object,<br />

ori<strong>en</strong>tacion:String):void {<br />

4<br />

var compon<strong>en</strong>te:Compon<strong>en</strong>te = this.CrearCompon<strong>en</strong>te();<br />

METODOS DE INICIALIZACION DE LAS PROPIEDADES<br />

GRAFICAS Y ELECTRICAS DEL COMPONENTE<br />

}<br />

3<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

}<br />

protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

Metodo Abstracto: se <strong>de</strong>be <strong>de</strong>finir <strong>en</strong> una subc<strong>la</strong>se<br />

throw new IllegalOperationError("Metodo abtracto: <strong>de</strong>be<br />

ser <strong>de</strong>finido <strong>en</strong> una subc<strong>la</strong>se");<br />

return null;<br />

}<br />

1<br />

botonResist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

Compon<strong>en</strong>te2T<br />

C<strong>la</strong>se Concreta<br />

Resist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

2<br />

public c<strong>la</strong>ss FabricarResist<strong>en</strong>cia ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

}<br />

:: FabricarResist<strong>en</strong>cia – C<strong>la</strong>se CONCRETA<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Resist<strong>en</strong>cia;<br />

}<br />

Figura V.6. Secu<strong>en</strong>cia <strong>de</strong>l proceso <strong>de</strong> fabricación <strong>de</strong> una resist<strong>en</strong>cia, <strong>de</strong>s<strong>de</strong> que<br />

se activa <strong>la</strong> c<strong>la</strong>se botonResist<strong>en</strong>cia, hasta que se inicializa el objeto<br />

resist<strong>en</strong>cia.<br />

49


V.1.2 Los botones <strong>de</strong>l M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes<br />

Mediante esta misma técnica <strong>de</strong> producción <strong>de</strong> resist<strong>en</strong>cias, es posible<br />

fabricar cualquiera <strong>de</strong> los compon<strong>en</strong>tes cuyos botones se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el M<strong>en</strong>ú<br />

<strong>de</strong> Compon<strong>en</strong>tes. La ext<strong>en</strong>sión <strong>de</strong> esta técnica a otros compon<strong>en</strong>tes <strong>de</strong> dos<br />

terminales (2T), se muestra <strong>en</strong> <strong>la</strong> Figura V.7<br />

Código común para compon<strong>en</strong>tes <strong>de</strong> 2 Terminales<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Compon<strong>en</strong>te2T<br />

C<strong>la</strong>se Concreta<br />

FabricarCompon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Resist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

Capacitor<br />

C<strong>la</strong>se Concreta<br />

A<strong>la</strong>mbre1<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teVDC<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teVAC<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teIDC<br />

C<strong>la</strong>se Concreta<br />

FabricarResist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

FabricarCapacitor<br />

C<strong>la</strong>se Concreta<br />

FabricarA<strong>la</strong>mbre1<br />

C<strong>la</strong>se Concreta<br />

FabricarVDC<br />

C<strong>la</strong>se Concreta<br />

FabricarVAC<br />

C<strong>la</strong>se Concreta<br />

FabricarIDC<br />

C<strong>la</strong>se Concreta<br />

botonResist<strong>en</strong>cia<br />

C<strong>la</strong>se Concreta<br />

botonCapacitor<br />

C<strong>la</strong>se Concreta<br />

botonA<strong>la</strong>mbreLargo<br />

C<strong>la</strong>se Concreta<br />

botonFu<strong>en</strong>teVoltajeDC<br />

C<strong>la</strong>se Concreta<br />

botonFu<strong>en</strong>teVoltajeAC<br />

C<strong>la</strong>se Concreta<br />

botonFu<strong>en</strong>teCorri<strong>en</strong>teDC<br />

C<strong>la</strong>se Concreta<br />

Figura V.7. Diagrama <strong>de</strong> c<strong>la</strong>ses <strong>de</strong> <strong>la</strong> estructura FMP, para <strong>la</strong> fabricación <strong>de</strong><br />

difer<strong>en</strong>tes objetos compon<strong>en</strong>tes <strong>de</strong> dos terminales (2T).<br />

Para <strong>la</strong> fabricación <strong>de</strong> compon<strong>en</strong>tes <strong>de</strong> una terminal (tierra), a<strong>la</strong>mbre corto o<br />

compon<strong>en</strong>tes <strong>de</strong> tres terminales (transistores y amplificador operacional), se<br />

emplea un diagrama <strong>de</strong> c<strong>la</strong>ses simi<strong>la</strong>r al anterior, excepto que se emplean tres<br />

nuevas c<strong>la</strong>se concretas: Compon<strong>en</strong>te1T, A<strong>la</strong>mbreCorto2T y Compon<strong>en</strong>te3T<br />

respectivam<strong>en</strong>te. En <strong>la</strong> Figura V.8 se muestra el diagrama <strong>de</strong> c<strong>la</strong>ses<br />

correspondi<strong>en</strong>te.<br />

50


Código común para compon<strong>en</strong>tes <strong>de</strong> 1T, 3T y<br />

A<strong>la</strong>mbreCorto2T<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

A<strong>la</strong>mbreCorto2T<br />

C<strong>la</strong>se Concreta<br />

Compon<strong>en</strong>te1T<br />

C<strong>la</strong>se Concreta<br />

Compon<strong>en</strong>te3T<br />

C<strong>la</strong>se Concreta<br />

FabricarCompon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Tierra<br />

C<strong>la</strong>se Concreta<br />

A<strong>la</strong>mbre2<br />

C<strong>la</strong>se Concreta<br />

OpAmp<br />

C<strong>la</strong>se Concreta<br />

FabricarTierra<br />

C<strong>la</strong>se Concreta<br />

FabricarA<strong>la</strong>mbre2<br />

C<strong>la</strong>se Concreta<br />

FabricarOpAmp<br />

C<strong>la</strong>se Concreta<br />

botonTierra<br />

C<strong>la</strong>se Concreta<br />

botonA<strong>la</strong>mbreCorto<br />

C<strong>la</strong>se Concreta<br />

botonOpAmp<br />

C<strong>la</strong>se Concreta<br />

Figura V.8. Diagrama <strong>de</strong> c<strong>la</strong>ses <strong>de</strong> <strong>la</strong> estructura FMP, para <strong>la</strong> fabricación <strong>de</strong><br />

difer<strong>en</strong>tes objetos compon<strong>en</strong>tes <strong>de</strong> una terminal (1T), tres terminales (3T)<br />

y.A<strong>la</strong>mbreCorto<br />

Cada una <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses que se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> <strong>la</strong> columna <strong>de</strong> <strong>la</strong> <strong>de</strong>recha <strong>en</strong><br />

<strong>la</strong>s Figuras V.7 y V.8, al “instanciarse” g<strong>en</strong>eran los objetos compon<strong>en</strong>tes<br />

respectivos al compon<strong>en</strong>te <strong>de</strong> que se trate. Por ejemplo, Capacitor, Tierra,<br />

OpAmp, etc<br />

V.1.3 Los botones <strong>de</strong>l M<strong>en</strong>ú <strong>de</strong> <strong>Circuitos</strong><br />

Los botones <strong>de</strong>l M<strong>en</strong>ú <strong>Circuitos</strong> se <strong>en</strong>cargan, mediante un proceso simi<strong>la</strong>r<br />

al <strong>de</strong> <strong>la</strong> sección anterior, <strong>de</strong> “instanciar” cada uno <strong>de</strong> los objetos compon<strong>en</strong>tes<br />

<strong>de</strong>finidos <strong>en</strong> una c<strong>la</strong>se l<strong>la</strong>mada <strong>de</strong>scriptor <strong>de</strong> circuitos. Esta c<strong>la</strong>se conti<strong>en</strong>e <strong>la</strong><br />

<strong>de</strong>scripción <strong>de</strong> todos los compon<strong>en</strong>tes que constituy<strong>en</strong> un <strong>de</strong>terminado circuito.<br />

Esta <strong>de</strong>scripción consiste <strong>en</strong> <strong>la</strong> <strong>de</strong>finición <strong>de</strong>l tipo <strong>de</strong> compon<strong>en</strong>te, su posición<br />

física <strong>en</strong> el Area <strong>de</strong> Dibujo y los valores <strong>de</strong> todos los parámetros para cada<br />

compon<strong>en</strong>te. En <strong>la</strong> Figura V.9 se muestra una parte <strong>de</strong>l código correspondi<strong>en</strong>te al<br />

<strong>de</strong>scriptor <strong>de</strong> un circuito divisor <strong>de</strong> voltaje resistivo, formado por dos resist<strong>en</strong>cias,<br />

a<strong>la</strong>mbres y una fu<strong>en</strong>te <strong>de</strong> voltaje <strong>de</strong> DC.<br />

51


:: circuitoDivisor – C<strong>la</strong>se CONCRETA (fragm<strong>en</strong>to)<br />

public c<strong>la</strong>ss circuitoDivisor1 {<br />

public function circuitoDivisor1():void {<br />

// --- Constructor ---<br />

}<br />

public function <strong>de</strong>scriptorCircuito():Array {<br />

// =============================================================<br />

// Descriptor <strong>de</strong>l circuito:<br />

//<br />

// =============================================================<br />

var circuito:Array = new Array();<br />

var <strong>de</strong>scriptor:Object;<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

Fu<strong>en</strong>te <strong>de</strong> Voltaje <strong>de</strong> DC<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "V0";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 218;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [197,-40,-20,0,];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [239,-40,20,0,];<br />

<strong>de</strong>scriptor.i_tipoFu<strong>en</strong>te = "DC";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 10;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

A<strong>la</strong>mbre<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W21";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 197;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [176,-40,-40,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [197,-40,-20,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

Resist<strong>en</strong>cia<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "R6";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 222;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [201,40,-20,0,];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [243,40,20,0,];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 1000;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

Figura V.9. Fracción <strong>de</strong>l código <strong>de</strong>l <strong>de</strong>scriptor <strong>de</strong> un circuito divisor <strong>de</strong> voltaje<br />

resistivo.<br />

52


En <strong>la</strong> figura anterior, cada sección <strong>de</strong> código g<strong>en</strong>era el compon<strong>en</strong>te<br />

respectivo hasta crear el circuito completo. Cada compon<strong>en</strong>te, a su vez, se<br />

g<strong>en</strong>era mediante todo el procedimi<strong>en</strong>to <strong>de</strong>scrito <strong>en</strong> <strong>la</strong> sección anterior.<br />

V.1.4 Los objetos compon<strong>en</strong>tes<br />

Cada objeto compon<strong>en</strong>te que se g<strong>en</strong>era a través <strong>de</strong> <strong>la</strong> fábrica, ti<strong>en</strong><strong>en</strong> su<br />

repres<strong>en</strong>tación gráfica <strong>en</strong> forma <strong>de</strong> símbolo, el cual es el que aparece <strong>en</strong> el Area<br />

<strong>de</strong> Dibujo. Los símbolos disponibles son los que se muestran <strong>en</strong> <strong>la</strong> Figura V.10, y<br />

se <strong>en</strong>cu<strong>en</strong>tran <strong>en</strong> el M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes.<br />

Fu<strong>en</strong>te <strong>de</strong> Voltaje <strong>de</strong> DC<br />

Fu<strong>en</strong>te <strong>de</strong> Corri<strong>en</strong>te <strong>de</strong> DC<br />

Fu<strong>en</strong>te <strong>de</strong> Voltaje <strong>de</strong> AC<br />

Resist<strong>en</strong>cia<br />

Capacitor<br />

A<strong>la</strong>mbre Largo<br />

A<strong>la</strong>mbre corto<br />

Tierra<br />

Amplificador Operacional<br />

Figura V.10. Símbolo disponibles para compon<strong>en</strong>tes.<br />

En <strong>la</strong> Figura V.11 se observa que todos los objetos compon<strong>en</strong>tes, sin<br />

importar su tipo, se originan <strong>de</strong> una c<strong>la</strong>se abstracta l<strong>la</strong>mada Compon<strong>en</strong>te. Esta<br />

c<strong>la</strong>se base <strong>la</strong> exti<strong>en</strong>d<strong>en</strong> <strong>la</strong>s cuatro c<strong>la</strong>ses concretas, Compon<strong>en</strong>te1T,<br />

Compon<strong>en</strong>te2T y Compon<strong>en</strong>te3T, para compon<strong>en</strong>tes <strong>de</strong> una, dos y tres<br />

terminales respectivam<strong>en</strong>te, y <strong>la</strong> c<strong>la</strong>se concreta A<strong>la</strong>mbreCorto2T para a<strong>la</strong>mbres<br />

cortos <strong>de</strong> dos terminales. So<strong>la</strong>m<strong>en</strong>te <strong>la</strong> tierra es un compon<strong>en</strong>te <strong>de</strong> una terminal y<br />

el amplificador operacional es un compon<strong>en</strong>te <strong>de</strong> tres terminales. Los <strong>de</strong>más<br />

compon<strong>en</strong>tes ti<strong>en</strong><strong>en</strong> dos terminales.<br />

53


Código común para compon<strong>en</strong>tes<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Compon<strong>en</strong>te1T<br />

Compon<strong>en</strong>te2T<br />

A<strong>la</strong>mbreCorto2T<br />

Compon<strong>en</strong>te3T<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Figura V.11. Diagrama <strong>de</strong> c<strong>la</strong>ses comunes a todos los compon<strong>en</strong>tes disponibles<br />

<strong>en</strong> el M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes.<br />

Cada objeto compon<strong>en</strong>te <strong>en</strong> particu<strong>la</strong>r, exti<strong>en</strong><strong>de</strong> nuevam<strong>en</strong>te a <strong>la</strong> c<strong>la</strong>se que<br />

le correspon<strong>de</strong> <strong>de</strong> acuerdo a su número <strong>de</strong> terminales. Por ejemplo, <strong>la</strong> tierra<br />

exti<strong>en</strong><strong>de</strong> a <strong>la</strong> c<strong>la</strong>se concreta Compon<strong>en</strong>te1T, el capacitor exti<strong>en</strong><strong>de</strong> a <strong>la</strong> c<strong>la</strong>se<br />

conreta Compon<strong>en</strong>te2T, el amplificador operacional exti<strong>en</strong><strong>de</strong> a <strong>la</strong> c<strong>la</strong>se<br />

concreta Compon<strong>en</strong>te3T. En <strong>la</strong> Figura V.12 se pres<strong>en</strong>ta un resum<strong>en</strong> gráfico <strong>de</strong><br />

los objetos compon<strong>en</strong>tes disponibles y <strong>la</strong> c<strong>la</strong>se concreta que exti<strong>en</strong>d<strong>en</strong>.<br />

Código común para compon<strong>en</strong>tes<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Compon<strong>en</strong>te1T<br />

Compon<strong>en</strong>te2T<br />

A<strong>la</strong>mbreCorto2T<br />

Compon<strong>en</strong>te3T<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Tierra<br />

Resist<strong>en</strong>cia<br />

A<strong>la</strong>mbre2<br />

OpAmp<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Capacitor<br />

Código<br />

particu<strong>la</strong>r <strong>de</strong><br />

cada<br />

compon<strong>en</strong>te<br />

C<strong>la</strong>se Concreta<br />

A<strong>la</strong>mbre1<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teVDC<br />

C<strong>la</strong>se Concreta<br />

54<br />

Fu<strong>en</strong>teVAC<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teIDC<br />

C<strong>la</strong>se Concreta<br />

Figura V.12. Diagrama <strong>de</strong> c<strong>la</strong>ses<br />

completo que muestra a todos los<br />

compon<strong>en</strong>tes disponibles <strong>en</strong> el<br />

M<strong>en</strong>ú <strong>de</strong> Compon<strong>en</strong>tes y <strong>la</strong> c<strong>la</strong>se<br />

concreta que exti<strong>en</strong>d<strong>en</strong>


Cuando se dibuja un circuito <strong>en</strong> el Area <strong>de</strong> Dibujo, por el hecho <strong>de</strong><br />

colocarlo d<strong>en</strong>tro <strong>de</strong> esta área, a cada objeto compon<strong>en</strong>te que forme parte <strong>de</strong>l<br />

circuito, se le asigna una refer<strong>en</strong>cia que queda guardada <strong>en</strong> un arreglo <strong>de</strong><br />

objetos gráfico. Este arreglo es muy importante, pues constituye el punto <strong>de</strong><br />

conexión con <strong>la</strong>s estructuras MVC y CP, como se explicará mas a<strong>de</strong><strong>la</strong>nte.<br />

V.2 La c<strong>la</strong>se abstracta Compon<strong>en</strong>te<br />

La <strong>de</strong>finición <strong>de</strong> abstracta asignada a esta c<strong>la</strong>se, obliga al programador a<br />

ext<strong>en</strong><strong>de</strong>r<strong>la</strong> y no instanciar<strong>la</strong>, a<strong>de</strong>más <strong>de</strong> que crea un nodo <strong>de</strong> programación<br />

que permite mucha flexibilidad, <strong>en</strong> el s<strong>en</strong>tido <strong>de</strong> que <strong>de</strong> este nodo se pued<strong>en</strong><br />

colgar difer<strong>en</strong>tes compon<strong>en</strong>tes <strong>de</strong> una, dos o tres terminales, con difer<strong>en</strong>tes<br />

comportami<strong>en</strong>tos.<br />

La c<strong>la</strong>se abstracta Compon<strong>en</strong>te está estructurada con <strong>la</strong>s propieda<strong>de</strong>s y<br />

métodos que son comunes a todos los compon<strong>en</strong>tes sin importar su número <strong>de</strong><br />

terminales. En <strong>la</strong> Figura V.13 se muestra <strong>la</strong> estructura <strong>de</strong>l código <strong>de</strong> <strong>la</strong> esta c<strong>la</strong>se<br />

abstracta.<br />

PROPIEDADES<br />

- Propieda<strong>de</strong>s auxiliares para todos los métodos<br />

locales utilizados <strong>en</strong> esta c<strong>la</strong>se abstracta<br />

- Arreglo datosCompon<strong>en</strong>te<br />

METODOS<br />

:: Compon<strong>en</strong>te – C<strong>la</strong>se ABSTRACTA<br />

- Inicialización <strong>de</strong> parámetros<br />

- Asignación <strong>de</strong> List<strong>en</strong>ers para el compon<strong>en</strong>te<br />

- G<strong>en</strong>eración <strong>de</strong> una v<strong>en</strong>tan <strong>de</strong> edición para los<br />

parámetros <strong>de</strong>l compon<strong>en</strong>te<br />

v<strong>en</strong>tanaEdicion<br />

C<strong>la</strong>se Concreta<br />

- Colocación inicial <strong>de</strong>l compon<strong>en</strong>te<br />

- Desp<strong>la</strong>zami<strong>en</strong>to <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> el Area <strong>de</strong><br />

Dibujo<br />

- Eliminación <strong>de</strong>l compon<strong>en</strong>te<br />

Figura V.13. Estructura <strong>de</strong>l código <strong>de</strong> <strong>la</strong> c<strong>la</strong>se abstracta Compon<strong>en</strong>te.<br />

Los métodos que aparec<strong>en</strong> <strong>en</strong> el código <strong>de</strong> <strong>la</strong> figura, constituy<strong>en</strong> dos<br />

grupos <strong>de</strong> funciones comunes a todos los compon<strong>en</strong>tes, cuyas funciones son:<br />

1. Asignar al compon<strong>en</strong>te un id<strong>en</strong>tificador único, recibir información sobre<br />

dim<strong>en</strong>siones y coord<strong>en</strong>adas <strong>de</strong> posición válidas <strong>de</strong>l Area <strong>de</strong> Dibujo,<br />

inicializar list<strong>en</strong>ers y crear una v<strong>en</strong>tana <strong>de</strong> edición <strong>de</strong> parámetros<br />

propios <strong>de</strong>l compon<strong>en</strong>te.<br />

55


2. Definir <strong>la</strong> colocación inicial <strong>de</strong>l compon<strong>en</strong>te <strong>de</strong>spués <strong>de</strong> que el usuario<br />

presionó el botón correspondi<strong>en</strong>te, permitir el <strong>de</strong>sp<strong>la</strong>zami<strong>en</strong>to <strong>de</strong>l<br />

compon<strong>en</strong>te <strong>en</strong> el Area <strong>de</strong> Dibujo (bajo ciertas reg<strong>la</strong>s <strong>de</strong> movimi<strong>en</strong>to) y<br />

permitir <strong>la</strong> eliminación <strong>de</strong>l compon<strong>en</strong>te por parte <strong>de</strong>l usuario.<br />

En esta c<strong>la</strong>se se <strong>de</strong>fine un propiedad (tipo arreglo) l<strong>la</strong>mada<br />

datosCompon<strong>en</strong>te, que guarda información <strong>de</strong> <strong>la</strong> localización física espacial<br />

(estática y dinámica) <strong>de</strong>l compon<strong>en</strong>te y sus terminales. La estructura <strong>de</strong> este<br />

arreglo es <strong>la</strong> que se muestra <strong>en</strong> <strong>la</strong> Figura V.14.<br />

datosCompon<strong>en</strong>te[0] = compon<strong>en</strong>te (xg, yg, zg)<br />

datosCompon<strong>en</strong>te[1] = terminal1 (xg, yg, zg)<br />

datosCompon<strong>en</strong>te[2] = terminal2 (xg, yg, zg)<br />

datosCompon<strong>en</strong>te[3] = terminal3 (xg, yg, zg)<br />

Coord<strong>en</strong>adas <strong>de</strong><br />

<strong>la</strong> terminal 1<br />

xg, yg, zg<br />

Coord<strong>en</strong>adas <strong>de</strong>l<br />

compon<strong>en</strong>te:<br />

xg, yg, zg<br />

Coord<strong>en</strong>adas <strong>de</strong><br />

<strong>la</strong> terminal 2<br />

xg, yg, zg<br />

Punto <strong>de</strong> registro <strong>de</strong>l compon<strong>en</strong>te<br />

Dibujo <strong>de</strong> un compon<strong>en</strong>te <strong>de</strong> dos termianles<br />

Figura V.14. Estructura <strong>de</strong> <strong>la</strong> propiedad datosCompon<strong>en</strong>te <strong>de</strong> <strong>la</strong> c<strong>la</strong>se<br />

abstracta Compon<strong>en</strong>te.<br />

La c<strong>la</strong>se abstracta Compon<strong>en</strong>te <strong>en</strong> realidad sólo g<strong>en</strong>era el primer r<strong>en</strong>glón<br />

<strong>de</strong> <strong>la</strong> estructura anterior, es <strong>de</strong>cir, el que correspon<strong>de</strong> a datosCompon<strong>en</strong>te[0].<br />

Los sigui<strong>en</strong>tes r<strong>en</strong>glones <strong>de</strong> esta estructura los g<strong>en</strong>eran cada una <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses<br />

concretas que <strong>la</strong> exti<strong>en</strong>d<strong>en</strong> (Compon<strong>en</strong>te1T, Compon<strong>en</strong>te2T, A<strong>la</strong>mbreCorto2T<br />

y Compon<strong>en</strong>te3T), como se explica <strong>en</strong> <strong>la</strong> sigui<strong>en</strong>te sección.<br />

El código completo y com<strong>en</strong>tado para esta c<strong>la</strong>se se pue<strong>de</strong> consultar <strong>en</strong> el<br />

Anexo correspondi<strong>en</strong>te.<br />

56


V.3 Las c<strong>la</strong>ses concretas Compon<strong>en</strong>te1T, Compon<strong>en</strong>te2T, A<strong>la</strong>mbre Corto2T y<br />

Compon<strong>en</strong>te3T<br />

Estas c<strong>la</strong>ses concretas exti<strong>en</strong>d<strong>en</strong> a <strong>la</strong> c<strong>la</strong>se abstracta Compon<strong>en</strong>te. La<br />

propiedad datosCompon<strong>en</strong>te explicada <strong>en</strong> <strong>la</strong> sección anterior, también se<br />

exti<strong>en</strong><strong>de</strong> <strong>en</strong> cada una <strong>de</strong> estas c<strong>la</strong>ses concretas, como se muestra <strong>en</strong> <strong>la</strong> Figura<br />

V.15.<br />

datosCompon<strong>en</strong>te[0] = compon<strong>en</strong>te (xg, yg, zg)<br />

datosCompon<strong>en</strong>te[1] = terminal1 (xg, yg, zg)<br />

datosCompon<strong>en</strong>te[2] = terminal2 (xg, yg, zg)<br />

datosCompon<strong>en</strong>te[3] = terminal3 (xg, yg, zg)<br />

Código común para compon<strong>en</strong>tes<br />

Propiedad (arreglo)<br />

datosCompon<strong>en</strong>te<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

Coord<strong>en</strong>adas<br />

<strong>de</strong>l<br />

compon<strong>en</strong>te:<br />

Compon<strong>en</strong>te1T<br />

Compon<strong>en</strong>te2T<br />

A<strong>la</strong>mbreCorto2T<br />

Compon<strong>en</strong>te3T<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Coord<strong>en</strong>adas <strong>de</strong><br />

<strong>la</strong> terminal 1<br />

xg, yg, zg<br />

Coord<strong>en</strong>adas <strong>de</strong><br />

<strong>la</strong> terminal 1<br />

xg, yg, zg<br />

<strong>la</strong> terminal 2<br />

xg, yg, zg<br />

Coord<strong>en</strong>adas <strong>de</strong><br />

<strong>la</strong> terminal 1<br />

xg, yg, zg<br />

<strong>la</strong> terminal 2<br />

xg, yg, zg<br />

Coord<strong>en</strong>adas <strong>de</strong><br />

<strong>la</strong> terminal 1<br />

xg, yg, zg<br />

<strong>la</strong> terminal 2<br />

xg, yg, zg<br />

<strong>la</strong> terminal 3<br />

xg, yg, zg<br />

Figura V.15. Estructura <strong>de</strong> <strong>la</strong> propiedad datosCompon<strong>en</strong>te distribuida <strong>en</strong>tre <strong>la</strong><br />

c<strong>la</strong>se abstracta Compon<strong>en</strong>te y <strong>la</strong>s c<strong>la</strong>ses concretas que <strong>la</strong> exti<strong>en</strong>ed<strong>en</strong>.<br />

La c<strong>la</strong>ses concretas anteriores están estructuradas con <strong>la</strong>s propieda<strong>de</strong>s y<br />

métodos que son comunes a todos los compon<strong>en</strong>tes <strong>de</strong> una, dos o tres<br />

terminales (respectivam<strong>en</strong>te). En <strong>la</strong>s Figuras V.16 y V.17, se muestran <strong>la</strong>s<br />

estructuras g<strong>en</strong>erales <strong>de</strong>l código <strong>de</strong> estas c<strong>la</strong>ses concretas.<br />

57


PROPIEDADES<br />

- Propieda<strong>de</strong>s auxiliares para todos los métodos<br />

locales utilizados <strong>en</strong> <strong>la</strong> c<strong>la</strong>se concreta respectiva.<br />

- Ext<strong>en</strong>sión <strong>de</strong>l arreglo datosCompon<strong>en</strong>te<br />

METODOS<br />

:: Compon<strong>en</strong>te1T, 2T, AlCorto2T–<br />

- Colocación <strong>de</strong>l compon<strong>en</strong>te <strong>de</strong> acuerdo a su<br />

ori<strong>en</strong>tación (horizontal / vertical)<br />

- Actualización <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

- Simu<strong>la</strong>ción <strong>de</strong> <strong>la</strong> posición <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> AC<br />

Figura V.16. Estructura <strong>de</strong>l código g<strong>en</strong>eral <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses concretas<br />

Compon<strong>en</strong>te1T, Compon<strong>en</strong>te2T y A<strong>la</strong>mbreCorto2T.<br />

PROPIEDADES<br />

- Propieda<strong>de</strong>s auxiliares para todos los métodos<br />

locales utilizados <strong>en</strong> <strong>la</strong> c<strong>la</strong>se concreta respectiva.<br />

- Ext<strong>en</strong>sión <strong>de</strong>l arreglo datosCompon<strong>en</strong>te<br />

METODOS<br />

:: Compon<strong>en</strong>te1T, 2T, AlCorto2T–<br />

- Colocación <strong>de</strong>l compon<strong>en</strong>te <strong>de</strong> acuerdo a su<br />

ori<strong>en</strong>tación (horizontal / vertical)<br />

- Actualización <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

Figura V.17. Estructura <strong>de</strong>l código g<strong>en</strong>eral <strong>de</strong> <strong>la</strong> c<strong>la</strong>se concreta Compon<strong>en</strong>te3T.<br />

Como se observa <strong>en</strong> <strong>la</strong>s Figuras V.16 y V.17, los métodos <strong>de</strong>finidos para<br />

<strong>la</strong>s c<strong>la</strong>ses concretas Compon<strong>en</strong>te1T, Compon<strong>en</strong>te 2T, A<strong>la</strong>mbreCorto2T y<br />

Compon<strong>en</strong>te 3T, se <strong>en</strong>cargan <strong>de</strong> colocar el compon<strong>en</strong>te con <strong>la</strong> ori<strong>en</strong>tación<br />

(vertical / horizontal) solicitada y actualizar <strong>la</strong>s coord<strong>en</strong>adas <strong>de</strong>l arreglo<br />

datosCompon<strong>en</strong>te <strong>de</strong> acuerdo a dicha ori<strong>en</strong>tación. So<strong>la</strong>m<strong>en</strong>te <strong>la</strong>s tres primeras<br />

c<strong>la</strong>ses pose<strong>en</strong> un método <strong>en</strong>cargado <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong> <strong>la</strong> posición <strong>de</strong>l<br />

compon<strong>en</strong>te <strong>en</strong> AC. En <strong>la</strong> c<strong>la</strong>se Compon<strong>en</strong>te3T este método no está pres<strong>en</strong>te<br />

<strong>en</strong> dicha c<strong>la</strong>se, sin embargo si está <strong>de</strong>finido <strong>en</strong> <strong>la</strong> c<strong>la</strong>se particu<strong>la</strong>r <strong>de</strong>l compon<strong>en</strong>te<br />

<strong>de</strong> tres terminales, <strong>en</strong> este caso el Amplificador Operacional (c<strong>la</strong>se OpAmp).<br />

El código completo y com<strong>en</strong>tado para estas c<strong>la</strong>ses se pue<strong>de</strong> consultar <strong>en</strong> el<br />

Anexo correspondi<strong>en</strong>te.<br />

58


V.4 La c<strong>la</strong>se v<strong>en</strong>tanaEdicion<br />

Uno <strong>de</strong> los métodos <strong>de</strong> <strong>la</strong> c<strong>la</strong>se abstracta Compon<strong>en</strong>te <strong>de</strong>scrita <strong>en</strong> <strong>la</strong><br />

sección V.1.5, ti<strong>en</strong>e <strong>la</strong> función <strong>de</strong> g<strong>en</strong>erar una v<strong>en</strong>tana <strong>de</strong> edición que permita<br />

editar algunos <strong>de</strong> los parámetros <strong>de</strong> los compon<strong>en</strong>tes que se utilizan <strong>en</strong> el<br />

dibujo <strong>de</strong> un circuito <strong>en</strong> el Area <strong>de</strong> Dibujo. La c<strong>la</strong>se Compon<strong>en</strong>te crea esta<br />

v<strong>en</strong>tana para cada compon<strong>en</strong>te, como se observa <strong>en</strong> <strong>la</strong> Figura V.17.<br />

Compon<strong>en</strong>te<br />

C<strong>la</strong>se Abstracta<br />

v<strong>en</strong>tanaEdición<br />

C<strong>la</strong>se Concreta<br />

rectangulo<br />

campoTexto<br />

convertidorPrefijosDecimal<br />

Twe<strong>en</strong><br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Figura V.17. Diagrama <strong>de</strong> conexión <strong>de</strong> <strong>la</strong> c<strong>la</strong>se v<strong>en</strong>tanaEdicion con <strong>la</strong> c<strong>la</strong>se<br />

abstracta Compon<strong>en</strong>te y con sus c<strong>la</strong>ses auxiliares: rectangulo, campoTexto,<br />

convertidorPrefijoDecimal y Twe<strong>en</strong>.<br />

Esta c<strong>la</strong>se g<strong>en</strong>era una v<strong>en</strong>tana <strong>de</strong> edición para cada compon<strong>en</strong>te, cada<br />

vez que se realiza un “doble click", con el puntero <strong>de</strong>l mouse, sobre algún<br />

compon<strong>en</strong>te. En <strong>la</strong> Figura V.18 se muestran varias v<strong>en</strong>tanas <strong>de</strong> edición abiertas<br />

para cada compon<strong>en</strong>te <strong>de</strong> un circuito <strong>de</strong> ejemplo.<br />

Figura V.18. V<strong>en</strong>tanas <strong>de</strong> edición abiertas para cada compon<strong>en</strong>te <strong>de</strong> un circuito<br />

<strong>de</strong> ejemplo.<br />

59


En <strong>la</strong> parte superior <strong>de</strong> dichas v<strong>en</strong>tana aparece el nombre <strong>de</strong>l<br />

compon<strong>en</strong>te y un cuadro <strong>en</strong> el extremo <strong>de</strong>recho que permite cerrar <strong>la</strong> v<strong>en</strong>tana.<br />

Todas <strong>la</strong>s v<strong>en</strong>tanas abiertas <strong>de</strong>berán cerrarse antes <strong>de</strong> realizar cualquier<br />

simu<strong>la</strong>ción <strong>de</strong>l circuito, ya sea <strong>en</strong> DC o <strong>en</strong> AC. A continuación, <strong>en</strong> cada v<strong>en</strong>tana,<br />

aparece información particu<strong>la</strong>r <strong>de</strong>l compon<strong>en</strong>te al cual esta conectada dicha<br />

v<strong>en</strong>tana mediante una línea. So<strong>la</strong>m<strong>en</strong>te <strong>la</strong> información que aparece <strong>en</strong> color<br />

“naranja” d<strong>en</strong>tro <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición, podrá editar<strong>la</strong> (alterar<strong>la</strong>) el usuario.<br />

Las pa<strong>la</strong>bras o números que aparec<strong>en</strong> <strong>en</strong> color b<strong>la</strong>nco d<strong>en</strong>tro <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana, solo<br />

son informativos y no pued<strong>en</strong> editarse.<br />

Las v<strong>en</strong>tanas <strong>de</strong> edición abiertas se pued<strong>en</strong> <strong>de</strong>sp<strong>la</strong>zar con el mouse para<br />

colocar<strong>la</strong>s <strong>en</strong> cualquier parte <strong>de</strong> <strong>la</strong> pantal<strong>la</strong>. Para hacer esto, basta con colocar el<br />

puntero <strong>de</strong>l mouse sobre <strong>la</strong> franja superior <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana y arrastrar<strong>la</strong> presionando<br />

el botón izquierdo <strong>de</strong>l mouse. Como se observa <strong>en</strong> <strong>la</strong> figura anterior, también<br />

pued<strong>en</strong> estar abiertas varias v<strong>en</strong>tanas al mismo tiempo.<br />

V.19.<br />

La estructura <strong>de</strong>l código <strong>de</strong> <strong>la</strong> c<strong>la</strong>se v<strong>en</strong>tanEdición se muestra <strong>en</strong> <strong>la</strong> Figura<br />

:: v<strong>en</strong>tanaEdicion – C<strong>la</strong>se rectangulo<br />

PROPIEDADES<br />

C<strong>la</strong>se Concreta<br />

- Propieda<strong>de</strong>s auxiliares para todos los métodos<br />

locales utilizados <strong>en</strong> esta c<strong>la</strong>se<br />

METODOS<br />

- Construcción <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición<br />

- Desp<strong>la</strong>zami<strong>en</strong>to <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición<br />

- Actualizar información <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición<br />

campoTexto<br />

C<strong>la</strong>se Concreta<br />

convertidorPrefijosDecimal<br />

C<strong>la</strong>se Concreta<br />

Twe<strong>en</strong><br />

C<strong>la</strong>se Concreta<br />

Figura V.19. Estructura <strong>de</strong>l código <strong>de</strong> <strong>la</strong> c<strong>la</strong>se concreta v<strong>en</strong>tanaEdicion.<br />

Los métodos que aparec<strong>en</strong> <strong>en</strong> el código <strong>de</strong> <strong>la</strong> figura, constituy<strong>en</strong> dos<br />

grupos <strong>de</strong> funciones comunes a todos los compon<strong>en</strong>tes, cuyas funciones son:<br />

1. Construir <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición mediante el dibujo <strong>de</strong> un rectángulo y<br />

<strong>la</strong> <strong>de</strong>finición <strong>de</strong> campos <strong>de</strong> texto estáticos y <strong>de</strong> <strong>en</strong>trada. El formato<br />

permitido <strong>en</strong> el campo <strong>de</strong> texto <strong>de</strong> <strong>en</strong>trada será <strong>de</strong> notación <strong>de</strong>cimal y<br />

notación con prefijos, por lo que se requiere <strong>de</strong>l auxilio <strong>de</strong> <strong>la</strong> c<strong>la</strong>se<br />

convertidorPrefjoDecimal. Finalm<strong>en</strong>te, <strong>la</strong> v<strong>en</strong>tana se abre aum<strong>en</strong>tando<br />

gradualm<strong>en</strong>te su tamaño y se cierra disminuy<strong>en</strong>do, también,<br />

gradualm<strong>en</strong>te su tamaño, lo cual se logra mediante <strong>la</strong> c<strong>la</strong>se Twe<strong>en</strong>.<br />

60


2. El método <strong>de</strong> actualización <strong>de</strong> información es un método auxiliar<br />

utilizado por <strong>la</strong> c<strong>la</strong>se externa manejadorCircuito, <strong>la</strong> cual se explicará<br />

mas a<strong>de</strong><strong>la</strong>nte, <strong>en</strong> <strong>la</strong> sección correspondi<strong>en</strong>te a <strong>la</strong> estructura MVC.<br />

El código completo y com<strong>en</strong>tado para esta c<strong>la</strong>se se pue<strong>de</strong> consultar <strong>en</strong> el<br />

Anexo correspondi<strong>en</strong>te.<br />

Las c<strong>la</strong>ses auxiliares rectángulo y campoTexto, como su nombre lo indica<br />

se <strong>en</strong>cargan <strong>de</strong> dibujar un rectángulo y <strong>de</strong> <strong>de</strong>finir y manejar campos <strong>de</strong> texto<br />

estáticos (no editables por el usuario) y <strong>de</strong> <strong>en</strong>trada (editables). Por su simplicidad<br />

no se muestran aquí <strong>la</strong>s estructuras <strong>de</strong> código <strong>de</strong> estas c<strong>la</strong>ses, sin embargo, el<br />

código completo y com<strong>en</strong>tado se pue<strong>de</strong> consultar <strong>en</strong> el Anexo correspondi<strong>en</strong>te.<br />

La c<strong>la</strong>se auxiliar convertidorPrefjoDecimal se <strong>en</strong>carga <strong>de</strong> convertir<br />

<strong>de</strong>terminados prefijos a un número <strong>de</strong>cimal, con <strong>la</strong> finalidad <strong>de</strong> que los pueda<br />

manejar el simu<strong>la</strong>dor, el cual también se explicará mas a<strong>de</strong><strong>la</strong>nte <strong>en</strong> <strong>la</strong> sección <strong>de</strong><br />

<strong>la</strong> estructura MVC. Los prefijos que convierte esta c<strong>la</strong>se se muestran <strong>en</strong> <strong>la</strong> Figura<br />

V.20.<br />

METODOS<br />

:: convertidorPrefjoDecimal – C<strong>la</strong>se<br />

- Conversión a <strong>de</strong>cimal <strong>de</strong> los sigui<strong>en</strong>tes prefijos:<br />

T --> 1E12<br />

G --> 1E9<br />

M --> 1E6<br />

K --> 1E3<br />

m --> 1E-3<br />

u --> 1E-6<br />

n --> 1E-9<br />

p --> 1E-12<br />

Figura V.20. Estructura <strong>de</strong>l código <strong>de</strong> <strong>la</strong> c<strong>la</strong>se concreta<br />

convertidorPrefjoDecimal.<br />

La conversión <strong>de</strong> los prefijos se realiza mediante un análisis <strong>de</strong> <strong>la</strong> cad<strong>en</strong>a<br />

<strong>de</strong> caracteres escrita por el usuario. El código completo y com<strong>en</strong>tado para esta<br />

c<strong>la</strong>se se pue<strong>de</strong> consultar <strong>en</strong> el Anexo correspondi<strong>en</strong>te.<br />

61


V.5 Las c<strong>la</strong>ses <strong>de</strong> los compon<strong>en</strong>tes<br />

En <strong>la</strong> Figura V.21 se muestra gráficam<strong>en</strong>te un listado c<strong>la</strong>sificado <strong>de</strong> <strong>la</strong>s<br />

c<strong>la</strong>ses para los compon<strong>en</strong>tes que se pued<strong>en</strong> manejar <strong>en</strong> el simu<strong>la</strong>dor.<br />

Compon<strong>en</strong>te1T<br />

Compon<strong>en</strong>te2T<br />

A<strong>la</strong>mbreCorto2T<br />

Compon<strong>en</strong>te3T<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Tierra<br />

Resist<strong>en</strong>cia<br />

A<strong>la</strong>mbre2<br />

OpAmp<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

C<strong>la</strong>se Concreta<br />

Capacitor<br />

C<strong>la</strong>se Concreta<br />

A<strong>la</strong>mbre1<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teVDC<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teVAC<br />

C<strong>la</strong>se Concreta<br />

Fu<strong>en</strong>teIDC<br />

C<strong>la</strong>se Concreta<br />

Código particu<strong>la</strong>r <strong>de</strong> cada compon<strong>en</strong>te<br />

Figura V.21. Listado c<strong>la</strong>sificado <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses para los compon<strong>en</strong>tes que se<br />

pued<strong>en</strong> manejar <strong>en</strong> el simu<strong>la</strong>dor.<br />

Los nombres <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses <strong>de</strong>scrib<strong>en</strong> por si solos el tipo <strong>de</strong> objeto<br />

compon<strong>en</strong>te que pued<strong>en</strong> g<strong>en</strong>erar. La estructura <strong>de</strong>l código <strong>de</strong> cada c<strong>la</strong>se<br />

comparte el formato común que se muestra <strong>en</strong> <strong>la</strong> Figura V.22.<br />

62


PROPIEDADES<br />

- Propieda<strong>de</strong>s auxiliares para todos los métodos<br />

locales utilizados <strong>en</strong> esta c<strong>la</strong>se<br />

METODOS<br />

:: (algún compon<strong>en</strong>te) – C<strong>la</strong>se Capa 3: Símbolo <strong>de</strong>l compon<strong>en</strong>te<br />

Capa 2: Pelícu<strong>la</strong> animada<br />

corri<strong>en</strong>te (flujo <strong>de</strong> flechas)<br />

Capa 1: Línea que repres<strong>en</strong>ta <strong>la</strong>s<br />

terminales <strong>de</strong>l compon<strong>en</strong>te<br />

Capa 0: Cont<strong>en</strong>edor gráfico<br />

- G<strong>en</strong>eración <strong>de</strong>l dibujo <strong>de</strong>l compon<strong>en</strong>te<br />

- Información a mostrar <strong>en</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición<br />

- Asignación o cálculo <strong>de</strong> voltajes y corri<strong>en</strong>tes<br />

obt<strong>en</strong>idos <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> DC o AC<br />

- Activación <strong>de</strong>l comportami<strong>en</strong>to <strong>en</strong> el espacio <strong>3D</strong><br />

- Nombre <strong>de</strong>l compon<strong>en</strong>te<br />

- Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

- Valor <strong>de</strong>l compon<strong>en</strong>te<br />

- Otra información (cuando se<br />

requiera)<br />

Figura V.22. Estructura común <strong>de</strong>l código <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses concretas <strong>de</strong> cada<br />

compon<strong>en</strong>te <strong>en</strong> particu<strong>la</strong>r.<br />

Los métodos que aparec<strong>en</strong> <strong>en</strong> el código <strong>de</strong> <strong>la</strong> figura, constituy<strong>en</strong> tres<br />

grupos funcionales comunes a todos los compon<strong>en</strong>tes, cuyas funciones son:<br />

1. G<strong>en</strong>erar el dibujo <strong>de</strong>l compon<strong>en</strong>te. – El dibujo <strong>de</strong> cada compon<strong>en</strong>te se<br />

construye mediante cuatro capas, como se ejemplifica <strong>en</strong> <strong>la</strong> Figura<br />

V.23. Esta separación <strong>de</strong> los compon<strong>en</strong>tes <strong>de</strong>l símbolo <strong>en</strong> cuatro<br />

capas, es necesaria para lograr proyectarlo <strong>en</strong> el espacio <strong>3D</strong> sin<br />

<strong>de</strong>formarlo, a<strong>de</strong>más <strong>de</strong> permitir <strong>la</strong> animación <strong>de</strong>l mismo<br />

Capa 3: Símbolo <strong>de</strong>l compon<strong>en</strong>te<br />

Capa 2: Pelícu<strong>la</strong> animada<br />

corri<strong>en</strong>te (flujo <strong>de</strong> flechas)<br />

Capa 1: Línea que repres<strong>en</strong>ta <strong>la</strong>s<br />

terminales <strong>de</strong>l compon<strong>en</strong>te<br />

Capa 0: Cont<strong>en</strong>edor gráfico<br />

Vista “por arriba” <strong>de</strong>l compon<strong>en</strong>te<br />

Figura V.23. Ejemplo <strong>de</strong> <strong>la</strong> construcción <strong>de</strong>l símbolo <strong>de</strong> una resist<strong>en</strong>cia mediante<br />

una estructura <strong>de</strong> cuatro capas.<br />

63


2. Definir <strong>la</strong> información a mostrar <strong>en</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edición <strong>de</strong>l<br />

compon<strong>en</strong>te. – Esta información se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> cad<strong>en</strong>as <strong>de</strong><br />

caracteres y/o números guardados <strong>en</strong> un arreglo <strong>de</strong> cad<strong>en</strong>as <strong>de</strong><br />

caracteres l<strong>la</strong>mado infoV<strong>en</strong>tana, el cual lo consulta <strong>la</strong> c<strong>la</strong>se<br />

v<strong>en</strong>tanaEdición y lo <strong>de</strong>spliega <strong>en</strong> su v<strong>en</strong>tana correspondi<strong>en</strong>te al<br />

compon<strong>en</strong>te que ti<strong>en</strong>e asociado. La estructura <strong>de</strong> este arreglo es <strong>la</strong> que<br />

se muestra <strong>en</strong> <strong>la</strong> Figura V.24.<br />

- Nombre <strong>de</strong>l compon<strong>en</strong>te<br />

- Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

- Valor <strong>de</strong>l compon<strong>en</strong>te<br />

- Otra información (cuando se<br />

requiera)<br />

Figura V.24. Estructura <strong>de</strong>l arreglo infoV<strong>en</strong>tana.<br />

3. Asignar o calcu<strong>la</strong>r los voltajes nodales y/o <strong>la</strong>s corri<strong>en</strong>tes <strong>de</strong> rama<br />

resultantes <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong>l circuito <strong>en</strong> DC o AC. – Estos<br />

resultados o cálculos se guardan <strong>en</strong> <strong>la</strong>s PROPIEDADES DE CLASE <strong>de</strong><br />

cada compon<strong>en</strong>te <strong>en</strong> particu<strong>la</strong>r, <strong>la</strong>s cuales serán consultadas por el<br />

bloque Vista (<strong>de</strong> <strong>la</strong> estructura MVC) para su <strong>de</strong>spliegue <strong>en</strong> <strong>la</strong>s gráficas<br />

correspondi<strong>en</strong>tes.<br />

4. Activación <strong>de</strong>l comportami<strong>en</strong>to <strong>en</strong> el espacio <strong>3D</strong>. – Consiste <strong>en</strong><br />

colocar el compon<strong>en</strong>te <strong>en</strong> el espacio <strong>3D</strong> y calcu<strong>la</strong>r su ori<strong>en</strong>tación y<br />

comportami<strong>en</strong>to <strong>en</strong> dicho espacio. La Figura V.25 muestra un ejemplo<br />

<strong>de</strong>l símbolo <strong>de</strong> una resist<strong>en</strong>cia colocado y ori<strong>en</strong>tado un cierto ángulo <strong>en</strong><br />

el espacio <strong>3D</strong>. El p<strong>la</strong>no inferior repres<strong>en</strong>ta el p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia o <strong>de</strong><br />

pot<strong>en</strong>cial 0 volts.<br />

Figura V.25. Colocación <strong>de</strong>l símbolo <strong>de</strong> una resist<strong>en</strong>cia <strong>en</strong> el espacio <strong>3D</strong>.<br />

Se hace notar que <strong>la</strong> sección <strong>de</strong> código <strong>de</strong> c<strong>la</strong>se l<strong>la</strong>mado simu<strong>la</strong>ción <strong>de</strong> <strong>la</strong><br />

posición <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> AC, resi<strong>de</strong> <strong>en</strong> <strong>la</strong> c<strong>la</strong>ses Compon<strong>en</strong>te1T,<br />

Compon<strong>en</strong>te2T y A<strong>la</strong>mbreCorto2T. Para el caso <strong>de</strong> <strong>la</strong> c<strong>la</strong>se Compon<strong>en</strong>te3T,<br />

dicho código no resi<strong>de</strong> <strong>en</strong> esta c<strong>la</strong>se sino <strong>en</strong> <strong>la</strong> c<strong>la</strong>se particu<strong>la</strong>r <strong>de</strong>l compon<strong>en</strong>te <strong>de</strong><br />

64


tres terminales (el Amplificador Operacional <strong>en</strong> este caso). Esta sección <strong>de</strong> código<br />

m<strong>en</strong>cionada, se <strong>en</strong>carga, junto con <strong>la</strong> c<strong>la</strong>se motor_<strong>3D</strong>_ac (correspondi<strong>en</strong>te a <strong>la</strong><br />

sestructura MVC), <strong>de</strong> “osci<strong>la</strong>r” al compon<strong>en</strong>te alre<strong>de</strong>dor <strong>de</strong> su punto <strong>de</strong> registro<br />

<strong>de</strong> acuerdo a los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC (magnitud y fase).<br />

El código completo y com<strong>en</strong>tado para todas <strong>la</strong>s c<strong>la</strong>ses <strong>de</strong> cada<br />

compon<strong>en</strong>te se pue<strong>de</strong> consultar <strong>en</strong> el Anexo correspondi<strong>en</strong>te.<br />

65


1. Dibujo y<br />

edición <strong>de</strong>l<br />

circuito<br />

Compon<strong>en</strong>t<br />

e 1<br />

Compon<strong>en</strong>t<br />

e 2<br />

FMP<br />

Fabrica<br />

Botón 1<br />

Botón 2<br />

Compon<strong>en</strong>t<br />

e n<br />

Botón n<br />

2. Validación y<br />

simu<strong>la</strong>ción <strong>de</strong>l<br />

circuito<br />

Mo<strong>de</strong>lo<br />

MVC<br />

CP<br />

Vista<br />

Contro<strong>la</strong>dor<br />

Gráfica <strong>de</strong><br />

Respuesta <strong>en</strong><br />

Frecu<strong>en</strong>cia<br />

Gráfica <strong>de</strong><br />

Barras<br />

Gráfica dinámica<br />

<strong>en</strong> <strong>3D</strong><br />

3. Pres<strong>en</strong>tación<br />

gráfica <strong>de</strong><br />

resultados<br />

VI. Patrón <strong>de</strong> Programación MODELO - VISTA – CONTROLADOR<br />

(MVC).<br />

El patrón <strong>de</strong> programación MVC se <strong>en</strong>cu<strong>en</strong>tra asociado con el manejo <strong>de</strong> <strong>la</strong><br />

red <strong>de</strong>l circuito, <strong>la</strong> simu<strong>la</strong>ción <strong>de</strong>l mismo y <strong>la</strong> repres<strong>en</strong>tación <strong>de</strong> resultados <strong>en</strong><br />

forma gráfica.<br />

La función <strong>de</strong> esta estructura <strong>de</strong> programación es <strong>la</strong> <strong>de</strong> consultar el<br />

arreglo <strong>de</strong> objetos gráficos g<strong>en</strong>erado por <strong>la</strong> estructura FMP pres<strong>en</strong>tada <strong>en</strong> el<br />

66


capítulo anterior, y procesarlo hasta g<strong>en</strong>erar el tipo <strong>de</strong> datos requerido para <strong>la</strong><br />

repres<strong>en</strong>tación <strong>de</strong> éstos <strong>en</strong> gráficas 2D y <strong>3D</strong>.<br />

El procesami<strong>en</strong>to <strong>de</strong>l arreglo <strong>de</strong> objetos gráficos por parte <strong>de</strong> esta<br />

estructura se divi<strong>de</strong> <strong>en</strong> tres etapas, como se muestra <strong>en</strong> <strong>la</strong> Figura VI.1.<br />

Repres<strong>en</strong>tación<br />

grafica <strong>de</strong> los<br />

resultados <strong>de</strong> <strong>la</strong><br />

simu<strong>la</strong>ción<br />

Simu<strong>la</strong>ción <strong>de</strong>l<br />

circuito<br />

Validación <strong>de</strong> <strong>la</strong><br />

red <strong>de</strong>l circuito a<br />

simu<strong>la</strong>r<br />

Consulta <strong>de</strong>l<br />

arreglo <strong>de</strong> objetos<br />

gráficos g<strong>en</strong>erado<br />

por FMP<br />

Figura VI.1. Procesami<strong>en</strong>to <strong>de</strong>l arreglo <strong>de</strong> objetos gráficos que repres<strong>en</strong>ta el<br />

circuito a simu<strong>la</strong>r.<br />

El procesami<strong>en</strong>to comi<strong>en</strong>za con <strong>la</strong> consulta <strong>de</strong>l arreglo <strong>de</strong> objetos<br />

gráficos g<strong>en</strong>erados por <strong>la</strong> estructura FMP. Se valida <strong>la</strong> red resultante que<br />

constituye una <strong>de</strong>scripción <strong>de</strong>l circuito, se simu<strong>la</strong> y, finalm<strong>en</strong>te, los resultados<br />

obt<strong>en</strong>idos se grafican <strong>en</strong> gráficas 2D y <strong>3D</strong>.<br />

VI.1 Diagrama <strong>de</strong> c<strong>la</strong>ses<br />

En al Figura VI.2, se muestra <strong>en</strong> forma gráfica <strong>la</strong> arquitectura <strong>de</strong>tal<strong>la</strong>da <strong>de</strong>l<br />

patrón <strong>de</strong> diseño <strong>de</strong> programación MVC utilizado <strong>en</strong> el proyecto. Esta estructura<br />

constituye una adaptación <strong>de</strong> dicho mo<strong>de</strong>lo a <strong>la</strong>s necesida<strong>de</strong>s <strong>de</strong>l simu<strong>la</strong>dor. En <strong>la</strong><br />

figura se indican <strong>la</strong>s conexiones y el flujo <strong>de</strong> información <strong>en</strong>tre cada uno <strong>de</strong> los<br />

elem<strong>en</strong>tos que lo constituy<strong>en</strong>.<br />

4<br />

El mo<strong>de</strong>lo valida el dibujo <strong>de</strong>l<br />

circuito y lo simu<strong>la</strong> <strong>en</strong> DC o AC<br />

El mo<strong>de</strong>lo le <strong>en</strong>vía los<br />

resultados <strong>de</strong> <strong>la</strong> simui<strong>la</strong>ción a <strong>la</strong><br />

vista para que muestre<br />

gráficam<strong>en</strong>te dichos resultados<br />

5<br />

Vista<br />

Mo<strong>de</strong>lo<br />

El mo<strong>de</strong>lo autoriza al contro<strong>la</strong>dor<br />

a cambiar su estado<br />

6<br />

3<br />

2<br />

Contro<strong>la</strong>dor<br />

El contro<strong>la</strong>dor solicita cambiar<br />

el estado <strong>de</strong>l mo<strong>de</strong>lo<br />

1<br />

El usuario interactúa con <strong>la</strong><br />

aplicación a través <strong>de</strong>l<br />

contro<strong>la</strong>dor (ejemplo: clic <strong>de</strong><br />

botón)<br />

El contro<strong>la</strong>dor le ord<strong>en</strong>a a <strong>la</strong><br />

vista liberar datos para regresar<br />

al modo <strong>de</strong> edición<br />

Figura VI.2. Arquitectura y flujo <strong>de</strong> información <strong>en</strong>tre los elem<strong>en</strong>tos <strong>de</strong>l patrón <strong>de</strong><br />

programación MVC<br />

67


Cada uno <strong>de</strong> los bloques <strong>de</strong>l sistema MVC realizará <strong>la</strong>s sigui<strong>en</strong>tes<br />

funciones:<br />

• Contro<strong>la</strong>dor. – Contro<strong>la</strong> el flujo global <strong>de</strong>l simu<strong>la</strong>dor, previa autorización<br />

<strong>de</strong>l Mo<strong>de</strong>lo, contro<strong>la</strong>ndo los tres botones <strong>de</strong>l M<strong>en</strong>ú Principal: EDICION,<br />

SIMULAR EN DC y SIMULAR EN AC.<br />

• Mo<strong>de</strong>lo – Contro<strong>la</strong> el estado <strong>de</strong>l sistema, analiza y valida el dibujo <strong>de</strong>l<br />

circuito, g<strong>en</strong>era un mo<strong>de</strong>lo matemático <strong>de</strong>l circuito y lo simu<strong>la</strong> <strong>en</strong> DC o<br />

AC.<br />

• Vista – Crea los tres tipos <strong>de</strong> gráfica para mostrar los resultados <strong>de</strong> <strong>la</strong><br />

simu<strong>la</strong>ción: gráfica <strong>de</strong> barras, grafica <strong>de</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia<br />

(AC) y graficas dinámicas <strong>en</strong> <strong>3D</strong> <strong>en</strong> DC y AC.<br />

Cada módulo mostrado <strong>en</strong> <strong>la</strong> figura anterior, repres<strong>en</strong>ta una “c<strong>la</strong>se”. Los<br />

objetos correspondi<strong>en</strong>tes a cada “c<strong>la</strong>se”, así como <strong>la</strong> conexión <strong>en</strong>tre dichos<br />

objetos, se g<strong>en</strong>eran <strong>en</strong> una c<strong>la</strong>se inicial <strong>de</strong>l proyecto l<strong>la</strong>mada Main, <strong>la</strong> cual se<br />

<strong>en</strong>carga <strong>de</strong> g<strong>en</strong>erar los objetos y conectarlos <strong>en</strong>tre sí <strong>de</strong> acuerdo al diagrama<br />

establecido <strong>en</strong> <strong>la</strong> Figura VI.2 y cuyo código <strong>en</strong> ActionScript 3, se muestra <strong>en</strong> <strong>la</strong><br />

Figura VI.3<br />

:: Main<br />

CONSTRUCTOR<br />

// --- Mo<strong>de</strong>lo ---<br />

var mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito = new Mo<strong>de</strong>loCircuito(this);<br />

// --- Vistas ---<br />

var muestraResultadosDC:vistasDC = new vistasDC(mo<strong>de</strong>lo);<br />

var muestraResultadosAC:vistasAC = new vistasAC(mo<strong>de</strong>lo);<br />

// --- Contro<strong>la</strong>dor ---<br />

var cont:contro<strong>la</strong>dor = new contro<strong>la</strong>dor(mo<strong>de</strong>lo, muestraResultadosDC,<br />

muestraResultadosAC);<br />

Figura VI.2. Código <strong>de</strong> <strong>la</strong> c<strong>la</strong>se principal Main que se <strong>en</strong>carga <strong>de</strong> g<strong>en</strong>erar y<br />

conectar los objetos <strong>de</strong> acuerdo al mo<strong>de</strong>lo MVC mostrado <strong>en</strong> el diagrama <strong>de</strong> <strong>la</strong><br />

Figura VI.1<br />

La creación <strong>de</strong> los objetos <strong>en</strong> el código anterior, se realiza mediante el<br />

comando new. La conexión <strong>en</strong>tre los objetos se realiza a través <strong>de</strong> los argum<strong>en</strong>tos<br />

<strong>de</strong> <strong>la</strong>s funciones constructoras <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses correspondi<strong>en</strong>tes.<br />

Los dos objetos vistas (DC y AC), se conectan con el objeto mo<strong>de</strong>lo a<br />

través <strong>de</strong> su argum<strong>en</strong>to <strong>de</strong>l constructor correspondi<strong>en</strong>te.<br />

68


El objeto contro<strong>la</strong>dor se conecta con el objeto mo<strong>de</strong>lo y los dos objetos<br />

vistas, también a través <strong>de</strong>l argum<strong>en</strong>to <strong>de</strong> su función constructora.<br />

Con este código, se crean <strong>la</strong>s conexiones <strong>en</strong>tre los objetos como se<br />

muestra <strong>en</strong> <strong>la</strong> Figura VI.2. Sin embargo, <strong>la</strong> dirección <strong>de</strong>l flujo <strong>de</strong> información <strong>en</strong>tre<br />

dichas conexiones, se <strong>en</strong>cu<strong>en</strong>tra <strong>de</strong>finida <strong>en</strong> los métodos <strong>de</strong> acceso <strong>de</strong> cada<br />

c<strong>la</strong>se.<br />

VI.2 La c<strong>la</strong>se Mo<strong>de</strong>lo<br />

La c<strong>la</strong>se Mo<strong>de</strong>lo está estructurada con <strong>la</strong>s propieda<strong>de</strong>s y métodos que se<br />

muestran <strong>en</strong> <strong>la</strong> Figura VI.3.<br />

:: Mo<strong>de</strong>lo<br />

PROPIEDADES<br />

- Propieda<strong>de</strong>s auxiliares para todos los métodos<br />

locales utilizados <strong>en</strong> esta c<strong>la</strong>se abstracta<br />

- Arreglo G<strong>en</strong>erador_Lista_Datos<br />

METODOS<br />

- G<strong>en</strong>eración <strong>de</strong> un tab<strong>la</strong> Cos<strong>en</strong>oidal<br />

- G<strong>en</strong>eraciónd <strong>de</strong> un área <strong>de</strong> m<strong>en</strong>sajes<br />

- Capturar el arreglo <strong>de</strong> objetos gráficos<br />

- Validación <strong>de</strong> <strong>la</strong> red <strong>de</strong>l circuito<br />

- Simu<strong>la</strong>ción <strong>en</strong> DC<br />

- Validar resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción<br />

- Asignar resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción a cada<br />

compon<strong>en</strong>te <strong>de</strong>l circuito.<br />

- Creación <strong>de</strong> nodos visuales<br />

- Normalización <strong>de</strong> voltajes y corri<strong>en</strong>tes<br />

-<br />

- Simu<strong>la</strong>ción <strong>en</strong> AC<br />

- Validar resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción<br />

- Creación <strong>de</strong> nodos visuales<br />

- Asignar resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción a cada<br />

compon<strong>en</strong>te <strong>de</strong>l circuito.<br />

- Normalización <strong>de</strong> voltajes y corri<strong>en</strong>tes complejos<br />

tab<strong>la</strong>Cos<strong>en</strong>oidal<br />

C<strong>la</strong>se Concreta<br />

manejadorRed<br />

C<strong>la</strong>se Concreta<br />

simu<strong>la</strong>dorDC<br />

C<strong>la</strong>se Concreta<br />

NodoDC<br />

C<strong>la</strong>se Concreta<br />

simu<strong>la</strong>dorAC<br />

C<strong>la</strong>se Concreta<br />

NodoAC<br />

C<strong>la</strong>se Concreta<br />

Arreglo <strong>de</strong><br />

objetos<br />

gráficos<br />

Figura VI.3. Estructura <strong>de</strong>l código <strong>de</strong> <strong>la</strong> c<strong>la</strong>se Mo<strong>de</strong>lo.<br />

En <strong>la</strong> propiedad <strong>de</strong> <strong>la</strong> c<strong>la</strong>se l<strong>la</strong>mada G<strong>en</strong>erador_Lista_Datos se guardan<br />

todo los valores y resultados asociados con <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC<br />

Los métodos que aparec<strong>en</strong> <strong>en</strong> el código <strong>de</strong> <strong>la</strong> figura, se <strong>en</strong>cu<strong>en</strong>tran<br />

calsificados <strong>en</strong> tres grupos, cuyas funciones son:<br />

69


1. G<strong>en</strong>erar una tab<strong>la</strong> cos<strong>en</strong>oidal para utilizarse <strong>en</strong> <strong>la</strong> g<strong>en</strong>eración <strong>de</strong>l<br />

movimi<strong>en</strong>to osci<strong>la</strong>torio <strong>de</strong> los compon<strong>en</strong>tes <strong>en</strong> <strong>la</strong> simu<strong>la</strong>ción <strong>en</strong> AC.<br />

G<strong>en</strong>erar un área <strong>de</strong> m<strong>en</strong>sajes para el usuario. Capturar y validar <strong>la</strong><br />

red <strong>de</strong>l circuito que se va a simu<strong>la</strong>r.<br />

2. Simu<strong>la</strong>r el circuito <strong>en</strong> DC. Validar y asignar resultados <strong>de</strong> <strong>la</strong><br />

simu<strong>la</strong>ción a todos los compon<strong>en</strong>tes que forman el circuito. Crear<br />

nodos visuales (DC), es <strong>de</strong>cir, dibujos <strong>de</strong> nodos que repres<strong>en</strong>t<strong>en</strong><br />

gráficam<strong>en</strong>te el comportami<strong>en</strong>to <strong>de</strong> un nodo <strong>de</strong>l circuito. Normalizar los<br />

valores <strong>de</strong> voltaje y corri<strong>en</strong>te para repres<strong>en</strong>tarlos siempre d<strong>en</strong>tro <strong>de</strong><br />

los límites <strong>de</strong> graficación <strong>de</strong>l proyecto. Los límites para el voltaje son 160<br />

pixeles máximo <strong>de</strong> difer<strong>en</strong>cia <strong>de</strong> altura <strong>en</strong>tre dos nodos, y para <strong>la</strong><br />

corri<strong>en</strong>te un valor <strong>de</strong> 10 pixeles como anchura máxima <strong>de</strong>l flujo <strong>de</strong><br />

flechas.<br />

3. Simu<strong>la</strong>r el circuito <strong>en</strong> AC. Validar y asignar resultados <strong>de</strong> <strong>la</strong><br />

simu<strong>la</strong>ción a todos los compon<strong>en</strong>tes que forman el circuito. Crear<br />

nodos visuales (AC), es <strong>de</strong>cir, dibujos <strong>de</strong> nodos que repres<strong>en</strong>t<strong>en</strong><br />

gráficam<strong>en</strong>te el comportami<strong>en</strong>to <strong>de</strong> un nodo <strong>de</strong>l circuito. Normalizar los<br />

valores <strong>de</strong> voltaje y corri<strong>en</strong>te para repres<strong>en</strong>tarlos siempre d<strong>en</strong>tro <strong>de</strong><br />

los límites <strong>de</strong> graficación <strong>de</strong>l proyecto. Los límites para el voltaje son 160<br />

pixeles máximo <strong>de</strong> difer<strong>en</strong>cia <strong>de</strong> altura <strong>en</strong>tre dos nodos.<br />

4. La asignación <strong>de</strong> los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>ción se realiza<br />

directam<strong>en</strong>te <strong>en</strong> cada compon<strong>en</strong>te <strong>de</strong>l circuito a través <strong>de</strong> <strong>la</strong>s<br />

refer<strong>en</strong>cias guardadas <strong>en</strong> el arreglo <strong>de</strong> objetos gráfico.<br />

La propiedad <strong>de</strong> <strong>la</strong> c<strong>la</strong>se l<strong>la</strong>mada G<strong>en</strong>erador_Lista_Datos, constituye una<br />

c<strong>la</strong>se utilizada para g<strong>en</strong>erar listas <strong>de</strong> valores utilizado exclusivam<strong>en</strong>te <strong>en</strong> <strong>la</strong><br />

simu<strong>la</strong>ción <strong>en</strong> AC <strong>de</strong>l circuito. También aquí se guardan todos los resultados<br />

obt<strong>en</strong>idos <strong>en</strong> <strong>la</strong> simu<strong>la</strong>ción. Esta c<strong>la</strong>se se utiliza como un almacén <strong>de</strong> datos <strong>de</strong>bido<br />

a <strong>la</strong> gran cantidad <strong>de</strong> información que se g<strong>en</strong>era, ya que <strong>en</strong> este tipo <strong>de</strong><br />

simu<strong>la</strong>ción se realiza un barrido <strong>en</strong> frecu<strong>en</strong>cia <strong>de</strong> 400 muestras (400 frecu<strong>en</strong>cias<br />

difer<strong>en</strong>tes), y los resultados complejos <strong>de</strong> los voltajes se guardan <strong>en</strong> dos formatos:<br />

complejo y po<strong>la</strong>r para cada frecu<strong>en</strong>cia.<br />

El código completo y com<strong>en</strong>tado para esta c<strong>la</strong>se se pue<strong>de</strong> consultar <strong>en</strong> el<br />

Anexo correspondi<strong>en</strong>te.<br />

70


VIII. Resultados<br />

Tomando el simu<strong>la</strong>dor PSPICE como refer<strong>en</strong>cia <strong>de</strong> uno <strong>de</strong> los simu<strong>la</strong>dores<br />

mas utilizados a nivel universida<strong>de</strong>s e industrias, se pres<strong>en</strong>tan <strong>en</strong> forma<br />

comparativa <strong>la</strong>s noveda<strong>de</strong>s que pres<strong>en</strong>ta el proyecto realizado. Para fines <strong>de</strong><br />

comparación, el simu<strong>la</strong>dor realizado <strong>en</strong> el proyecto se le l<strong>la</strong>mará Sim<strong>3D</strong>.<br />

VIII.1 El editor <strong>de</strong> circuitos<br />

El editor <strong>de</strong> PSPICE al igual que el <strong>de</strong>l proyecto, permit<strong>en</strong> dibujar un circuito<br />

p<strong>la</strong>no <strong>en</strong> 2D, como se muestra <strong>en</strong> <strong>la</strong> Figura VIII.1. El editor <strong>de</strong>l proyecto no ti<strong>en</strong>e<br />

comandos para rotar compon<strong>en</strong>tes como los que ti<strong>en</strong>e PSPICE, por lo que es mas<br />

fácil su uso.<br />

PSPICE<br />

Sim<strong>3D</strong><br />

Figura VIII.1 Editores <strong>de</strong> PSPICE y <strong>de</strong>l Sim<strong>3D</strong><br />

Sim<strong>3D</strong><br />

PSPICE<br />

Figura VIII.2 Edición <strong>de</strong> parámetros <strong>de</strong> los compon<strong>en</strong>tes <strong>en</strong> PSPICE y <strong>de</strong>l Sim<strong>3D</strong><br />

71


VIII.2 Simu<strong>la</strong>ción<br />

El simu<strong>la</strong>dor Sim<strong>3D</strong> utiliza el Método Nodal Modificado para <strong>la</strong> simu<strong>la</strong>ción<br />

<strong>de</strong> los circuitos, el cual g<strong>en</strong>era resultados iguales a los realizados mediante un<br />

análisis manual o a través <strong>de</strong>l simu<strong>la</strong>dor PSPICE, como se muestra <strong>en</strong> <strong>la</strong> Figura<br />

VIII.3<br />

VIII.3 Pres<strong>en</strong>tación <strong>de</strong> resultados<br />

El simu<strong>la</strong>dor Sim<strong>3D</strong> pres<strong>en</strong>ta todos sus resultados <strong>en</strong> forma gráfica e<br />

interactiva, como se muestra <strong>en</strong> <strong>la</strong> misma Figura VIII.3.<br />

PSPICE<br />

Sim<strong>3D</strong><br />

Sim<strong>3D</strong><br />

Sim<strong>3D</strong><br />

Figura VIII.3 Simu<strong>la</strong>ción y pres<strong>en</strong>tación <strong>de</strong> resultados <strong>en</strong> PSPICE y <strong>en</strong> Sim<strong>3D</strong><br />

72


IX. CONCLUSIONES<br />

De acuerdo a los objetivos <strong>de</strong>l proyecto, puedo afirmar que se lograron<br />

alcanzar.<br />

En cuanto a <strong>la</strong> funcionalidad <strong>de</strong>l proyecto, se lograron conjuntar tres cosas:<br />

un editor gráfico s<strong>en</strong>cillo, un simu<strong>la</strong>dor <strong>de</strong> circuitos eléctricos y electrónicos y <strong>la</strong><br />

repres<strong>en</strong>tación <strong>de</strong> los resultados <strong>de</strong>l simu<strong>la</strong>dor <strong>en</strong> un gráfica <strong>de</strong>l circuito <strong>en</strong> <strong>3D</strong>.<br />

En cuanto a <strong>la</strong> construcción <strong>de</strong>l proyecto, se utilizó como estructura <strong>de</strong><br />

programación base para <strong>la</strong> realización <strong>de</strong>l mismo, el patrón <strong>de</strong> programación MVC<br />

(Mo<strong>de</strong>lo – Vista – Contro<strong>la</strong>dor), a<strong>de</strong>más <strong>de</strong> que fue necesaria <strong>la</strong> adición <strong>de</strong> un<br />

patrón <strong>de</strong> programación mas, el FMP (Método <strong>de</strong> <strong>la</strong> Fábrica). El patrón <strong>de</strong><br />

programación CP (Composición), también utilizado <strong>en</strong> el proyecto, se <strong>en</strong>cu<strong>en</strong>tra<br />

tras<strong>la</strong>pado <strong>en</strong> el módulo Vista <strong>de</strong>l mo<strong>de</strong>lo MVC.<br />

El editor resultó muy s<strong>en</strong>cillo <strong>de</strong> usar y muy intuitivo, ya que carece <strong>de</strong> los<br />

comandos <strong>de</strong> rotación <strong>de</strong> compon<strong>en</strong>tes como el que pres<strong>en</strong>ta el editor <strong>de</strong><br />

PSPICE, lo cual le da gran facilidad <strong>de</strong> uso.<br />

El simu<strong>la</strong>dor, por estar basado <strong>en</strong> el Método Nodal Modificado, g<strong>en</strong>era<br />

resultados iguales a los realizados mediante un análisis manual o a través <strong>de</strong>l<br />

simu<strong>la</strong>dor PSPICE para un <strong>de</strong>terminado circuito.<br />

La gráficas <strong>en</strong> 2D y <strong>3D</strong> que se obtuvieron son <strong>de</strong> bu<strong>en</strong>a calidad, así como el<br />

comportami<strong>en</strong>to <strong>de</strong> <strong>la</strong>s mismas a <strong>la</strong> interactividad <strong>de</strong> éstas con el usuario.<br />

Sería recom<strong>en</strong>dable int<strong>en</strong>tar otros formatos para <strong>la</strong>s gráficas <strong>en</strong> <strong>3D</strong>, como<br />

pued<strong>en</strong> ser, crear efectos <strong>de</strong> mayor iluminación <strong>de</strong> los compon<strong>en</strong>tes que estén<br />

más cerca <strong>de</strong>l usuario; incluir <strong>la</strong> función <strong>de</strong> zoom; crear compon<strong>en</strong>tes <strong>en</strong> <strong>3D</strong> <strong>en</strong><br />

lugar <strong>de</strong> compon<strong>en</strong>tes <strong>en</strong> 2D, como los que se utilizaron; increm<strong>en</strong>tar <strong>la</strong><br />

información proporcionada por <strong>la</strong>s gráficas (pot<strong>en</strong>cia, <strong>en</strong>ergía, etc).<br />

73


BIBLIOGRAFÍA<br />

[1] ActionScript 3.0 Design Patterns<br />

William San<strong>de</strong>rs and Chandima Cumaranatunge<br />

Ed. O´REILLY, ADOBE, 2007<br />

[2] Introducción a PSPICE<br />

James W. Nilsson and Susan A. Rie<strong>de</strong>l<br />

Ed. Addison-Wesley, 1994<br />

[3] Análisis y Diseño <strong>de</strong> <strong>Circuitos</strong> con Computadora<br />

Joan María Miró Sans, Antonio Puerta Notario,<br />

José María Miguel López, Margarita Sanz Postil<strong>la</strong><br />

Ed. Alfaomega - Marcombo, 1989<br />

[4] Programming ADOBE ACTIONSCRIPT 3.0<br />

ADOBE, 2008<br />

[5] ActionScript: Making Things Move<br />

Keith Peters<br />

Ed. fri<strong>en</strong>dsofED, 2006<br />

[6] Advanced ActionScript 3.0 Animation<br />

Keith Peters<br />

Ed. fri<strong>en</strong>dsofED, 2009<br />

[7] ActionScript 3.0: Bible<br />

Roger Braunstein, Mims H. Wright and Joshua J. Noble<br />

Ed. Wiley, 2008<br />

[8] ActionScript 3.0 Cookbook<br />

Joey Lott, Darron Schall and Keith Peters<br />

Ed. O´REILLY, ADOBE, 2007<br />

[9] ActionScript 3.0 Game Programming University<br />

Gary Ros<strong>en</strong>zweig´s<br />

Ed. QUE, 2008<br />

[10] Programming Macomedia F<strong>la</strong>sh MX<br />

Robert P<strong>en</strong>ner´s<br />

Ed. OSBORNE, McGrawHill, 2002<br />

[11] F<strong>la</strong>sh Math Creativity<br />

Varios Autores<br />

Ed. fri<strong>en</strong>dsofED, 2004<br />

[12] F<strong>la</strong>sh and Math Applets: Learn by Example<br />

Doug<strong>la</strong>s Ensley and Barbara Kaskosz<br />

Ed. Ensley and Kaskosz, 2009<br />

[13] Fundam<strong>en</strong>tos <strong>de</strong> <strong>Circuitos</strong> Eléctricos<br />

Charles K. Alexan<strong>de</strong>r, Mattew N. O. Sadiku<br />

Ed. McGrawHill, 2006<br />

[14] <strong>Circuitos</strong> Eléctricos: Introducción al Análisis y Diseño<br />

Richard C. Dorf<br />

Ed. Alfaomega, 1995<br />

[15] Active Filter Opamp Cookbook<br />

Don Lancaster<br />

Ed. SAMS, 1985<br />

74<br />

B - 1


[16] La sintaxis <strong>de</strong> <strong>la</strong> imag<strong>en</strong>: Introducción al alfabeto visual<br />

D. A. Dondis<br />

Ed. Gustavo Gil, 2000<br />

[17] Bases <strong>de</strong>l Diseño Gráfico<br />

A<strong>la</strong>n Swann<br />

Ed. Gustavo Gil, 2006<br />

[18] Fundam<strong>en</strong>tos <strong>de</strong>l Diseño<br />

Wucius Wong<br />

Ed. Gustavo Gil, 2007<br />

[19] Ohm Zone<br />

http://www.article19.com/shockwave/oz.htm<br />

[20] ActionScript 3.0 Tutorials<br />

http://www.f<strong>la</strong>shandmath.com/<br />

B - 2<br />

75


package com.fabrica.consumidor.registroBotones<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: CrearBotonesCompon<strong>en</strong>tes (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Botones <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.resist<strong>en</strong>cia.botonResist<strong>en</strong>cia;<br />

import com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.capacitor.botonCapacitor;<br />

import<br />

com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.fu<strong>en</strong>teVoltajeDC.botonFu<strong>en</strong>teVoltajeDC;<br />

import<br />

com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.fu<strong>en</strong>teCorri<strong>en</strong>teDC.botonFu<strong>en</strong>teCorri<strong>en</strong>teDC;<br />

import<br />

com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.fu<strong>en</strong>teVoltajeAC.botonFu<strong>en</strong>teVoltajeAC;<br />

import com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.a<strong>la</strong>mbre.*;<br />

import com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.tierra.botonTierra;<br />

import<br />

com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.amplificador_operacional.botonOpAmp;<br />

public c<strong>la</strong>ss CrearBotonesCompon<strong>en</strong>tes ext<strong>en</strong>ds Sprite {<br />

// ---------------------------------<br />

// COLORES<br />

// ---------------------------------<br />

public var ver<strong>de</strong>:Number = 0x00ff99;<br />

public var naranja:Number = 0xff6633;<br />

public var naranja2:Number = 0xff9900;<br />

public var azul:Number = 0x0099ff;<br />

public var azul2:Number = 0x0066ff;<br />

public var amarillo:Number = 0xffff00;<br />

public var violeta:Number = 0xff00ff;<br />

public var rojo:Number = 0xff0000;<br />

public var rojo2:Number = 0xcc0000;<br />

public var cafe:Number = 0xcc6633;<br />

public var b<strong>la</strong>nco:Number = 0xffffff;<br />

public var gris:Number = 0x666666;<br />

public var negro:Number = 0x000000;<br />

// --- Posicion <strong>de</strong> botones ---<br />

1


public var posicionBoton:Array;<br />

public var posicionInicial:uint = 10;<br />

public var tamanioBoton:uint = 50;<br />

public var separacion:uint = 2;<br />

// --- Datos ---<br />

public var spM<strong>en</strong>uCompon<strong>en</strong>tes:Sprite;<br />

public var spEditor:Sprite;<br />

public var parametros:Object<br />

spEditor:Sprite,<br />

public function CrearBotonesCompon<strong>en</strong>tes(spM<strong>en</strong>uCompon<strong>en</strong>tes:Sprite,<br />

parametros:Object):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.spM<strong>en</strong>uCompon<strong>en</strong>tes = spM<strong>en</strong>uCompon<strong>en</strong>tes;<br />

this.spEditor = spEditor;<br />

this.parametros = parametros;<br />

}<br />

// --- G<strong>en</strong>era posisiones <strong>de</strong> Botones <strong>en</strong> 8 fi<strong>la</strong>s y 6 columnas ---<br />

g<strong>en</strong>eraPosicionesBotones();<br />

// --- Crear botones <strong>de</strong> compon<strong>en</strong>tes ---<br />

g<strong>en</strong>erarBotonesCompon<strong>en</strong>tes();<br />

public function g<strong>en</strong>erarBotonesCompon<strong>en</strong>tes():void {<br />

-> | "S" v<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W"


--- Creacion <strong>de</strong> botones <strong>de</strong> compon<strong>en</strong>tes ---<br />

// ---------------------------------<br />

// FILA: 0<br />

// ---------------------------------<br />

// FUENTES DE VOLTAJE DC<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 0;<br />

arg.color = azul;<br />

// --- BOTONES >FUENTE DE VOLTAJE DC: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnVDC1:botonFu<strong>en</strong>teVoltajeDC = new botonFu<strong>en</strong>teVoltajeDC(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnVDC2:botonFu<strong>en</strong>teVoltajeDC = new botonFu<strong>en</strong>teVoltajeDC(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnVDC3:botonFu<strong>en</strong>teVoltajeDC = new botonFu<strong>en</strong>teVoltajeDC(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnVDC4:botonFu<strong>en</strong>teVoltajeDC = new botonFu<strong>en</strong>teVoltajeDC(arg);<br />

// ---------------------------------<br />

// FILA: 1<br />

// ---------------------------------<br />

// FUENTES DE CORRIENTE DC<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 1;<br />

arg.color = azul;<br />

// --- BOTONES >FUENTE DE VOLTAJE DC: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnIDC1:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new<br />

botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnIDC2:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new<br />

botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnIDC3:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new<br />

botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnIDC4:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new<br />

botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

// ---------------------------------<br />

// FILA: 2<br />

3


---------------------------------<br />

// FUENTES DE VOLTAJE AC<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 2;<br />

arg.color = azul;<br />

// --- BOTONES >FUENTE DE VOLTAJE AC: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.color = azul;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnVAC1:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnVAC2:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnVAC3:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnVAC4:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

// ---------------------------------<br />

// FILA: 3<br />

// ---------------------------------<br />

// RESISTENCIAS Y CAPACITORES<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 3;<br />

arg.color = amarillo;<br />

// --- BOTONES >RESISTENCIAS: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnRH:botonResist<strong>en</strong>cia = new botonResist<strong>en</strong>cia(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnRV:botonResist<strong>en</strong>cia = new botonResist<strong>en</strong>cia(arg);<br />

// --- BOTONES >CAPACITORES: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 2;<br />

arg.color = amarillo;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnCH:botonCapacitor = new botonCapacitor(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnCV:botonCapacitor = new botonCapacitor(arg);<br />

// ---------------------------------<br />

// FILA: 4<br />

// ---------------------------------<br />

// ALAMBRES<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 4;<br />

arg.color = amarillo;<br />

4


--- BOTONES >ALAMBRES: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnA1H:botonA<strong>la</strong>mbreLargo = new botonA<strong>la</strong>mbreLargo(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnA1V:botonA<strong>la</strong>mbreLargo = new botonA<strong>la</strong>mbreLargo(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnA2H:botonA<strong>la</strong>mbreCorto = new botonA<strong>la</strong>mbreCorto(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnA2V:botonA<strong>la</strong>mbreCorto = new botonA<strong>la</strong>mbreCorto(arg);<br />

// ---------------------------------<br />

// FILA: 5<br />

// ---------------------------------<br />

// TIERRA<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 5;<br />

arg.color = amarillo;<br />

// --- BOTON >CONEXION: Argum<strong>en</strong>tos variables ---<br />

/*arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnConexion:botonConexion = new botonConexion(arg);*/<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnGround0:botonTierra = new botonTierra(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnGround1:botonTierra = new botonTierra(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnGround2:botonTierra = new botonTierra(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnGround3:botonTierra = new botonTierra(arg);<br />

// ---------------------------------<br />

// FILA: 6<br />

// ---------------------------------<br />

// AMPLIFICADOR OPERACIONAL IDEAL<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 6;<br />

arg.color = ver<strong>de</strong>;<br />

// --- BOTONES >OpAmp: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

5


}<br />

var btnOpAmp1:botonOpAmp = new botonOpAmp(arg);<br />

public function g<strong>en</strong>eraPosicionesBotones():void {<br />

(tamanioBoton+separacion),<br />

posicionInicial+iy*<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> DATOS:<br />

// posicionBoton[fi<strong>la</strong>][columna] = Point(coord_x, coord_y]<br />

// 8 fi<strong>la</strong>s x 6 columnas<br />

// -----------------------------------------------------------<br />

posicionBoton = new Array();<br />

(tamanioBoton+separacion));<br />

}<br />

}<br />

}<br />

for (var iy=0; iy


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.a<strong>la</strong>mbre<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonA<strong>la</strong>mbreLargo (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre.FabricarA<strong>la</strong>mbre1;<br />

public c<strong>la</strong>ss botonA<strong>la</strong>mbreLargo {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

7


public function botonA<strong>la</strong>mbreLargo(arg):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_A<strong>la</strong>mbre1 = new mc_A<strong>la</strong>mbre1();<br />

var downLogo:mc_A<strong>la</strong>mbre1 = new mc_A<strong>la</strong>mbre1();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarA<strong>la</strong>mbre1();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

8


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.a<strong>la</strong>mbre<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonA<strong>la</strong>mbreCorto (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre.FabricarA<strong>la</strong>mbre2;<br />

public c<strong>la</strong>ss botonA<strong>la</strong>mbreCorto {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

9


public function botonA<strong>la</strong>mbreCorto(arg):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_A<strong>la</strong>mbre2 = new mc_A<strong>la</strong>mbre2();<br />

var downLogo:mc_A<strong>la</strong>mbre2 = new mc_A<strong>la</strong>mbre2();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarA<strong>la</strong>mbre2();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

10


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.capacitor<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonCapacitor (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.capacitor.FabricarCapacitor;<br />

public c<strong>la</strong>ss botonCapacitor{<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

11


public function botonCapacitor(arg:Object):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_Capacitor = new mc_Capacitor();<br />

var downLogo:mc_Capacitor = new mc_Capacitor();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarCapacitor();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

12


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.resist<strong>en</strong>cia<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonResist<strong>en</strong>cia (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.resist<strong>en</strong>cia.FabricarResist<strong>en</strong>cia;<br />

public c<strong>la</strong>ss botonResist<strong>en</strong>cia {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

13


public function botonResist<strong>en</strong>cia(arg:Object):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_Resist<strong>en</strong>cia = new mc_Resist<strong>en</strong>cia();<br />

var downLogo:mc_Resist<strong>en</strong>cia = new mc_Resist<strong>en</strong>cia();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarResist<strong>en</strong>cia();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

14


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.fu<strong>en</strong>teVoltajeDC<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonFu<strong>en</strong>teVoltajeDC (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje.FabricarVDC;<br />

public c<strong>la</strong>ss botonFu<strong>en</strong>teVoltajeDC {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

15


public function botonFu<strong>en</strong>teVoltajeDC(arg):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_VoltajeDC = new mc_VoltajeDC();<br />

var downLogo:mc_VoltajeDC = new mc_VoltajeDC();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarVDC();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

16


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.fu<strong>en</strong>teVoltajeAC<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonFu<strong>en</strong>teVoltajeAC (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje.FabricarVAC;<br />

public c<strong>la</strong>ss botonFu<strong>en</strong>teVoltajeAC {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

17


public function botonFu<strong>en</strong>teVoltajeAC(arg):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_VoltajeAC = new mc_VoltajeAC();<br />

var downLogo:mc_VoltajeAC = new mc_VoltajeAC();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarVAC();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

18


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.fu<strong>en</strong>teCorri<strong>en</strong>teDC<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonFu<strong>en</strong>teCorri<strong>en</strong>teDC (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesCorri<strong>en</strong>te.FabricarIDC;<br />

public c<strong>la</strong>ss botonFu<strong>en</strong>teCorri<strong>en</strong>teDC {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

19


public function botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_Corri<strong>en</strong>teDC = new mc_Corri<strong>en</strong>teDC();<br />

var downLogo:mc_Corri<strong>en</strong>teDC = new mc_Corri<strong>en</strong>teDC();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarIDC();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

20


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.amplificador_operacional<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonOpAmp (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.opamp.FabricarOpAmp;<br />

public c<strong>la</strong>ss botonOpAmp {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

21


public function botonOpAmp(arg):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_OpAmp = new mc_OpAmp();<br />

var downLogo:mc_OpAmp = new mc_OpAmp();<br />

*");<br />

*");<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "E": // "E" -><br />

break;<br />

case "W": // "W"


package com.fabrica.consumidor.botonesCompon<strong>en</strong>tes.tierra<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonTierra (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton<br />

import com.bin.boton;<br />

// Conexion con <strong>la</strong> fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.conexion.FabricarTierra;<br />

public c<strong>la</strong>ss botonTierra {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

23


public function botonTierra(arg:Object):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l compon<strong>en</strong>te ---<br />

var overLogo:mc_Ground = new mc_Ground();<br />

var downLogo:mc_Ground = new mc_Ground();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "N":<br />

break;<br />

case "W":<br />

overLogo.rotation = 90; // "W" <br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

// "N" ^<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:boton = new boton(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>uCompon<strong>en</strong>tes.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te = new FabricarTierra();<br />

compon<strong>en</strong>te.Fabricar(arg.spEditor, arg.parametros, ori<strong>en</strong>tacion);<br />

}<br />

}<br />

24


package com.fabrica.consumidor.registroBotones<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: CrearBotones<strong>Circuitos</strong> (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo / 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Botones <strong>de</strong> compon<strong>en</strong>tes<br />

// <strong>Circuitos</strong> DC<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc.botonDivisor1;<br />

// <strong>Circuitos</strong> AC<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac.botonFiltroLPActivo1;<br />

/*import com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc.botonRed1;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc.botonRed2;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc.botonInversor;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc.botonNoInversor;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc.botonDifer<strong>en</strong>cial;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac.botonLPRC;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac.botonLPActivo;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac.botonHPActivo;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac.botonAllPassActivo;<br />

import com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac.botonStateVar;*/<br />

public c<strong>la</strong>ss CrearBotones<strong>Circuitos</strong> ext<strong>en</strong>ds Sprite {<br />

// ---------------------------------<br />

// COLORES<br />

// ---------------------------------<br />

public var ver<strong>de</strong>:Number = 0x00ff99;<br />

public var naranja:Number = 0xff6633;<br />

public var naranja2:Number = 0xff9900;<br />

public var azul:Number = 0x0099ff;<br />

public var azul2:Number = 0x0066ff;<br />

public var amarillo:Number = 0xffff00;<br />

public var violeta:Number = 0xff00ff;<br />

public var rojo:Number = 0xff0000;<br />

public var rojo2:Number = 0xcc0000;<br />

public var cafe:Number = 0xcc6633;<br />

public var b<strong>la</strong>nco:Number = 0xffffff;<br />

public var gris:Number = 0x666666;<br />

public var negro:Number = 0x000000;<br />

// Posicion <strong>de</strong> botones<br />

public var posicionBoton:Array;<br />

public var posicionInicial:uint = 10;<br />

public var tamanioBoton:uint = 150;<br />

public var separacion:uint = 2;<br />

// --- Datos ---<br />

public var spM<strong>en</strong>u<strong>Circuitos</strong>:Sprite;<br />

public var spEditor:Sprite;<br />

public var parametros:Object<br />

public function CrearBotones<strong>Circuitos</strong>(spM<strong>en</strong>u<strong>Circuitos</strong>:Sprite,<br />

25


spEditor:Sprite,<br />

parametros:Object):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.spM<strong>en</strong>u<strong>Circuitos</strong> = spM<strong>en</strong>u<strong>Circuitos</strong>;<br />

this.spEditor = spEditor;<br />

this.parametros = parametros;<br />

}<br />

// --- G<strong>en</strong>era posisiones <strong>de</strong> Botones <strong>en</strong> 8 fi<strong>la</strong>s y 6 columnas ---<br />

g<strong>en</strong>eraPosicionesBotones();<br />

// --- Crear botones <strong>de</strong> circuitos ---<br />

g<strong>en</strong>erarBotones<strong>Circuitos</strong>();<br />

public function g<strong>en</strong>erarBotones<strong>Circuitos</strong>():void {<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S" v<br />

// -----------------------------------------------------------<br />

var arg:Object = new Object();<br />

// --- Argum<strong>en</strong>tos constantes ---<br />

arg.spM<strong>en</strong>u<strong>Circuitos</strong> = spM<strong>en</strong>u<strong>Circuitos</strong>;<br />

arg.spEditor = spEditor;<br />

arg.g<strong>en</strong>eraCoord<strong>en</strong>adas = this;<br />

arg.parametros = parametros;<br />

// ---------------------------------<br />

// FILA: 0<br />

// ---------------------------------<br />

// CIRCUITOS DC<br />

// ---------------------------------<br />

arg.fi<strong>la</strong> = 0;<br />

arg.color = azul;<br />

// --- BOTONES > CIRCUITOS DC: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnDivisor1:botonDivisor1 = new botonDivisor1(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnFiltroLPActivo1:botonFiltroLPActivo1 = new botonFiltroLPActivo1(arg);<br />

/*arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnVDC3:botonFu<strong>en</strong>teVoltajeDC = new botonFu<strong>en</strong>teVoltajeDC(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnVDC4:botonFu<strong>en</strong>teVoltajeDC = new botonFu<strong>en</strong>teVoltajeDC(arg);*/<br />

// ---------------------------------<br />

// FILA: 1<br />

// ---------------------------------<br />

26


FUENTES DE CORRIENTE DC<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 1;<br />

arg.color = azul;<br />

// --- BOTONES >FUENTE DE VOLTAJE DC: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnIDC1:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnIDC2:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnIDC3:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnIDC4:botonFu<strong>en</strong>teCorri<strong>en</strong>teDC = new botonFu<strong>en</strong>teCorri<strong>en</strong>teDC(arg);*/<br />

// ---------------------------------<br />

// FILA: 2<br />

// ---------------------------------<br />

// FUENTES DE VOLTAJE AC<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 2;<br />

arg.color = azul;<br />

// --- BOTONES >FUENTE DE VOLTAJE AC: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.color = azul;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnVAC1:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnVAC2:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnVAC3:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnVAC4:botonFu<strong>en</strong>teVoltajeAC = new botonFu<strong>en</strong>teVoltajeAC(arg);*/<br />

// ---------------------------------<br />

// FILA: 3<br />

// ---------------------------------<br />

// RESISTENCIAS Y CAPACITORES<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 3;<br />

arg.color = amarillo;<br />

// --- BOTONES >RESISTENCIAS: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnRH:botonResist<strong>en</strong>cia = new botonResist<strong>en</strong>cia(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnRV:botonResist<strong>en</strong>cia = new botonResist<strong>en</strong>cia(arg);<br />

// --- BOTONES >CAPACITORES: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 2;<br />

arg.color = amarillo;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnCH:botonCapacitor = new botonCapacitor(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

27


var btnCV:botonCapacitor = new botonCapacitor(arg);*/<br />

// ---------------------------------<br />

// FILA: 4<br />

// ---------------------------------<br />

// ALAMBRES<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 4;<br />

arg.color = amarillo;<br />

// --- BOTONES >ALAMBRES: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnA1H:botonA<strong>la</strong>mbreLargo = new botonA<strong>la</strong>mbreLargo(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnA1V:botonA<strong>la</strong>mbreLargo = new botonA<strong>la</strong>mbreLargo(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnA2H:botonA<strong>la</strong>mbreCorto = new botonA<strong>la</strong>mbreCorto(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnA2V:botonA<strong>la</strong>mbreCorto = new botonA<strong>la</strong>mbreCorto(arg);*/<br />

// ---------------------------------<br />

// FILA: 5<br />

// ---------------------------------<br />

// TIERRA<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 5;<br />

arg.color = amarillo;*/<br />

// --- BOTON >CONEXION: Argum<strong>en</strong>tos variables ---<br />

/*arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnConexion:botonConexion = new botonConexion(arg);*/<br />

/*arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "N";<br />

var btnGround0:botonTierra = new botonTierra(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

var btnGround1:botonTierra = new botonTierra(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

var btnGround2:botonTierra = new botonTierra(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

var btnGround3:botonTierra = new botonTierra(arg);*/<br />

// ---------------------------------<br />

// FILA: 6<br />

// ---------------------------------<br />

// AMPLIFICADOR OPERACIONAL IDEAL<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 6;<br />

arg.color = ver<strong>de</strong>;<br />

// --- BOTONES >OpAmp: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnOpAmp1:botonOpAmp = new botonOpAmp(arg);*/<br />

// ---------------------------------<br />

// FILA: 5<br />

28


---------------------------------<br />

// TRANSISTORES NPN<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 4;<br />

arg.color = ver<strong>de</strong>;<br />

// --- BOTONES >TRANSISTORES NPN: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnNPN1:botonTransistorNPN = new botonTransistorNPN(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnNPN2:botonTransistorNPN = new botonTransistorNPN(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnNPNFlip1:botonTransistorNPNF = new botonTransistorNPNF(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnNPNFlip2:botonTransistorNPNF = new botonTransistorNPNF(arg);*/<br />

// ---------------------------------<br />

// FILA: 5<br />

// ---------------------------------<br />

// TRANSISTORES PNP<br />

// ---------------------------------<br />

/*arg.fi<strong>la</strong> = 5;<br />

arg.color = ver<strong>de</strong>;<br />

// --- BOTONES >TRANSISTORES NPN: Argum<strong>en</strong>tos variables ---<br />

arg.columna = 0;<br />

arg.ori<strong>en</strong>tacion = "W";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnPNP1:botonTransistorPNP = new botonTransistorPNP(arg);<br />

arg.columna = 1;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnPNP2:botonTransistorPNP = new botonTransistorPNP(arg);<br />

arg.columna = 2;<br />

arg.ori<strong>en</strong>tacion = "E";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnPNPFlip1:botonTransistorPNPF = new botonTransistorPNPF(arg);<br />

arg.columna = 3;<br />

arg.ori<strong>en</strong>tacion = "S";<br />

// --- SOLO SE ACEPTAN LAS ORIENTACIONES: y ---<br />

var btnPNPFlip2:botonTransistorPNPF = new botonTransistorPNPF(arg);*/<br />

}<br />

public function g<strong>en</strong>eraPosicionesBotones():void {<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> DATOS:<br />

// posicionBoton[fi<strong>la</strong>][columna] = Point(coord_x, coord_y]<br />

// 3 fi<strong>la</strong>s x 6 columnas<br />

// -----------------------------------------------------------<br />

posicionBoton = new Array();<br />

for (var iy=0; iy


}<br />

}<br />

}<br />

(tamanioBoton+separacion),<br />

posicionInicial+iy*<br />

(tamanioBoton+separacion));<br />

public function posicionaBoton(fi<strong>la</strong>:uint, columna:uint):Point {<br />

}<br />

// -----------------------------------------------------------<br />

// Consulta coord<strong>en</strong>adas <strong>de</strong>l boton <strong>en</strong> funcion <strong>de</strong> su "fi<strong>la</strong>"<br />

// y su "r<strong>en</strong>glon" solicitado<br />

// -----------------------------------------------------------<br />

return posicionBoton[fi<strong>la</strong>][columna];<br />

}<br />

}<br />

package com.fabrica.consumidor.botones<strong>Circuitos</strong>.dc<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonDivisor1 (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo / 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton <strong>de</strong> circuito<br />

import com.bin.botonCircuito;<br />

// Conexion con <strong>la</strong> fabrica<br />

import com.fabrica.productor.circuitos.manejadorCircuito;<br />

public c<strong>la</strong>ss botonDivisor1 {<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

30


v<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

public function botonDivisor1(arg:Object):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l circuito ---<br />

var overLogo:mc_Circuito_Divisor01 = new mc_Circuito_Divisor01();<br />

var downLogo:mc_Circuito_Divisor01 = new mc_Circuito_Divisor01();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:botonCircuito = new botonCircuito(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>u<strong>Circuitos</strong>.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

31


-----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

var circuito:manejadorCircuito = new manejadorCircuito("circuitoDivisor1",<br />

arg.spEditor,<br />

}<br />

arg.parametros);<br />

}<br />

}<br />

32


package com.fabrica.consumidor.botones<strong>Circuitos</strong>.ac<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonFiltroLPActivo1 (CLIENTE)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// Crear un boton <strong>de</strong> circuito<br />

import com.bin.botonCircuito;<br />

// Conexion con <strong>la</strong> fabrica<br />

import com.fabrica.productor.circuitos.manejadorCircuito;<br />

public c<strong>la</strong>ss botonFiltroLPActivo1 {<br />

v<br />

private var arg:Object;<br />

// -----------------------------------------------------------<br />

// Estructura <strong>de</strong> Datos <strong>de</strong>l argum<strong>en</strong>to "arg" para solicitar<br />

// <strong>la</strong> creacion <strong>de</strong> un boton:<br />

//<br />

// +++ Constantes +++<br />

// arg.spM<strong>en</strong>uCompon<strong>en</strong>tes --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los botones<br />

// arg.spEditor --> "sprite" <strong>en</strong> don<strong>de</strong> se colocan<br />

// los compon<strong>en</strong>tes<br />

// arg.g<strong>en</strong>eraCoord<strong>en</strong>adas --> "objeto" parametros<br />

// +++ Variables +++<br />

// arg.fi<strong>la</strong> y arg. columna > coord<strong>en</strong>adas para colocacion<br />

// <strong>de</strong>l boton<br />

// arg.color --> color <strong>de</strong>l "marco" <strong>de</strong>l boton<br />

// arg.ori<strong>en</strong>tacion --> ori<strong>en</strong>tacion <strong>de</strong>l "logo" <strong>de</strong>l boton<br />

// y <strong>de</strong>l compon<strong>en</strong>te:<br />

// "W" | "S"<br />

// -----------------------------------------------------------<br />

private var fi<strong>la</strong>:uint;<br />

private var columna:uint;<br />

private var color:Number;<br />

private var ori<strong>en</strong>tacion:String;<br />

public function botonFiltroLPActivo1(arg:Object):void {<br />

33


--- Recepcion <strong>de</strong> datos ---<br />

this.arg = arg;<br />

this.fi<strong>la</strong> = arg.fi<strong>la</strong>;<br />

this.columna = arg.columna;<br />

this.color = arg.color;<br />

this.ori<strong>en</strong>tacion = arg.ori<strong>en</strong>tacion;<br />

// --- Logos <strong>de</strong>l circuito ---<br />

var overLogo:mc_FiltroActivoLP01 = new mc_FiltroActivoLP01();<br />

var downLogo:mc_FiltroActivoLP01 = new mc_FiltroActivoLP01();<br />

// --- Seleccion <strong>de</strong> <strong>la</strong> ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te ---<br />

switch(arg.ori<strong>en</strong>tacion) {<br />

case "W": // "W" <br />

downLogo.rotation = 180;<br />

break;<br />

case "S":<br />

overLogo.rotation = 270; // "S" v<br />

downLogo.rotation = 270;<br />

break;<br />

}<br />

}<br />

// --- Creacion <strong>de</strong>l boton ---<br />

var btn:botonCircuito = new botonCircuito(color);<br />

btn.agregarLogo(overLogo, downLogo);<br />

arg.spM<strong>en</strong>u<strong>Circuitos</strong>.addChild(btn);<br />

btn.x = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).x;<br />

btn.y = arg.g<strong>en</strong>eraCoord<strong>en</strong>adas.posicionaBoton(fi<strong>la</strong>,columna).y;<br />

btn.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, respuestaBoton);<br />

public function respuestaBoton(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

// -----------------------------------------------------------<br />

// Fabricacion <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

var circuito:manejadorCircuito = new manejadorCircuito("filtroLPActivo1",<br />

arg.spEditor,<br />

}<br />

arg.parametros);<br />

}<br />

}<br />

34


package com.fabrica.productor.fabricacion<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se ABSTRACTA: Compon<strong>en</strong>te (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo / 2010<br />

// **************************************************************<br />

//<br />

// Esta c<strong>la</strong>se constituye <strong>la</strong> <strong>de</strong>finicion <strong>de</strong> <strong>la</strong> c<strong>la</strong>se base para<br />

// establecer <strong>la</strong> FUNCIONALIDAD <strong>de</strong> todos los compon<strong>en</strong>tes utilizados<br />

// <strong>en</strong> el simu<strong>la</strong>dor<br />

//<br />

// C<strong>la</strong>ses <strong>de</strong>rivadas:<br />

//<br />

// - Compon<strong>en</strong>te1T --> tierra<br />

// - Compon<strong>en</strong>te2T --> resist<strong>en</strong>cia, capacitor,<br />

// a<strong>la</strong>mbre <strong>la</strong>rgo (40<br />

pixeles),<br />

// fu<strong>en</strong>tes <strong>de</strong> voltaje DC y<br />

AC<br />

// fu<strong>en</strong>te <strong>de</strong> corri<strong>en</strong>te <strong>de</strong><br />

DC<br />

// - A<strong>la</strong>mbreCorto2T --> a<strong>la</strong>mbre corto (20 pixeles)<br />

// - Compon<strong>en</strong>te3T --> amplificador operacional<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.*;<br />

// Error al int<strong>en</strong>tar g<strong>en</strong>erar un objeto <strong>de</strong> esta c<strong>la</strong>se abstracta<br />

import f<strong>la</strong>sh.errors.IllegalOperationError;<br />

// Animaciones<br />

import fl.transitions.Twe<strong>en</strong>;<br />

import fl.transitions.Twe<strong>en</strong>Ev<strong>en</strong>t;<br />

import fl.transitions.easing.*;<br />

// V<strong>en</strong>tana <strong>de</strong> edicion <strong>de</strong> compon<strong>en</strong>te<br />

import com.bin.v<strong>en</strong>tanaEdicion;<br />

// C<strong>la</strong>se ABSTRACTA (<strong>de</strong>be ser "ext<strong>en</strong>dida"<br />

// y no int<strong>en</strong>tar "g<strong>en</strong>erar objetos" <strong>de</strong> el<strong>la</strong>)<br />

public c<strong>la</strong>ss Compon<strong>en</strong>te ext<strong>en</strong>ds MovieClip {<br />

// ---------------------------------------------<br />

// Variables para MANEJO INTERNO <strong>de</strong>l simu<strong>la</strong>dor<br />

// ---------------------------------------------<br />

// Contador <strong>de</strong> instancias <strong>de</strong> compon<strong>en</strong>tes<br />

static var i_numeroCompon<strong>en</strong>teCreado:Number = 0;<br />

// Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

public var i_id<strong>en</strong>tificadorCompon<strong>en</strong>te:String;<br />

// Tipo <strong>de</strong> compon<strong>en</strong>te<br />

public var i_tipoCompon<strong>en</strong>te:String<br />

// ---------------------------------------------<br />

// Elem<strong>en</strong>tos Graficos <strong>de</strong>l Compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

public var cont<strong>en</strong>edorGrafico:MovieClip;<br />

public var simboloGrafico:MovieClip;<br />

35


public var lineaGrafica:MovieClip;<br />

public var fondoGrafico:MovieClip;<br />

public var corri<strong>en</strong>teGrafica:MovieClip;<br />

public var pot<strong>en</strong>ciaGrafica:MovieClip;<br />

// --- Animacion ---<br />

private var <strong>la</strong>nzarCompon<strong>en</strong>teGrafico:Twe<strong>en</strong>;<br />

// ---------------------------------------------<br />

// Target para colocacion <strong>de</strong> compon<strong>en</strong>tes<br />

// y dibujo <strong>de</strong>l circuito <strong>en</strong> modo <strong>de</strong> Edicion<br />

public var target:Disp<strong>la</strong>yObjectContainer;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Variables para manejo <strong>de</strong>l ususario<br />

// ---------------------------------------------<br />

public var u_id<strong>en</strong>tificadorCompon<strong>en</strong>te:String;<br />

// V<strong>en</strong>tana <strong>de</strong> edicion <strong>de</strong> parametros <strong>de</strong>l compon<strong>en</strong>te<br />

public var v<strong>en</strong>tanaEdicionPermitida:Boolean;<br />

public var v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te:v<strong>en</strong>tanaEdicion;<br />

// ---------------------------------------------<br />

xg, yg, zg)<br />

// ---------------------------------------------<br />

// Arreglo para guardado <strong>de</strong> coord<strong>en</strong>adas<br />

// ---------------------------------------------<br />

public var datosCompon<strong>en</strong>te:Array;<br />

// ---------------------------------------------<br />

// Estructura <strong>de</strong> DATOS <strong>de</strong> "datosCompon<strong>en</strong>te":<br />

// datosCompon<strong>en</strong>te[0] = compon<strong>en</strong>te(id<strong>en</strong>tificador,<br />

// numero_Punto_Rejil<strong>la</strong>,<br />

// datosCompon<strong>en</strong>te[1] = terminal1(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[2] = terminal2(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[n] = terminaln(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// PARAMETROS COMUNES COMPARTIDOS<br />

// ---------------------------------------------<br />

public var parametros:Object;<br />

public var separacionEntrePuntosRejil<strong>la</strong>:Number;<br />

public var numeroPuntosAnchoRejil<strong>la</strong>:Number;<br />

public var numeroPuntosAltoRejil<strong>la</strong>:Number;<br />

public var longitudCompon<strong>en</strong>te:Number;<br />

// ---------------------------------------------<br />

// Estructura <strong>de</strong> DATOS:<br />

// puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>] =<br />

// [fi<strong>la</strong>, columna, x, y, z, xg, yg, zg]<br />

//<br />

// x, y, z --> Coord<strong>en</strong>adas re<strong>la</strong>tivas<br />

// a <strong>la</strong> esquina superior<br />

// <strong>de</strong>recha <strong>de</strong>l editor<br />

// xg, yg, zg --> Coord<strong>en</strong>adas re<strong>la</strong>tivas<br />

// al c<strong>en</strong>tro <strong>de</strong>l area<br />

// <strong>de</strong>l editor<br />

// ---------------------------------------------<br />

public var puntosRejil<strong>la</strong>:Array;<br />

public var numero_Punto_Rejil<strong>la</strong>:Number;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Variables auxiliares para ubicacion <strong>de</strong>l<br />

// compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

public var numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te:Number;<br />

public var numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te:Number;<br />

public var numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong>:Number;<br />

public var numero_Punto_Inicial_Columna_Rejil<strong>la</strong>:Number;<br />

// Offsets <strong>de</strong> colocacion <strong>de</strong>l compon<strong>en</strong>te<br />

public var offsetHorizontal:Number = 0;<br />

36


target:Disp<strong>la</strong>yObjectContainer):void {<br />

public var offsetVertical:Number = 0;<br />

// ---------------------------------------------<br />

// --- Constantes ---<br />

public var LN_LOG:Number = 0.434294;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> "inicializacion" <strong>de</strong> parametros<br />

//<br />

// -----------------------------------------------------------<br />

public function inicializaParametros(parametros:Object,<br />

// -------------------------------------------<br />

// Id<strong>en</strong>tificacion INTERNA <strong>de</strong>l compon<strong>en</strong>te<br />

// -------------------------------------------<br />

i_id<strong>en</strong>tificadorCompon<strong>en</strong>te = i_tipoCompon<strong>en</strong>te +<br />

i_numeroCompon<strong>en</strong>teCreado;<br />

i_numeroCompon<strong>en</strong>teCreado++;<br />

u_id<strong>en</strong>tificadorCompon<strong>en</strong>te = i_id<strong>en</strong>tificadorCompon<strong>en</strong>te;<br />

// -------------------------------------------<br />

// Definicion <strong>de</strong>l nombre <strong>de</strong> este "objeto" para<br />

// refer<strong>en</strong>cia interna <strong>de</strong>l simu<strong>la</strong>dor<br />

// -------------------------------------------<br />

this.name = i_id<strong>en</strong>tificadorCompon<strong>en</strong>te;<br />

// -------------------------------------------<br />

// -------------------------------------------<br />

// Captura <strong>de</strong> parametros comunes<br />

// -------------------------------------------<br />

this.parametros = parametros;<br />

separacionEntrePuntosRejil<strong>la</strong> =<br />

parametros.separacionEntrePuntosRejil<strong>la</strong>;<br />

numeroPuntosAnchoRejil<strong>la</strong> = parametros.numeroPuntosAnchoRejil<strong>la</strong>;<br />

numeroPuntosAltoRejil<strong>la</strong> = parametros.numeroPuntosAltoRejil<strong>la</strong>;<br />

longitudCompon<strong>en</strong>te = parametros.longitudCompon<strong>en</strong>te;<br />

puntosRejil<strong>la</strong> = parametros.puntosRejil<strong>la</strong>;<br />

// -------------------------------------------<br />

this,parametros);<br />

}<br />

// Define modo boton para este "objeto"<br />

this.buttonMo<strong>de</strong> = true;<br />

// Inicializa capa <strong>de</strong> dibujo <strong>de</strong> edicion<br />

this.target = target;<br />

// Inicializa "list<strong>en</strong>ers" para interactividad<br />

inicializaList<strong>en</strong>ers();<br />

// Inicializa "datosCompon<strong>en</strong>te" para guardado <strong>de</strong><br />

// coord<strong>en</strong>adas<br />

datosCompon<strong>en</strong>te = new Array();<br />

// Inicializa v<strong>en</strong>tana para edicion <strong>de</strong> parametros<br />

// <strong>de</strong>l compon<strong>en</strong>te<br />

v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te = new v<strong>en</strong>tanaEdicion(target,<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> "edicion" para el compon<strong>en</strong>te<br />

//<br />

// -----------------------------------------------------------<br />

public function abrirPantal<strong>la</strong>Edicion(evt:MouseEv<strong>en</strong>t):void {<br />

37


}<br />

// -----------------------------------------------------------<br />

// Metodo ABSTRACTO: se <strong>de</strong>be "<strong>de</strong>finir" <strong>en</strong> una subc<strong>la</strong>se<br />

// -----------------------------------------------------------<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> "list<strong>en</strong>ers" para el compon<strong>en</strong>te<br />

//<br />

// -----------------------------------------------------------<br />

public function inicializaList<strong>en</strong>ers():void {<br />

// -----------------------------------------------------------<br />

// Inicializa "list<strong>en</strong>ers" para:<br />

// - Pantal<strong>la</strong> <strong>de</strong> Edicion <strong>de</strong> parametros <strong>de</strong>l compon<strong>en</strong>te<br />

// - Aplicacion <strong>de</strong> <strong>en</strong>foque al compon<strong>en</strong>te<br />

// - Inciar movimi<strong>en</strong>to <strong>de</strong> compon<strong>en</strong>te<br />

// - Eliminar compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

simboloGrafico.doubleClickEnabled = true;<br />

simboloGrafico.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.DOUBLE_CLICK,<br />

abrirPantal<strong>la</strong>Edicion);<br />

simboloGrafico.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK,<br />

aplicarEnfoqueCompon<strong>en</strong>te);<br />

this.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_DOWN,<br />

iniciaMovimi<strong>en</strong>toCompon<strong>en</strong>te);<br />

this.addEv<strong>en</strong>tList<strong>en</strong>er(KeyboardEv<strong>en</strong>t.KEY_DOWN,<br />

eliminarCompon<strong>en</strong>te);<br />

}<br />

public function removerList<strong>en</strong>ers():void {<br />

// -----------------------------------------------------------<br />

// Remover "list<strong>en</strong>ers"<br />

// -----------------------------------------------------------<br />

simboloGrafico.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.DOUBLE_CLICK,<br />

abrirPantal<strong>la</strong>Edicion);<br />

simboloGrafico.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK,<br />

aplicarEnfoqueCompon<strong>en</strong>te);<br />

this.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_DOWN,<br />

iniciaMovimi<strong>en</strong>toCompon<strong>en</strong>te);<br />

stage.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_MOVE,<br />

moverCompon<strong>en</strong>te);<br />

stage.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_UP,<br />

<strong>de</strong>t<strong>en</strong>erCompon<strong>en</strong>te);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion para eliminar el compon<strong>en</strong>te<br />

//<br />

// -----------------------------------------------------------<br />

public function aplicarEnfoqueCompon<strong>en</strong>te(evt:MouseEv<strong>en</strong>t=null):void {<br />

// -----------------------------------------------------------<br />

// Enfoque <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

38


}<br />

stage.focus = this;<br />

public function eliminarCompon<strong>en</strong>te(ev<strong>en</strong>t:KeyboardEv<strong>en</strong>t):void {<br />

// -----------------------------------------------------------<br />

// Eliminacion <strong>de</strong> compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

var DELETE:Number = 46;<br />

if (ev<strong>en</strong>t.keyCo<strong>de</strong> == DELETE) {<br />

simboloGrafico.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.DOUBLE_CLICK,<br />

abrirPantal<strong>la</strong>Edicion);<br />

aplicarEnfoqueCompon<strong>en</strong>te);<br />

simboloGrafico.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK,<br />

this.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_DOWN,<br />

iniciaMovimi<strong>en</strong>toCompon<strong>en</strong>te);<br />

stage.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_MOVE,<br />

}<br />

moverCompon<strong>en</strong>te);<br />

<strong>de</strong>t<strong>en</strong>erCompon<strong>en</strong>te);<br />

}<br />

stage.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_UP,<br />

// --- Si <strong>la</strong> pantal<strong>la</strong> esta abierta, cerrar<strong>la</strong> ---<br />

if (v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.v<strong>en</strong>tanaAbierta) {<br />

v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.cerrar();<br />

}<br />

target.removeChild(this);<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> "movimi<strong>en</strong>to" <strong>de</strong>l compon<strong>en</strong>te<br />

//<br />

// -----------------------------------------------------------<br />

public function iniciaMovimi<strong>en</strong>toCompon<strong>en</strong>te(evt:MouseEv<strong>en</strong>t):void {<br />

}<br />

cont<strong>en</strong>edorGrafico = MovieClip(evt.curr<strong>en</strong>tTarget);<br />

stage.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_MOVE,moverCompon<strong>en</strong>te);<br />

stage.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_UP,<strong>de</strong>t<strong>en</strong>erCompon<strong>en</strong>te);<br />

public function moverCompon<strong>en</strong>te(e:MouseEv<strong>en</strong>t):void {<br />

cont<strong>en</strong>edorGrafico.x = g<strong>en</strong>eraPosicionValidaX(target.mouseX);<br />

cont<strong>en</strong>edorGrafico.y = g<strong>en</strong>eraPosicionValidaY(target.mouseY);<br />

// -----------------------------------------------------------<br />

// Calculo <strong>de</strong>l "numero <strong>de</strong> punto" <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>en</strong> don<strong>de</strong> estan<br />

// colocadas <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te, consi<strong>de</strong>rando que<br />

// el punto <strong>de</strong> registro <strong>de</strong>l compon<strong>en</strong>te se <strong>en</strong>cu<strong>en</strong>tra al CENTRO<br />

// <strong>de</strong> este, es <strong>de</strong>cir, cont<strong>en</strong>edorGrafico.x y cont<strong>en</strong>edorGrafico.y<br />

// son <strong>la</strong>s coord<strong>en</strong>adas <strong>de</strong>l CENTRO <strong>de</strong>l compon<strong>en</strong>te.<br />

// -----------------------------------------------------------<br />

numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te = cont<strong>en</strong>edorGrafico.y/<br />

separacionEntrePuntosRejil<strong>la</strong>+10;<br />

numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te = cont<strong>en</strong>edorGrafico.x/<br />

separacionEntrePuntosRejil<strong>la</strong>+10;<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong> = numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te*<br />

(numeroPuntosAnchoRejil<strong>la</strong> + 1);<br />

numero_Punto_Inicial_Columna_Rejil<strong>la</strong> = numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te;<br />

39


separacionEntrePuntosRejil<strong>la</strong> + 10)+<br />

numero_Punto_Rejil<strong>la</strong> = ((cont<strong>en</strong>edorGrafico.x)/<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong>;<br />

// -----------------------------------------------------------<br />

// Guardado <strong>de</strong> los datos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> un arreglo <strong>de</strong> datos:<br />

// "datosCompon<strong>en</strong>te"<br />

// -----------------------------------------------------------<br />

[0][0]<br />

// [0][1]<br />

datosCompon<strong>en</strong>te[0] = new Array();<br />

datosCompon<strong>en</strong>te[0].push(i_id<strong>en</strong>tificadorCompon<strong>en</strong>te); //<br />

datosCompon<strong>en</strong>te[0].push(numero_Punto_Rejil<strong>la</strong>);<br />

datosCompon<strong>en</strong>te[0].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>].xg); // [0][2]<br />

datosCompon<strong>en</strong>te[0].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>].yg); // [0][3]<br />

datosCompon<strong>en</strong>te[0].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te // [0][4]<br />

datosCompon<strong>en</strong>te[0].push(new Array()); // Ubicacion(t) <strong>en</strong>tre nodos "z" [0][5]<br />

datosCompon<strong>en</strong>te[0].push(new Array()); // Distancia(t) <strong>en</strong>tre nodos [0][6]<br />

datosCompon<strong>en</strong>te[0].push(new Array()); // Inclinacion(t) <strong>en</strong>tre nodos [0][7]<br />

actualiza_Coord<strong>en</strong>adas_Terminales();<br />

// Actualiza "lineaGrafica" <strong>de</strong> conexion a <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

if (v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.v<strong>en</strong>tanaAbierta) {<br />

v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.actualizaPosicion(this);<br />

}<br />

}<br />

e.updateAfterEv<strong>en</strong>t();<br />

public function actualiza_Coord<strong>en</strong>adas_Terminales():void {<br />

// -----------------------------------------------------------<br />

// Metodo ABSTRACTO: se <strong>de</strong>be "<strong>de</strong>finir" <strong>en</strong> una subc<strong>la</strong>se<br />

// -----------------------------------------------------------<br />

}<br />

internal function g<strong>en</strong>eraPosicionValidaX(posicionMouseX:Number):Number {<br />

// --- Limite <strong>de</strong>recho <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo ---<br />

var limiteXMaximoPosicionRejil<strong>la</strong>:Number = separacionEntrePuntosRejil<strong>la</strong>*<br />

(numeroPuntosAnchoRejil<strong>la</strong>/2) - offsetHorizontal;<br />

var limiteXMinimoPosicionRejil<strong>la</strong>:Number = -separacionEntrePuntosRejil<strong>la</strong>*<br />

(numeroPuntosAnchoRejil<strong>la</strong>/2) + offsetHorizontal;<br />

if (posicionMouseX > limiteXMaximoPosicionRejil<strong>la</strong>) {<br />

return limiteXMaximoPosicionRejil<strong>la</strong>;<br />

}<br />

// --- Limite izquierdo <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo ---<br />

if (posicionMouseX < limiteXMinimoPosicionRejil<strong>la</strong>) {<br />

return limiteXMinimoPosicionRejil<strong>la</strong>;<br />

}<br />

// --- D<strong>en</strong>tro <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo ---<br />

return separacionEntrePuntosRejil<strong>la</strong>*Math.round(posicionMouseX/<br />

separacionEntrePuntosRejil<strong>la</strong>);<br />

}<br />

internal function g<strong>en</strong>eraPosicionValidaY(posicionMouseY:Number):Number {<br />

// --- Limite inferior <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo ---<br />

var limiteYMaximoPosicionRejil<strong>la</strong>:Number = separacionEntrePuntosRejil<strong>la</strong>*<br />

(numeroPuntosAltoRejil<strong>la</strong>/2) - offsetVertical;<br />

var limiteYMinimoPosicionRejil<strong>la</strong>:Number = -separacionEntrePuntosRejil<strong>la</strong>*<br />

(numeroPuntosAltoRejil<strong>la</strong>/2) + offsetVertical;<br />

40


separacionEntrePuntosRejil<strong>la</strong>);<br />

}<br />

if (posicionMouseY > limiteYMaximoPosicionRejil<strong>la</strong>) {<br />

return limiteYMaximoPosicionRejil<strong>la</strong>;<br />

}<br />

// --- Limite superior <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo ---<br />

if (posicionMouseY < limiteYMinimoPosicionRejil<strong>la</strong>) {<br />

return limiteYMinimoPosicionRejil<strong>la</strong>;<br />

}<br />

// --- D<strong>en</strong>tro <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo ---<br />

return separacionEntrePuntosRejil<strong>la</strong>*Math.round(posicionMouseY/<br />

internal function <strong>de</strong>t<strong>en</strong>erCompon<strong>en</strong>te(e:MouseEv<strong>en</strong>t):void {<br />

}<br />

cont<strong>en</strong>edorGrafico.stopDrag();<br />

stage.removeEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_MOVE, moverCompon<strong>en</strong>te);<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> colocacion inicial <strong>de</strong>l compon<strong>en</strong>te<br />

//<br />

// -----------------------------------------------------------<br />

internal function colocacionInicial():void {<br />

// --- Colocacion incial <strong>de</strong>l compon<strong>en</strong>te cuando se g<strong>en</strong>era<br />

// oprimir su boton <strong>de</strong> creacion correspondi<strong>en</strong>te<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico = new Twe<strong>en</strong>(this, "x",<br />

//Regu<strong>la</strong>r.easeOut, 300, parametros.posicionInicialCompon<strong>en</strong>teX,<br />

//0.2, true);<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico = new Twe<strong>en</strong>(this, "y",<br />

//Regu<strong>la</strong>r.easeOut, 0, parametros.posicionInicialCompon<strong>en</strong>teY,<br />

//0.2, true);<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico.addEv<strong>en</strong>tList<strong>en</strong>er(Twe<strong>en</strong>Ev<strong>en</strong>t.MOTION_FINISH,<br />

//terminaTwe<strong>en</strong>);<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico = new Twe<strong>en</strong>(this, "scaleX",<br />

//Regu<strong>la</strong>r.easeOut, 0, 1, 0.2, true);<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico = new Twe<strong>en</strong>(this, "scaleY",<br />

//Regu<strong>la</strong>r.easeOut, 0, 1, 0.2, true);<br />

}<br />

this.x = parametros.posicionInicialCompon<strong>en</strong>teX;<br />

this.y = parametros.posicionInicialCompon<strong>en</strong>teY;<br />

public function terminaTwe<strong>en</strong>(evnt:Ev<strong>en</strong>t):void {<br />

terminaTwe<strong>en</strong>);<br />

}<br />

setCompon<strong>en</strong>te();<br />

<strong>la</strong>nzarCompon<strong>en</strong>teGrafico.removeEv<strong>en</strong>tList<strong>en</strong>er(Twe<strong>en</strong>Ev<strong>en</strong>t.MOTION_FINISH,<br />

public function setCompon<strong>en</strong>te():void {<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico = new Twe<strong>en</strong>(this, "x",<br />

//Regu<strong>la</strong>r.easeOut, this.x, datosCompon<strong>en</strong>te[0][2], 0.2, true);<br />

//<strong>la</strong>nzarCompon<strong>en</strong>teGrafico = new Twe<strong>en</strong>(this, "y",<br />

//Regu<strong>la</strong>r.easeOut, this.y, datosCompon<strong>en</strong>te[0][3], 0.2, true);<br />

}<br />

this.x = datosCompon<strong>en</strong>te[0][2];<br />

this.y = datosCompon<strong>en</strong>te[0][3];<br />

}<br />

}<br />

41


package com.fabrica.productor.fabricacion<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Compon<strong>en</strong>te1T (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

public c<strong>la</strong>ss Compon<strong>en</strong>te1T ext<strong>en</strong>ds Compon<strong>en</strong>te {<br />

// ---------------------------------------------<br />

// Variables para manejo <strong>de</strong>l ususario<br />

// ---------------------------------------------<br />

// Datos <strong>de</strong>l compon<strong>en</strong>te para el susuario<br />

public var u_nombreCompon<strong>en</strong>te:String;<br />

public var u_valorCompon<strong>en</strong>te:Number;<br />

public var u_unida<strong>de</strong>sCompon<strong>en</strong>te:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Pot<strong>en</strong>ciales <strong>de</strong> <strong>la</strong>s "terminales" <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

public var Vnodo1:Number; // Pot<strong>en</strong>cial <strong>de</strong> <strong>la</strong><br />

// "terminal1" (coord. "z")<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Ori<strong>en</strong>tacion para colocacion <strong>de</strong>l compon<strong>en</strong>te<br />

public var ori<strong>en</strong>tacion:String;<br />

// ---------------------------------------------<br />

public function especificaCompon<strong>en</strong>te(ori<strong>en</strong>tacion:String):void {<br />

u_id<strong>en</strong>tificadorCompon<strong>en</strong>te = i_id<strong>en</strong>tificadorCompon<strong>en</strong>te;<br />

this.ori<strong>en</strong>tacion = ori<strong>en</strong>tacion;<br />

// -------------------------------<br />

// Ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -------------------------------<br />

switch (ori<strong>en</strong>tacion) {<br />

case "N":<br />

// ********************************<br />

// (1) o<br />

// |<br />

// (2) o<br />

// ********************************<br />

rotation = 0;<br />

43


eak;<br />

case "W":<br />

// ********************************<br />

//<br />

// (1) o -- o (2)<br />

//<br />

// ********************************<br />

break;<br />

rotation = 90;<br />

case "S":<br />

// ********************************<br />

// (2) o<br />

// |<br />

// (1) o<br />

// ********************************<br />

break;<br />

rotation = 180;<br />

case "E":<br />

// ********************************<br />

//<br />

// (2) o -- o (1)<br />

//<br />

// ********************************<br />

rotation = 270;<br />

break;<br />

}<br />

}<br />

overri<strong>de</strong> public function actualiza_Coord<strong>en</strong>adas_Terminales():void {<br />

numero_Punto_Rejil<strong>la</strong><br />

// -----------------------------------------------------------<br />

// Guardado <strong>de</strong> los datos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> un arreglo <strong>de</strong> datos:<br />

// "datosCompon<strong>en</strong>te"<br />

// -----------------------------------------------------------<br />

datosCompon<strong>en</strong>te[1] = new Array();<br />

// Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal1 <strong>de</strong>l Compon<strong>en</strong>te<br />

// Se asignan <strong>la</strong>s mismas coord<strong>en</strong>adas <strong>de</strong>l compon<strong>en</strong>te a <strong>la</strong> "terminal1"<br />

datosCompon<strong>en</strong>te[1][0] = datosCompon<strong>en</strong>te[0][1]; //<br />

datosCompon<strong>en</strong>te[1][1] = datosCompon<strong>en</strong>te[0][2]; // coord<strong>en</strong>ada "x"<br />

datosCompon<strong>en</strong>te[1][2] = datosCompon<strong>en</strong>te[0][3]; // coord<strong>en</strong>ada "y"<br />

datosCompon<strong>en</strong>te[1][3] = datosCompon<strong>en</strong>te[0][4]; // coord<strong>en</strong>ada "z"<br />

// --- V1(t) (comportami<strong>en</strong>to <strong>en</strong> AC) ---<br />

datosCompon<strong>en</strong>te[1].push(new Array()); // V1(t) (4)<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//trace("Compon<strong>en</strong>te1T:: datosCompon<strong>en</strong>te[0]= "+datosCompon<strong>en</strong>te[0]);<br />

//trace("Compon<strong>en</strong>te1T:: datosCompon<strong>en</strong>te[1]= "+datosCompon<strong>en</strong>te[1]);<br />

44


}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> SIMULACION EN AC<br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

// --- Posicion "z" <strong>de</strong>l cont<strong>en</strong>edor ---<br />

var cont<strong>en</strong>edor_z:Number;<br />

removerList<strong>en</strong>ers();<br />

// --- Ubicacion(t) <strong>en</strong>tre nodos "z": [0][5] ---<br />

datosCompon<strong>en</strong>te[0][5] = new Array();<br />

// Asignacion <strong>de</strong>l "arreglo <strong>de</strong> voltajes nodales"<br />

// a <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

V1_t = datosCompon<strong>en</strong>te[1][4];<br />

}<br />

for (i in V1_t) {<br />

cont<strong>en</strong>edor_z = V1_t[i];<br />

datosCompon<strong>en</strong>te[0][5].push(cont<strong>en</strong>edor_z);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion "onEnterFrame" l<strong>la</strong>mada <strong>de</strong>s<strong>de</strong> el motor<strong>3D</strong>_ac<br />

//<br />

// -----------------------------------------------------------<br />

public function asignaPot<strong>en</strong>cial(t:Number):void {<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te<br />

cont<strong>en</strong>edor_z = datosCompon<strong>en</strong>te[0][5][t];<br />

this.z = cont<strong>en</strong>edor_z;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

}<br />

this.z = 0;<br />

inicializaList<strong>en</strong>ers();<br />

}<br />

}<br />

45


package com.fabrica.productor.fabricacion<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Compon<strong>en</strong>te2T (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo / 2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

public c<strong>la</strong>ss Compon<strong>en</strong>te2T ext<strong>en</strong>ds Compon<strong>en</strong>te {<br />

// ---------------------------------------------<br />

// Variables para manejo <strong>de</strong>l ususario<br />

// ---------------------------------------------<br />

// Datos <strong>de</strong>l compon<strong>en</strong>te para el susuario<br />

public var u_nombreCompon<strong>en</strong>te:String;<br />

public var u_valorCompon<strong>en</strong>te:Number;<br />

public var u_unida<strong>de</strong>sCompon<strong>en</strong>te:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Estructura <strong>de</strong> DATOS <strong>de</strong> "datosCompon<strong>en</strong>te":<br />

// datosCompon<strong>en</strong>te[0] = compon<strong>en</strong>te(id<strong>en</strong>tificador, numero_Punto_Rejil<strong>la</strong>,<br />

//<br />

xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[1] = terminal1(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[2] = terminal2(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[n] = terminaln(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Pot<strong>en</strong>ciales <strong>de</strong> <strong>la</strong>s "terminales" <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

// --- Terminal 1 ---<br />

public var Vnodo1:Number; // Pot<strong>en</strong>cial (coord. "z")<br />

public var V1_t:Array;<br />

// V1(t) (coord. "z")<br />

// --- Terminal 2 ---<br />

public var Vnodo2:Number;<br />

public var V2_t:Array;<br />

public var <strong>de</strong>ltaV:Number;<br />

// Pot<strong>en</strong>cial (coord. "z")<br />

// V2(t) (coord. "z")<br />

// Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion<br />

public var corri<strong>en</strong>te:Number;<br />

public var pot<strong>en</strong>cia:Number;<br />

// ---------------------------------------------<br />

// Parametros <strong>de</strong> "dibujo <strong>en</strong> <strong>3D</strong>" <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

// --- Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion normalizada ---<br />

private var dv:Number;<br />

// --- Distancia <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te ---<br />

private var distancia:Number;<br />

// --- Angulo <strong>en</strong>tre <strong>la</strong>s terminales 1 y 2 ---<br />

private var angulo:Number;<br />

// --- Inclinacion <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong>tre <strong>la</strong>s terminales 1 y 2 ---<br />

private var inclinacion:Number;<br />

// ---------------------------------------------<br />

47


Ori<strong>en</strong>tacion para colocacion <strong>de</strong>l compon<strong>en</strong>te<br />

public var ori<strong>en</strong>tacion:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Variables auxiliares para el calculo <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas <strong>de</strong> <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal1:Number;<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal2:Number;<br />

// ---------------------------------------------<br />

// -----------------------------------------------<br />

// Mo<strong>de</strong>lo matematico para "Metodo Nodal Modificado"<br />

// -----------------------------------------------<br />

public var mna:Array;<br />

// -----------------------------------------------<br />

public function especificaCompon<strong>en</strong>te(ori<strong>en</strong>tacion:String):void {<br />

u_id<strong>en</strong>tificadorCompon<strong>en</strong>te = i_id<strong>en</strong>tificadorCompon<strong>en</strong>te;<br />

this.ori<strong>en</strong>tacion = ori<strong>en</strong>tacion;<br />

// -------------------------------<br />

// Ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -------------------------------<br />

switch (ori<strong>en</strong>tacion) {<br />

case "N":<br />

// ********************************<br />

// (1) o<br />

// |<br />

// |<br />

// (2) o<br />

// ********************************<br />

rotation = 90;<br />

offsetHorizontal = 0;<br />

offsetVertical = 20;<br />

break;<br />

case "W":<br />

// ********************************<br />

//<br />

// (1) o -- o (2)<br />

//<br />

// ********************************<br />

break;<br />

rotation = 0;<br />

offsetHorizontal = 20;<br />

offsetVertical = 0;<br />

case "S":<br />

// ********************************<br />

// (2) o<br />

// |<br />

// |<br />

// (1) o<br />

// ********************************<br />

break;<br />

rotation = 270;<br />

offsetHorizontal = 0;<br />

offsetVertical = 20;<br />

case "E":<br />

// ********************************<br />

//<br />

// (2) o -- o (1)<br />

//<br />

// ********************************<br />

48


eak;<br />

rotation = 180;<br />

offsetHorizontal = 20;<br />

offsetVertical = 0;<br />

}<br />

}<br />

separacionEntrePuntosRejil<strong>la</strong>)/<br />

separacionEntrePuntosRejil<strong>la</strong> +<br />

overri<strong>de</strong> public function actualiza_Coord<strong>en</strong>adas_Terminales():void {<br />

switch (ori<strong>en</strong>tacion) {<br />

case "W":<br />

// ********************************<br />

//<br />

// (1) o -- o (2)<br />

//<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = (cont<strong>en</strong>edorGrafico.x -<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong> + 10;<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = numero_Punto_Rejil<strong>la</strong>_Terminal1<br />

+ longitudCompon<strong>en</strong>te/<br />

separacionEntrePuntosRejil<strong>la</strong>;<br />

break;<br />

numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te<br />

(numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te-1)*<br />

case "N":<br />

// ********************************<br />

// (1) o<br />

// |<br />

// |<br />

// (2) o<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 =<br />

+<br />

(numeroPuntosAnchoRejil<strong>la</strong> + 1);<br />

2*(numeroPuntosAnchoRejil<strong>la</strong>+1);<br />

break;<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = numero_Punto_Rejil<strong>la</strong>_Terminal1<br />

+<br />

case "E":<br />

// ********************************<br />

//<br />

// (2) o -- o (1)<br />

//<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = (cont<strong>en</strong>edorGrafico.x -<br />

separacionEntrePuntosRejil<strong>la</strong>)<br />

/separacionEntrePuntosRejil<strong>la</strong> +<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong> +10;<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = numero_Punto_Rejil<strong>la</strong>_Terminal2<br />

+ longitudCompon<strong>en</strong>te/<br />

separacionEntrePuntosRejil<strong>la</strong>;<br />

break;<br />

case "S":<br />

// ********************************<br />

// (2) o<br />

49


numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te<br />

(numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te-1)*<br />

// |<br />

// |<br />

// (1) o<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 =<br />

+<br />

(numeroPuntosAnchoRejil<strong>la</strong> + 1);<br />

2*(numeroPuntosAnchoRejil<strong>la</strong>+1);<br />

}<br />

break;<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = numero_Punto_Rejil<strong>la</strong>_Terminal2<br />

+<br />

// -----------------------------------------------------------<br />

// Guardado <strong>de</strong> los datos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> un arreglo <strong>de</strong> datos:<br />

// "datosCompon<strong>en</strong>te"<br />

// -----------------------------------------------------------<br />

datosCompon<strong>en</strong>te[1] = new Array();<br />

datosCompon<strong>en</strong>te[2] = new Array();<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal1 <strong>de</strong>l Compon<strong>en</strong>te ---<br />

datosCompon<strong>en</strong>te[1].push(numero_Punto_Rejil<strong>la</strong>_Terminal1);<br />

datosCompon<strong>en</strong>te[1].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal1].xg);<br />

datosCompon<strong>en</strong>te[1].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal1].yg);<br />

datosCompon<strong>en</strong>te[1].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl1 (3)<br />

// --- V1(t) (comportami<strong>en</strong>to <strong>en</strong> AC) ---<br />

datosCompon<strong>en</strong>te[1].push(new Array()); // V1(t) (4)<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal2 <strong>de</strong>l Compon<strong>en</strong>te ---<br />

datosCompon<strong>en</strong>te[2].push(numero_Punto_Rejil<strong>la</strong>_Terminal2);<br />

datosCompon<strong>en</strong>te[2].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal2].xg);<br />

datosCompon<strong>en</strong>te[2].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal2].yg);<br />

datosCompon<strong>en</strong>te[2].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl2 (3)<br />

// --- V2(t) (comportami<strong>en</strong>to <strong>en</strong> AC) ---<br />

datosCompon<strong>en</strong>te[2].push(new Array()); // V2(t) (4)<br />

}<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//trace("Compon<strong>en</strong>te2T:: datosCompon<strong>en</strong>te[1]= "+datosCompon<strong>en</strong>te[1]);<br />

//trace("Compon<strong>en</strong>te2T:: datosCompon<strong>en</strong>te[2]= "+datosCompon<strong>en</strong>te[2]);<br />

overri<strong>de</strong> public function abrirPantal<strong>la</strong>Edicion(evt:MouseEv<strong>en</strong>t):void {<br />

if (v<strong>en</strong>tanaEdicionPermitida) {<br />

v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.abrir(this);<br />

}<br />

}<br />

public function inicializaMatrizNodal(mna:Array):void {<br />

// <strong>de</strong>sarrollo a futuro<br />

}<br />

public function update():void {<br />

nodo1 = 0;<br />

nodo2 = 0;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> SIMULACION EN AC<br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

50


--- Posicion "z" <strong>de</strong>l cont<strong>en</strong>edor ---<br />

var cont<strong>en</strong>edor_z:Number;<br />

removerList<strong>en</strong>ers();<br />

corri<strong>en</strong>teGrafica.visible = false;<br />

// --- Ubicacion(t) <strong>en</strong>tre nodos "z" : [0][5] ---<br />

datosCompon<strong>en</strong>te[0][5] = new Array();<br />

// --- Distancia(t) <strong>en</strong>tre nodos : [0][6] ---<br />

datosCompon<strong>en</strong>te[0][6] = new Array();<br />

// --- Inclinacion(t) <strong>en</strong>tre nodos : [0][7] ---<br />

datosCompon<strong>en</strong>te[0][7] = new Array();<br />

// Asignacion <strong>de</strong>l "arreglo <strong>de</strong> voltajes nodales"<br />

// a <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

V1_t = datosCompon<strong>en</strong>te[1][4];<br />

V2_t = datosCompon<strong>en</strong>te[2][4];<br />

for (i in V1_t) {<br />

<strong>de</strong>ltaV = V1_t[i] - V2_t[i];<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto<br />

// medio <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal<br />

cont<strong>en</strong>edor_z = (V1_t[i] + V2_t[i])/2;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(<strong>de</strong>ltaV*<strong>de</strong>ltaV + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

inclinacion = (Math.atan2(<strong>de</strong>ltaV,40)/Math.PI)*180;<br />

}<br />

}<br />

datosCompon<strong>en</strong>te[0][5].push(cont<strong>en</strong>edor_z);<br />

datosCompon<strong>en</strong>te[0][6].push(distancia);<br />

datosCompon<strong>en</strong>te[0][7].push(inclinacion);<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion "onEnterFrame" l<strong>la</strong>mada <strong>de</strong>s<strong>de</strong> el motor<strong>3D</strong>_ac<br />

//<br />

// -----------------------------------------------------------<br />

public function asignaPot<strong>en</strong>cial(t:Number):void {<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te<br />

cont<strong>en</strong>edor_z = datosCompon<strong>en</strong>te[0][5][t];<br />

distancia = datosCompon<strong>en</strong>te[0][6][t];<br />

inclinacion = datosCompon<strong>en</strong>te[0][7][t];<br />

}<br />

this.z = cont<strong>en</strong>edor_z;<br />

lineaGrafica.scaleX = distancia/40;<br />

cont<strong>en</strong>edorGrafico.rotationY = inclinacion;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

this.z = 0;<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

}<br />

}<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

51


package com.fabrica.productor.fabricacion<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: A<strong>la</strong>mbreCorto2T (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo / 2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

public c<strong>la</strong>ss A<strong>la</strong>mbreCorto2T ext<strong>en</strong>ds Compon<strong>en</strong>te {<br />

// ---------------------------------------------<br />

// Variables para manejo <strong>de</strong>l ususario<br />

// ---------------------------------------------<br />

// Datos <strong>de</strong>l compon<strong>en</strong>te para el susuario<br />

public var u_nombreCompon<strong>en</strong>te:String;<br />

public var u_valorCompon<strong>en</strong>te:Number;<br />

public var u_unida<strong>de</strong>sCompon<strong>en</strong>te:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Estructura <strong>de</strong> DATOS <strong>de</strong> "datosCompon<strong>en</strong>te":<br />

// datosCompon<strong>en</strong>te[0] = compon<strong>en</strong>te(id<strong>en</strong>tificador, numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[1] = terminal1(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[2] = terminal2(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[n] = terminaln(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Pot<strong>en</strong>ciales <strong>de</strong> <strong>la</strong>s "terminales" <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

// --- Terminal 1 ---<br />

public var Vnodo1:Number; // Pot<strong>en</strong>cial (coord. "z")<br />

public var V1_t:Array; // V1(t) (coord. "z")<br />

// --- Terminal 2 ---<br />

public var Vnodo2:Number; // Pot<strong>en</strong>cial (coord. "z")<br />

public var V2_t:Array; // V2(t) (coord. "z")<br />

public var <strong>de</strong>ltaV:Number; // Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion<br />

public var corri<strong>en</strong>te:Number;<br />

public var pot<strong>en</strong>cia:Number;<br />

// ---------------------------------------------<br />

// Parametros <strong>de</strong> "dibujo <strong>en</strong> <strong>3D</strong>" <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

// Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion normalizada<br />

private var dv:Number;<br />

// Distancia <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

private var distancia:Number;<br />

// Angulo <strong>en</strong>tre <strong>la</strong>s terminales 1 y 2<br />

private var angulo:Number;<br />

// Inclinacion <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong>tre <strong>la</strong>s terminales 1 y 2<br />

private var inclinacion:Number;<br />

// ---------------------------------------------<br />

// Ori<strong>en</strong>tacion para colocacion <strong>de</strong>l compon<strong>en</strong>te<br />

53


public var ori<strong>en</strong>tacion:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Variables auxiliares para el calculo <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas <strong>de</strong> <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal1:Number;<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal2:Number;<br />

// ---------------------------------------------<br />

// -----------------------------------------------<br />

// Mo<strong>de</strong>lo matematico para "Metodo Nodal Modificado"<br />

// -----------------------------------------------<br />

public var mna:Array;<br />

// -----------------------------------------------<br />

public function especificaCompon<strong>en</strong>te(ori<strong>en</strong>tacion:String):void {<br />

u_id<strong>en</strong>tificadorCompon<strong>en</strong>te = i_id<strong>en</strong>tificadorCompon<strong>en</strong>te;<br />

this.ori<strong>en</strong>tacion = ori<strong>en</strong>tacion;<br />

// -------------------------------<br />

// Ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -------------------------------<br />

switch (ori<strong>en</strong>tacion) {<br />

case "N":<br />

// ********************************<br />

// (1) o<br />

// |<br />

// (2) o<br />

// ********************************<br />

rotation = 90;<br />

offsetHorizontal = 0;<br />

offsetVertical = 20;<br />

break;<br />

case "W":<br />

// ********************************<br />

//<br />

// (1) o - o (2)<br />

//<br />

// ********************************<br />

break;<br />

rotation = 0;<br />

offsetHorizontal = 20;<br />

offsetVertical = 0;<br />

case "S":<br />

// ********************************<br />

// (2) o<br />

// |<br />

// (1) o<br />

// ********************************<br />

break;<br />

rotation = 270;<br />

offsetHorizontal = 0;<br />

offsetVertical = 20;<br />

case "E":<br />

// ********************************<br />

//<br />

// (2) o - o (1)<br />

//<br />

// ********************************<br />

rotation = 180;<br />

offsetHorizontal = 20;<br />

offsetVertical = 0;<br />

54


eak;<br />

}<br />

}<br />

separacionEntrePuntosRejil<strong>la</strong>)<br />

/separacionEntrePuntosRejil<strong>la</strong> +<br />

overri<strong>de</strong> public function actualiza_Coord<strong>en</strong>adas_Terminales():void {<br />

switch (ori<strong>en</strong>tacion) {<br />

case "W":<br />

// ********************************<br />

//<br />

// (1) o - o (2)<br />

//<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = (cont<strong>en</strong>edorGrafico.x -<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong> + 10;<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = numero_Punto_Rejil<strong>la</strong>_Terminal1<br />

+<br />

(longitudCompon<strong>en</strong>te/2)/separacionEntrePuntosRejil<strong>la</strong>;<br />

break;<br />

numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te<br />

(numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te-1)*<br />

case "N":<br />

// ********************************<br />

// (1) o<br />

// |<br />

// (2) o<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 =<br />

+<br />

(numeroPuntosAnchoRejil<strong>la</strong> + 1);<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = numero_Punto_Rejil<strong>la</strong>_Terminal1 +<br />

(numeroPuntosAnchoRejil<strong>la</strong>+1);<br />

break;<br />

case "E":<br />

// ********************************<br />

//<br />

// (2) o - o (1)<br />

//<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = (cont<strong>en</strong>edorGrafico.x -<br />

separacionEntrePuntosRejil<strong>la</strong>)<br />

/separacionEntrePuntosRejil<strong>la</strong> +<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong> + 10;<br />

(longitudCompon<strong>en</strong>te/2)<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = numero_Punto_Rejil<strong>la</strong>_Terminal2<br />

+<br />

/separacionEntrePuntosRejil<strong>la</strong>;<br />

break;<br />

case "S":<br />

// ********************************<br />

// (2) o<br />

// |<br />

// (1) o<br />

// ********************************<br />

55


numero_Columna_Rejil<strong>la</strong>_Compon<strong>en</strong>te<br />

(numero_Fi<strong>la</strong>_Rejil<strong>la</strong>_Compon<strong>en</strong>te-1)*<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 =<br />

+<br />

(numeroPuntosAnchoRejil<strong>la</strong> + 1);<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = numero_Punto_Rejil<strong>la</strong>_Terminal2 +<br />

(numeroPuntosAnchoRejil<strong>la</strong>+1);<br />

}<br />

break;<br />

// -----------------------------------------------------------------------------<br />

// Guardado <strong>de</strong> los datos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> un arreglo <strong>de</strong> datos: "datosCompon<strong>en</strong>te"<br />

// -----------------------------------------------------------------------------<br />

datosCompon<strong>en</strong>te[1] = new Array();<br />

datosCompon<strong>en</strong>te[2] = new Array();<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal1 <strong>de</strong>l Compon<strong>en</strong>te ----<br />

datosCompon<strong>en</strong>te[1].push(numero_Punto_Rejil<strong>la</strong>_Terminal1);<br />

datosCompon<strong>en</strong>te[1].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal1].xg);<br />

datosCompon<strong>en</strong>te[1].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal1].yg);<br />

datosCompon<strong>en</strong>te[1].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl1<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal2 <strong>de</strong>l Compon<strong>en</strong>te ----<br />

datosCompon<strong>en</strong>te[2].push(numero_Punto_Rejil<strong>la</strong>_Terminal2);<br />

datosCompon<strong>en</strong>te[2].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal2].xg);<br />

datosCompon<strong>en</strong>te[2].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal2].yg);<br />

datosCompon<strong>en</strong>te[2].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl2<br />

}<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//trace("A<strong>la</strong>mbreCorto2T:: datosCompon<strong>en</strong>te[1]= "+datosCompon<strong>en</strong>te[1]);<br />

//trace("A<strong>la</strong>mbreCorto2T:: datosCompon<strong>en</strong>te[2]= "+datosCompon<strong>en</strong>te[2]);<br />

overri<strong>de</strong> public function abrirPantal<strong>la</strong>Edicion(evt:MouseEv<strong>en</strong>t):void {<br />

if (v<strong>en</strong>tanaEdicionPermitida) {<br />

v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.abrir(this);<br />

}<br />

}<br />

public function inicializaMatrizNodal(mna:Array):void {<br />

this.mna = mna;<br />

trace(" ");<br />

for (i in mna) {<br />

trace("mna["+i+"] = "+mna[i]);<br />

}<br />

}<br />

public function update():void {<br />

nodo1 = 0;<br />

nodo2 = 0;<br />

}<br />

// ------------------------------------------------------------------<br />

// Seccion <strong>de</strong> SIMULACION EN AC<br />

// ------------------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

// Posicion "z" <strong>de</strong>l cont<strong>en</strong>edor<br />

var cont<strong>en</strong>edor_z:Number;<br />

removerList<strong>en</strong>ers();<br />

corri<strong>en</strong>teGrafica.visible = false;<br />

datosCompon<strong>en</strong>te[0][5] = new Array(); // Ubicacion(t) <strong>en</strong>tre nodos "z" // [0][5]<br />

56


datosCompon<strong>en</strong>te[0][6] = new Array(); // Distancia(t) <strong>en</strong>tre nodos // [0][6]<br />

datosCompon<strong>en</strong>te[0][7] = new Array(); // Inclinacion(t) <strong>en</strong>tre nodos // [0][7]<br />

// Asignacion <strong>de</strong>l "arreglo <strong>de</strong> voltajes nodales"<br />

// a <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

V1_t = datosCompon<strong>en</strong>te[1][4];<br />

V2_t = datosCompon<strong>en</strong>te[2][4];<br />

for (i in V1_t) {<br />

<strong>de</strong>ltaV = V1_t[i] - V2_t[i];<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto<br />

// medio <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal<br />

cont<strong>en</strong>edor_z = (V1_t[i] + V2_t[i])/2;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(<strong>de</strong>ltaV*<strong>de</strong>ltaV + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

inclinacion = (Math.atan2(<strong>de</strong>ltaV,40)/Math.PI)*180;<br />

}<br />

}<br />

datosCompon<strong>en</strong>te[0][5].push(cont<strong>en</strong>edor_z);<br />

datosCompon<strong>en</strong>te[0][6].push(distancia);<br />

datosCompon<strong>en</strong>te[0][7].push(inclinacion);<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion "onEnterFrame" l<strong>la</strong>mada <strong>de</strong>s<strong>de</strong> el motor<strong>3D</strong>_ac<br />

//<br />

// -----------------------------------------------------------<br />

public function asignaPot<strong>en</strong>cial(t:Number):void {<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te<br />

cont<strong>en</strong>edor_z = datosCompon<strong>en</strong>te[0][5][t];<br />

distancia = datosCompon<strong>en</strong>te[0][6][t];<br />

inclinacion = datosCompon<strong>en</strong>te[0][7][t];<br />

}<br />

this.z = cont<strong>en</strong>edor_z;<br />

lineaGrafica.scaleX = distancia/40;<br />

cont<strong>en</strong>edorGrafico.rotationY = inclinacion;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

this.z = 0;<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

}<br />

}<br />

57


package com.fabrica.productor.fabricacion<br />

58


{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Compon<strong>en</strong>te3T (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo / 2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

public c<strong>la</strong>ss Compon<strong>en</strong>te3T ext<strong>en</strong>ds Compon<strong>en</strong>te {<br />

// ---------------------------------------------<br />

// Variables para manejo <strong>de</strong>l ususario<br />

// ---------------------------------------------<br />

// Datos <strong>de</strong>l compon<strong>en</strong>te para el susuario<br />

public var u_nombreCompon<strong>en</strong>te:String;<br />

public var u_valorCompon<strong>en</strong>te:Number;<br />

public var u_unida<strong>de</strong>sCompon<strong>en</strong>te:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Estructura <strong>de</strong> DATOS <strong>de</strong> "datosCompon<strong>en</strong>te":<br />

// datosCompon<strong>en</strong>te[0] = compon<strong>en</strong>te(id<strong>en</strong>tificador, numero_Punto_Rejil<strong>la</strong>,<br />

//<br />

xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[1] = terminal1(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[2] = terminal2(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// datosCompon<strong>en</strong>te[n] = terminaln(numero_Punto_Rejil<strong>la</strong>, xg, yg, zg)<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Pot<strong>en</strong>ciales <strong>de</strong> <strong>la</strong>s "terminales" <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

// --- Terminal 1 ---<br />

public var Vnodo1:Number; // Pot<strong>en</strong>cial (coord. "z")<br />

public var V1_t:Array; // V1(t) (coord. "z")<br />

// --- Terminal 2 ---<br />

public var Vnodo2:Number; // Pot<strong>en</strong>cial (coord. "z")<br />

public var V2_t:Array; // V2(t) (coord. "z")<br />

// --- Terminal 3 ---<br />

public var Vnodo3:Number; // Pot<strong>en</strong>cial (coord. "z")<br />

public var V3_t:Array; // V3(t) (coord. "z")<br />

public var <strong>de</strong>ltaV:Number; // Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion<br />

public var corri<strong>en</strong>te:Number;<br />

public var pot<strong>en</strong>cia:Number;<br />

// ---------------------------------------------<br />

// Ori<strong>en</strong>tacion para colocacion <strong>de</strong>l compon<strong>en</strong>te<br />

public var ori<strong>en</strong>tacion:String;<br />

// ---------------------------------------------<br />

// ---------------------------------------------<br />

// Variables auxiliares para el calculo <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas <strong>de</strong> <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

// ---------------------------------------------<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal1:Number;<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal2:Number;<br />

public var numero_Punto_Rejil<strong>la</strong>_Terminal3:Number;<br />

59


---------------------------------------------<br />

// -----------------------------------------------<br />

// Mo<strong>de</strong>lo matematico para "Metodo Nodal Modificado"<br />

// -----------------------------------------------<br />

public var mna:Array;<br />

// -----------------------------------------------<br />

public function especificaCompon<strong>en</strong>te(ori<strong>en</strong>tacion:String):void {<br />

u_id<strong>en</strong>tificadorCompon<strong>en</strong>te = i_id<strong>en</strong>tificadorCompon<strong>en</strong>te;<br />

this.ori<strong>en</strong>tacion = ori<strong>en</strong>tacion;<br />

// -------------------------------<br />

// Ori<strong>en</strong>tacion <strong>de</strong>l compon<strong>en</strong>te<br />

// -------------------------------<br />

offsetHorizontal = longitudCompon<strong>en</strong>te/2;<br />

offsetVertical = longitudCompon<strong>en</strong>te/2;<br />

switch (ori<strong>en</strong>tacion) {<br />

case "W":<br />

// ********************************<br />

// o (2)<br />

// (1) o<br />

// o (3)<br />

// ********************************<br />

rotation = 0;<br />

break;<br />

case "S":<br />

break;<br />

// ********************************<br />

// (2) o o (3)<br />

// o (1)<br />

//<br />

// ********************************<br />

rotation = 270;<br />

}<br />

*");<br />

}<br />

<strong>de</strong>fault:<br />

break;<br />

trace(" ");<br />

trace("*****************************************************");<br />

trace("* ERROR: COMPONENTE NO SOPORTADO<br />

trace("*****************************************************");<br />

overri<strong>de</strong> public function actualiza_Coord<strong>en</strong>adas_Terminales():void {<br />

switch (ori<strong>en</strong>tacion) {<br />

case "E":<br />

// ********************************<br />

// (-)(2) o<br />

// o (3)(Vo)<br />

// (+)(1) o<br />

// ********************************<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = datosCompon<strong>en</strong>te[0][1] +<br />

numeroPuntosAnchoRejil<strong>la</strong>;<br />

numeroPuntosAnchoRejil<strong>la</strong> - 2;<br />

break;<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = datosCompon<strong>en</strong>te[0][1] -<br />

numero_Punto_Rejil<strong>la</strong>_Terminal3 = datosCompon<strong>en</strong>te[0][1] + 1;<br />

case "W":<br />

// ********************************<br />

// o (2)<br />

// (1) o<br />

60


o (3)<br />

// ********************************<br />

// NPN - Base / CH-N - Gate / OPAMP - Output<br />

// PNP - Base / CH-P - Gate / OPAMP - Output<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = (cont<strong>en</strong>edorGrafico.x -<br />

separacionEntrePuntosRejil<strong>la</strong>)<br />

/separacionEntrePuntosRejil<strong>la</strong> +<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong> + 10;<br />

numeroPuntosAnchoRejil<strong>la</strong>;<br />

// NPN - Colector / CH-N - Drain / OPAMP - Inversora<br />

// PNP - Colector / CH-P - Drain / OPAMP - No-Inversora<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = numero_Punto_Rejil<strong>la</strong>_Terminal1 -<br />

// NPN - Emisor / CH-N - Source / OPAMP - No-Inversora<br />

// NPN - Emisor / CH-N - Source / OPAMP - Inversora<br />

numero_Punto_Rejil<strong>la</strong>_Terminal3 = numero_Punto_Rejil<strong>la</strong>_Terminal1 +<br />

numeroPuntosAnchoRejil<strong>la</strong> + 2;<br />

break;<br />

case "S":<br />

// ********************************<br />

// (2) o o (3)<br />

// o (1)<br />

//<br />

// ********************************<br />

// NPN - Base / CH-P - Gate / OPAMP - Output<br />

numero_Punto_Rejil<strong>la</strong>_Terminal1 = (cont<strong>en</strong>edorGrafico.x -<br />

separacionEntrePuntosRejil<strong>la</strong>)<br />

/separacionEntrePuntosRejil<strong>la</strong> +<br />

numero_Punto_Inicial_Fi<strong>la</strong>_Rejil<strong>la</strong><br />

numeroPuntosAnchoRejil<strong>la</strong> + 2 + 10;<br />

numeroPuntosAnchoRejil<strong>la</strong> - 2;<br />

// NPN - Colector / CH-P - Drain / OPAMP - Inversora<br />

numero_Punto_Rejil<strong>la</strong>_Terminal2 = numero_Punto_Rejil<strong>la</strong>_Terminal1 -<br />

// NPN - Emisor / CH-P - Source / OPAMP - No-Inversora<br />

numero_Punto_Rejil<strong>la</strong>_Terminal3 = numero_Punto_Rejil<strong>la</strong>_Terminal1 -<br />

+<br />

numeroPuntosAnchoRejil<strong>la</strong>;<br />

break;<br />

*");<br />

}<br />

<strong>de</strong>fault:<br />

break;<br />

trace(" ");<br />

trace("*****************************************************");<br />

trace("* ERROR: COMPONENTE NO SOPORTADO<br />

trace("*****************************************************");<br />

// -----------------------------------------------------------<br />

// Guardado <strong>de</strong> los datos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> un arreglo <strong>de</strong> datos:<br />

// "datosCompon<strong>en</strong>te"<br />

// -----------------------------------------------------------<br />

datosCompon<strong>en</strong>te[1] = new Array();<br />

datosCompon<strong>en</strong>te[2] = new Array();<br />

datosCompon<strong>en</strong>te[3] = new Array();<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal1 <strong>de</strong>l Compon<strong>en</strong>te ---<br />

datosCompon<strong>en</strong>te[1].push(numero_Punto_Rejil<strong>la</strong>_Terminal1);<br />

datosCompon<strong>en</strong>te[1].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal1].x);<br />

61


datosCompon<strong>en</strong>te[1].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal1].y);<br />

datosCompon<strong>en</strong>te[1].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl1 (3)<br />

// --- V1(t) (comportami<strong>en</strong>to <strong>en</strong> AC) ---<br />

datosCompon<strong>en</strong>te[1].push(new Array()); // [+] V1(t) (4)<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal2 <strong>de</strong>l Compon<strong>en</strong>te ---<br />

datosCompon<strong>en</strong>te[2].push(numero_Punto_Rejil<strong>la</strong>_Terminal2);<br />

datosCompon<strong>en</strong>te[2].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal2].x);<br />

datosCompon<strong>en</strong>te[2].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal2].y);<br />

datosCompon<strong>en</strong>te[2].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl2 (3)<br />

// --- V2(t) (comportami<strong>en</strong>to <strong>en</strong> AC) ---<br />

datosCompon<strong>en</strong>te[2].push(new Array()); // [-] V2(t) (4)<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas a <strong>la</strong> terminal3 <strong>de</strong>l Compon<strong>en</strong>te ---<br />

datosCompon<strong>en</strong>te[3].push(numero_Punto_Rejil<strong>la</strong>_Terminal3);<br />

datosCompon<strong>en</strong>te[3].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal3].x);<br />

datosCompon<strong>en</strong>te[3].push(puntosRejil<strong>la</strong>[numero_Punto_Rejil<strong>la</strong>_Terminal3].y);<br />

datosCompon<strong>en</strong>te[3].push(0); // coord<strong>en</strong>ada "z" <strong>de</strong> <strong>la</strong> termianl3 (3)<br />

// --- V2(t) (comportami<strong>en</strong>to <strong>en</strong> AC) ---<br />

datosCompon<strong>en</strong>te[3].push(new Array()); // [Vo] V3(t) (4)<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//trace("Compon<strong>en</strong>te3TF:: [x] datosCompon<strong>en</strong>te[0]= "+datosCompon<strong>en</strong>te[0]);<br />

//trace("Compon<strong>en</strong>te3TF:: [+] datosCompon<strong>en</strong>te[1]= "+datosCompon<strong>en</strong>te[1]);<br />

//trace("Compon<strong>en</strong>te3TF:: [-] datosCompon<strong>en</strong>te[2]= "+datosCompon<strong>en</strong>te[2]);<br />

//trace("Compon<strong>en</strong>te3TF:: [Vo] datosCompon<strong>en</strong>te[3]= "+datosCompon<strong>en</strong>te[3]);<br />

}<br />

}<br />

}<br />

overri<strong>de</strong> public function abrirPantal<strong>la</strong>Edicion(evt:MouseEv<strong>en</strong>t):void {<br />

if (v<strong>en</strong>tanaEdicionPermitida) {<br />

v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.abrir(this);<br />

}<br />

}<br />

public function update():void {<br />

}<br />

62


package com.fabrica.productor.fabricacion<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se ABSTRACTA: FabricarCompon<strong>en</strong>te (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// Esta c<strong>la</strong>se constituye <strong>la</strong> <strong>de</strong>finicion <strong>de</strong> <strong>la</strong> c<strong>la</strong>se base para el<br />

// proceso <strong>de</strong> FABRICACION <strong>de</strong> todos los compon<strong>en</strong>tes utilizados <strong>en</strong><br />

// el simu<strong>la</strong>dor<br />

//<br />

// C<strong>la</strong>ses <strong>de</strong>rivadas:<br />

//<br />

// - FabricarTierra --> tierra<br />

// - FabricarA<strong>la</strong>mbre1 --> a<strong>la</strong>mbre <strong>la</strong>rgo (40 pixeles)<br />

// - FabricarA<strong>la</strong>mbre2 --> a<strong>la</strong>mbre corto (20 pixeles)<br />

// - FabricarResist<strong>en</strong>cia --> resist<strong>en</strong>cia<br />

// - FabricarCapacitor --> capacitor<br />

// - FabricarVDC --> fu<strong>en</strong>te <strong>de</strong> voltaje DC<br />

// - FabricarVAC --> fu<strong>en</strong>te <strong>de</strong> voltaje AC<br />

// - FabricarIDC --> fu<strong>en</strong>te <strong>de</strong> corri<strong>en</strong>te DC<br />

// - FabricarOpAmp --> amplificador<br />

operacional<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.Sprite;<br />

// Error al int<strong>en</strong>tar g<strong>en</strong>erar un objeto <strong>de</strong> esta c<strong>la</strong>se abstracta<br />

import f<strong>la</strong>sh.errors.IllegalOperationError;<br />

// C<strong>la</strong>se ABSTRACTA (<strong>de</strong>be ser "ext<strong>en</strong>dida"<br />

// y no int<strong>en</strong>tar "g<strong>en</strong>erar objetos" <strong>de</strong> el<strong>la</strong>)<br />

public c<strong>la</strong>ss FabricarCompon<strong>en</strong>te {<br />

public function Fabricar(target:Sprite, parametros:Object,<br />

ori<strong>en</strong>tacion:String):void {<br />

}<br />

var compon<strong>en</strong>te:Compon<strong>en</strong>te = this.CrearCompon<strong>en</strong>te();<br />

compon<strong>en</strong>te.inicializaParametros(parametros,target);<br />

compon<strong>en</strong>te.especificaCompon<strong>en</strong>te(ori<strong>en</strong>tacion);<br />

compon<strong>en</strong>te.colocacionInicial();<br />

target.addChild(compon<strong>en</strong>te);<br />

protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

// -----------------------------------------------------------<br />

63


subc<strong>la</strong>se");<br />

}<br />

// Metodo ABSTRACTO: se <strong>de</strong>be "<strong>de</strong>finir" <strong>en</strong> una subc<strong>la</strong>se<br />

// -----------------------------------------------------------<br />

throw new IllegalOperationError("Metodo abtracto: <strong>de</strong>be ser <strong>de</strong>finido <strong>en</strong> una<br />

return null;<br />

}<br />

}<br />

64


package com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarA<strong>la</strong>mbre1 (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarA<strong>la</strong>mbre1 ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new A<strong>la</strong>mbre1;<br />

}<br />

}<br />

}<br />

65


package com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarAambre2 (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarA<strong>la</strong>mbre2 ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new A<strong>la</strong>mbre2;<br />

}<br />

}<br />

}<br />

66


package com.fabrica.productor.compon<strong>en</strong>tes.capacitor<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarCapacitor (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarCapacitor ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Capacitor;<br />

}<br />

}<br />

}<br />

67


package com.fabrica.productor.compon<strong>en</strong>tes.resist<strong>en</strong>cia<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarResist<strong>en</strong>cia (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarResist<strong>en</strong>cia ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Resist<strong>en</strong>cia;<br />

}<br />

}<br />

}<br />

68


package com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarVDC (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarVDC ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Fu<strong>en</strong>teVDC;<br />

}<br />

}<br />

}<br />

69


package com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarVAC (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarVAC ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Fu<strong>en</strong>teVAC;<br />

}<br />

}<br />

}<br />

70


package com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesCorri<strong>en</strong>te<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarIDC (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarIDC ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Fu<strong>en</strong>teIDC;<br />

}<br />

}<br />

}<br />

71


package com.fabrica.productor.compon<strong>en</strong>tes.opamp<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarOpAmp (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarOpAmp ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new OpAmp;<br />

}<br />

}<br />

}<br />

72


package com.fabrica.productor.compon<strong>en</strong>tes.conexion<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: FabricarTierra (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "FabricarCompon<strong>en</strong>te"<br />

//<br />

// **************************************************************<br />

// Establece <strong>la</strong> FUNCIONALIDAD <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

// Proceso <strong>de</strong> FABRICACION <strong>de</strong>l compon<strong>en</strong>te<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

public c<strong>la</strong>ss FabricarTierra ext<strong>en</strong>ds FabricarCompon<strong>en</strong>te {<br />

overri<strong>de</strong> protected function CrearCompon<strong>en</strong>te():Compon<strong>en</strong>te {<br />

return new Tierra;<br />

}<br />

}<br />

}<br />

73


package com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: A<strong>la</strong>mbre1 (PRODUCTO) [A<strong>la</strong>mbre <strong>la</strong>rgo: 40 pixeles]<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te2T;<br />

public c<strong>la</strong>ss A<strong>la</strong>mbre1 ext<strong>en</strong>ds Compon<strong>en</strong>te2T {<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong>l a<strong>la</strong>mbre1 (<strong>la</strong>rgo)<br />

//<br />

// -----------------------------------------------------------<br />

public function A<strong>la</strong>mbre1():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "A<strong>la</strong>mbre1"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "fondo"<br />

fondoGrafico = new mc_FondoLargo();<br />

cont<strong>en</strong>edorGrafico.addChild(fondoGrafico);<br />

// Capa 2 : "simbolo"<br />

simboloGrafico = new mc_ALargo();<br />

lineaGrafica = simboloGrafico;<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// Capa 3 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te();<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

75


--- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "W";<br />

u_nombreCompon<strong>en</strong>te = "A<strong>la</strong>mbre";<br />

u_valorCompon<strong>en</strong>te = 0;<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "ohms";<br />

// 0 ohms<br />

}<br />

// --- No permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = false;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "A<strong>la</strong>mbre1"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

}<br />

// --- Asignacion <strong>de</strong> voltajes nodales ---<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

}<br />

// --- Asignacion <strong>de</strong> corri<strong>en</strong>tes <strong>de</strong> rama ---<br />

this.corri<strong>en</strong>te = corri<strong>en</strong>te;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- Inicializa compon<strong>en</strong>te ---<br />

colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>);<br />

76


}<br />

// --- Activar corri<strong>en</strong>te ---<br />

activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

public function colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*Vnodo1;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = (Math.atan2(dv,40)/Math.PI)*180;<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

public function activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- CORRIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te =<br />

Math.ceil(factor_conversion*LN_LOG*Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(corri<strong>en</strong>te) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.rotationY = 0;<br />

if (corri<strong>en</strong>te


}<br />

corri<strong>en</strong>teGrafica.visible = true;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>():void {<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

lineaGrafica.alpha = 1;<br />

fondoGrafico.alpha = 1;<br />

corri<strong>en</strong>teGrafica.scaleX = 1;<br />

corri<strong>en</strong>teGrafica.gotoAndStop("i0");<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

}<br />

}<br />

78


package com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: A<strong>la</strong>mbre2 (PRODUCTO) [A<strong>la</strong>mbre corto: 20 pixeles]<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.A<strong>la</strong>mbreCorto2T;<br />

public c<strong>la</strong>ss A<strong>la</strong>mbre2 ext<strong>en</strong>ds A<strong>la</strong>mbreCorto2T {<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong>l a<strong>la</strong>mbre2 (corto)<br />

//<br />

// -----------------------------------------------------------<br />

public function A<strong>la</strong>mbre2():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "A<strong>la</strong>mbre2"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "fondo"<br />

fondoGrafico = new mc_FondoCorto();<br />

cont<strong>en</strong>edorGrafico.addChild(fondoGrafico);<br />

// Capa 2 : "simbolo"<br />

simboloGrafico = new mc_ACorto();<br />

lineaGrafica = simboloGrafico;<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te2();<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

79


--- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "W2";<br />

u_nombreCompon<strong>en</strong>te = "A<strong>la</strong>mbre";<br />

u_valorCompon<strong>en</strong>te = 0;<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "ohms";<br />

// 0 ohms<br />

}<br />

// --- No permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = false;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "A<strong>la</strong>mbre2"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

}<br />

// --- Asignacion <strong>de</strong> voltajes nodales ---<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

}<br />

// --- Asignacion <strong>de</strong> corri<strong>en</strong>tes <strong>de</strong> rama ---<br />

this.corri<strong>en</strong>te = corri<strong>en</strong>te;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function<br />

activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// Inicializa compon<strong>en</strong>te<br />

colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>);<br />

// Activar corri<strong>en</strong>te<br />

80


}<br />

activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

public function colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*Vnodo1;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = (Math.atan2(dv,40)/Math.PI)*180;<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

public function activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- CORRIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te =<br />

Math.ceil(factor_conversion*LN_LOG*Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(corri<strong>en</strong>te) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.rotationY = 0;<br />

corri<strong>en</strong>teGrafica.x = -10; // Para c<strong>en</strong>trar <strong>la</strong> corri<strong>en</strong>te<br />

if (corri<strong>en</strong>te


}<br />

corri<strong>en</strong>teGrafica.visible = true;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>():void {<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

lineaGrafica.alpha = 1;<br />

fondoGrafico.alpha = 1;<br />

corri<strong>en</strong>teGrafica.scaleX = 1;<br />

corri<strong>en</strong>teGrafica.gotoAndStop("i0");<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

}<br />

}<br />

82


package com.fabrica.productor.compon<strong>en</strong>tes.capacitor<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Capacitor (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te2T;<br />

public c<strong>la</strong>ss Capacitor ext<strong>en</strong>ds Compon<strong>en</strong>te2T {<br />

public var C:Number;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong>l capacitor<br />

//<br />

// -----------------------------------------------------------<br />

public function Capacitor():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "Capacitor"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "linea"<br />

lineaGrafica = new mc_Linea2();<br />

cont<strong>en</strong>edorGrafico.addChild(lineaGrafica);<br />

// Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te();<br />

corri<strong>en</strong>teGrafica.z = 0;<br />

corri<strong>en</strong>teGrafica.visible = false;<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

// Capa 3 : "simbolo"<br />

83


simboloGrafico = new mc_C();<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// --- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "C";<br />

u_nombreCompon<strong>en</strong>te = "Capacitor";<br />

u_valorCompon<strong>en</strong>te = 100E-6; // 100 uF<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "Farad";<br />

G = u_valorCompon<strong>en</strong>te; // 2*PI*f = 1<br />

}<br />

// --- Permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = true;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "Capacitor"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

// Asignacion <strong>de</strong> voltajes nodales<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

}<br />

// Actualiza valor <strong>de</strong>l compon<strong>en</strong>te<br />

C = u_valorCompon<strong>en</strong>te;<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

this.corri<strong>en</strong>te = corri<strong>en</strong>te;<br />

}<br />

// Calculo <strong>de</strong> <strong>la</strong> pot<strong>en</strong>cia reactiva<br />

pot<strong>en</strong>cia = <strong>de</strong>ltaV * corri<strong>en</strong>te;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

84


-----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// Inicializa compon<strong>en</strong>te<br />

colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>);<br />

// Activar corri<strong>en</strong>te<br />

activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

}<br />

public function colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*(Vnodo1 + Vnodo2)/2;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = (Math.atan2(dv,40)/Math.PI)*180;<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = -angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

public function activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- CORRIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te = Math.ceil(factor_conversion*LN_LOG*<br />

Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(<strong>de</strong>ltaV) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.scaleX = distancia/40;<br />

corri<strong>en</strong>teGrafica.alpha = 0.9;<br />

lineaGrafica.alpha = valorCorri<strong>en</strong>te/10;<br />

85


}<br />

}<br />

corri<strong>en</strong>teGrafica.gotoAndP<strong>la</strong>y("i"+valorCorri<strong>en</strong>te.toString());<br />

corri<strong>en</strong>teGrafica.rotationY = 0;<br />

if (<strong>de</strong>ltaV


package com.fabrica.productor.compon<strong>en</strong>tes.resist<strong>en</strong>cia<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Resist<strong>en</strong>cia (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te2T;<br />

public c<strong>la</strong>ss Resist<strong>en</strong>cia ext<strong>en</strong>ds Compon<strong>en</strong>te2T {<br />

public var R:Number;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong> <strong>la</strong> resist<strong>en</strong>cia<br />

//<br />

// -----------------------------------------------------------<br />

public function Resist<strong>en</strong>cia():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "Resist<strong>en</strong>cia"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "linea"<br />

lineaGrafica = new mc_Linea();<br />

cont<strong>en</strong>edorGrafico.addChild(lineaGrafica);<br />

// Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te();<br />

corri<strong>en</strong>teGrafica.z = 0;<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

// Capa 3 : "simbolo"<br />

simboloGrafico = new mc_R();<br />

87


cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// --- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "R";<br />

u_nombreCompon<strong>en</strong>te = "Resist<strong>en</strong>cia";<br />

u_valorCompon<strong>en</strong>te = 1000; // 1000 ohms<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "ohms";<br />

}<br />

// --- Permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = true;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "Resist<strong>en</strong>cia"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

// --- Asignacion <strong>de</strong> voltajes nodales ---<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo1 - Vnodo2;<br />

// --- Actualiza valor <strong>de</strong>l compon<strong>en</strong>te ---<br />

R = u_valorCompon<strong>en</strong>te;<br />

// --- Calculo <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te ---<br />

if (Math.abs(<strong>de</strong>ltaV) > 1e-10) {<br />

corri<strong>en</strong>te = <strong>de</strong>ltaV/R;<br />

} else {<br />

corri<strong>en</strong>te = 0;<br />

}<br />

// Ley <strong>de</strong> Ohm<br />

}<br />

// --- Calculo <strong>de</strong> <strong>la</strong> pot<strong>en</strong>cia ---<br />

pot<strong>en</strong>cia = <strong>de</strong>ltaV * corri<strong>en</strong>te;<br />

// -----------------------------------------------------------<br />

//<br />

88


Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- Inicializa compon<strong>en</strong>te ---<br />

colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>);<br />

// --- Activar corri<strong>en</strong>te ---<br />

activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

}<br />

public function colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*(Vnodo1 + Vnodo2)/2;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

calcu<strong>la</strong>DistanciaAngulo(factorEsca<strong>la</strong><strong>3D</strong>);<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = -angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

public function calcu<strong>la</strong>DistanciaAngulo(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

}<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = (Math.atan2(dv,40)/Math.PI)*180;<br />

private function activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- CORRIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te = Math.ceil(factor_conversion*LN_LOG*<br />

89


Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(<strong>de</strong>ltaV) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.scaleX = distancia/40;<br />

corri<strong>en</strong>teGrafica.alpha = 0.9; //0.5;<br />

lineaGrafica.alpha = valorCorri<strong>en</strong>te/10;<br />

corri<strong>en</strong>teGrafica.gotoAndP<strong>la</strong>y("i"+valorCorri<strong>en</strong>te.toString());<br />

corri<strong>en</strong>teGrafica.rotationY = 0;<br />

if (<strong>de</strong>ltaV


package com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Fu<strong>en</strong>teVDC (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te2T;<br />

public c<strong>la</strong>ss Fu<strong>en</strong>teVDC ext<strong>en</strong>ds Compon<strong>en</strong>te2T {<br />

// Tipo <strong>de</strong> Fu<strong>en</strong>te <strong>de</strong> Voltaje<br />

public var i_tipoFu<strong>en</strong>te:String;<br />

// Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion normalizada<br />

private var dv:Number;<br />

// Distancia <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

private var distancia:Number;<br />

// Angulo <strong>en</strong>tre <strong>la</strong>s terminales 1 y 2<br />

private var angulo:Number;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong> <strong>la</strong> fu<strong>en</strong>te <strong>de</strong> voltaje DC<br />

//<br />

// -----------------------------------------------------------<br />

public function Fu<strong>en</strong>teVDC():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "Fu<strong>en</strong>teVDC"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "linea"<br />

lineaGrafica = new mc_Linea();<br />

cont<strong>en</strong>edorGrafico.addChild(lineaGrafica);<br />

91


Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te();<br />

corri<strong>en</strong>teGrafica.z = 0;<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

// Capa 3 : "simbolo"<br />

simboloGrafico = new mc_VDC();<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// --- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "V";<br />

i_tipoFu<strong>en</strong>te = "DC";<br />

u_nombreCompon<strong>en</strong>te = "Fu<strong>en</strong>te <strong>de</strong> Voltaje DC";<br />

u_valorCompon<strong>en</strong>te = 10;<br />

// 10 volts<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "volts";<br />

}<br />

// --- Permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = true;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "Fu<strong>en</strong>teVDC"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

infoV<strong>en</strong>tana[3] = new Array();<br />

infoV<strong>en</strong>tana[3] = ["Fu<strong>en</strong>te:","Voltaje","DC"];<br />

infoV<strong>en</strong>tana[4] = new Array();<br />

infoV<strong>en</strong>tana[4] = ["Tipo:","In<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te"];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

// Asignacion <strong>de</strong> voltajes nodales<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

}<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

this.corri<strong>en</strong>te = corri<strong>en</strong>te;<br />

}<br />

92


-----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*(Vnodo1 + Vnodo2)/2;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = -(Math.atan2(dv,40)/Math.PI)*180;<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

// --- CORIIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te = Math.ceil(factor_conversion*LN_LOG*<br />

Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(corri<strong>en</strong>te) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.rotationY = 180;<br />

if (corri<strong>en</strong>te


}<br />

corri<strong>en</strong>teGrafica.visible = true;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>():void {<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

lineaGrafica.alpha = 1;<br />

corri<strong>en</strong>teGrafica.scaleX = 1;<br />

corri<strong>en</strong>teGrafica.gotoAndStop("i0");<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

}<br />

}<br />

94


package com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Fu<strong>en</strong>teVAC (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te2T;<br />

public c<strong>la</strong>ss Fu<strong>en</strong>teVAC ext<strong>en</strong>ds Compon<strong>en</strong>te2T {<br />

// Tipo <strong>de</strong> Fu<strong>en</strong>te <strong>de</strong> Voltaje<br />

public var i_tipoFu<strong>en</strong>te:String;<br />

// Amplitud<br />

public var u_amplitudVoltaje:Number;<br />

private var i_unida<strong>de</strong>sVoltaje:String;<br />

// Fase<br />

public var u_faseVoltaje:Number;<br />

private var i_unida<strong>de</strong>sFase:String;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong> <strong>la</strong> fu<strong>en</strong>te <strong>de</strong> voltaje AC<br />

//<br />

// -----------------------------------------------------------<br />

public function Fu<strong>en</strong>teVAC():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "Fu<strong>en</strong>teVAC"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "linea"<br />

lineaGrafica = new mc_Linea();<br />

cont<strong>en</strong>edorGrafico.addChild(lineaGrafica);<br />

95


Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te();<br />

corri<strong>en</strong>teGrafica.z = 0;<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

// Capa 3 : "simbolo"<br />

simboloGrafico = new mc_VAC();<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// --- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "V";<br />

i_tipoFu<strong>en</strong>te = "AC";<br />

u_nombreCompon<strong>en</strong>te = "Fu<strong>en</strong>te <strong>de</strong> Voltaje AC";<br />

u_valorCompon<strong>en</strong>te = 10;<br />

// 10 Vp<br />

u_amplitudVoltaje = u_valorCompon<strong>en</strong>te;<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "Vpico";<br />

i_unida<strong>de</strong>sVoltaje = u_unida<strong>de</strong>sCompon<strong>en</strong>te;<br />

u_faseVoltaje = 0;<br />

i_unida<strong>de</strong>sFase = "Grados";<br />

// 0 grados<br />

}<br />

// --- Permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = true;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "Fu<strong>en</strong>teVAC"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_amplitudVoltaje,i_unida<strong>de</strong>sVoltaje];<br />

infoV<strong>en</strong>tana[3] = new Array();<br />

infoV<strong>en</strong>tana[3] = ["Fase:",u_faseVoltaje,i_unida<strong>de</strong>sFase];<br />

infoV<strong>en</strong>tana[4] = new Array();<br />

infoV<strong>en</strong>tana[4] = ["Fu<strong>en</strong>te:","Voltaje","AC"];<br />

infoV<strong>en</strong>tana[5] = new Array();<br />

infoV<strong>en</strong>tana[5] = ["Tipo:","In<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te"];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

// Asignacion <strong>de</strong> voltajes nodales<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

96


}<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

this.corri<strong>en</strong>te = corri<strong>en</strong>te;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// Inicializa compon<strong>en</strong>te<br />

colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>);<br />

// Activar corri<strong>en</strong>te<br />

activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

}<br />

public function colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*(Vnodo1 + Vnodo2)/2;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = -(Math.atan2(dv,40)/Math.PI)*180;<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

public function activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- CORIIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

97


var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te = Math.ceil(factor_conversion*LN_LOG*<br />

Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

}<br />

if (Math.abs(corri<strong>en</strong>te) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.rotationY = 180;<br />

if (corri<strong>en</strong>te


package com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesCorri<strong>en</strong>te<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Fu<strong>en</strong>teIDC (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te2T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te2T;<br />

public c<strong>la</strong>ss Fu<strong>en</strong>teIDC ext<strong>en</strong>ds Compon<strong>en</strong>te2T {<br />

// Tipo <strong>de</strong> Fu<strong>en</strong>te <strong>de</strong> Corri<strong>en</strong>te<br />

public var i_tipoFu<strong>en</strong>te:String;<br />

// Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion normalizada<br />

private var dv:Number;<br />

// Distancia <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

private var distancia:Number;<br />

// Angulo <strong>en</strong>tre <strong>la</strong>s terminales 1 y 2<br />

private var angulo:Number;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong> <strong>la</strong> fu<strong>en</strong>te <strong>de</strong> corri<strong>en</strong>te DC<br />

//<br />

// -----------------------------------------------------------<br />

public function Fu<strong>en</strong>teIDC():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "Fu<strong>en</strong>teIDC"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

// Capa 1 : "linea"<br />

lineaGrafica = new mc_Linea();<br />

cont<strong>en</strong>edorGrafico.addChild(lineaGrafica);<br />

99


Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te();<br />

corri<strong>en</strong>teGrafica.z = 0;<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

// Capa 3 : "simbolo"<br />

simboloGrafico = new mc_IDC();<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// --- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "I";<br />

i_tipoFu<strong>en</strong>te = "DC";<br />

u_nombreCompon<strong>en</strong>te = "Fu<strong>en</strong>te <strong>de</strong> Corri<strong>en</strong>te DC";<br />

u_valorCompon<strong>en</strong>te = 10E-3; // 10 mA<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = "ampere";<br />

}<br />

// --- Permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = true;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "Fu<strong>en</strong>teIDC"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Valor:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

infoV<strong>en</strong>tana[3] = new Array();<br />

infoV<strong>en</strong>tana[3] = ["Fu<strong>en</strong>te:","Corri<strong>en</strong>te","DC"];<br />

infoV<strong>en</strong>tana[4] = new Array();<br />

infoV<strong>en</strong>tana[4] = ["Tipo:","In<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te"];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

public function asignarVoltajesNodales():void {<br />

// Asignacion <strong>de</strong> voltajes nodales<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

<strong>de</strong>ltaV = Vnodo2 - Vnodo1;<br />

}<br />

// Calculo <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te<br />

corri<strong>en</strong>te = u_valorCompon<strong>en</strong>te;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

100


}<br />

// --- Dummy ---<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*(Vnodo1 + Vnodo2)/2;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = -(Math.atan2(dv,40)/Math.PI)*180;<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

// --- CORIIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te = Math.ceil(factor_conversion*LN_LOG*<br />

Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(corri<strong>en</strong>te) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.rotationY = 180;<br />

if (corri<strong>en</strong>te


}<br />

}<br />

lineaGrafica.alpha = valorCorri<strong>en</strong>te/10;<br />

corri<strong>en</strong>teGrafica.gotoAndP<strong>la</strong>y("i"+valorCorri<strong>en</strong>te.toString());<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>():void {<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

lineaGrafica.alpha = 1;<br />

corri<strong>en</strong>teGrafica.scaleX = 1;<br />

corri<strong>en</strong>teGrafica.gotoAndStop("i0");<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

}<br />

}<br />

102


package com.fabrica.productor.compon<strong>en</strong>tes.opamp<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: OpAmp (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se base heredada: "Compon<strong>en</strong>te3T"<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// C<strong>la</strong>se base<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te3T;<br />

public c<strong>la</strong>ss OpAmp ext<strong>en</strong>ds Compon<strong>en</strong>te3T {<br />

public var Av:Number;<br />

// Difer<strong>en</strong>cia <strong>de</strong> t<strong>en</strong>sion normalizada<br />

private var dv:Number;<br />

// Distancia <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

private var distancia:Number;<br />

// Angulo <strong>en</strong>tre <strong>la</strong>s terminales 2 y 3<br />

private var angulo:Number;<br />

// Inclinacion <strong>de</strong>l compo<strong>en</strong>nte <strong>en</strong>tre <strong>la</strong>s terminales 2 y 3<br />

private var inclinacion:Number;<br />

private var V_inversora:Number;<br />

private var V_noinversora:Number;<br />

private var Vo:Number;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ESPECIFICACION <strong>de</strong>l Amplificador Operacional<br />

//<br />

// -----------------------------------------------------------<br />

public function OpAmp():void {<br />

// -----------------------------------------------------------<br />

// Constructor <strong>de</strong>l objeto "OpAmp"<br />

// -----------------------------------------------------------<br />

// --- G<strong>en</strong>era dibujo <strong>de</strong>l compon<strong>en</strong>te ---<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edorGrafico = new MovieClip();<br />

addChild(cont<strong>en</strong>edorGrafico);<br />

103


Capa 1 : "linea"<br />

lineaGrafica = new MovieClip();<br />

lineaSalida = new mc_OpAmp_LineaSalida();<br />

lineaEntrada = new mc_OpAmp_LineaEntrada();<br />

lineaGrafica.addChild(lineaSalida);<br />

lineaGrafica.addChild(lineaEntrada);<br />

cont<strong>en</strong>edorGrafico.addChild(lineaGrafica);<br />

// Capa 2 : "corri<strong>en</strong>te"<br />

corri<strong>en</strong>teGrafica = new mc_Corri<strong>en</strong>te2();<br />

corri<strong>en</strong>teGrafica.z = 0;<br />

cont<strong>en</strong>edorGrafico.addChild(corri<strong>en</strong>teGrafica);<br />

corri<strong>en</strong>teGrafica.visible = false;<br />

// Capa 3 : "simbolo"<br />

simboloGrafico = new mc_OpAmp();<br />

cont<strong>en</strong>edorGrafico.addChild(simboloGrafico);<br />

// --- Inicializa parametros ---<br />

i_tipoCompon<strong>en</strong>te = "A";<br />

u_nombreCompon<strong>en</strong>te = "Amplificador Operacional I<strong>de</strong>al";<br />

u_valorCompon<strong>en</strong>te = 1000; // Ganancia <strong>en</strong> Lazo Abierto<br />

u_unida<strong>de</strong>sCompon<strong>en</strong>te = " ";<br />

}<br />

// --- Permite abrir v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

v<strong>en</strong>tanaEdicionPermitida = true;<br />

public function v<strong>en</strong>tanaInformativa():Array {<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana informativa <strong>de</strong>l objeto "OpAmp"<br />

// -----------------------------------------------------------<br />

var infoV<strong>en</strong>tana:Array = new Array();<br />

infoV<strong>en</strong>tana[0] = u_nombreCompon<strong>en</strong>te;<br />

infoV<strong>en</strong>tana[1] = new Array();<br />

infoV<strong>en</strong>tana[1] = ["Id<strong>en</strong>tificador:", , ];<br />

infoV<strong>en</strong>tana[2] = new Array();<br />

infoV<strong>en</strong>tana[2] = ["Av:",u_valorCompon<strong>en</strong>te,u_unida<strong>de</strong>sCompon<strong>en</strong>te];<br />

}<br />

return infoV<strong>en</strong>tana;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> EVALUACION <strong>de</strong> VOLTAJES y CORRIENTES<br />

//<br />

// -----------------------------------------------------------<br />

public function asignarVoltajesNodales():void {<br />

// Asignacion <strong>de</strong> voltajes nodales<br />

Vnodo1 = datosCompon<strong>en</strong>te[1][3];<br />

Vnodo2 = datosCompon<strong>en</strong>te[2][3];<br />

Vnodo3 = datosCompon<strong>en</strong>te[3][3];<br />

// V_no_inversora<br />

// V_inversora<br />

// Vo<br />

104


}<br />

V_noinversora = Vnodo1;<br />

V_inversora = Vnodo2;<br />

Vo = Vnodo3;<br />

<strong>de</strong>ltaV = Vo - V_inversora;<br />

public function asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>te:Number):void {<br />

this.corri<strong>en</strong>te = corri<strong>en</strong>te;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ACTIVACION DE COMPORTAMIENTO EN <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number,<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// Inicializa compon<strong>en</strong>te<br />

colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>);<br />

// Activar corri<strong>en</strong>te<br />

activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

}<br />

public function colocarCompon<strong>en</strong>teEspacio<strong>3D</strong>(factorEsca<strong>la</strong><strong>3D</strong>:Number):void {<br />

removerList<strong>en</strong>ers();<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto medio <strong>de</strong> <strong>la</strong>s<br />

// coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal y aplica el factor <strong>de</strong> esca<strong>la</strong><br />

// para normalizar <strong>la</strong> altura <strong>de</strong>l compon<strong>en</strong>te<br />

cont<strong>en</strong>edorGrafico.z = factorEsca<strong>la</strong><strong>3D</strong>*(Vnodo3 + Vnodo2)/2;<br />

// Actualiza <strong>la</strong> coord<strong>en</strong>ada "z" <strong>de</strong>l compon<strong>en</strong>te<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

// Aplica el factor <strong>de</strong> esca<strong>la</strong> <strong>en</strong> <strong>3D</strong> para normalizar <strong>la</strong> difer<strong>en</strong>cia<br />

// <strong>de</strong> voltajes <strong>en</strong>tre <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

dv = factorEsca<strong>la</strong><strong>3D</strong>*<strong>de</strong>ltaV;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(dv*dv + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 1 a <strong>la</strong> 2<br />

angulo = (Math.atan2(dv,40)/Math.PI)*180;<br />

}<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te <strong>de</strong> acuerdo a los resultados<br />

cont<strong>en</strong>edorGrafico.rotationY = -angulo;<br />

lineaGrafica.scaleX = distancia/40;<br />

public function activarCorri<strong>en</strong>te(esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object):void {<br />

// --- CORRIENTE ---<br />

var valorCorri<strong>en</strong>te:Number;<br />

if (esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.lineal) {<br />

// Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LINEAL<br />

valorCorri<strong>en</strong>te = 10;<br />

} else {<br />

105


Repres<strong>en</strong>tacion <strong>en</strong> ESCALA LOGARITMICA<br />

var corri<strong>en</strong>teMinima:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima;<br />

var factor_conversion:Number =<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion;<br />

valorCorri<strong>en</strong>te = Math.ceil(factor_conversion*LN_LOG*<br />

Math.log(Math.abs(corri<strong>en</strong>te)/corri<strong>en</strong>teMinima))+1;<br />

}<br />

if (Math.abs(corri<strong>en</strong>te) > 1e-10) {<br />

corri<strong>en</strong>teGrafica.rotationY = 0;<br />

corri<strong>en</strong>teGrafica.x = 15; // Para c<strong>en</strong>trar <strong>la</strong> corri<strong>en</strong>te<br />

lineaSalida.alpha = valorCorri<strong>en</strong>te/10;<br />

corri<strong>en</strong>teGrafica.scaleX = distancia/40;<br />

corri<strong>en</strong>teGrafica.gotoAndP<strong>la</strong>y("i"+valorCorri<strong>en</strong>te.toString());<br />

corri<strong>en</strong>teGrafica.rotationY = 0;<br />

}<br />

if (corri<strong>en</strong>te


[0][5]<br />

[0][6]<br />

[0][7]<br />

datosCompon<strong>en</strong>te[0][5] = new Array(); // Ubicacion(t) <strong>en</strong>tre nodos "z" //<br />

datosCompon<strong>en</strong>te[0][6] = new Array(); // Distancia(t) <strong>en</strong>tre nodos //<br />

datosCompon<strong>en</strong>te[0][7] = new Array(); // Inclinacion(t) <strong>en</strong>tre nodos //<br />

// Asignacion <strong>de</strong>l "arreglo <strong>de</strong> voltajes nodales"<br />

// a <strong>la</strong>s terminales <strong>de</strong>l compon<strong>en</strong>te<br />

V1_t = datosCompon<strong>en</strong>te[1][4]; // [+]<br />

V2_t = datosCompon<strong>en</strong>te[2][4]; // [-]<br />

V3_t = datosCompon<strong>en</strong>te[3][4]; // [Vo]<br />

for (i in V1_t) {<br />

<strong>de</strong>ltaV = V2_t[i] - V3_t[i];<br />

// Coloca el compon<strong>en</strong>te a una altura igual al punto<br />

// medio <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas "z" <strong>de</strong> cada terminal<br />

cont<strong>en</strong>edor_z = (V2_t[i] + V3_t[i])/2;<br />

// Calcu<strong>la</strong> distancia geometrica <strong>en</strong>tre terminales <strong>de</strong>l compon<strong>en</strong>te<br />

distancia = Math.sqrt(<strong>de</strong>ltaV*<strong>de</strong>ltaV + 1600);<br />

// Calcu<strong>la</strong> angulo <strong>de</strong> <strong>la</strong> terminal 2 a <strong>la</strong> 3<br />

inclinacion = (Math.atan2(<strong>de</strong>ltaV,40)/Math.PI)*180;<br />

}<br />

}<br />

datosCompon<strong>en</strong>te[0][5].push(cont<strong>en</strong>edor_z);<br />

datosCompon<strong>en</strong>te[0][6].push(distancia);<br />

datosCompon<strong>en</strong>te[0][7].push(inclinacion);<br />

public function asignaPot<strong>en</strong>cial(t:Number):void {<br />

// -----------------------------------------------------------<br />

// Funcion "onEnterFrame" l<strong>la</strong>mada <strong>de</strong>s<strong>de</strong> el motor<strong>3D</strong>_ac<br />

// -----------------------------------------------------------<br />

// Rota, esca<strong>la</strong> y ori<strong>en</strong>ta el compon<strong>en</strong>te<br />

cont<strong>en</strong>edor_z = datosCompon<strong>en</strong>te[0][5][t];<br />

distancia = datosCompon<strong>en</strong>te[0][6][t];<br />

inclinacion = datosCompon<strong>en</strong>te[0][7][t];<br />

}<br />

this.z = cont<strong>en</strong>edor_z;<br />

lineaGrafica.scaleX = distancia/40;<br />

cont<strong>en</strong>edorGrafico.rotationY = inclinacion;<br />

public function <strong>de</strong>sactivarComportami<strong>en</strong>to<strong>3D</strong>Complejo():void {<br />

this.z = 0;<br />

cont<strong>en</strong>edorGrafico.z = 0;<br />

datosCompon<strong>en</strong>te[0][4] = cont<strong>en</strong>edorGrafico.z;<br />

cont<strong>en</strong>edorGrafico.rotationY = 0;<br />

lineaGrafica.scaleX = 1;<br />

lineaSalida.alpha = 1;<br />

}<br />

inicializaList<strong>en</strong>ers();<br />

107


}<br />

}<br />

108


package com.fabrica.productor.circuitos<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: manejadorCircuito (FABRICA)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// mayo /<br />

2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// <strong>Circuitos</strong> DC<br />

import com.fabrica.productor.circuitos.<strong>de</strong>scriptores.dc.circuitoDivisor1;<br />

// <strong>Circuitos</strong> AC<br />

import com.fabrica.productor.circuitos.<strong>de</strong>scriptores.ac.filtroLPActivo1;<br />

// Fabrica <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.fabricacion.FabricarCompon<strong>en</strong>te;<br />

// Procesos <strong>de</strong> fabricacion <strong>de</strong> compon<strong>en</strong>tes<br />

import com.fabrica.productor.compon<strong>en</strong>tes.resist<strong>en</strong>cia.FabricarResist<strong>en</strong>cia;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.capacitor.FabricarCapacitor;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre.FabricarA<strong>la</strong>mbre1;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.a<strong>la</strong>mbre.FabricarA<strong>la</strong>mbre2;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.conexion.FabricarTierra;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesCorri<strong>en</strong>te.FabricarIDC;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje.FabricarVDC;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.fu<strong>en</strong>tesVoltaje.FabricarVAC;<br />

import com.fabrica.productor.compon<strong>en</strong>tes.opamp.FabricarOpAmp;<br />

public c<strong>la</strong>ss manejadorCircuito ext<strong>en</strong>ds Sprite {<br />

parametros:Object):void {<br />

// --- Nombre <strong>de</strong>l circuito ---<br />

public var nombre:String;<br />

// --- Refr<strong>en</strong>cia al area d edicion ---<br />

public var spEditor:Sprite;<br />

// --- Parametros comunes ---<br />

public var parametros:Object;<br />

// --- Descriptor <strong>de</strong>l circuito ---<br />

public var circuito:Array;<br />

public function manejadorCircuito(nombre:String,spEditor:Sprite,<br />

// --- Recepcion <strong>de</strong> datos ---<br />

109


this.nombre = nombre;<br />

this.spEditor = spEditor;<br />

this.parametros = parametros;<br />

}<br />

// --- Seleccion <strong>de</strong> circuitos ---<br />

seleccionaCircuito();<br />

// --- G<strong>en</strong>eracion <strong>de</strong>l dibujo <strong>de</strong>l circuito ---<br />

g<strong>en</strong>eraDibujoCircuito();<br />

public function seleccionaCircuito():void {<br />

// -----------------------------------------------------------<br />

// Seleccion <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

var seleccion:Object;<br />

switch(nombre) {<br />

case "circuitoDivisor1":<br />

seleccion = new circuitoDivisor1();<br />

break;<br />

case "filtroLPActivo1":<br />

seleccion = new filtroLPActivo1();<br />

break;<br />

}<br />

}<br />

circuito = seleccion.<strong>de</strong>scriptorCircuito();<br />

public function g<strong>en</strong>eraDibujoCircuito():void {<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>eracion <strong>de</strong>l dibujo <strong>de</strong>l circuito a partir <strong>de</strong>l <strong>de</strong>scriptor<br />

// -----------------------------------------------------------<br />

var tipoCompon<strong>en</strong>te:String;<br />

var ori<strong>en</strong>tacion:String;<br />

var compon<strong>en</strong>te:FabricarCompon<strong>en</strong>te;<br />

var compon<strong>en</strong>teVisual:Object;<br />

// --- Limpiar spEditor ---<br />

while (spEditor.numChildr<strong>en</strong> > 0) {<br />

spEditor.removeChildAt(0);<br />

}<br />

// --- Construccion <strong>de</strong>l dibujo <strong>de</strong>l circuito ---<br />

for (i in circuito) {<br />

tipoCompon<strong>en</strong>te = circuito[i].datosCompon<strong>en</strong>te[0][0];<br />

ori<strong>en</strong>tacion = circuito[i].ori<strong>en</strong>tacion;<br />

switch (tipoCompon<strong>en</strong>te.substr(0,1)) {<br />

// --- Resistor --------------------------------------<br />

case "R":<br />

compon<strong>en</strong>te = new FabricarResist<strong>en</strong>cia();<br />

break;<br />

// --- Capacitor --------------------------------------<br />

case "C":<br />

compon<strong>en</strong>te = new FabricarCapacitor();<br />

break;<br />

110


SOPORTADO");<br />

}<br />

// --- Fu<strong>en</strong>te <strong>de</strong> Voltaje in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> DC y AC -----<br />

case "V":<br />

if (circuito[i].i_tipoFu<strong>en</strong>te == "DC") {<br />

compon<strong>en</strong>te = new FabricarVDC();<br />

}<br />

if (circuito[i].i_tipoFu<strong>en</strong>te == "AC") {<br />

compon<strong>en</strong>te = new FabricarVAC();<br />

}<br />

break;<br />

// --- A<strong>la</strong>mbre ----------------------------------------<br />

case "W":<br />

if (circuito[i].tamanio == "<strong>la</strong>rgo") {<br />

compon<strong>en</strong>te = new FabricarA<strong>la</strong>mbre1();<br />

}<br />

if (circuito[i].tamanio == "corto") {<br />

compon<strong>en</strong>te = new FabricarA<strong>la</strong>mbre2();<br />

}<br />

break;<br />

// --- Tierra ------------------------------------------<br />

case "T":<br />

compon<strong>en</strong>te = new FabricarTierra();<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> Corri<strong>en</strong>te In<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> DC ---------<br />

case "I":<br />

compon<strong>en</strong>te = new FabricarIDC();<br />

break;<br />

// --- AMPLIFICADOR OERACIONAL "A" --- FVCV ---<br />

case "A": // n1(V+); n2(V-); nc1(Vo)<br />

compon<strong>en</strong>te = new FabricarOpAmp();<br />

break;<br />

// --- Default -----------------------------------------<br />

<strong>de</strong>fault:<br />

trace("**********************************************");<br />

trace(" CIRCUITO SOLICITADO:: NO<br />

break;<br />

trace("**********************************************");<br />

circuito[i].datosCompon<strong>en</strong>te;<br />

compon<strong>en</strong>teVisual.name;<br />

circuito[i].u_valorCompon<strong>en</strong>te;<br />

compon<strong>en</strong>te.Fabricar(spEditor, parametros, ori<strong>en</strong>tacion);<br />

compon<strong>en</strong>teVisual = spEditor.getChildAt(i);<br />

compon<strong>en</strong>teVisual.datosCompon<strong>en</strong>te =<br />

compon<strong>en</strong>teVisual.datosCompon<strong>en</strong>te[0][0] =<br />

compon<strong>en</strong>teVisual.u_valorCompon<strong>en</strong>te =<br />

// --- Actualiza coord<strong>en</strong>adas x-y <strong>de</strong>l compon<strong>en</strong>te (posicion) ---<br />

compon<strong>en</strong>teVisual.setCompon<strong>en</strong>te();<br />

// --- Actualiza tipo <strong>de</strong> Fu<strong>en</strong>te <strong>de</strong> Voltaje in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te ---<br />

if (compon<strong>en</strong>teVisual.name.substr(0,1) == "V") {<br />

compon<strong>en</strong>teVisual.i_tipoFu<strong>en</strong>te = circuito[i].i_tipoFu<strong>en</strong>te;<br />

}<br />

// --- Actualiza V<strong>en</strong>tana Informativa <strong>de</strong>l compon<strong>en</strong>te ---<br />

compon<strong>en</strong>teVisual.v<strong>en</strong>tanaInformativa();<br />

// --- Actualiza V<strong>en</strong>tana <strong>de</strong> Edicion <strong>de</strong>l compon<strong>en</strong>te ---<br />

111


compon<strong>en</strong>teVisual.v<strong>en</strong>tanaEdicionCompon<strong>en</strong>te.actualizaInformacion();<br />

}<br />

var obj:Object;<br />

}<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

/*trace(" ");<br />

trace("manejadorCircuito:: name");<br />

for (i=0; i


package com.fabrica.productor.circuitos.<strong>de</strong>scriptores.dc<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: circuitoDivisor1 (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// Descriptor <strong>de</strong> Circuito<br />

//<br />

// **************************************************************<br />

public c<strong>la</strong>ss circuitoDivisor1 {<br />

public function circuitoDivisor1():void {<br />

// --- Constructor ---<br />

}<br />

public function <strong>de</strong>scriptorCircuito():Array {<br />

//<br />

=============================================================<br />

// Descriptor <strong>de</strong>l circuito:<br />

//<br />

//<br />

=============================================================<br />

var circuito:Array = new Array();<br />

var <strong>de</strong>scriptor:Object;<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "V0";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 218;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [197,-40,-20,0,];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [239,-40,20,0,];<br />

<strong>de</strong>scriptor.i_tipoFu<strong>en</strong>te = "DC";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 10;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

113


<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W21";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 197;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [176,-40,-40,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [197,-40,-20,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W22";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 177;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [176,-40,-40,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [177,-20,-40,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "W";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "R3";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 178;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [177,-20,-40,0,];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [179,20,-40,0,];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 1000;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "W";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W24";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 180;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [179,20,-40,0];<br />

114


<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [180,40,-40,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "W";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W25";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 201;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [180,40,-40,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [201,40,-20,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "R6";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 222;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [201,40,-20,0,];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [243,40,20,0,];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 1000;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "T7";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 239;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [239,-40,20,0,];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

115


<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "T8";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 243;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [243,40,20,0,];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

}<br />

return circuito;<br />

}<br />

}<br />

116


package com.fabrica.productor.circuitos.<strong>de</strong>scriptores.ac<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: filtroLPActivo1 (PRODUCTO)<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "Metodo <strong>de</strong> <strong>la</strong> Fabrica" (CLIENTE - FABRICA - PRODUCTO)<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// Descriptor <strong>de</strong> Circuito<br />

//<br />

// **************************************************************<br />

public c<strong>la</strong>ss filtroLPActivo1 {<br />

public function filtroLPActivo1():void {<br />

// --- Constructor ---<br />

}<br />

public function <strong>de</strong>scriptorCircuito():Array {<br />

// --- Descriptor <strong>de</strong>l circuito ---<br />

var circuito:Array = new Array();<br />

var <strong>de</strong>scriptor:Object;<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "A0";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 222;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [242,220,220,0,0,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [200,220,180,0,0,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[3] = [223,260,200,0,0,0];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 1000;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "E";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "R1";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 199;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

117


<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [198,-20,-20,0,0,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [200,20,-20,0,0,0];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 1000;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "W";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "R2";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 201;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [200,20,-20,0,0,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [202,60,-20,0,0,0];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 1000;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "W";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "V3";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 219;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [198,-20,-20,0,0,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [240,-20,20,0,0,0];<br />

<strong>de</strong>scriptor.i_tipoFu<strong>en</strong>te = "AC";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 10;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "T4";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 240;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [240,-20,20,0,0,0];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

118


<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "T5";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 242;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [242,20,20,0,0,0];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "C6";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 180;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -40;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [179,20,-40,0,0,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [181,60,-40,0,0,0];<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0.000159;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "W";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W27";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 200;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [179,20,-40,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [200,20,-20,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W28";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 202;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 60;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = -20;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

119


<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [181,60,-40,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [202,60,-20,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][0] = "W29";<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][1] = 223;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][2] = 60;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][3] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0][4] = 0;<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[1] = [202,60,-20,0];<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[2] = [223,60,0,0];<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = 0;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion = "N";<br />

circuito.push(<strong>de</strong>scriptor);<br />

}<br />

return circuito;<br />

}<br />

}<br />

120


package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: v<strong>en</strong>tanaEdicion<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses "Compon<strong>en</strong>te" y "manejadorCircuito"<br />

//<br />

// Refer<strong>en</strong>cias a otras c<strong>la</strong>ses:<br />

// - "rectangulo"<br />

// - "Compon<strong>en</strong>te"<br />

// - "campoTexto"<br />

// - "convertidorPrefijoDecinal"<br />

//<br />

// julio / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: "compon<strong>en</strong>te.v<strong>en</strong>tanaInformativa()" --> Array:<br />

// Arreglo que conti<strong>en</strong>e <strong>la</strong> informacion <strong>de</strong>l compon<strong>en</strong>te<br />

// que se <strong>de</strong>sea <strong>de</strong>splegar y/o editar<br />

//<br />

// SALIDA: "v<strong>en</strong>tanaEdicion" --> Sprite: V<strong>en</strong>tana que muestra<br />

// datos<br />

informativos/editables<br />

// <strong>de</strong>l compon<strong>en</strong>te<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Animaciones<br />

import fl.transitions.Twe<strong>en</strong>;<br />

import fl.transitions.Twe<strong>en</strong>Ev<strong>en</strong>t;<br />

import fl.transitions.easing.*;<br />

import com.fabrica.productor.fabricacion.Compon<strong>en</strong>te;<br />

public c<strong>la</strong>ss v<strong>en</strong>tanaEdicion ext<strong>en</strong>ds Sprite {<br />

// --- Parametros comunes ---<br />

public var parametros:Object;<br />

// --- Colores ---<br />

public var rojo2:Number = 0xcc0000;<br />

public var naranja2:Number = 0xff9900;<br />

public var azul2:Number = 0x0066ff;<br />

public var b<strong>la</strong>nco:Number = 0xffffff;<br />

public var negro:Number = 0x000000;<br />

121


compon<strong>en</strong>te:Compon<strong>en</strong>te,<br />

parametros:Object):void {<br />

// --- Elem<strong>en</strong>tos <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

public var target:Sprite;<br />

public var v<strong>en</strong>tana:Sprite;<br />

public var v<strong>en</strong>tanaAbierta:Boolean;<br />

public var cerrarV<strong>en</strong>tana:Boolean;<br />

// --- Campos <strong>de</strong> etiquetas ---<br />

public var campo:campoTexto;<br />

public var etiqueta_idCompon<strong>en</strong>te:TextField;<br />

// --- Campos <strong>de</strong> Edicion ---<br />

public var win_idCompon<strong>en</strong>te:TextField; // input<br />

public var win_nombreCompon<strong>en</strong>te:TextField;<br />

public var win_idCompon<strong>en</strong>te_titulo:TextField;<br />

public var win_valorCompon<strong>en</strong>te:TextField;<br />

public var win_valorCompon<strong>en</strong>te_titulo:TextField;<br />

// --- Animacion <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana ---<br />

private var animacionAbrirV<strong>en</strong>tana:Twe<strong>en</strong>;<br />

private var animacionCerrarV<strong>en</strong>tana:Twe<strong>en</strong>;<br />

// --- Sprite para linea <strong>de</strong> conexion <strong>de</strong> v<strong>en</strong>tana con compon<strong>en</strong>te ---<br />

public var lineaConexion:Sprite;<br />

public var v<strong>en</strong>tanaInformativa:rectangulo;<br />

public var cuadroDesp<strong>la</strong>zami<strong>en</strong>to:rectangulo;<br />

public var btnCierre:rectangulo;<br />

// --- Posicion <strong>de</strong> compon<strong>en</strong>te ---<br />

public var XposComp:Number;<br />

public var YposComp:Number;<br />

// --- Datos <strong>de</strong>l compon<strong>en</strong>te ---<br />

public var compon<strong>en</strong>te:Compon<strong>en</strong>te;<br />

public var informacionCompon<strong>en</strong>te:Array;<br />

// --- Analizador <strong>de</strong>l valor <strong>de</strong>l compon<strong>en</strong>te ---<br />

public var ccd:convertidorPrefijosDecimal;<br />

public function v<strong>en</strong>tanaEdicion(target:Disp<strong>la</strong>yObjectContainer,<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.target = target;<br />

this.compon<strong>en</strong>te = compon<strong>en</strong>te;<br />

this.parametros = parametros;<br />

// --- Creacion <strong>de</strong> <strong>la</strong> V<strong>en</strong>tana <strong>de</strong> Edicion ---<br />

v<strong>en</strong>tana = new Sprite();<br />

v<strong>en</strong>tana.name = "v<strong>en</strong>tana";<br />

}<br />

// --- Construccion <strong>de</strong> <strong>la</strong> V<strong>en</strong>tana <strong>de</strong> Edicion ---<br />

construirV<strong>en</strong>tanaEdicion();<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> contruccion <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

122


// -----------------------------------------------------------<br />

public function construirV<strong>en</strong>tanaEdicion():void {<br />

// --- Carga informacion <strong>de</strong>l compon<strong>en</strong>te para <strong>de</strong>splegar ---<br />

informacionCompon<strong>en</strong>te = compon<strong>en</strong>te.v<strong>en</strong>tanaInformativa();<br />

// --- Ajuste automatico <strong>de</strong>l "alto <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana" ---<br />

var altoV<strong>en</strong>tana:Number = informacionCompon<strong>en</strong>te.l<strong>en</strong>gth*20;<br />

// --- V<strong>en</strong>tana para <strong>de</strong>spliegue <strong>de</strong> informacion ---<br />

v<strong>en</strong>tanaInformativa = new rectangulo(200,altoV<strong>en</strong>tana);<br />

v<strong>en</strong>tanaInformativa.gruesoLinea = 1;<br />

v<strong>en</strong>tanaInformativa.colorLinea = naranja2;<br />

v<strong>en</strong>tanaInformativa.alfaLinea = 1;<br />

v<strong>en</strong>tanaInformativa.colorFondo = negro;<br />

v<strong>en</strong>tanaInformativa.alfaFondo = 0.6;<br />

v<strong>en</strong>tanaInformativa.dibujaRectangulo();<br />

v<strong>en</strong>tana.addChild(v<strong>en</strong>tanaInformativa);<br />

// --- Encabezado <strong>de</strong> v<strong>en</strong>tada para <strong>de</strong>sp<strong>la</strong>zami<strong>en</strong>to ---<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to = new rectangulo(200,20);<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.gruesoLinea = 1;<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.colorLinea = naranja2;<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.alfaLinea = 1;<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.colorFondo = azul2;<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.alfaFondo = 1;<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.dibujaRectangulo();<br />

v<strong>en</strong>tana.addChild(cuadroDesp<strong>la</strong>zami<strong>en</strong>to);<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.buttonMo<strong>de</strong> = true;<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_DOWN,<br />

<strong>de</strong>sp<strong>la</strong>zar);<br />

cuadroDesp<strong>la</strong>zami<strong>en</strong>to.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_UP,<br />

termina_<strong>de</strong>sp<strong>la</strong>zar);<br />

// --- Boton <strong>de</strong> cierre <strong>de</strong> v<strong>en</strong>tana ---<br />

btnCierre = new rectangulo(10,10);<br />

btnCierre.x = 185;<br />

btnCierre.y = 5;<br />

btnCierre.gruesoLinea = 1;<br />

btnCierre.colorLinea = rojo2;<br />

btnCierre.alfaLinea = 1;<br />

btnCierre.colorFondo = rojo2;<br />

btnCierre.alfaFondo = 1;<br />

btnCierre.dibujaRectangulo();<br />

v<strong>en</strong>tana.addChild(btnCierre);<br />

// --- Dibujo "X" <strong>en</strong> el "boton <strong>de</strong> cierre <strong>de</strong> v<strong>en</strong>tana" ---<br />

var dibujoX:Shape = new Shape();<br />

dibujoX.graphics.lineStyle(2,b<strong>la</strong>nco,1);<br />

dibujoX.graphics.moveTo(2,2);<br />

dibujoX.graphics.lineTo(8,8);<br />

dibujoX.graphics.moveTo(2,8);<br />

dibujoX.graphics.lineTo(8,2);<br />

123


tnCierre.addChild(dibujoX);<br />

btnCierre.buttonMo<strong>de</strong> = true;<br />

btnCierre.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, cerrar);<br />

// -----------------------------------------------------------<br />

// V<strong>en</strong>tana Informativa para edicion <strong>de</strong> parametros<br />

// <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

// --- Creacion <strong>de</strong> Campos <strong>de</strong> Texto ---<br />

campo = new campoTexto(this);<br />

// --- Etiqueta Id<strong>en</strong>tificador Compon<strong>en</strong>te ---<br />

etiqueta_idCompon<strong>en</strong>te = new TextField();<br />

etiqueta_idCompon<strong>en</strong>te = campo.estatico(<br />

compon<strong>en</strong>te.u_id<strong>en</strong>tificadorCompon<strong>en</strong>te,<br />

naranja2);<br />

// -----------------------------------------------------------<br />

// Datos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

// -----------------------------------------------------------<br />

// + --- Encabezado ---<br />

win_nombreCompon<strong>en</strong>te = new TextField();<br />

win_nombreCompon<strong>en</strong>te = campo.estatico(<br />

informacionCompon<strong>en</strong>te[0],<br />

b<strong>la</strong>nco);<br />

v<strong>en</strong>tana.addChild(win_nombreCompon<strong>en</strong>te);<br />

win_nombreCompon<strong>en</strong>te.x = 10;<br />

win_nombreCompon<strong>en</strong>te.y = 2;<br />

// + --- Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te ---<br />

// --- Titulo: Id<strong>en</strong>tificador ---<br />

win_idCompon<strong>en</strong>te_titulo = new TextField();<br />

win_idCompon<strong>en</strong>te_titulo = campo.estatico(<br />

informacionCompon<strong>en</strong>te[1][0],<br />

v<strong>en</strong>tana.addChild(win_idCompon<strong>en</strong>te_titulo);<br />

win_idCompon<strong>en</strong>te_titulo.x = 10;<br />

win_idCompon<strong>en</strong>te_titulo.y = 25;<br />

// --- Editable: id ---<br />

win_idCompon<strong>en</strong>te = new TextField();<br />

b<strong>la</strong>nco);<br />

// + --- Valor <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> v<strong>en</strong>tana <strong>de</strong> edicion ------<br />

// --- Titulo: Valor ---<br />

win_valorCompon<strong>en</strong>te_titulo = new TextField();<br />

win_valorCompon<strong>en</strong>te_titulo = campo.estatico(<br />

informacionCompon<strong>en</strong>te[2][0],<br />

v<strong>en</strong>tana.addChild(win_valorCompon<strong>en</strong>te_titulo);<br />

win_valorCompon<strong>en</strong>te_titulo.x = 10;<br />

win_valorCompon<strong>en</strong>te_titulo.y = 40;<br />

b<strong>la</strong>nco);<br />

124


--- Editable: valor ---<br />

// --- Actualiza id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te ---<br />

win_idCompon<strong>en</strong>te = new TextField();<br />

win_idCompon<strong>en</strong>te = campo.<strong>en</strong>trada(<br />

compon<strong>en</strong>te.u_id<strong>en</strong>tificadorCompon<strong>en</strong>te,<br />

naranja2);<br />

v<strong>en</strong>tana.addChild(win_idCompon<strong>en</strong>te);<br />

win_idCompon<strong>en</strong>te.x = 100;<br />

win_idCompon<strong>en</strong>te.y = 25;<br />

// --- Actualiza valor <strong>de</strong>l compon<strong>en</strong>te ---<br />

win_valorCompon<strong>en</strong>te = new TextField();<br />

win_valorCompon<strong>en</strong>te = campo.<strong>en</strong>trada(<br />

informacionCompon<strong>en</strong>te[2][1],<br />

naranja2);<br />

v<strong>en</strong>tana.addChild(win_valorCompon<strong>en</strong>te);<br />

win_valorCompon<strong>en</strong>te.x = 100;<br />

win_valorCompon<strong>en</strong>te.y = 40;<br />

informacionCompon<strong>en</strong>te[2][2],<br />

// --- Unida<strong>de</strong>s <strong>de</strong>l campo valor ---<br />

win_unida<strong>de</strong>sCompon<strong>en</strong>te = new TextField();<br />

win_unida<strong>de</strong>sCompon<strong>en</strong>te = campo.estatico(<br />

v<strong>en</strong>tana.addChild(win_unida<strong>de</strong>sCompon<strong>en</strong>te);<br />

win_unida<strong>de</strong>sCompon<strong>en</strong>te.x = 150;<br />

win_unida<strong>de</strong>sCompon<strong>en</strong>te.y = 40;<br />

b<strong>la</strong>nco);<br />

// + --- Datos informativos <strong>de</strong>l compon<strong>en</strong>te <strong>en</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion ---<br />

if (informacionCompon<strong>en</strong>te.l<strong>en</strong>gth > 3) {<br />

for (var i:uint=3; i


--- Analizador <strong>de</strong>l valor <strong>de</strong>l compon<strong>en</strong>te<br />

ccd = new convertidorPrefijosDecimal();<br />

}<br />

public function update(): void {<br />

// -----------------------------------------------------------<br />

// Actualiza parametros <strong>de</strong>l compon<strong>en</strong>te cuando se edita algun<br />

// campo <strong>de</strong> <strong>en</strong>trada (editable) <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana<br />

// Funcion l<strong>la</strong>mada tambi<strong>en</strong> por <strong>la</strong> c<strong>la</strong>se "campoTexto"<br />

// -----------------------------------------------------------<br />

// -----------------------------------------------------------<br />

// Actualiza IDENTIFICADOR <strong>de</strong>l compon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

// --- Actualiza parametros <strong>de</strong>l compon<strong>en</strong>te ---<br />

compon<strong>en</strong>te.u_id<strong>en</strong>tificadorCompon<strong>en</strong>te = win_idCompon<strong>en</strong>te.text;<br />

// --- Actualiza IDENTIFICADOR <strong>de</strong>l compon<strong>en</strong>te ---<br />

target.removeChild(etiqueta_idCompon<strong>en</strong>te);<br />

etiqueta_idCompon<strong>en</strong>te = campo.estatico(<br />

compon<strong>en</strong>te.u_id<strong>en</strong>tificadorCompon<strong>en</strong>te,<br />

naranja2);<br />

target.addChild(etiqueta_idCompon<strong>en</strong>te);<br />

// --- Actualiza posicion <strong>de</strong> Campo_idCompon<strong>en</strong>te ---<br />

etiqueta_idCompon<strong>en</strong>te.x = XposComp-40;<br />

etiqueta_idCompon<strong>en</strong>te.y = YposComp-10;<br />

// -----------------------------------------------------------<br />

// Valida y Actualiza VALOR <strong>de</strong>l comnpon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

// --- Extraccion <strong>de</strong>l valor numerico <strong>de</strong>l valor <strong>de</strong>l compon<strong>en</strong>te ---<br />

var numero:Number = ccd.analizaDato(win_valorCompon<strong>en</strong>te.text);<br />

if (isNaN(numero)) {<br />

win_valorCompon<strong>en</strong>te.text = "ERROR!";<br />

cerrarV<strong>en</strong>tana = false;<br />

} else {<br />

compon<strong>en</strong>te.u_valorCompon<strong>en</strong>te = numero;<br />

cerrarV<strong>en</strong>tana = true;<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

// Actualiza Mo<strong>de</strong>lo Nodal y Matriz Nodal <strong>de</strong>l comnpon<strong>en</strong>te<br />

// -----------------------------------------------------------<br />

//compon<strong>en</strong>te.inicializaMo<strong>de</strong>loNodal();<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> ANIMACION para abrir/cerrar <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

//<br />

// -----------------------------------------------------------<br />

126


public function abrir(compon<strong>en</strong>te:Compon<strong>en</strong>te):void {<br />

// -----------------------------------------------------------<br />

// Animacion para abrir v<strong>en</strong>tana <strong>de</strong> edicion<br />

// -----------------------------------------------------------<br />

// --- Despliega V<strong>en</strong>tana <strong>de</strong> Edicion <strong>de</strong>l compon<strong>en</strong>te<br />

target.addChild(v<strong>en</strong>tana);<br />

animacionAbrirV<strong>en</strong>tana = new Twe<strong>en</strong>(v<strong>en</strong>tana, "scaleX",<br />

Regu<strong>la</strong>r.easeOut, 0.5, 1,<br />

Regu<strong>la</strong>r.easeOut, 0.5, 1,<br />

animacionAbrirV<strong>en</strong>tana = new Twe<strong>en</strong>(v<strong>en</strong>tana, "scaleY",<br />

v<strong>en</strong>tana.x = compon<strong>en</strong>te.x+30;<br />

v<strong>en</strong>tana.y = compon<strong>en</strong>te.y-50;<br />

target.addChild(etiqueta_idCompon<strong>en</strong>te);<br />

0.2, true);<br />

0.2, true);<br />

actualizaPosicion(compon<strong>en</strong>te);<br />

}<br />

v<strong>en</strong>tanaAbierta = true;<br />

Regu<strong>la</strong>r.easeOut, 1, 0,<br />

public function cerrar(evt:Ev<strong>en</strong>t=null):void {<br />

// -----------------------------------------------------------<br />

// Animacion para cerrar v<strong>en</strong>tana <strong>de</strong> edicion<br />

// -----------------------------------------------------------<br />

update();<br />

if (cerrarV<strong>en</strong>tana) {<br />

animacionCerrarV<strong>en</strong>tana = new Twe<strong>en</strong>(v<strong>en</strong>tana, "scaleX",<br />

0.1, true);<br />

animacionCerrarV<strong>en</strong>tana = new Twe<strong>en</strong>(v<strong>en</strong>tana, "scaleY",<br />

Regu<strong>la</strong>r.easeOut, 1, 0,<br />

0.1, true);<br />

animacionCerrarV<strong>en</strong>tana.addEv<strong>en</strong>tList<strong>en</strong>er(<br />

Twe<strong>en</strong>Ev<strong>en</strong>t.MOTION_FINISH,terminaTwe<strong>en</strong>);<br />

}<br />

}<br />

public function terminaTwe<strong>en</strong>(evnt:Ev<strong>en</strong>t):void {<br />

// -----------------------------------------------------------<br />

// Espera a que <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion termine <strong>de</strong> reducirse<br />

// (animacion) antes <strong>de</strong> quitar<strong>la</strong> <strong>de</strong> <strong>la</strong> pantal<strong>la</strong><br />

// -----------------------------------------------------------<br />

target.removeChild(v<strong>en</strong>tana);<br />

target.removeChild(etiqueta_idCompon<strong>en</strong>te);<br />

127


target.removeChild(lineaConexion);<br />

lineaConexion.graphics.clear();<br />

v<strong>en</strong>tanaAbierta = false;<br />

animacionCerrarV<strong>en</strong>tana.removeEv<strong>en</strong>tList<strong>en</strong>er(<br />

Twe<strong>en</strong>Ev<strong>en</strong>t.MOTION_FINISH,terminaTwe<strong>en</strong>);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> <strong>de</strong>sp<strong>la</strong>zami<strong>en</strong>to <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

//<br />

// -----------------------------------------------------------<br />

public function <strong>de</strong>sp<strong>la</strong>zar(evt:Ev<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Desp<strong>la</strong>zami<strong>en</strong>to <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

// -----------------------------------------------------------<br />

v<strong>en</strong>tana.startDrag();<br />

target.removeChild(lineaConexion);<br />

lineaConexion.graphics.clear();<br />

public function termina_<strong>de</strong>sp<strong>la</strong>zar(evt:Ev<strong>en</strong>t):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Termina <strong>de</strong>sp<strong>la</strong>zami<strong>en</strong>to <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

// -----------------------------------------------------------<br />

v<strong>en</strong>tana.stopDrag();<br />

lineaConexion.graphics.lineStyle(1,naranja2,1);<br />

lineaConexion.graphics.moveTo(XposComp, YposComp);<br />

lineaConexion.graphics.lineTo(v<strong>en</strong>tana.x, v<strong>en</strong>tana.y);<br />

target.addChild(lineaConexion);<br />

actualizaPosicion(compon<strong>en</strong>te);<br />

public function actualizaPosicion(compon<strong>en</strong>te:Compon<strong>en</strong>te):void {<br />

}<br />

// -----------------------------------------------------------<br />

// Actualiza posicion <strong>de</strong> etiquetas y linea cuando se <strong>de</strong>sp<strong>la</strong>za<br />

// <strong>la</strong> v<strong>en</strong>tana<br />

// -----------------------------------------------------------<br />

XposComp = compon<strong>en</strong>te.x;<br />

YposComp = compon<strong>en</strong>te.y;<br />

// Actualiza posicion <strong>de</strong> Campo_idCompon<strong>en</strong>te<br />

etiqueta_idCompon<strong>en</strong>te.x = XposComp-40;<br />

etiqueta_idCompon<strong>en</strong>te.y = YposComp-10;<br />

// Trazo <strong>de</strong> linea <strong>de</strong> conexion <strong>de</strong> v<strong>en</strong>tana con compon<strong>en</strong>te<br />

lineaConexion.graphics.clear();<br />

lineaConexion.graphics.lineStyle(1,naranja2,1);<br />

lineaConexion.graphics.moveTo(XposComp, YposComp);<br />

lineaConexion.graphics.lineTo(v<strong>en</strong>tana.x, v<strong>en</strong>tana.y);<br />

target.addChild(lineaConexion);<br />

128


-----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> FUNCIONES utilizadas por <strong>la</strong> c<strong>la</strong>se externa<br />

// "manejadorCircuito"<br />

//<br />

// -----------------------------------------------------------<br />

public function actualizaInformacion():void {<br />

// -----------------------------------------------------------<br />

// Funcion utilizada por <strong>la</strong> c<strong>la</strong>se "manejadorCircuito", cuando<br />

// se selecciona algun circuito exist<strong>en</strong>te, mediante un "boton"<br />

// <strong>en</strong> el m<strong>en</strong>u <strong>de</strong> circuitos. Esta funcion actualiza los VALORES<br />

// <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> edicion<br />

// -----------------------------------------------------------<br />

// --- Actualiza datos <strong>de</strong>l compon<strong>en</strong>te ---<br />

informacionCompon<strong>en</strong>te = compon<strong>en</strong>te.v<strong>en</strong>tanaInformativa();<br />

// --- Editable: valor ---<br />

// --- Actualiza id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te ---<br />

v<strong>en</strong>tana.removeChild(win_idCompon<strong>en</strong>te);<br />

win_idCompon<strong>en</strong>te =<br />

campo.<strong>en</strong>trada(compon<strong>en</strong>te.u_id<strong>en</strong>tificadorCompon<strong>en</strong>te,<br />

naranja2);<br />

v<strong>en</strong>tana.addChild(win_idCompon<strong>en</strong>te);<br />

win_idCompon<strong>en</strong>te.x = 100;<br />

win_idCompon<strong>en</strong>te.y = 25;<br />

// --- Actualiza valor <strong>de</strong>l compon<strong>en</strong>te ---<br />

v<strong>en</strong>tana.removeChild(win_valorCompon<strong>en</strong>te);<br />

win_valorCompon<strong>en</strong>te = campo.<strong>en</strong>trada(informacionCompon<strong>en</strong>te[2][1],<br />

naranja2);<br />

v<strong>en</strong>tana.addChild(win_valorCompon<strong>en</strong>te);<br />

win_valorCompon<strong>en</strong>te.x = 100;<br />

win_valorCompon<strong>en</strong>te.y = 40;<br />

}<br />

}<br />

}<br />

package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: rectangulo<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "v<strong>en</strong>tanaEdicion"<br />

//<br />

// julio / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: "valorAncho" --> Number: Ancho <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana (=50)<br />

// "valorAlto" --> Number: Alto <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana (=50)<br />

// "redondo" --> Boolean: Bor<strong>de</strong>s redon<strong>de</strong>ados (=false)<br />

129


// SALIDA: "rectangulo" --> Sprite: Dibujo <strong>de</strong> un rectangulo<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

public c<strong>la</strong>ss rectangulo ext<strong>en</strong>ds Sprite {<br />

// --- Marco ---<br />

public var gruesoLinea:uint;<br />

public var colorLinea:uint;<br />

public var alfaLinea:Number;<br />

// --- Fondo ---<br />

public var colorFondo:uint;<br />

public var alfaFondo:Number;<br />

// --- Ancho y alto ---<br />

public var valorAncho:Number;<br />

public var valorAlto:Number;<br />

// --- Esquinas redon<strong>de</strong>adas ---<br />

public var redondo:Boolean;<br />

public var redon<strong>de</strong>oAncho:Number=8;<br />

public var redon<strong>de</strong>oAlto:Number=8;<br />

public function<br />

rectangulo(valorAncho:Number=50,valorAlto:Number=50,redondo:Boolean=false):void {<br />

}<br />

// --- Recepcion <strong>de</strong> datos para dibujo <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana ---<br />

this.valorAncho = valorAncho;<br />

this.valorAlto = valorAlto;<br />

this.redondo = redondo;<br />

public function dibujaRectangulo():void {<br />

// --- Dibujo <strong>de</strong>l rectangulo ---<br />

var bkground:Shape = new Shape();<br />

bkground.graphics.lineStyle(gruesoLinea,colorLinea,alfaLinea);<br />

bkground.graphics.beginFill(colorFondo, alfaFondo);<br />

if (redondo) {<br />

bkground.graphics.drawRoundRect(0,0,valorAncho,valorAlto,<br />

redon<strong>de</strong>oAncho,redon<strong>de</strong>oAlto);<br />

} else {<br />

bkground.graphics.drawRect(0,0,valorAncho,valorAlto);<br />

}<br />

bkground.graphics.<strong>en</strong>dFill();<br />

addChild(bkground);<br />

}<br />

}<br />

}<br />

130


package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: campoTexto<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "v<strong>en</strong>tanaEdicion"<br />

//<br />

// julio / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: "v<strong>en</strong>tanaEdicion" --> Textos<br />

//<br />

// SALIDA: textos estatico, dinamico y <strong>de</strong> <strong>en</strong>trada<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

public c<strong>la</strong>ss campoTexto {<br />

public var v<strong>en</strong>tana:Object;<br />

public var datoEntrada:TextField;<br />

public function campoTexto(v<strong>en</strong>tanaEdicion:Object):void {<br />

// --- Registra <strong>la</strong> refer<strong>en</strong>cia a <strong>la</strong> v<strong>en</strong>tana que lo l<strong>la</strong>ma ---<br />

this.v<strong>en</strong>tana = v<strong>en</strong>tanaEdicion;<br />

}<br />

public function estatico(texto:String,color:Number):TextField {<br />

}<br />

// -----------------------------------------------------------<br />

// Campo Estatico<br />

// -----------------------------------------------------------<br />

return dinamico(texto,color);<br />

public function dinamico(texto:String,color:Number):TextField {<br />

// -----------------------------------------------------------<br />

// Campo Dinamico<br />

// -----------------------------------------------------------<br />

var datoSalida:TextField = new TextField();<br />

datoSalida.autoSize = TextFieldAutoSize.LEFT;<br />

datoSalida.type = TextFieldType.DYNAMIC;<br />

datoSalida.text = texto;<br />

datoSalida = formatoTexto(datoSalida,color);<br />

return datoSalida;<br />

131


}<br />

public function <strong>en</strong>trada(texto:String,color:Number):TextField {<br />

keyDownHandler);<br />

}<br />

// -----------------------------------------------------------<br />

// Campo <strong>de</strong> Entrada<br />

// -----------------------------------------------------------<br />

datoEntrada = new TextField();<br />

datoEntrada.autoSize = TextFieldAutoSize.LEFT;<br />

datoEntrada.type = TextFieldType.INPUT;<br />

datoEntrada.text = texto;<br />

datoEntrada.addEv<strong>en</strong>tList<strong>en</strong>er(KeyboardEv<strong>en</strong>t.KEY_DOWN,<br />

datoEntrada = formatoTexto(datoEntrada,color);<br />

return datoEntrada;<br />

public function formatoTexto(datoTexto:TextField ,color:Number):TextField {<br />

keyDownHandler);<br />

}<br />

// -----------------------------------------------------------<br />

// Formato <strong>de</strong> Texto<br />

// -----------------------------------------------------------<br />

var format:TextFormat = new TextFormat();<br />

format.font = "_sans";<br />

format.size = 10;<br />

format.color = color;<br />

datoTexto.addEv<strong>en</strong>tList<strong>en</strong>er(KeyboardEv<strong>en</strong>t.KEY_DOWN,<br />

datoTexto.setTextFormat(format);<br />

return datoTexto;<br />

public function keyDownHandler(ev<strong>en</strong>t:KeyboardEv<strong>en</strong>t):void {<br />

}<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

// Deteccion <strong>de</strong> <strong>la</strong> tec<strong>la</strong> "ENTER"<br />

// -----------------------------------------------------------<br />

// --- Presionar <strong>la</strong> tec<strong>la</strong> ENTER (keyCo<strong>de</strong>=13) ---<br />

var ENTER:Number = 13;<br />

if (ev<strong>en</strong>t.keyCo<strong>de</strong> == ENTER) {<br />

// --- Actualiza parametros <strong>de</strong>l compon<strong>en</strong>te ---<br />

v<strong>en</strong>tana.update();<br />

}<br />

132


package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: convertidorPrefijosDecimal<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "v<strong>en</strong>tanaEdicion"<br />

//<br />

// julio / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: "cad<strong>en</strong>a" --> String: cad<strong>en</strong>a a analizar<br />

//<br />

// SALIDA: "valorFinal" --> Number<br />

//<br />

// Convierte prefijos <strong>de</strong>l SISTEMA INTERNACIONAL a valores numericos<br />

// <strong>en</strong> notacion <strong>de</strong>cimal (ci<strong>en</strong>tifica), para su manejo <strong>en</strong> el simu<strong>la</strong>dor.<br />

//<br />

// T --> 1E12<br />

// G --> 1E9<br />

// M --> 1E6<br />

// K --> 1E3<br />

// m --> 1E-3<br />

// u --> 1E-6<br />

// n --> 1E-9<br />

// p --> 1E-12<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

public c<strong>la</strong>ss convertidorPrefijosDecimal {<br />

public function convertidorPrefijosDecimal():void {<br />

// --- Constructor ---<br />

}<br />

public function analizaDato(cad<strong>en</strong>a:String):Number {<br />

var pot<strong>en</strong>cia:Number;<br />

var valor:Number = 0;<br />

var valorFinal:Number;<br />

var dato:Array = [];<br />

var indice:uint = 0;<br />

var primerCaracter:Boolean = true;<br />

// Analisis <strong>de</strong> <strong>la</strong> cad<strong>en</strong>a escrita por el usuario<br />

for (var i:uint=0; i 47<br />

&& cad<strong>en</strong>a.charCo<strong>de</strong>At(i) < 58) {<br />

// --- Numero ---<br />

133


dato.push(cad<strong>en</strong>a.charCo<strong>de</strong>At(i));<br />

indice++;<br />

} else if (cad<strong>en</strong>a.charCo<strong>de</strong>At(i) == 32) {<br />

// --- Espacio ---<br />

} else if (cad<strong>en</strong>a.charCo<strong>de</strong>At(i) == 46) {<br />

// --- Punto ---<br />

dato.push(cad<strong>en</strong>a.charCo<strong>de</strong>At(i));<br />

} else if (cad<strong>en</strong>a.charCo<strong>de</strong>At(i) > 57) {<br />

// --- Caracter ---<br />

if (primerCaracter) {<br />

switch(cad<strong>en</strong>a.charAt(i)) {<br />

case "T":<br />

pot<strong>en</strong>cia = 1E12;<br />

break;<br />

case "G":<br />

pot<strong>en</strong>cia = 1E9;<br />

break;<br />

case "M":<br />

pot<strong>en</strong>cia = 1E6;<br />

break;<br />

case "K":<br />

pot<strong>en</strong>cia = 1E3;<br />

break;<br />

case "m":<br />

pot<strong>en</strong>cia = 1E-3;<br />

break;<br />

case "u":<br />

pot<strong>en</strong>cia = 1E-6;<br />

break;<br />

case "n":<br />

pot<strong>en</strong>cia = 1E-9;<br />

break;<br />

case "p":<br />

pot<strong>en</strong>cia = 1E-12;<br />

break;<br />

<strong>de</strong>fault:<br />

trace("************************************");<br />

*");<br />

trace("--- "+cad<strong>en</strong>a.charAt(i)+" ---");<br />

trace("* CARACTER INVALIDO !!!<br />

trace("************************************");<br />

}<br />

primerCaracter = false;<br />

}<br />

}<br />

if (i == (cad<strong>en</strong>a.l<strong>en</strong>gth-1) &&<br />

primerCaracter) {<br />

pot<strong>en</strong>cia = 1;<br />

primerCaracter = false;<br />

}<br />

}<br />

if (pot<strong>en</strong>cia != 1) {<br />

// -------------------------------------------------<br />

134


Valor expresado <strong>en</strong> NOTACION CIENTIFICA<br />

// -------------------------------------------------<br />

// Comprobacion <strong>de</strong> exist<strong>en</strong>cia <strong>de</strong> punto <strong>de</strong>cimal<br />

for (i=0; i


136


package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: botonCircuito<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses: (circuitos)<br />

// - "botonDivisor1"<br />

// - "botonFiltroLPActivo1"<br />

// - ""<br />

// - ""<br />

// - ""<br />

// - ""<br />

// - ""<br />

// - ""<br />

// - ""<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: "color" --> Number: Color <strong>de</strong>l boton<br />

// "upLogo" --> MovieClip: Logo perman<strong>en</strong>te<br />

// "overLogo" --> MovieClip: Logo al pasar el mouse<br />

//<br />

// SALIDA: "boton" --> SimpleButton<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Rectangulo<br />

import com.bin.rectangulo;<br />

public c<strong>la</strong>ss botonCircuito ext<strong>en</strong>ds SimpleButton {<br />

public function botonCircuito(color:Number):void {<br />

// --- Estado "up" --> "logo up" ---<br />

upState = new rectangulo(100,100);<br />

upState.gruesoLinea = 1;<br />

upState.colorLinea = color;<br />

upState.alfaLinea = 0.8;<br />

upState.colorFondo = 0xffffff;<br />

upState.alfaFondo = 0.1;<br />

upState.dibujaRectangulo();<br />

// --- Estado "over" --> "logo over" ---<br />

overState = new rectangulo(100,100);<br />

overState.gruesoLinea = 3;<br />

overState.colorLinea = 0xffffff;<br />

overState.alfaLinea = 0.8;<br />

overState.colorFondo = 0xffffff;<br />

137


overState.alfaFondo = 0.3;<br />

overState.dibujaRectangulo();<br />

// --- Estado "down" --> "fondo b<strong>la</strong>nco" ---<br />

downState = new rectangulo(100,100);<br />

downState.gruesoLinea = 2;<br />

downState.colorLinea = 0xffffff;<br />

downState.alfaLinea = 0.2;<br />

downState.colorFondo = 0xffffff;<br />

downState.alfaFondo = 1;<br />

downState.dibujaRectangulo();<br />

}<br />

hitTestState = upState;<br />

public function agregarLogo(upLogo:MovieClip, overLogo:MovieClip):void {<br />

// --- Logo "up" ---<br />

upState.addChild(upLogo);<br />

upLogo.x = 0;<br />

upLogo.y = 25;<br />

}<br />

}<br />

}<br />

// --- Logo "over" ---<br />

overState.addChild(overLogo);<br />

overLogo.x = 0;<br />

overLogo.y = 25;<br />

138


package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: boton<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong>s c<strong>la</strong>ses: (compon<strong>en</strong>tes)<br />

// - "botonResist<strong>en</strong>cia"<br />

// - "botonCapacitor"<br />

// - "botonFu<strong>en</strong>teVoltajeDC"<br />

// - "botonFu<strong>en</strong>teVoltajeAC"<br />

// - "botonFu<strong>en</strong>teCorri<strong>en</strong>teDC"<br />

// - "botonA<strong>la</strong>mbreCorto"<br />

// - "botonA<strong>la</strong>mbreLargo"<br />

// - "botonTierra"<br />

// - "botonOpAmp"<br />

//<br />

// junio / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: "color" --> Number: Color <strong>de</strong>l boton<br />

// "upLogo" --> MovieClip: Logo perman<strong>en</strong>te<br />

// "overLogo" --> MovieClip: Logo al pasar el mouse<br />

//<br />

// SALIDA: "boton" --> SimpleButton<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Rectnagulo<br />

import com.bin.rectangulo;<br />

public c<strong>la</strong>ss boton ext<strong>en</strong>ds SimpleButton {<br />

public function boton(color:Number):void {<br />

// --- Estado "up" --> "logo up" ---<br />

upState = new rectangulo();<br />

upState.gruesoLinea = 1;<br />

upState.colorLinea = color;<br />

upState.alfaLinea = 0.8;<br />

upState.colorFondo = 0xffffff;<br />

upState.alfaFondo = 0.1;<br />

upState.dibujaRectangulo();<br />

// --- Estado "over" --> "logo over" ---<br />

overState = new rectangulo();<br />

overState.gruesoLinea = 3;<br />

overState.colorLinea = 0xffffff;<br />

overState.alfaLinea = 0.8;<br />

overState.colorFondo = 0xffffff;<br />

overState.alfaFondo = 0.3;<br />

139


overState.dibujaRectangulo();<br />

// --- Estado "down" --> "fondo b<strong>la</strong>nco" ---<br />

downState = new rectangulo();<br />

downState.gruesoLinea = 2;<br />

downState.colorLinea = 0xffffff;<br />

downState.alfaLinea = 0.2;<br />

downState.colorFondo = 0xffffff;<br />

downState.alfaFondo = 1;<br />

downState.dibujaRectangulo();<br />

}<br />

hitTestState = upState;<br />

public function agregarLogo(upLogo:MovieClip, overLogo:MovieClip):void {<br />

// --- Logo "up" ---<br />

upState.addChild(upLogo);<br />

upLogo.x = 25;<br />

upLogo.y = 25;<br />

}<br />

}<br />

}<br />

// --- Logo "over" ---<br />

overState.addChild(overLogo);<br />

overLogo.x = 25;<br />

overLogo.y = 25;<br />

140


package<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Main<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// C<strong>la</strong>se constructora <strong>de</strong>l mo<strong>de</strong>lo<br />

// "MVC" (MODELO - VISTA - CONTROLADOR)<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Mo<strong>de</strong>lo MVC<br />

import Mo<strong>de</strong>lo.Mo<strong>de</strong>loCircuito;<br />

import Contro<strong>la</strong>dor.contro<strong>la</strong>dor;<br />

import Vistas.dc.vistasDC;<br />

import Vistas.ac.vistasAC;<br />

public c<strong>la</strong>ss Main ext<strong>en</strong>ds MovieClip {<br />

public function Main() {<br />

muestraResultadosAC);<br />

addChild(cont);<br />

}<br />

}<br />

}<br />

// --- Mo<strong>de</strong>lo ---<br />

var mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito = new Mo<strong>de</strong>loCircuito(this);<br />

addChild(mo<strong>de</strong>lo);<br />

// --- Vistas ---<br />

var muestraResultadosDC:vistasDC = new vistasDC(mo<strong>de</strong>lo);<br />

addChild(muestraResultadosDC);<br />

var muestraResultadosAC:vistasAC = new vistasAC(mo<strong>de</strong>lo);<br />

addChild(muestraResultadosAC);<br />

// --- Contro<strong>la</strong>dor ---<br />

var cont:contro<strong>la</strong>dor = new contro<strong>la</strong>dor(mo<strong>de</strong>lo,muestraResultadosDC,<br />

1


package Mo<strong>de</strong>lo<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Mo<strong>de</strong>loCircuito<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "MVC" (MODELO - VISTA - CONTROLADOR)<br />

2


2010<br />

//<br />

// septiembre /<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Manejador <strong>de</strong> red <strong>de</strong> circuitos<br />

import com.red.g<strong>en</strong>erador.manejadorRed;<br />

// <strong>Simu<strong>la</strong>dor</strong>es<br />

import com.red.simu<strong>la</strong>dor.simu<strong>la</strong>dorDC;<br />

import com.red.simu<strong>la</strong>dor.simu<strong>la</strong>dorAC;<br />

// Nodos para Vistas<br />

import Vistas.dc.animacion<strong>3D</strong>.NodoDC;<br />

import Vistas.ac.animacion<strong>3D</strong>.NodoAC;<br />

// Matematicas<br />

import com.bin.tab<strong>la</strong>Cos<strong>en</strong>oidal;<br />

//public c<strong>la</strong>ss Mo<strong>de</strong>lo ext<strong>en</strong>ds Ev<strong>en</strong>tDispatcher {<br />

public c<strong>la</strong>ss Mo<strong>de</strong>loCircuito ext<strong>en</strong>ds Sprite {<br />

// --- Autorizacion <strong>de</strong> cambio <strong>de</strong> estado ---<br />

public var autorizacionCambiarEstado:Boolean;<br />

// --- Dibujo y <strong>de</strong>finicion <strong>de</strong>l circuito ---<br />

public var spEditor:Sprite;<br />

private var elem<strong>en</strong>tosCircuito:Array;<br />

public var nodosTerminales:Array;<br />

public var red:manejadorRed;<br />

public var redNodal:Array;<br />

public var C:Array;<br />

public var circuito:Sprite;<br />

// --- Voltajes ---<br />

public var voltajesNodales:Array;<br />

public var voltajesNodalesComplejos:Array;<br />

private var voltajeMaximo:Number;<br />

private var voltajeMaximoMagnitud:Number;<br />

private var esca<strong>la</strong><strong>3D</strong>_voltaje:Number = 80;<br />

// --- Corri<strong>en</strong>tes ---<br />

public var corri<strong>en</strong>tesRama:Array;<br />

public var corri<strong>en</strong>tesCompon<strong>en</strong>te:Array;<br />

private var corri<strong>en</strong>teMaxima:Number;<br />

private var corri<strong>en</strong>teMinima:Number;<br />

private var esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te:Object;<br />

// --- <strong>Simu<strong>la</strong>dor</strong>es ---<br />

public var simu<strong>la</strong>dor_DC:simu<strong>la</strong>dorDC;<br />

public var simu<strong>la</strong>dor_AC:simu<strong>la</strong>dorAC;<br />

private var frecu<strong>en</strong>ciaC<strong>en</strong>tral:Number;<br />

private var simu<strong>la</strong>cionValida:Boolean;<br />

private var tipoSimu<strong>la</strong>cion:String;<br />

// Lista <strong>de</strong> resultados <strong>de</strong> Magnitud y Fase para<br />

// respuesta <strong>en</strong> Frecu<strong>en</strong>cia<br />

public var LD:G<strong>en</strong>erador_Lista_Datos;<br />

// --- Variables auxiliares ---<br />

public var parametros:Object;<br />

public var nodosVisuales:Array;<br />

public var cont<strong>en</strong>edor:Sprite;<br />

public var target:Sprite;<br />

private var compon<strong>en</strong>te:Object;<br />

3


--- M<strong>en</strong>sajes <strong>de</strong> estado <strong>de</strong>l simu<strong>la</strong>dor ---<br />

public var areaM<strong>en</strong>sajesEstado:MovieClip;<br />

// --- Constantes ---<br />

private var LN_LOG:Number = 0.434294;<br />

// --- Matematicas ---<br />

private var tab<strong>la</strong>Cos<strong>en</strong>o:tab<strong>la</strong>Cos<strong>en</strong>oidal;<br />

public function Mo<strong>de</strong>loCircuito(cont<strong>en</strong>edor:Sprite):void {<br />

this.cont<strong>en</strong>edor = cont<strong>en</strong>edor;<br />

// --- Matematicas ---<br />

tab<strong>la</strong>Cos<strong>en</strong>o = new tab<strong>la</strong>Cos<strong>en</strong>oidal();<br />

// --- M<strong>en</strong>sajes iniciales <strong>de</strong> estado <strong>de</strong>l simu<strong>la</strong>dor ---<br />

g<strong>en</strong>erarAreaM<strong>en</strong>sajes();<br />

muestraM<strong>en</strong>sajeEstado(">>> EDITANDO ",<br />

muestraM<strong>en</strong>sajeEstado(">>> EDITANDO ",<br />

"b<strong>la</strong>nco","alerta");<br />

"b<strong>la</strong>nco","normal");<br />

}<br />

public function g<strong>en</strong>erarAreaM<strong>en</strong>sajes():void {<br />

}<br />

// Creacion <strong>de</strong> area <strong>de</strong> m<strong>en</strong>sajes <strong>de</strong> estado <strong>en</strong> <strong>la</strong> parte<br />

// superior izquierda <strong>de</strong> <strong>la</strong> pantal<strong>la</strong><br />

areaM<strong>en</strong>sajesEstado = new mc_AreaM<strong>en</strong>sajesEstado();<br />

areaM<strong>en</strong>sajesEstado.x = 351;<br />

areaM<strong>en</strong>sajesEstado.y = 15;<br />

addChild(areaM<strong>en</strong>sajesEstado);<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> GENERACION DE RED DEL CIRCUITO y su VALIDACION<br />

//<br />

// -----------------------------------------------------------<br />

public function capturaElem<strong>en</strong>tosCircuito(spEditor:Sprite,parametros:Object):void {<br />

// --- Captura el dibujo <strong>de</strong>l circuito ---<br />

this.spEditor = spEditor;<br />

this.parametros = parametros;<br />

// Guarda refer<strong>en</strong>cias a cada elem<strong>en</strong>to <strong>de</strong>l circuito<br />

// <strong>en</strong> el arreglo "elem<strong>en</strong>tosCircuito"<br />

elem<strong>en</strong>tosCircuito = new Array();<br />

for (i=0; i


public function validarElem<strong>en</strong>tosCircuito():void {<br />

// --- Envia el dibujo al manejador <strong>de</strong> red ---<br />

red = new manejadorRed(spEditor);<br />

COMPONENTE ",<br />

// -----------------------------------------------------------<br />

// Comprueba que el dibujo <strong>de</strong>l circuito cump<strong>la</strong> con<br />

// <strong>la</strong>s sigui<strong>en</strong>tes restricciones:<br />

// -----------------------------------------------------------<br />

if (spEditor.numChildr<strong>en</strong> == 0) {<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* NO SE AUTORIZA CAMBIO DE ESTADO *");<br />

trace("* PORQUE NO EXISTE CIRCUITO *");<br />

trace("***************************************************");<br />

autorizacionCambiarEstado=false;<br />

muestraM<strong>en</strong>sajeEstado(">>> NO EXISTE CIRCUITO QUE SIMULAR ",<br />

"naranja","alerta");<br />

}<br />

if (autorizacionCambiarEstado && red.v<strong>en</strong>tanaAbierta()) {<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* NO SE AUTORIZA CAMBIO DE ESTADO *");<br />

trace("* PORQUE EXISTEN VENTANAS DE EDICION ABIERTAS *");<br />

trace("***************************************************");<br />

autorizacionCambiarEstado=false;<br />

muestraM<strong>en</strong>sajeEstado(">>> CERRAR VENTANAS DE EDICION DE CADA<br />

}<br />

"naranja","alerta");<br />

if (autorizacionCambiarEstado && !red.existeTierra()) {<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* NO SE AUTORIZA CAMBIO DE ESTADO *");<br />

trace("* PORQUE NO SE HA DEFINIDO EL NODO DE TIERRA *");<br />

trace("***************************************************");<br />

autorizacionCambiarEstado=false;<br />

muestraM<strong>en</strong>sajeEstado(">>> NO SE HA DEFINIDO EL NODO DE TIERRA",<br />

"naranja","alerta");<br />

}<br />

if (autorizacionCambiarEstado && !red.existeCircuito()) {<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* NO SE AUTORIZA CAMBIO DE ESTADO *");<br />

trace("* PORQUE EXISTE UNO O VARIOS ELEMENTOS *");<br />

trace("* DESCONECTADOS DEL CIRCUITO *");<br />

trace("***************************************************");<br />

autorizacionCambiarEstado=false;<br />

muestraM<strong>en</strong>sajeEstado(">>> ELEMENTOS DESCONECTADOS DEL CIRCUITO",<br />

"naranja","alerta");<br />

}<br />

if (autorizacionCambiarEstado && !red.conexionValidaFu<strong>en</strong>tes()) {<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* NO SE AUTORIZA CAMBIO DE ESTADO *");<br />

trace("* PORQUE UNA O VARIAS FUENTES SE ENCUENTRAN *");<br />

trace("* EN CONEXION NO VALIDA *");<br />

trace("***************************************************");<br />

autorizacionCambiarEstado=false;<br />

muestraM<strong>en</strong>sajeEstado(">>> FUENTES EN CONEXION NO VALIDA",<br />

"naranja","alerta");<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

5


// Seccion <strong>de</strong> SIMULACION EN DC<br />

//<br />

// -----------------------------------------------------------<br />

public function simu<strong>la</strong>rCircuitoDC():Boolean {<br />

tipoSimu<strong>la</strong>cion = "DC";<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>era lista <strong>de</strong> compon<strong>en</strong>tes <strong>de</strong>l dibujo <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

redNodal = red.construyeRed();<br />

if (!red.compruebaTierraCircuito()) {<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* SE PRODUJO UN ERROR EN LA SIMULACION *");<br />

trace("* EL CIRCUITO NO SE ENCUENTRA CONECTADO *");<br />

trace("* A TIERRA: REVISAR EL CIRCUITO *")<br />

trace("***************************************************");<br />

autorizacionCambiarEstado=false;<br />

muestraM<strong>en</strong>sajeEstado(" CIRCUITO NO CONECTADO A TIERRA",<br />

"naranja","alerta");<br />

simu<strong>la</strong>cionValida = false;<br />

} else {<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>era <strong>la</strong> Descripcion Grafica <strong>de</strong>l circuito para g<strong>en</strong>erar<br />

// "archivos <strong>de</strong> circuitos" y asociarlos a los "botones <strong>de</strong>l<br />

// m<strong>en</strong>u <strong>de</strong> circuitos"<br />

// -----------------------------------------------------------<br />

red.g<strong>en</strong>eraDescripcionGraficaCircuito();<br />

// --- Actualiza m<strong>en</strong>saje <strong>de</strong> estado <strong>de</strong>l simu<strong>la</strong>dor ---<br />

muestraM<strong>en</strong>sajeEstado(">>> SIMULANDO EN DC",<br />

"b<strong>la</strong>nco","normal");<br />

// --- Simu<strong>la</strong> el circuito <strong>en</strong> DC ---<br />

simu<strong>la</strong>dor_DC = new simu<strong>la</strong>dorDC(redNodal);<br />

// Obti<strong>en</strong>e voltajes nodales<br />

voltajesNodales = simu<strong>la</strong>dor_DC.obt<strong>en</strong>erVoltajesNodales();<br />

// Obti<strong>en</strong>e corri<strong>en</strong>tes <strong>de</strong> rama <strong>en</strong> fu<strong>en</strong>tes <strong>de</strong> voltaje<br />

// <strong>de</strong> DC y a<strong>la</strong>mbres<br />

corri<strong>en</strong>tesRama = simu<strong>la</strong>dor_DC.obt<strong>en</strong>erCorri<strong>en</strong>tesRama();<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

/*trace(" ");<br />

trace("MMM:: --- redNodal ---");<br />

for (nodo in redNodal) {<br />

trace("redNodal["+nodo+"] id: "+redNodal[nodo].id+" c:<br />

"+redNodal[nodo].c+" valor: "+redNodal[nodo].valor);<br />

}*/<br />

/*trace(" ");<br />

trace("MMM:: --- VOLTAJES NODALES ---");<br />

for (i in voltajesNodales) {<br />

trace("V["+i+"]= "+voltajesNodales[i]);<br />

}*/<br />

/*trace(" ");<br />

trace("MMM:: --- CORRIENTES RAMA ---");<br />

for (i in corri<strong>en</strong>tesRama) {<br />

trace("corri<strong>en</strong>tesRama["+i+"]= "+corri<strong>en</strong>tesRama[i]);<br />

}*/<br />

// -----------------------------------------------------------<br />

// Comprueba que no existan errores <strong>en</strong> <strong>la</strong> simu<strong>la</strong>cion<br />

// por <strong>la</strong>s sigui<strong>en</strong>tes condiciones:<br />

// -----------------------------------------------------------<br />

6


*");<br />

*");<br />

*");<br />

REVISAR EL CIRCUITO",<br />

*");<br />

*");<br />

*");<br />

REVISAR EL CIRCUITO",<br />

simu<strong>la</strong>cionValida = true;<br />

for (i in voltajesNodales) {<br />

if (isNaN(voltajesNodales[i]) ||<br />

!isFinite(voltajesNodales[i])) {<br />

simu<strong>la</strong>cionValida = false;<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* SE PRODUJO UN ERROR EN LA SIMULACION<br />

}<br />

}<br />

trace("*<br />

UN VOLTAJE NODAL NO FUE CALCULADO<br />

trace("* --> 01 REVISAR EL CIRCUITO<br />

trace("***************************************************");<br />

muestraM<strong>en</strong>sajeEstado(" 01:: ERROR EN LA SIMULACION:<br />

"naranja","alerta");<br />

for (i in corri<strong>en</strong>tesRama) {<br />

if (isNaN(corri<strong>en</strong>tesRama[i][1]) ||<br />

!isFinite(corri<strong>en</strong>tesRama[i][1])) {<br />

simu<strong>la</strong>cionValida = false;<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* SE PRODUJO UN ERROR EN LA SIMULACION<br />

}<br />

}<br />

trace("*<br />

UNA CORRIENTE DE RAMA NO FUE CALCULADA<br />

trace("* --> 02 REVISAR EL CIRCUITO<br />

trace("***************************************************");<br />

muestraM<strong>en</strong>sajeEstado(" 02:: ERROR EN LA SIMULACION:<br />

"naranja","alerta");<br />

}<br />

// --- La simu<strong>la</strong>cion fue exitosa ---<br />

if (simu<strong>la</strong>cionValida) {<br />

// --- Asigna resultados a cada compon<strong>en</strong>te <strong>de</strong>l circuito ---<br />

asignarResultadosSimu<strong>la</strong>cionDC();<br />

// --- Crea nodos visuales para repres<strong>en</strong>tarlos <strong>en</strong> <strong>3D</strong> ---<br />

crearNodosVisualesDC();<br />

}<br />

}<br />

// --- La simu<strong>la</strong>cion fue exitosa ---<br />

return simu<strong>la</strong>cionValida;<br />

public function asignarResultadosSimu<strong>la</strong>cionDC():void {<br />

// -------------------------------------------------------------<br />

// Asignacion <strong>de</strong> "voltajes nodales" a <strong>la</strong>s terminales<br />

// correspondi<strong>en</strong>tes <strong>de</strong> cada elem<strong>en</strong>to <strong>de</strong>l circuito y<br />

// calculo <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te a traves <strong>de</strong> el<br />

// -------------------------------------------------------------<br />

for (i in red.nodosAsignados) {<br />

compon<strong>en</strong>te = spEditor.getChildByName(red.nodosAsignados[i][0]);<br />

for (j=1; j


Asignacion <strong>de</strong> "corri<strong>en</strong>tes <strong>de</strong> rama" a los a<strong>la</strong>mbres (W)<br />

// y fu<strong>en</strong>tes <strong>de</strong> voltaje <strong>de</strong> DC (V)<br />

// -------------------------------------------------------------<br />

for (i in corri<strong>en</strong>tesRama) {<br />

compon<strong>en</strong>te = spEditor.getChildByName(corri<strong>en</strong>tesRama[i][0]);<br />

compon<strong>en</strong>te.asignarCorri<strong>en</strong>tesRama(corri<strong>en</strong>tesRama[i][1]);<br />

}<br />

// --- Normalizacion <strong>de</strong> voltajes y corri<strong>en</strong>tes ---<br />

normalizarVoltajes();<br />

normalizarCorri<strong>en</strong>tes();<br />

var factorEsc<strong>la</strong><strong>la</strong><strong>3D</strong>_voltaje:Number;<br />

if (voltajeMaximo == 0) {<br />

factorEsc<strong>la</strong><strong>la</strong><strong>3D</strong>_voltaje = 1;<br />

} else {<br />

factorEsc<strong>la</strong><strong>la</strong><strong>3D</strong>_voltaje = esca<strong>la</strong><strong>3D</strong>_voltaje/voltajeMaximo;<br />

}<br />

// Asignacion <strong>de</strong> resultados normalizados a cada compon<strong>en</strong>te<br />

// <strong>de</strong>l circuito para su repres<strong>en</strong>tacion <strong>en</strong> <strong>3D</strong><br />

for (i in red.nodosAsignados) {<br />

compon<strong>en</strong>te = spEditor.getChildByName(red.nodosAsignados[i][0]);<br />

compon<strong>en</strong>te.activarComportami<strong>en</strong>to<strong>3D</strong>(factorEsc<strong>la</strong><strong>la</strong><strong>3D</strong>_voltaje,esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te);<br />

}<br />

}<br />

public function crearNodosVisualesDC():void {<br />

// --------------------------------------------------------<br />

// G<strong>en</strong>eracion <strong>de</strong> "nodos graficos" que se agregan <strong>en</strong> <strong>la</strong><br />

// repres<strong>en</strong>tacion <strong>en</strong> <strong>3D</strong> como "puntos" (MovieClip's) <strong>en</strong><br />

// <strong>la</strong>s uniones <strong>de</strong> los elem<strong>en</strong>tos <strong>de</strong> circuito<br />

// --------------------------------------------------------<br />

nodosVisuales = new Array();<br />

var nodo:NodoDC;<br />

var magnitud:Number;<br />

var fase:Number;<br />

var x_n:Number, y_n:Number;<br />

var z_n:Number;<br />

var obj:Object;<br />

}<br />

for (i in red.nodosTerminales) {<br />

// Asignacion <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas (x,y,z) para cada "nodo visual"<br />

x_n = parametros.puntosRejil<strong>la</strong>[red.nodosTerminales[i][0]].xg;<br />

y_n = parametros.puntosRejil<strong>la</strong>[red.nodosTerminales[i][0]].yg;<br />

if (voltajeMaximo == 0) {<br />

z_n = voltajesNodales[i];<br />

} else {<br />

z_n = (voltajesNodales[i]/voltajeMaximo)*esca<strong>la</strong><strong>3D</strong>_voltaje;<br />

}<br />

// --- Formacion <strong>de</strong>l argum<strong>en</strong>to para el "constructor" <strong>de</strong>l nodo ---<br />

obj = new Object();<br />

obj.i = i;<br />

obj.x_n = x_n;<br />

obj.y_n = y_n;<br />

obj.z_n = z_n;<br />

obj.voltajeNodal = voltajesNodales[i];<br />

// --- Creacion <strong>de</strong>l nodo visual ---<br />

nodo = new NodoDC(obj);<br />

nodosVisuales.push(nodo);<br />

}<br />

public function normalizarVoltajes():void {<br />

// --- Determinacion <strong>de</strong>l voltaje nodal maximo ---<br />

voltajeMaximo = Math.abs(voltajesNodales[0]);<br />

8


}<br />

for (i=1; i


}<br />

// el valor <strong>de</strong> <strong>la</strong> corri<strong>en</strong>te a traves <strong>de</strong> dicho compon<strong>en</strong>te<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.factor_conversion = convierte_<strong>de</strong>cadas;<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMaxima = corri<strong>en</strong>teMaxima;<br />

esca<strong>la</strong><strong>3D</strong>_corri<strong>en</strong>te.corri<strong>en</strong>teMinima = corri<strong>en</strong>teMinima;<br />

public function mostrarM<strong>en</strong>sajeDC():void {<br />

muestraM<strong>en</strong>sajeEstado(" SIMULACION VALIDA EN > DC


*");<br />

EL CIRCUITO",<br />

// -----------------------------------------------------------<br />

// Comprueba que no existan errores <strong>en</strong> <strong>la</strong> simu<strong>la</strong>cion<br />

// por <strong>la</strong>s sigui<strong>en</strong>tes condiciones:<br />

// -----------------------------------------------------------<br />

simu<strong>la</strong>cionValida = true;<br />

if (simu<strong>la</strong>dor_AC.validarSimu<strong>la</strong>cionAC()) {<br />

simu<strong>la</strong>cionValida = true;<br />

} else {<br />

simu<strong>la</strong>cionValida = false;<br />

trace(" ");<br />

trace("***************************************************");<br />

trace("* SE PRODUJO UN ERROR EN LA SIMULACION AC *");<br />

trace("* UN VALOR DE GANANCIA NO ES VALIDO *");<br />

trace("* --> REVISAR EL CIRCUITO<br />

}<br />

trace("***************************************************");<br />

muestraM<strong>en</strong>sajeEstado(" 03:: ERROR EN LA SIMULACION: REVISAR<br />

"naranja","alerta");<br />

}<br />

// --- Simu<strong>la</strong>cion exitosa ---<br />

if (simu<strong>la</strong>cionValida) {<br />

// --- Recupera valores <strong>de</strong> <strong>la</strong> simu<strong>la</strong>cion ---<br />

LD = simu<strong>la</strong>dor_AC.LD;<br />

// --- Craer nodos visuales ---<br />

crearNodosVisuales();<br />

// --- Asignar resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>cion a cada compon<strong>en</strong>te ---<br />

asignarResultadosSimu<strong>la</strong>cionAC();<br />

}<br />

}<br />

// --- Simu<strong>la</strong>cion exitosa ---<br />

return simu<strong>la</strong>cionValida;<br />

public function crearNodosVisuales():void {<br />

// --------------------------------------------------------<br />

// G<strong>en</strong>eracion <strong>de</strong> "nodos visuales" que se agregan <strong>en</strong> <strong>la</strong><br />

// repres<strong>en</strong>tacion <strong>en</strong> <strong>3D</strong> como "puntos" (MovieClip's) <strong>en</strong><br />

// <strong>la</strong>s uniones <strong>de</strong> los elem<strong>en</strong>tos <strong>de</strong> circuito<br />

// --------------------------------------------------------<br />

nodosVisuales = new Array();<br />

var nodo:NodoAC;<br />

var magnitud:Number;<br />

var fase:Number;<br />

var x_n:Number, y_n:Number;<br />

var z_n:Array;<br />

var obj:Object;<br />

// --- Normalizar magnitud <strong>de</strong> voltajes nodales ---<br />

normalizarMagnitudVoltajesComplejos();<br />

for (i in red.nodosTerminales) {<br />

// Asignacion <strong>de</strong> <strong>la</strong>s coord<strong>en</strong>adas (x,y,z) para cada "nodo visual"<br />

x_n = parametros.puntosRejil<strong>la</strong>[red.nodosTerminales[i][0]].xg;<br />

y_n = parametros.puntosRejil<strong>la</strong>[red.nodosTerminales[i][0]].yg;<br />

// Se utiliza signo negativo por conv<strong>en</strong>cion <strong>de</strong> sistema <strong>de</strong> ejes x,y,z<br />

// --- V(t) = magnitud*Cos<strong>en</strong>o(wt + fase) ---<br />

magnitud = -voltajesNodalesComplejos[i].x;<br />

fase = -voltajesNodalesComplejos[i].y;<br />

if (voltajeMaximoMagnitud != 0) {<br />

magnitud = magnitud*esca<strong>la</strong><strong>3D</strong>_voltaje/voltajeMaximoMagnitud;<br />

}<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>era y asigna a cada nodo visual, una tab<strong>la</strong> con los<br />

// valores <strong>de</strong> voltaje nodal <strong>de</strong>fasados <strong>de</strong> acur=erdo a los<br />

11


}<br />

}<br />

// resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>cion<br />

// -----------------------------------------------------------<br />

z_n = tab<strong>la</strong>Cos<strong>en</strong>o.g<strong>en</strong>eraCos<strong>en</strong>oModu<strong>la</strong>do(magnitud,fase);<br />

// --- Formacion <strong>de</strong>l argum<strong>en</strong>to para el "constructor" <strong>de</strong>l nodo ---<br />

obj = new Object();<br />

obj.i = i;<br />

obj.x_n = x_n;<br />

obj.y_n = y_n;<br />

obj.z_n = z_n; // Array<br />

obj.magnitud = magnitud;<br />

obj.fase = fase;<br />

obj.voltajeNodalPico = voltajesNodalesComplejos[i].x;<br />

// --- Creacion <strong>de</strong>l nodo visua---<br />

nodo = new NodoAC(obj);<br />

nodosVisuales.push(nodo);<br />

public function asignarResultadosSimu<strong>la</strong>cionAC():void {<br />

// -------------------------------------------------------------<br />

// Asignacion <strong>de</strong>l "arreglo <strong>de</strong> voltajes nodales" a <strong>la</strong>s terminales<br />

// correspondi<strong>en</strong>tes <strong>de</strong> cada elem<strong>en</strong>to <strong>de</strong>l circuito<br />

// Estos valores son listas <strong>de</strong> 400 puntos <strong>de</strong> una funcion s<strong>en</strong>oidal<br />

// <strong>de</strong>fasada <strong>de</strong> acuerdo a los resultados <strong>de</strong> <strong>la</strong> simu<strong>la</strong>cion<br />

// -------------------------------------------------------------<br />

var magnitud:Number;<br />

var fase:Number;<br />

for (i in red.nodosAsignados) {<br />

compon<strong>en</strong>te = spEditor.getChildByName(red.nodosAsignados[i][0]);<br />

for (j=1; j


// Area <strong>de</strong> MENSAJES DE ESTADO<br />

//<br />

// ------------------------------------------------------------------<br />

public function muestraM<strong>en</strong>sajeEstado(msg:String,color:String,tipo:String):void {<br />

// --- Limpia el area <strong>de</strong> m<strong>en</strong>sajes ---<br />

while(areaM<strong>en</strong>sajesEstado.numChildr<strong>en</strong> > 0) {<br />

areaM<strong>en</strong>sajesEstado.removeChildAt(0);<br />

}<br />

// --- Seleccion <strong>de</strong> color <strong>de</strong>l text<strong>de</strong>l m<strong>en</strong>saje ---<br />

var colorTexto:Number;<br />

switch(color) {<br />

case "b<strong>la</strong>nco":<br />

colorTexto = 0xffffff;<br />

break;<br />

case "ver<strong>de</strong>":<br />

colorTexto = 0x00ff99;<br />

break;<br />

case "naranja":<br />

colorTexto = 0xff9900;<br />

break;<br />

<strong>de</strong>fault:<br />

trace("ERROR: Color no soportado");<br />

break;<br />

}<br />

// --- Construccion <strong>de</strong>l texto <strong>de</strong>l m<strong>en</strong>saje ---<br />

var m<strong>en</strong>saje:TextField = new TextField();<br />

m<strong>en</strong>saje.text = msg;<br />

m<strong>en</strong>saje.x=10;<br />

m<strong>en</strong>saje.y=3;<br />

m<strong>en</strong>saje.autoSize=TextFieldAutoSize.LEFT;<br />

m<strong>en</strong>saje.width = 250;<br />

m<strong>en</strong>saje.height = 15;<br />

// --- Formato <strong>de</strong>l Texto <strong>de</strong>l m<strong>en</strong>saje ---<br />

var format:TextFormat = new TextFormat();<br />

format.font = "_sans";<br />

format.size = 10;<br />

format.color = colorTexto;<br />

m<strong>en</strong>saje.setTextFormat(format);<br />

// --- Selecciona el tipo <strong>de</strong> m<strong>en</strong>saje ---<br />

switch(tipo) {<br />

case "alerta":<br />

areaM<strong>en</strong>sajesEstado.gotoAndP<strong>la</strong>y(tipo);<br />

break;<br />

case "normal":<br />

areaM<strong>en</strong>sajesEstado.gotoAndP<strong>la</strong>y(tipo);<br />

break;<br />

}<br />

}<br />

}<br />

// --- Despliega m<strong>en</strong>saje ---<br />

areaM<strong>en</strong>sajesEstado.addChild(m<strong>en</strong>saje);<br />

}<br />

13


package Contro<strong>la</strong>dor<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: contro<strong>la</strong>dor<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "MVC" (MODELO - VISTA - CONTROLADOR)<br />

//<br />

// septiembre / 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Botones<br />

import fl.controls.Button;<br />

// Animaciones<br />

import fl.transitions.Twe<strong>en</strong>;<br />

import fl.transitions.easing.*;<br />

// Mo<strong>de</strong>lo MVC<br />

import Mo<strong>de</strong>lo.Mo<strong>de</strong>loCircuito;<br />

import Vistas.dc.vistasDC;<br />

import Vistas.ac.vistasAC;<br />

// M<strong>en</strong>us compon<strong>en</strong>tes y circuitos<br />

import com.fabrica.consumidor.registroBotones.CrearBotonesCompon<strong>en</strong>tes;<br />

import com.fabrica.consumidor.registroBotones.CrearBotones<strong>Circuitos</strong>;<br />

public c<strong>la</strong>ss contro<strong>la</strong>dor ext<strong>en</strong>ds Sprite {<br />

public var mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito;<br />

public var elem<strong>en</strong>tosCircuito:Array;<br />

// --- Colores ---<br />

public var ver<strong>de</strong>:Number = 0x00ff99;<br />

public var naranja:Number = 0xff6633;<br />

public var naranja2:Number = 0xff9900;<br />

public var azul:Number = 0x0099ff;<br />

public var azul2:Number = 0x0066ff;<br />

public var amarillo:Number = 0xffff00;<br />

public var violeta:Number = 0xff00ff;<br />

public var rojo:Number = 0xff0000;<br />

public var rojo2:Number = 0xcc0000;<br />

public var cafe:Number = 0xcc6633;<br />

public var b<strong>la</strong>nco:Number = 0xffffff;<br />

public var gris:Number = 0x666666;<br />

public var negro:Number = 0x000000;<br />

// --- Editor ---<br />

public var anchoFondoEditor:Number = 400;<br />

public var alturaFondoEditor:Number = 400;<br />

public var spC<strong>en</strong>tro:Sprite;<br />

public var spEditor:Sprite;<br />

public var rejil<strong>la</strong>:Sprite;<br />

public var mascara:Sprite;<br />

// --- Parametros compartidos ---<br />

public var parametros:Object;<br />

public var separacionEntrePuntosRejil<strong>la</strong>:Number = 20;<br />

public var numeroPuntosAnchoRejil<strong>la</strong>:Number;<br />

public var numeroPuntosAltoRejil<strong>la</strong>:Number;<br />

public var longitudCompon<strong>en</strong>te:Number = 40;<br />

public var puntosRejil<strong>la</strong>:Array;<br />

15


public var posicionInicialCompon<strong>en</strong>teX:Number = -180;<br />

public var posicionInicialCompon<strong>en</strong>teY:Number = -180;<br />

// --- M<strong>en</strong>us ---<br />

public var spM<strong>en</strong>uCompon<strong>en</strong>tes:Sprite;<br />

private var spM<strong>en</strong>u<strong>Circuitos</strong>:Sprite;<br />

private var mcRefer<strong>en</strong>cia<strong>3D</strong>:MovieClip;<br />

// --- Animaciones ---<br />

private var moverV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong>:Twe<strong>en</strong>;<br />

private var moverM<strong>en</strong>uCompon<strong>en</strong>tes:Twe<strong>en</strong>;<br />

private var moverM<strong>en</strong>u<strong>Circuitos</strong>:Twe<strong>en</strong>;<br />

// --- Auxiliares ---<br />

public var estado:String;<br />

public var elem<strong>en</strong>tos:Array;<br />

public var muestraResultadosDC:vistasDC;<br />

public var muestraResultadosAC:vistasAC;<br />

public function contro<strong>la</strong>dor(mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito,<br />

muestraResultadosDC:vistasDC,<br />

muestraResultadosAC:vistasAC) {<br />

this.mo<strong>de</strong>lo = mo<strong>de</strong>lo;<br />

this.muestraResultadosDC = muestraResultadosDC;<br />

this.muestraResultadosAC = muestraResultadosAC;<br />

// -----------------------------------------------------------<br />

// Creacion <strong>de</strong> botones para el m<strong>en</strong>u superior <strong>de</strong> <strong>la</strong> pantal<strong>la</strong><br />

// -----------------------------------------------------------<br />

btnEdicion = new Button();<br />

btnEdicion.x = 20;<br />

btnEdicion.y = 15;<br />

btnEdicion.<strong>la</strong>bel = "EDICION";<br />

// Maximo 14 caracteres<br />

addChild(btnEdicion);<br />

btnSimDC = new Button();<br />

btnSimDC.x = 130;<br />

btnSimDC.y = 15;<br />

btnSimDC.<strong>la</strong>bel = "SIMULAR EN DC"; // Maximo 14 caracteres<br />

addChild(btnSimDC);<br />

btnSimAC = new Button();<br />

btnSimAC.x = 240;<br />

btnSimAC.y = 15;<br />

btnSimAC.<strong>la</strong>bel = "SIMULAR EN AC"; // Maximo 14 caracteres<br />

addChild(btnSimAC);<br />

btnSimDC.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, this.botonSimu<strong>la</strong>rDC);<br />

btnEdicion.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, this.botonEditar);<br />

btnSimAC.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.CLICK, this.botonSimu<strong>la</strong>rAC);<br />

// -----------------------------------------------------------<br />

// Creacion <strong>de</strong>l Editor con su rejil<strong>la</strong> para colocacion <strong>de</strong><br />

// compon<strong>en</strong>tes<br />

// -----------------------------------------------------------<br />

// --- C<strong>en</strong>tro <strong>de</strong>l editor ---<br />

spC<strong>en</strong>tro = new Sprite();<br />

spC<strong>en</strong>tro.x = (anchoFondoEditor/2) + 20;<br />

spC<strong>en</strong>tro.y = (alturaFondoEditor/2) + 60;<br />

// --- Rejil<strong>la</strong> Editor ---<br />

rejil<strong>la</strong> = new Sprite();<br />

g<strong>en</strong>eraRejil<strong>la</strong>(rejil<strong>la</strong>);<br />

spC<strong>en</strong>tro.addChild(rejil<strong>la</strong>);<br />

// --- Editor ---<br />

spEditor = new Sprite();<br />

spEditor.graphics.lineStyle(1,b<strong>la</strong>nco,1);<br />

16


spEditor.graphics.beginFill(negro,0.5);<br />

spEditor.graphics.drawRect(-(anchoFondoEditor/2+10),<br />

spEditor.graphics.<strong>en</strong>dFill();<br />

spC<strong>en</strong>tro.addChild(spEditor);<br />

-(alturaFondoEditor/2+10),<br />

anchoFondoEditor+20,<br />

alturaFondoEditor+20);<br />

// --- Mascara <strong>de</strong> edicion aplicada <strong>en</strong> <strong>la</strong>s simu<strong>la</strong>ciones <strong>en</strong> <strong>3D</strong> ---<br />

mascara = new Sprite();<br />

mascara.graphics.lineStyle();<br />

mascara.graphics.beginFill(0xff0000);<br />

mascara.graphics.drawRect(-(anchoFondoEditor/2+10),<br />

-(alturaFondoEditor/2+10),<br />

anchoFondoEditor+21,<br />

alturaFondoEditor+21);<br />

mascara.graphics.<strong>en</strong>dFill();<br />

// --- Indicador <strong>de</strong> estado ---<br />

estado = "editando";<br />

// -----------------------------------------------------------<br />

// Parametros comunes a varias C<strong>la</strong>ses y Objetos <strong>de</strong>rivados<br />

// -----------------------------------------------------------<br />

parametros = new Object();<br />

parametros.separacionEntrePuntosRejil<strong>la</strong> = separacionEntrePuntosRejil<strong>la</strong>;<br />

parametros.numeroPuntosAnchoRejil<strong>la</strong> = numeroPuntosAnchoRejil<strong>la</strong>;<br />

parametros.numeroPuntosAltoRejil<strong>la</strong> = numeroPuntosAltoRejil<strong>la</strong>;<br />

parametros.longitudCompon<strong>en</strong>te = longitudCompon<strong>en</strong>te;<br />

parametros.puntosRejil<strong>la</strong> = puntosRejil<strong>la</strong>;<br />

parametros.posicionInicialCompon<strong>en</strong>teX = posicionInicialCompon<strong>en</strong>teX;<br />

parametros.posicionInicialCompon<strong>en</strong>teY = posicionInicialCompon<strong>en</strong>teY;<br />

// -----------------------------------------------------------<br />

// -----------------------------------------------------------<br />

// Creacion <strong>de</strong>l M<strong>en</strong>u <strong>de</strong> Compon<strong>en</strong>tes<br />

// -----------------------------------------------------------<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes = new Sprite();<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.graphics.lineStyle(1,b<strong>la</strong>nco,1);<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.graphics.beginFill(negro,1);<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.graphics.drawRect(0,0,300,420);<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.graphics.<strong>en</strong>dFill();<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.x = 800;<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.y = 50;<br />

<strong>en</strong>tradaM<strong>en</strong>uCompon<strong>en</strong>tes();<br />

// -----------------------------------------------------------<br />

// Creacion y colocacion <strong>de</strong> todos los botones<br />

// correspondi<strong>en</strong>tes a los COMPONENTES que se manejan <strong>en</strong><br />

// el M<strong>en</strong>u <strong>de</strong> Compon<strong>en</strong>tes<br />

// -----------------------------------------------------------<br />

var botones:CrearBotonesCompon<strong>en</strong>tes = new CrearBotonesCompon<strong>en</strong>tes(<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes,<br />

spEditor,parametros);<br />

// -----------------------------------------------------------<br />

// Creacion <strong>de</strong>l M<strong>en</strong>u <strong>de</strong> <strong>Circuitos</strong><br />

// -----------------------------------------------------------<br />

spM<strong>en</strong>u<strong>Circuitos</strong> = new Sprite();<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.graphics.lineStyle(1,b<strong>la</strong>nco,1);<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.graphics.beginFill(negro,1);<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.graphics.drawRect(0,0,800,200);<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.graphics.<strong>en</strong>dFill();<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.x = 0;<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.y = 600;<br />

<strong>en</strong>tradaM<strong>en</strong>u<strong>Circuitos</strong>();<br />

17


-----------------------------------------------------------<br />

// Creacion <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> refer<strong>en</strong>cia y controles <strong>en</strong> <strong>3D</strong><br />

// -----------------------------------------------------------<br />

mcRefer<strong>en</strong>cia<strong>3D</strong> = new mc_Refer<strong>en</strong>cia_<strong>3D</strong>();<br />

mcRefer<strong>en</strong>cia<strong>3D</strong>.x = 732;<br />

mcRefer<strong>en</strong>cia<strong>3D</strong>.y = 97;<br />

salidaV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong>();<br />

// -----------------------------------------------------------<br />

// Creacion y colocacion <strong>de</strong> todos los botones<br />

// correspondi<strong>en</strong>tes a los CIRCUITOS que se manejan <strong>en</strong><br />

// el M<strong>en</strong>u <strong>de</strong> <strong>Circuitos</strong><br />

// -----------------------------------------------------------<br />

var botones<strong>Circuitos</strong>:CrearBotones<strong>Circuitos</strong> = new CrearBotones<strong>Circuitos</strong>(<br />

spM<strong>en</strong>u<strong>Circuitos</strong>,<br />

spEditor,parametros);<br />

// -----------------------------------------------------------<br />

// Colocacion <strong>de</strong> <strong>la</strong> v<strong>en</strong>tana <strong>de</strong> refer<strong>en</strong>cia, editor,<br />

// m<strong>en</strong>u <strong>de</strong> compon<strong>en</strong>tes y m<strong>en</strong>u <strong>de</strong> circuitos <strong>en</strong> capas ord<strong>en</strong>adas<br />

// -----------------------------------------------------------<br />

// --- Capa 1 ---<br />

addChild(mcRefer<strong>en</strong>cia<strong>3D</strong>);<br />

// --- Capa 2 ---<br />

addChild(spM<strong>en</strong>uCompon<strong>en</strong>tes);<br />

// --- Capa 3 ---<br />

addChild(spM<strong>en</strong>u<strong>Circuitos</strong>);<br />

// --- Capa 4 ---<br />

addChild(spC<strong>en</strong>tro);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Creacion <strong>de</strong> <strong>la</strong> Rejil<strong>la</strong> <strong>de</strong> refer<strong>en</strong>cia pra el Editor<br />

//<br />

// -----------------------------------------------------------<br />

public function g<strong>en</strong>eraRejil<strong>la</strong>(target:Sprite):void {<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>erador <strong>de</strong> coord<strong>en</strong>adas para posicionami<strong>en</strong>to <strong>de</strong><br />

// compon<strong>en</strong>tes <strong>de</strong>l circuito <strong>en</strong> <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> dibujo <strong>de</strong>l<br />

// EDITOR<br />

// -----------------------------------------------------------<br />

// -----------------------------------------------------------<br />

// Definicion <strong>de</strong> arreglo <strong>de</strong> puntos <strong>de</strong> refer<strong>en</strong>cia<br />

// Estructura <strong>de</strong> DATOS:<br />

// puntosRejil<strong>la</strong>[numero_Punto] = [fi<strong>la</strong>, columna, x, y, z]<br />

// -----------------------------------------------------------<br />

puntosRejil<strong>la</strong> = new Array();<br />

// --- Ajuste <strong>de</strong> tamanio <strong>de</strong> parametros <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> ---<br />

numeroPuntosAnchoRejil<strong>la</strong> = Math.ceil(anchoFondoEditor/separacionEntrePuntosRejil<strong>la</strong>);<br />

numeroPuntosAltoRejil<strong>la</strong> = Math.ceil(alturaFondoEditor/separacionEntrePuntosRejil<strong>la</strong>);<br />

mitadNumPuntosXRejil<strong>la</strong> = numeroPuntosAnchoRejil<strong>la</strong>/2;<br />

mitadNumPuntosYRejil<strong>la</strong> = numeroPuntosAltoRejil<strong>la</strong>/2;<br />

// --- Ll<strong>en</strong>ado <strong>de</strong>l arreglo <strong>de</strong> puntos <strong>de</strong> refer<strong>en</strong>cia ---<br />

var k:Number = 0;<br />

// --- Coord<strong>en</strong>adas <strong>de</strong> DIBUJO ---<br />

var xg:Number;<br />

var yg:Number;<br />

var zg:Number;<br />

// --- Coord<strong>en</strong>adas <strong>de</strong> COLOCACION DE COMPONENTES ---<br />

var x_coord:Number;<br />

var y_coord:Number;<br />

var datos:Object;<br />

18


--- Manejo <strong>de</strong>l Array "puntosRejil<strong>la</strong> ---<br />

var columna:Number;<br />

var fi<strong>la</strong>:Number;<br />

// -----------------------------------------------------------<br />

// Dibujo <strong>de</strong> <strong>la</strong> Rejil<strong>la</strong> <strong>de</strong> Refer<strong>en</strong>cia para dibujar el circuito<br />

// -----------------------------------------------------------<br />

// --- C<strong>en</strong>tro <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> ---<br />

var long:uint = 6;<br />

target.graphics.lineStyle(1,0xffffff,1);<br />

target.graphics.moveTo(-long,0);<br />

target.graphics.lineTo(long,0);<br />

target.graphics.moveTo(0,-long);<br />

target.graphics.lineTo(0,long);<br />

// --- Circulos <strong>en</strong> posiciones validas <strong>de</strong> <strong>la</strong> rejil<strong>la</strong> ---<br />

target.graphics.lineStyle(0,0xffffff,0.6);<br />

// i --> RENGLONES (y)<br />

for (var i=-numeroPuntosAltoRejil<strong>la</strong>/2; i COLUMNAS (x)<br />

for (var j=-numeroPuntosAnchoRejil<strong>la</strong>/2; j


format.font = "_sans";<br />

format.size = 8;<br />

format.color = 0xffffff;<br />

etiqueta.setTextFormat(format);<br />

target.addChild(etiqueta);*/<br />

}<br />

k++;<br />

}<br />

}<br />

numeroTotalPuntosRejil<strong>la</strong> = k;<br />

// -----------------------------------------------------------<br />

//<br />

// Controles <strong>de</strong> <strong>en</strong>trada y salida <strong>de</strong>l M<strong>en</strong>u <strong>de</strong> Compon<strong>en</strong>tes<br />

// y <strong>de</strong>l M<strong>en</strong>u <strong>de</strong> <strong>Circuitos</strong><br />

//<br />

// -----------------------------------------------------------<br />

private function <strong>en</strong>tradaV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong>():void {<br />

moverV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong> = new Twe<strong>en</strong>(mcRefer<strong>en</strong>cia<strong>3D</strong>, "x",<br />

E<strong>la</strong>stic.easeOut,<br />

mcRefer<strong>en</strong>cia<strong>3D</strong>.x,<br />

732, 3, true);<br />

}<br />

private function salidaV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong>():void {<br />

moverV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong> = new Twe<strong>en</strong>(mcRefer<strong>en</strong>cia<strong>3D</strong>, "x",<br />

E<strong>la</strong>stic.easeOut,<br />

mcRefer<strong>en</strong>cia<strong>3D</strong>.x,<br />

1000, 3, true);<br />

}<br />

private function <strong>en</strong>tradaM<strong>en</strong>uCompon<strong>en</strong>tes():void {<br />

moverM<strong>en</strong>uCompon<strong>en</strong>tes = new Twe<strong>en</strong>(spM<strong>en</strong>uCompon<strong>en</strong>tes, "x",<br />

E<strong>la</strong>stic.easeOut,<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.x,<br />

475, 3, true);<br />

}<br />

private function salidaM<strong>en</strong>uCompon<strong>en</strong>tes():void {<br />

moverM<strong>en</strong>uCompon<strong>en</strong>tes = new Twe<strong>en</strong>(spM<strong>en</strong>uCompon<strong>en</strong>tes, "x",<br />

E<strong>la</strong>stic.easeOut,<br />

spM<strong>en</strong>uCompon<strong>en</strong>tes.x,<br />

1000, 3, true);<br />

}<br />

private function <strong>en</strong>tradaM<strong>en</strong>u<strong>Circuitos</strong>():void {<br />

moverM<strong>en</strong>u<strong>Circuitos</strong> = new Twe<strong>en</strong>(spM<strong>en</strong>u<strong>Circuitos</strong>, "y",<br />

}<br />

private function salidaM<strong>en</strong>u<strong>Circuitos</strong>():void {<br />

moverM<strong>en</strong>u<strong>Circuitos</strong> = new Twe<strong>en</strong>(spM<strong>en</strong>u<strong>Circuitos</strong>, "y",<br />

}<br />

E<strong>la</strong>stic.easeOut,<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.y,<br />

500, 3, true);<br />

E<strong>la</strong>stic.easeOut,<br />

spM<strong>en</strong>u<strong>Circuitos</strong>.y,<br />

710, 3, true);<br />

// -----------------------------------------------------------<br />

//<br />

// Comportami<strong>en</strong>tos <strong>de</strong> los botones <strong>de</strong> Edicion, Simu<strong>la</strong>r <strong>en</strong> DC<br />

// y simu<strong>la</strong>r <strong>en</strong> AC<br />

//<br />

// -----------------------------------------------------------<br />

protected function botonEditar(ev<strong>en</strong>t:Ev<strong>en</strong>t):void {<br />

// -----------------------------------------------------------<br />

20


Boton "EDICION "<br />

// -----------------------------------------------------------<br />

if (estado != "editando") {<br />

if (estado == "simu<strong>la</strong>ndoDC") {<br />

// Retorno <strong>de</strong>l estado <strong>de</strong> SIMULACION EN DC<br />

// al estado <strong>de</strong> EDICION<br />

for (i=0; i


muestraResultadosDC.mostrarDatos(mo<strong>de</strong>lo.spEditor,mo<strong>de</strong>lo.nodosVisuales);<br />

// --- Quitar m<strong>en</strong>us <strong>de</strong> compon<strong>en</strong>tes y circuitos ---<br />

salidaM<strong>en</strong>uCompon<strong>en</strong>tes();<br />

salidaM<strong>en</strong>u<strong>Circuitos</strong>();<br />

<strong>en</strong>tradaV<strong>en</strong>tanaRefer<strong>en</strong>cia<strong>3D</strong>();<br />

// --- Actualiza el estado <strong>de</strong>l simu<strong>la</strong>dor ---<br />

estado = "simu<strong>la</strong>ndoDC";<br />

// --- Aplica <strong>la</strong> mascara al Editor ---<br />

// Esta mascara evita que el p<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia<br />

// sobrepase el cuadro asignado para mostrar <strong>la</strong><br />

// simu<strong>la</strong>cion <strong>en</strong> <strong>3D</strong><br />

spC<strong>en</strong>tro.addChild(mascara);<br />

spEditor.mask = mascara;<br />

}<br />

}<br />

} else {<br />

}<br />

}<br />

// --- Quitar <strong>la</strong> rejil<strong>la</strong> <strong>de</strong> refer<strong>en</strong>cia <strong>de</strong>l Editor ---<br />

rejil<strong>la</strong>.visible = false;<br />

// Si el simu<strong>la</strong>dor se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el estado "simu<strong>la</strong>ndoDC"<br />

// no pue<strong>de</strong> cambiar al estado "simu<strong>la</strong>ndoAC" o "simu<strong>la</strong>ndoDC".<br />

// Solo podra cambiar al estado <strong>de</strong> "editando"<br />

protected function botonSimu<strong>la</strong>rAC(ev<strong>en</strong>t:Ev<strong>en</strong>t):void {<br />

// -----------------------------------------------------------<br />

// Boton "SIMULAR EN AC "<br />

// -----------------------------------------------------------<br />

if (estado != "simu<strong>la</strong>ndoDC" || estado != "simu<strong>la</strong>ndoAC") {<br />

// Se permite este estado <strong>de</strong> "simu<strong>la</strong>ndoAC"<br />

// --- Capturar el circuito proced<strong>en</strong>te <strong>de</strong>l Editor<br />

mo<strong>de</strong>lo.capturaElem<strong>en</strong>tosCircuito(spEditor,parametros);<br />

if (mo<strong>de</strong>lo.autorizacionCambiarEstado) {<br />

// --- Captura existosa <strong>de</strong>l circuito ---<br />

// Guarda refer<strong>en</strong>cia a todos los compon<strong>en</strong>tes <strong>de</strong>l Editor<br />

elem<strong>en</strong>tosCircuito = new Array();<br />

for (i=0; i


}<br />

}<br />

}<br />

}<br />

} else {<br />

}<br />

}<br />

// Si el simu<strong>la</strong>dor se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el estado "simu<strong>la</strong>ndoAC"<br />

// no pue<strong>de</strong> cambiar al estado "simu<strong>la</strong>ndoDC" o "simu<strong>la</strong>ndoAC".<br />

// Solo podra cambiar al estado <strong>de</strong> "editando"<br />

package com.bin<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: tab<strong>la</strong>Cos<strong>en</strong>oidal<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se: "mo<strong>de</strong>loCircuito"<br />

//<br />

// septiembre / 2010<br />

// **************************************************************<br />

//<br />

// TABLA: "cos<strong>en</strong>o" ---> Array: 62 muestras <strong>de</strong> <strong>la</strong> funcion<br />

// cos<strong>en</strong>o espaciadas un angulo <strong>de</strong> 0.1<br />

// radianes con amplitud 1.0 y fase 0<br />

// Formato:<br />

// cos<strong>en</strong>o[i][0] = angulo <strong>en</strong> radianes<br />

// cos<strong>en</strong>o[i][1] = valor <strong>de</strong> <strong>la</strong> funcion<br />

//<br />

// ENTRADA: "amplitud" --> Number: Amplitud <strong>de</strong>l cos<strong>en</strong>o<br />

// "fase" --> Number: Fase <strong>de</strong>l cos<strong>en</strong>o<br />

//<br />

// SALIDA: "cos<strong>en</strong>oModu<strong>la</strong>do" --> Array: 62 muestras <strong>de</strong> <strong>la</strong><br />

// funcion cos<strong>en</strong>o espaciadas<br />

// un angulo <strong>de</strong> 0.1 radianes<br />

// modu<strong>la</strong>dos con "amplitud" y<br />

// "fase"<br />

//<br />

// **************************************************************<br />

public c<strong>la</strong>ss tab<strong>la</strong>Cos<strong>en</strong>oidal {<br />

// --- Tab<strong>la</strong> cos<strong>en</strong>oidal ---<br />

public var cos<strong>en</strong>o:Array;<br />

// --- Increm<strong>en</strong>to <strong>de</strong>l angulo <strong>en</strong> radianes ---<br />

public var <strong>de</strong>ltaAngulo:Number = 0.1;<br />

// --- Numero <strong>de</strong> muestras <strong>de</strong> <strong>la</strong> Tab<strong>la</strong> cos<strong>en</strong>oidal ---<br />

var numMuestras:Number;<br />

public function tab<strong>la</strong>Cos<strong>en</strong>oidal():void {<br />

}<br />

// --- Constructor ---<br />

g<strong>en</strong>eraTab<strong>la</strong>Cos<strong>en</strong>oidal();<br />

23


public function g<strong>en</strong>eraTab<strong>la</strong>Cos<strong>en</strong>oidal():void {<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>eracion <strong>de</strong> <strong>la</strong> tab<strong>la</strong> cos<strong>en</strong>oidal con amplitud 1.0 y fase 0<br />

// -----------------------------------------------------------<br />

var cos:Number;<br />

var angulo:Number = 0;<br />

cos<strong>en</strong>o = new Array();<br />

// --- 62 muestras ---<br />

numMuestras = Math.round(2*Math.PI/<strong>de</strong>ltaAngulo)-1;<br />

}<br />

for (i=0; i= 0) {<br />

faseIndiceInicial = Math.round(numMuestras*fase/360);<br />

} else {<br />

faseIndiceInicial = numMuestras -<br />

Math.round(numMuestras*Math.abs(fase)/360);<br />

}<br />

numMuestras][1]);<br />

}<br />

// --- Construccion <strong>de</strong>l cos<strong>en</strong>o modu<strong>la</strong>do ---<br />

for (i in cos<strong>en</strong>o) {<br />

faseIndice = faseIndiceInicial + i;<br />

if (faseIndice < cos<strong>en</strong>o.l<strong>en</strong>gth) {<br />

cos<strong>en</strong>oModu<strong>la</strong>do[i] = Math.round(<br />

amplitud*cos<strong>en</strong>o[faseIndice][1]);<br />

} else {<br />

cos<strong>en</strong>oModu<strong>la</strong>do[i] = Math.round(<br />

amplitud*cos<strong>en</strong>o[faseIndice -<br />

}<br />

}<br />

return cos<strong>en</strong>oModu<strong>la</strong>do<br />

}<br />

}<br />

24


package com.red.g<strong>en</strong>erador<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: manejadorRed<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "Mo<strong>de</strong>loCircuito"<br />

//<br />

// abril<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - redDibujo --> Sprite: Dibujo <strong>de</strong>l circuito a simu<strong>la</strong>r<br />

//<br />

// SALIDA:<br />

// - Validacion <strong>de</strong>l circuito:<br />

// * existeCircuito() --> Existe circuito?<br />

// * v<strong>en</strong>tanaAbierta() --> Exist<strong>en</strong> v<strong>en</strong>tanas <strong>de</strong> edicion abiertas?<br />

// * existeTierra() --> Existe nodo <strong>de</strong> tierra?<br />

// * compruebaTierraCircuito() --> Comprueba que el circuito<br />

// t<strong>en</strong>ga<br />

conectado al m<strong>en</strong>os<br />

// una terminal<br />

<strong>de</strong> "tierra"<br />

// * conexionValidaFu<strong>en</strong>tes() --> Busca Fu<strong>en</strong>tes <strong>de</strong> VOLTAJE <strong>en</strong><br />

// CORTO<br />

CIRCUITO o<br />

// Fu<strong>en</strong>tes <strong>de</strong><br />

CORRIENTE <strong>en</strong><br />

// CIRCUITO<br />

ABIERTO<br />

// * construyeRed() --> G<strong>en</strong>era un archivo <strong>de</strong>scriptivo <strong>de</strong><br />

// <strong>de</strong>l circuito con un formato simi<strong>la</strong>r<br />

// a "PSPICE"<br />

// * g<strong>en</strong>eraDescripcionGraficaCircuito() --> G<strong>en</strong>era el archivo<br />

//<br />

impreso <strong>de</strong> <strong>la</strong> <strong>de</strong>scripcion<br />

// <strong>de</strong>l<br />

circuito dibujado <strong>en</strong><br />

// el<br />

editor<br />

//<br />

// **************************************************************<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.Sprite;<br />

public c<strong>la</strong>ss manejadorRed {<br />

public var redDibujo:Sprite;<br />

public var redCircuito:Array;<br />

public var listaTerminales:Array;<br />

public var listaCompon<strong>en</strong>tes:Array;<br />

public var listaA<strong>la</strong>mbres:Array;<br />

public var nodosA<strong>la</strong>mbres:Array;<br />

public var trayectos:Array;<br />

public var nodosTerminales:Array;<br />

public var nodosAsignados:Array;<br />

public var C:Array;<br />

public function manejadorRed(redDibujo:Sprite):void {<br />

this.redDibujo = redDibujo;<br />

redCircuito = new Array();<br />

listaTerminales = new Array();<br />

listaCompon<strong>en</strong>tes = new Array();<br />

listaA<strong>la</strong>mbres = new Array();<br />

nodosA<strong>la</strong>mbres = new Array();<br />

25


}<br />

trayectos = new Array();<br />

nodosTerminales = new Array();<br />

nodosAsignados = new Array();<br />

C = new Array();<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> Validacion <strong>de</strong>l circuito<br />

//<br />

// -----------------------------------------------------------<br />

public function existeCircuito():Boolean {<br />

g<strong>en</strong>era_listaCompon<strong>en</strong>tes_redCircuito();<br />

}<br />

// Busca elem<strong>en</strong>tos que no est<strong>en</strong> conectados al circuito<br />

var existe:Boolean = true;<br />

for (k=0; k


}<br />

// Busca Fu<strong>en</strong>tes <strong>de</strong> VOLTAJE <strong>en</strong> CORTO CIRCUITO o<br />

// Fu<strong>en</strong>tes <strong>de</strong> CORRIENTE <strong>en</strong> CIRCUITO ABIERTO<br />

var conexionValida:Boolean = true;<br />

for (k=0; k terminal 1<br />

// [2][0] --> terminal 2<br />

// [3][0] --> terminal 3<br />

if (j) {<br />

listaTerminales.push(compon<strong>en</strong>te.datosCompon<strong>en</strong>te[j][0]);<br />

}<br />

}<br />

redCircuito.push(informacionCompon<strong>en</strong>te);<br />

}<br />

}<br />

// --- Ord<strong>en</strong>a y reduce conexiones ---<br />

ord<strong>en</strong>aLista(listaTerminales);<br />

public function ord<strong>en</strong>aLista(a:Array):void {<br />

// --- Ord<strong>en</strong>ami<strong>en</strong>to asc<strong>en</strong>d<strong>en</strong>te <strong>de</strong>l arreglo --------<br />

a.sort(Array.NUMERIC);<br />

}<br />

// --- Eliminacion <strong>de</strong> valores repetidos -----------<br />

for (var j=0; j


Seccion <strong>de</strong> construccion <strong>de</strong> <strong>la</strong> red <strong>de</strong>scriptiva <strong>de</strong>l circuito<br />

//<br />

// -----------------------------------------------------------<br />

public function construyeRed():Array {<br />

g<strong>en</strong>eraRedNodal();<br />

g<strong>en</strong>eraRedCircuito();<br />

}<br />

return C;<br />

public function g<strong>en</strong>eraRedNodal():void {<br />

var j:uint;<br />

var a:uint = 0;<br />

nodosTerminales[a] = new Array();<br />

// --- G<strong>en</strong>era una lista <strong>de</strong> "terminales" <strong>de</strong> Tierra ---<br />

for (k in redCircuito) {<br />

if (redCircuito[k][0].substr(0,1)=="T") {<br />

nodosTerminales[0].push(redCircuito[k][1]);<br />

}<br />

}<br />

a++;<br />

}<br />

// Del arreglo "listaTerminales" elimina "terminales"<br />

// ya incluidas <strong>en</strong> el arreglo "nodosTerminales"<br />

var terminalNueva:Boolean = true;<br />

for (i in listaTerminales) {<br />

for (k=0; k


-<br />

Soulcion_Sistema_Ecuaciones_Complejo<br />

// ------------------------------------------------------------<br />

var obj:Object;<br />

for (nodo in nodosAsignados) {<br />

obj = new Object();<br />

if (nodosAsignados[nodo][0].substr(0,1) != "T") {<br />

// --- Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te ---<br />

obj.id = nodosAsignados[nodo][0];<br />

// --- Nodos <strong>de</strong> conexion <strong>de</strong>l compon<strong>en</strong>te ---<br />

obj.c = new Array();<br />

for (i=1; i


automaticam<strong>en</strong>te, a partir <strong>de</strong>l dibujo realizado por el<br />

// usuario<br />

//<br />

// -----------------------------------------------------------<br />

public function g<strong>en</strong>eraDescripcionGraficaCircuito():void {<br />

// -----------------------------------------------------------<br />

// CONSTRUCCION <strong>de</strong>l <strong>de</strong>scritor <strong>de</strong>l circuito<br />

// a partir <strong>de</strong>l dibujo <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

var circuito:Array = new Array();<br />

var compon<strong>en</strong>te:Object;<br />

var <strong>de</strong>scriptor:Object;<br />

var id<strong>en</strong>tificador:String;<br />

// --- Formato <strong>de</strong> datos <strong>de</strong>l compon<strong>en</strong>te ---<br />

for (i=0; i < redDibujo.numChildr<strong>en</strong>; i++) {<br />

<strong>de</strong>scriptor = new Object();<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();<br />

compon<strong>en</strong>te = redDibujo.getChildAt(i);<br />

// --- Id<strong>en</strong>tificador ---<br />

id<strong>en</strong>tificador = compon<strong>en</strong>te.name.substr(0,1);<br />

for (j=0; j Id<strong>en</strong>tificador y coord<strong>en</strong>adas <strong>de</strong><br />

//<br />

posicion <strong>de</strong>l compon<strong>en</strong>te<br />

// datosCompon<strong>en</strong>te[1] --> Coord<strong>en</strong>adas Terminal 1<br />

// datosCompon<strong>en</strong>te[2] --> Coord<strong>en</strong>adas Terminal 2 (si existe)<br />

// datosCompon<strong>en</strong>te[3] --> Coord<strong>en</strong>adas Terminal 3 (si existe)<br />

<strong>de</strong>scriptor.datosCompon<strong>en</strong>te.push(compon<strong>en</strong>te.datosCompon<strong>en</strong>te[j]);<br />

}<br />

<strong>de</strong>scriptor.u_valorCompon<strong>en</strong>te = compon<strong>en</strong>te.u_valorCompon<strong>en</strong>te;<br />

<strong>de</strong>scriptor.ori<strong>en</strong>tacion= compon<strong>en</strong>te.ori<strong>en</strong>tacion;<br />

if (id<strong>en</strong>tificador == "V") {<br />

// --- Selecciona tipo <strong>de</strong> fu<strong>en</strong>te <strong>de</strong> voltaje ---<br />

<strong>de</strong>scriptor.i_tipoFu<strong>en</strong>te = compon<strong>en</strong>te.i_tipoFu<strong>en</strong>te;<br />

}<br />

||<br />

{<br />

if (id<strong>en</strong>tificador == "W") {<br />

// Selecciona "a<strong>la</strong>mbre":<br />

// - <strong>la</strong>rgo (40 pixeles)<br />

// - corto (20 pixeles)<br />

if((Math.abs(compon<strong>en</strong>te.datosCompon<strong>en</strong>te[1][1]-<br />

compon<strong>en</strong>te.datosCompon<strong>en</strong>te[2][1])==40)<br />

}<br />

(Math.abs(compon<strong>en</strong>te.datosCompon<strong>en</strong>te[1][2]-<br />

compon<strong>en</strong>te.datosCompon<strong>en</strong>te[2][2])==40))<br />

} else {<br />

}<br />

<strong>de</strong>scriptor.tamanio = "<strong>la</strong>rgo";<br />

<strong>de</strong>scriptor.tamanio = "corto";<br />

}<br />

circuito.push(<strong>de</strong>scriptor);<br />

// -----------------------------------------------------------<br />

// IMPRESION <strong>de</strong>l <strong>de</strong>scritor <strong>de</strong>l circuito<br />

// a partir <strong>de</strong>l dibujo <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

trace(" ");<br />

trace("// =============================================================");<br />

trace("// Descriptor <strong>de</strong>l circuito:");<br />

trace("//");<br />

trace("// =============================================================");<br />

trace(" ");<br />

trace("var circuito:Array = new Array();");<br />

30


\""+<br />

trace("var <strong>de</strong>scriptor:Object;");<br />

for (i in circuito) {<br />

trace(" ");<br />

trace("<strong>de</strong>scriptor = new Object();");<br />

trace("<strong>de</strong>scriptor.datosCompon<strong>en</strong>te = new Array();");<br />

trace(" ");<br />

for (j in circuito[i].datosCompon<strong>en</strong>te) {<br />

if (j == 0) {<br />

trace("<strong>de</strong>scriptor.datosCompon<strong>en</strong>te[0] = new Array();");<br />

for (k=0; k


package Vistas.dc.animacion<strong>3D</strong><br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: NodoDC<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong>l modulo "MODELO" para simu<strong>la</strong>cion <strong>en</strong> DC<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

public c<strong>la</strong>ss NodoDC ext<strong>en</strong>ds MovieClip {<br />

// --- Cont<strong>en</strong>edor ---<br />

public var cont<strong>en</strong>edor:MovieClip;<br />

// --- Nodo Grafico ---<br />

public var nodoGrafico:Sprite;<br />

// --- Animacion grafica <strong>de</strong>l Nodo ---<br />

public var animacion:Sprite;<br />

// --- Indice ---<br />

public var i:Number;<br />

// --- Coord<strong>en</strong>adas <strong>3D</strong> ---<br />

public var x_n:Number;<br />

public var y_n:Number;<br />

public var z_n:Number;<br />

// --- Voltaje nodal ---<br />

public var voltajeNodal:Number;<br />

public function NodoDC(obj:Object):void {<br />

// --- Recepcion <strong>de</strong> parametros ---<br />

this.i = obj.i;<br />

this.x_n = obj.x_n;<br />

this.y_n = obj.y_n;<br />

this.z_n = obj.z_n;<br />

this.voltajeNodal = obj.voltajeNodal;<br />

// --- Asigancion <strong>de</strong> nombre <strong>de</strong>l nodo ---<br />

this.name = "n"+i;<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas <strong>en</strong> <strong>3D</strong> ---<br />

this.x = x_n;<br />

this.y = y_n;<br />

this.z = z_n;<br />

trace(" ");<br />

33


}<br />

// --- Construccion <strong>de</strong>l nodo visual ---<br />

construccionNodoDCVisual();<br />

public function construccionNodoDCVisual():void {<br />

// -----------------------------------------------------------<br />

// Construccion <strong>de</strong>l nodo visual<br />

// -----------------------------------------------------------<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edor = new MovieClip();<br />

addChild(cont<strong>en</strong>edor);<br />

// Capa 1 : "nodo grafico"<br />

nodoGrafico = new Sprite();<br />

cont<strong>en</strong>edor.addChild(nodoGrafico);<br />

construyeNodo();<br />

}<br />

// Capa 2 : "animar seleccion"<br />

animacion = new Sprite();<br />

construyeAnimacion();<br />

public function construyeNodo():void {<br />

nodoGrafico.graphics.lineStyle(1,0x00ccff,1);<br />

nodoGrafico.graphics.beginFill(0x00ccff,0.5);<br />

nodoGrafico.graphics.drawCircle(0,0,3);<br />

nodoGrafico.graphics.<strong>en</strong>dFill();<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Animacion <strong>de</strong>l Nodo Seleccionado<br />

// ( "circulos" <strong>en</strong> forma <strong>de</strong> ondas azules emitidas )<br />

//<br />

// -----------------------------------------------------------<br />

public function construyeAnimacion():void {<br />

animacion.graphics.lineStyle(1,0x00ccff,1);<br />

animacion.graphics.drawCircle(0,0,3);<br />

}<br />

public function iniciarAnimacion():void {<br />

addChild(animacion);<br />

addEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, onEnterFrame);<br />

}<br />

public function <strong>de</strong>t<strong>en</strong>erAnimacion():void {<br />

removeEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, onEnterFrame);<br />

removeChild(animacion);<br />

}<br />

public function onEnterFrame(ev<strong>en</strong>t:Ev<strong>en</strong>t):void {<br />

if (animacion.scaleX < 4) {<br />

34


}<br />

}<br />

}<br />

} else {<br />

}<br />

animacion.scaleX += 0.2;<br />

animacion.scaleY += 0.2;<br />

animacion.scaleX = 1;<br />

animacion.scaleY = 1;<br />

package Vistas.ac.animacion<strong>3D</strong><br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: NodoAC<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong>l modulo "MODELO" para simu<strong>la</strong>cion <strong>en</strong> AC<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

public c<strong>la</strong>ss NodoAC ext<strong>en</strong>ds MovieClip {<br />

// --- Cont<strong>en</strong>edor ---<br />

public var cont<strong>en</strong>edor:MovieClip;<br />

// --- Nodo Grafico ---<br />

public var nodoGrafico:Sprite;<br />

// --- Animacion grafica <strong>de</strong>l Nodo ---<br />

public var animacion:Sprite;<br />

// --- Pot<strong>en</strong>ciales <strong>de</strong>l nodo ---<br />

public var pot<strong>en</strong>ciales:Array;<br />

// --- Indice ---<br />

public var i:Number;<br />

// --- Coord<strong>en</strong>adas <strong>3D</strong> ---<br />

public var x_n:Number;<br />

public var y_n:Number;<br />

public var z_n:Array;<br />

// --- Voltaje nodal complejo ---<br />

public var magnitud:Number;<br />

public var fase:Number;<br />

public var voltajeNodalPico:Number;<br />

public function NodoAC(obj:Object):void {<br />

// --- Recepcion <strong>de</strong> parametros ---<br />

35


this.i = obj.i;<br />

this.x_n = obj.x_n;<br />

this.y_n = obj.y_n;<br />

this.z_n = obj.z_n;<br />

this.magnitud = obj.magnitud;<br />

this.fase = obj.fase;<br />

// -----------------------------------------------------------<br />

// Asignacion <strong>de</strong> una tab<strong>la</strong> <strong>de</strong> valores ("pot<strong>en</strong>ciales") <strong>de</strong> una<br />

// funcion cos<strong>en</strong>oidal <strong>de</strong>fasada <strong>de</strong> acuerdo a <strong>la</strong> magnitud y fase<br />

// reportados por el simu<strong>la</strong>dor:<br />

//<br />

// pot<strong>en</strong>ciales = magnitud*cos<strong>en</strong>o(2*pi*f + fase)<br />

//<br />

// -----------------------------------------------------------<br />

pot<strong>en</strong>ciales = z_n;<br />

this.voltajeNodalPico = obj.voltajeNodalPico;<br />

// --- Asigancion <strong>de</strong> nombre <strong>de</strong>l nodo ---<br />

this.name = "n"+i;<br />

// --- Asignacion <strong>de</strong> coord<strong>en</strong>adas <strong>en</strong> <strong>3D</strong> ---<br />

this.x = x_n;<br />

this.y = y_n;<br />

this.z = 0;<br />

}<br />

// --- Construccion <strong>de</strong>l nodo visual ---<br />

construccionNodoACVisual();<br />

public function construccionNodoACVisual():void {<br />

// Capa 0 : "cont<strong>en</strong>edor"<br />

cont<strong>en</strong>edor = new MovieClip();<br />

addChild(cont<strong>en</strong>edor);<br />

// Capa 1 : "nodo grafico"<br />

nodoGrafico = new Sprite();<br />

cont<strong>en</strong>edor.addChild(nodoGrafico);<br />

construyeNodo();<br />

}<br />

// Capa 2 : "animar seleccion"<br />

animacion = new Sprite();<br />

construyeAnimacion();<br />

public function construyeNodo():void {<br />

nodoGrafico.graphics.lineStyle(1,0x00ccff,1);<br />

nodoGrafico.graphics.beginFill(0x00ccff,0.5);<br />

nodoGrafico.graphics.drawCircle(0,0,3);<br />

nodoGrafico.graphics.<strong>en</strong>dFill();<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Asignacion <strong>de</strong> "pot<strong>en</strong>ciales" <strong>de</strong> forma dinamica mediante <strong>la</strong><br />

// funcion "onEnterFrame" g<strong>en</strong>erada <strong>en</strong> el modulo "motor<strong>3D</strong>_AC"<br />

36


}<br />

}<br />

// ( osci<strong>la</strong>ciones <strong>en</strong> el espacio <strong>3D</strong> )<br />

//<br />

// -----------------------------------------------------------<br />

public function asignaPot<strong>en</strong>cial(t:Number):void {<br />

this.z = pot<strong>en</strong>ciales[t];<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Animacion <strong>de</strong>l Nodo Seleccionado<br />

// ( "circulos" <strong>en</strong> forma <strong>de</strong> ondas azules emitidas )<br />

//<br />

// -----------------------------------------------------------<br />

public function construyeAnimacion():void {<br />

animacion.graphics.lineStyle(1,0x00ccff,1);<br />

animacion.graphics.drawCircle(0,0,3);<br />

}<br />

public function iniciarAnimacion():void {<br />

addChild(animacion);<br />

addEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, onEnterFrame);<br />

}<br />

public function <strong>de</strong>t<strong>en</strong>erAnimacion():void {<br />

removeEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, onEnterFrame);<br />

removeChild(animacion);<br />

}<br />

public function onEnterFrame(ev<strong>en</strong>t:Ev<strong>en</strong>t):void {<br />

if (animacion.scaleX < 4) {<br />

animacion.scaleX += 0.2;<br />

animacion.scaleY += 0.2;<br />

} else {<br />

animacion.scaleX = 1;<br />

animacion.scaleY = 1;<br />

}<br />

}<br />

37


package com.red.simu<strong>la</strong>dor<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: simu<strong>la</strong>dorDC<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "Mo<strong>de</strong>loCircuito" para simu<strong>la</strong>cion <strong>en</strong> DC<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - "redNodal" --> Descripcion <strong>de</strong>l circuito <strong>en</strong> el formato:<br />

// C[n] id: xx c: n1,n2 valor: xx tipo: DC o AC<br />

// con:<br />

// C[n]: --> Arreglo <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong><br />

compon<strong>en</strong>tes<br />

// id: --> Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

// c: --> Arreglo <strong>de</strong> conexion <strong>de</strong> terminales<br />

// n1,n2,n3: --> nodos <strong>de</strong> conexion <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

// valor: --> Valor <strong>de</strong>l compon<strong>en</strong>te<br />

// tipo: --> Tipo <strong>de</strong> fu<strong>en</strong>te: "DC" o "AC"<br />

//<br />

// SALIDA:<br />

// - "voltajesNodales" --> Array: Valores todos los VOLTAJES NODALES<br />

// <strong>de</strong>l circuito<br />

// - "corri<strong>en</strong>tesRama" --> Array: Valores <strong>de</strong> <strong>la</strong>s CORRIENTES DE RAMA<br />

// obt<strong>en</strong>idos <strong>en</strong> <strong>la</strong><br />

simu<strong>la</strong>cion <strong>en</strong> DC<br />

//<br />

// **************************************************************<br />

// Analisis_Nodal_Modificado_DC y Metodo_Gauss_Jordan_Real<br />

import com.red.simu<strong>la</strong>dor.dc.Analisis_Nodal_Modificado_DC;<br />

import com.red.simu<strong>la</strong>dor.dc.Metodo_Gauss_Jordan_Real;<br />

public c<strong>la</strong>ss simu<strong>la</strong>dorDC {<br />

// --- Descripcion <strong>de</strong>l circuito ---<br />

public var C:Array;<br />

// --- Analisis_Nodal_Modificado_DC ---<br />

public var A:Array = new Array();<br />

public var xv:Array = new Array();<br />

public var b:Array = new Array();<br />

public var ord<strong>en</strong>_Circuito:int;<br />

public var sistema:Analisis_Nodal_Modificado_DC;<br />

// --- Metodo_Gauss_Jordan_Real ---<br />

public var xvsol:Array;<br />

public var bsol:Array;<br />

public var resultado:Array;<br />

39


public var solucion:Metodo_Gauss_Jordan_Real;<br />

// --- Voltajes nodales ---<br />

public var voltajesNodales:Array;<br />

public function simu<strong>la</strong>dorDC(redNodal:Array):void {<br />

}<br />

// --- Recepcion <strong>de</strong>l circuito ---<br />

this.C = redNodal;<br />

// --- P<strong>la</strong>nteami<strong>en</strong>to <strong>de</strong>l sistema <strong>de</strong> ecuaciones ---<br />

g<strong>en</strong>eraSistemaEcuaciones();<br />

// ---Solucion <strong>de</strong>l sistema <strong>de</strong> ecuaciones ---<br />

resuelveSistemaEcuaciones();<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> p<strong>la</strong>nteami<strong>en</strong>to y solucion <strong>de</strong>l<br />

// sistema <strong>de</strong> ecuaciones <strong>de</strong>l circuito<br />

//<br />

// -----------------------------------------------------------<br />

public function g<strong>en</strong>eraSistemaEcuaciones():void {<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>era el sistema <strong>de</strong> ecuaciones "ext<strong>en</strong>dido" <strong>de</strong>l circuito<br />

// -----------------------------------------------------------<br />

sistema = new Analisis_Nodal_Modificado_DC(C);<br />

A = sistema.A;<br />

xv = sistema.xv;<br />

b = sistema.b;<br />

}<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//sistema.imprime_Matriz_y_Vectores();<br />

public function resuelveSistemaEcuaciones():void {<br />

// -----------------------------------------------------------<br />

// Solucion <strong>de</strong>l SISTEMA DE ECUACIONES por el<br />

// METODO DE GAUSS-JORDAN con numeros<br />

reales<br />

// -----------------------------------------------------------<br />

var resultado:Array;<br />

var solucion:Metodo_Gauss_Jordan_Real = new<br />

Metodo_Gauss_Jordan_Real(A,xv,b);<br />

xvsol = solucion.xv;<br />

bsol = solucion.b;<br />

}<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//solucion.imprimeSolucion();<br />

40


-----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> recuperacion <strong>de</strong> voltajes nodales<br />

// y corri<strong>en</strong>tes <strong>de</strong> rama<br />

//<br />

// -----------------------------------------------------------<br />

public function obt<strong>en</strong>erVoltajesNodales():Array {<br />

// --- Obt<strong>en</strong>cion <strong>de</strong> los vo<strong>la</strong>tjes nodales resultantes ---<br />

voltajesNodales = new Array();<br />

voltajesNodales.push(0);<br />

for (var i=0; i


package com.red.simu<strong>la</strong>dor.dc<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Analisis_Nodal_Modificado_DC<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "simu<strong>la</strong>dorDC"<br />

//<br />

// febrero /<br />

2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - "C[n]" --> Arreglo <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> compon<strong>en</strong>tes con el formato:<br />

//<br />

// C[n] = id: xx c: n1,n2 valor: xx tipo: DC o AC<br />

// con:<br />

// id: --> Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

// c: --> Arreglo <strong>de</strong> conexion <strong>de</strong> terminales<br />

// n1,n2,n3: --> nodos <strong>de</strong> conexion <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

// valor: --> Valor <strong>de</strong>l compon<strong>en</strong>te<br />

// tipo: --> Tipo <strong>de</strong> fu<strong>en</strong>te: "DC" o "AC"<br />

//<br />

// SALIDA: Matriz aum<strong>en</strong>tada "A" y vectores "xv" y "b"<br />

//<br />

// |A||xv| = |b|<br />

// con:<br />

// |A| --> Number: Matriz aum<strong>en</strong>tada<br />

// |xv| --> String: Vector <strong>de</strong> variables a<br />

calcu<strong>la</strong>r<br />

// (voltajes nodales y<br />

corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Number: Vector <strong>de</strong> excitacion<br />

//<br />

// - Servicios <strong>de</strong> Impresion<br />

// * imprime_Matriz_y_Vectores()<br />

//<br />

// **************************************************************<br />

public c<strong>la</strong>ss Analisis_Nodal_Modificado_DC {<br />

// --- Lista <strong>de</strong> compon<strong>en</strong>tes ---<br />

private var C:Array;<br />

// --- Lista <strong>de</strong> Nodos ---<br />

private var N:Array;<br />

// --- |A||xv| = |b| ---<br />

public var A:Array;<br />

public var xv:Array;<br />

public var b:Array;<br />

// --- Indices ---<br />

private var i:int;<br />

43


private var j:int;<br />

private var k:int;<br />

// --- Auxiliares ---<br />

private var numero_Ecuaciones_Adicionales:int;<br />

public function Analisis_Nodal_Modificado_DC(_C:Array):void {<br />

// --- Recepcion <strong>de</strong>l arreglo <strong>de</strong>scriptor <strong>de</strong>l circuito ---<br />

C = _C;<br />

// --- |A||xv| = |b| ---<br />

A = new Array();<br />

xv = new Array();<br />

b = new Array();<br />

}<br />

construirMatrizAum<strong>en</strong>tada();<br />

private function construirMatrizAum<strong>en</strong>tada():void {<br />

// --- G<strong>en</strong>erar lista <strong>de</strong> nodos <strong>de</strong>l circuito ---<br />

g<strong>en</strong>erarListaNodos();<br />

// --- Crear <strong>la</strong> matriz |A| y los vectores |xv| y |b| ---<br />

crear_Matriz_y_Vectores();<br />

// --- Inicializar <strong>la</strong> matriz |A| y los vectores |xv| y |b| ---<br />

inicializar_Matriz_y_Vectores();<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> g<strong>en</strong>eracion <strong>de</strong> <strong>la</strong> red <strong>de</strong>l circuito<br />

//<br />

// -----------------------------------------------------------<br />

private function g<strong>en</strong>erarListaNodos():void {<br />

N = new Array();<br />

// --- Lectura <strong>de</strong> Nodos <strong>de</strong> <strong>la</strong> Lista <strong>de</strong> Compon<strong>en</strong>tes ---<br />

for (i=0; i


}<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> creacion e inicializacion <strong>de</strong> <strong>la</strong> matriz y vectores:<br />

// |A||xv| = |b|<br />

//<br />

// -----------------------------------------------------------<br />

private function crear_Matriz_y_Vectores():void {<br />

// --- Auxiliares ---<br />

var r<strong>en</strong>glones:Array;<br />

// --- Cu<strong>en</strong>ta numero <strong>de</strong> fu<strong>en</strong>tes ---<br />

numero_Ecuaciones_Adicionales = 0;<br />

for (i=0; i


}<br />

}<br />

A.push(r<strong>en</strong>glones);<br />

// --- Creacion <strong>de</strong>l VECTOR DE VARIABLES con valor cero ---<br />

xv.push(0);<br />

// --- Creacion <strong>de</strong>l VECTOR DE EXCITACIONES con valor cero ---<br />

b.push(0);<br />

private function inicializar_Matriz_y_Vectores():void {<br />

// --- Auxiliares ---<br />

var id:String;<br />

// --- Nodos <strong>de</strong> conexion ---<br />

var n1:int;<br />

var n2:int;<br />

// --- Nodos contro<strong>la</strong>dores ---<br />

var nc1:int;<br />

var nc2:int;<br />

// --- Valor <strong>de</strong> compon<strong>en</strong>te ---<br />

var valor:Number;<br />

// --- Contadores ---<br />

numero_Ecuaciones_Adicionales = 0;<br />

// --- Inicializacion <strong>de</strong> <strong>la</strong> Matriz "A y los vectores "b" y "xv" ---<br />

for (i=0; i


A[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales][n1]<br />

= -1;<br />

A[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales][n2]<br />

= 1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

if (tipo == "AC") {<br />

// Analisis <strong>en</strong> AC<br />

// --- Pasivacion <strong>de</strong> fu<strong>en</strong>tes <strong>de</strong> voltaje --------<br />

-<br />

b[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales]<br />

= 0;<br />

} else {<br />

// Analisis <strong>en</strong> DC<br />

b[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales]<br />

= valor;<br />

}<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> Corri<strong>en</strong>te in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> DC ----------<br />

case "I":<br />

b[n1] -= valor;<br />

b[n2] -= -valor;<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> CORRIENTE contro<strong>la</strong>da por VOLTAJE ------<br />

-<br />

case "G":<br />

nc1 = C[i].c[2];<br />

nc2 = C[i].c[3];<br />

A[n1][nc1] += valor;<br />

A[n1][nc2] += -valor;<br />

A[n2][nc1] += -valor;<br />

A[n2][nc2] += valor;<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> CORRIENTE contro<strong>la</strong>da por CORRIENTE -<br />

----<br />

case "F":<br />

nc1 = C[i].c[2];<br />

nc2 = C[i].c[3];<br />

numero_Ecuaciones_Adicionales++;<br />

A[nc1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales]<br />

= 1;<br />

A[nc2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales]<br />

= -1;<br />

A[n1][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales]<br />

= valor;<br />

A[n2][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales]<br />

= -valor;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc1]<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc2]<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

break;<br />

// --- CORTO CIRCUITO -----------------------------------<br />

case "W":<br />

47


numero_Ecuaciones_Adicionales++;<br />

A[n1][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales]<br />

= 1;<br />

A[n2][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales]<br />

= -1;<br />

A[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales][n1]<br />

= 1;<br />

A[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales][n2]<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales]<br />

= valor;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

break;<br />

// --- AMPLIFICADOR OERACIONAL "A" --- FVCV -----------<br />

--<br />

case "A": // n1(V+); n2(V-); nc1(Vo)<br />

nc1 = C[i].c[2];<br />

numero_Ecuaciones_Adicionales++;<br />

A[nc1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales]<br />

= -1;<br />

A[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales][n1]<br />

= 1;<br />

A[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales][n2]<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

break;<br />

}<br />

}<br />

}<br />

// Cortar r<strong>en</strong>glon "0" <strong>de</strong> "A", "xv" y "b", correspondi<strong>en</strong>te<br />

// al nodo <strong>de</strong> "tierra"<br />

A.splice(0,1);<br />

xv.splice(0,1);<br />

b.splice(0,1);<br />

// --- Actualiza el vector "xv" ---<br />

for (i=0; i


-----------------------------------------------------------<br />

// |A||xv| = |b|<br />

// con:<br />

// |A| --> Matriz aum<strong>en</strong>tada<br />

// |xv| --> Vector <strong>de</strong> variables a calcu<strong>la</strong>r<br />

// (voltajes nodales y corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Vector <strong>de</strong> excitacion<br />

// -----------------------------------------------------------<br />

trace(" ");<br />

trace("*** MATRIZ [A] ***");<br />

for (i=0; i Number:Vector <strong>de</strong> excitacion<br />

//<br />

49


SALIDA: |xv| = |b = solucion|<br />

// con:<br />

// |xv| --> String: Vector <strong>de</strong> variables a<br />

calcu<strong>la</strong>r<br />

// (voltajes nodales y<br />

corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Number: Vector solucion<br />

//<br />

// - Servicios <strong>de</strong> Impresion<br />

// * imprimeSolucion()<br />

//<br />

// **************************************************************<br />

public c<strong>la</strong>ss Metodo_Gauss_Jordan_Real {<br />

// --- |A||xv| = |b| ---<br />

private var A:Array;<br />

public var xv:Array;<br />

public var b:Array;<br />

// --- Indices ---<br />

private var i:int;<br />

private var j:int;<br />

private var k:int;<br />

// --- Auxiliares ---<br />

private var permutaciones:int;<br />

public function Metodo_Gauss_Jordan_Real(_A:Array,_xv:Array,_b:Array):void {<br />

// --- Recepcion <strong>de</strong> <strong>la</strong> matriz y los vectores ---<br />

A = _A;<br />

xv = _xv;<br />

b = _b;<br />

}<br />

resolverSistemaEcuaciones();<br />

private function resolverSistemaEcuaciones():void {<br />

solucionGaussJordan();<br />

}<br />

private function solucionGaussJordan():void {<br />

// --- Auxiliares ---<br />

var pivote:Number;<br />

var elem<strong>en</strong>to:Number;<br />

var r<strong>en</strong>glon:int;<br />

var r:Number;<br />

var s:Number;<br />

var temp:Number;<br />

permutaciones = 0;<br />

// --- Creacion <strong>de</strong> <strong>la</strong> MATRIZ TRIANGULAR SUPERIOR ---<br />

// --- Proceso DIRECTO ---<br />

50


for (i=0; i


}<br />

if (pivote == 0) {<br />

trace("*******************************");<br />

trace("* ERROR: Matriz singu<strong>la</strong>r *");<br />

trace("* *");<br />

trace(" pivote = 0 *");<br />

trace("*******************************");<br />

break;<br />

} else {<br />

for (j=i-1; j>=0; j--) {<br />

r = A[j][i]/pivote;<br />

for (k=i; k>0; k--) {<br />

A[j][k] -= r*A[i][k];<br />

}<br />

b[j] -= r*b[i];<br />

}<br />

}<br />

}<br />

// --- Solucion FINAL ---<br />

for (i=0; i Vector <strong>de</strong> variables a calcu<strong>la</strong>r<br />

// (voltajes nodales y corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Vector solucion<br />

// -----------------------------------------------------------<br />

trace(" ");<br />

trace("*** RESULTADOS ***");<br />

for (i=0; i


package com.red.simu<strong>la</strong>dor<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: simu<strong>la</strong>dorAC<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "Mo<strong>de</strong>loCircuito" para simu<strong>la</strong>cion <strong>en</strong> AC<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - "redNodal" --> Descripcion <strong>de</strong>l circuito <strong>en</strong> el formato:<br />

// C[n] id: xx c: n1,n2 valor: xx tipo: DC o AC<br />

// con:<br />

// C[n]: --> Arreglo <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong><br />

compon<strong>en</strong>tes<br />

// id: --> Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

// c: --> Arreglo <strong>de</strong> conexion <strong>de</strong> terminales<br />

// n1,n2,n3: --> nodos <strong>de</strong> conexion <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

// valor: --> Valor <strong>de</strong>l compon<strong>en</strong>te<br />

// tipo: --> Tipo <strong>de</strong> fu<strong>en</strong>te: "DC" o "AC"<br />

//<br />

// SALIDA:<br />

// - "LD" --> Object: Creacion y ll<strong>en</strong>ado <strong>de</strong>l objeto:<br />

// "G<strong>en</strong>erador_Lista_Datos"<br />

// * "LF" --> Array: Valores <strong>de</strong> Frecu<strong>en</strong>cia <strong>en</strong> variacion logaritmica<br />

// (<strong>de</strong> "fmin" a "fmax")<br />

// * "resultado" --> Object: Valores <strong>de</strong> voltajes y corri<strong>en</strong>tes complejos<br />

// obt<strong>en</strong>idos <strong>en</strong> <strong>la</strong> simu<strong>la</strong>cion <strong>en</strong> AC con<br />

// formato rectangu<strong>la</strong>r (a una<br />

frecu<strong>en</strong>cia<br />

// especifica). Cada "resultado" se<br />

procesa para<br />

// g<strong>en</strong>erar difer<strong>en</strong>tes formatos, y se<br />

guarda <strong>en</strong><br />

// el objeto <strong>de</strong>rivado <strong>de</strong> <strong>la</strong> c<strong>la</strong>se<br />

// "G<strong>en</strong>erador_Lista_Datos"<br />

//<br />

// - "voltajesNodalesComplejos" --> Array: Valores <strong>de</strong> MAGNITUD y FASE <strong>de</strong> los<br />

//<br />

"voltajesNodalesComplejos" a <strong>la</strong><br />

// frecu<strong>en</strong>cia c<strong>en</strong>tral<br />

<strong>de</strong>l barrido logaritmico,<br />

// <strong>de</strong> todas <strong>la</strong>s<br />

variables calcu<strong>la</strong>das por el<br />

// simu<strong>la</strong>dor <strong>en</strong> AC<br />

//<br />

// **************************************************************<br />

import f<strong>la</strong>sh.geom.Point;<br />

53


Analisis_Nodal_Modificado_Complejo y Metodo_Gauss_Jordan_Complejo<br />

import com.red.simu<strong>la</strong>dor.ac.Analisis_Nodal_Modificado_Complejo;<br />

import com.red.simu<strong>la</strong>dor.ac.Metodo_Gauss_Jordan_Complejo;<br />

// Fu<strong>en</strong>te <strong>de</strong> datos<br />

import Mo<strong>de</strong>lo.G<strong>en</strong>erador_Lista_Datos;<br />

// Matematicas<br />

import com.red.simu<strong>la</strong>dor.ac.Operaciones_Numeros_Complejos;<br />

public c<strong>la</strong>ss simu<strong>la</strong>dorAC {<br />

// --- Descripcion <strong>de</strong>l circuito ---<br />

public var C:Array;<br />

// --- Analisis_Nodal_Modificado_Complejo ---<br />

public var A:Array = new Array();<br />

public var xv:Array = new Array();<br />

public var b:Array = new Array();<br />

public var ord<strong>en</strong>_Circuito:int;<br />

public var sistema:Analisis_Nodal_Modificado_Complejo;<br />

// --- Metodo_Gauss_Jordan_Complejo ---<br />

public var xvsol:Array;<br />

public var bsol:Array;<br />

public var resultado:Array;<br />

public var solucion:Metodo_Gauss_Jordan_Complejo;<br />

// --- G<strong>en</strong>erador_Lista_Datos ---<br />

public var LD:G<strong>en</strong>erador_Lista_Datos;<br />

public var barridoFrecu<strong>en</strong>cia:Array;<br />

public var voltajesNodalesComplejos:Array;<br />

public var indiceFrecu<strong>en</strong>ciaC<strong>en</strong>tral:Number;<br />

public function simu<strong>la</strong>dorAC(redNodal:Array):void {<br />

this.C = redNodal;<br />

// --- Operaciones complejas auxiliares ---<br />

operacion_compleja = new Operaciones_Numeros_Complejos();<br />

// G<strong>en</strong>era valores <strong>de</strong> barrido <strong>de</strong> frecu<strong>en</strong>cia (Hz)<br />

// <strong>en</strong>tre "fmin" y "fmax"<br />

barridoFrecu<strong>en</strong>cia = new Array();<br />

// G<strong>en</strong>era Lista <strong>de</strong> Datos con barrido <strong>de</strong> frecu<strong>en</strong>cia<br />

LD = new G<strong>en</strong>erador_Lista_Datos();<br />

var fmin:Number = 0.001; // Hz<br />

var fmax:Number = 1000; // Hz<br />

var numMuestras:Number = 400;<br />

barridoFrecu<strong>en</strong>cia = LD.g<strong>en</strong>erarBarridoFrecu<strong>en</strong>cia(fmin,fmax,<br />

numMuestras);<br />

}<br />

indiceFrecu<strong>en</strong>ciaC<strong>en</strong>tral = Math.round(numMuestras/2);<br />

54


public function simu<strong>la</strong>rAC_Frecu<strong>en</strong>cia_Especifica(redNodal:Array,<br />

f:Number):void {<br />

// -----------------------------------------------------------<br />

// Analisis_Nodal_Modificado_Complejo<br />

// -----------------------------------------------------------<br />

sistema = new Analisis_Nodal_Modificado_Complejo(redNodal);<br />

sistema.analizar("AC");<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//sistema.imprime_Matriz_y_Vectores_FormatoMatricial();<br />

//sistema.imprime_Matriz_y_Vectores();<br />

// -----------------------------------------------------------<br />

// Solucion <strong>de</strong>l SISTEMA DE ECUACIONES por<br />

// el METODO DE GAUSS-JORDAN (complejo)<br />

// -----------------------------------------------------------<br />

solucion = new Metodo_Gauss_Jordan_Complejo(sistema);<br />

solucion.calcu<strong>la</strong>_Voltajes_Corri<strong>en</strong>tes_AC(f);<br />

}<br />

// -----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

//solucion.imprime_Solucion_Matriz_Ab();<br />

public function simu<strong>la</strong>r_Barrido_Frecu<strong>en</strong>cia(redNodal:Array):void {<br />

// -----------------------------------------------------------<br />

// Analisis_Nodal_Modificado_Complejo<br />

// -----------------------------------------------------------<br />

sistema = new Analisis_Nodal_Modificado_Complejo(redNodal);<br />

sistema.analizar("AC");<br />

// -----------------------------------------------------------<br />

// Solucion <strong>de</strong>l SISTEMA DE ECUACIONES por<br />

// el METODO DE GAUSS-JORDAN (complejo)<br />

// -----------------------------------------------------------<br />

solucion = new Metodo_Gauss_Jordan_Complejo(sistema);<br />

// Calculo <strong>de</strong> voltajes y corri<strong>en</strong>tes complejos (<strong>en</strong> formato rectangu<strong>la</strong>r)<br />

// para cada valor <strong>de</strong> frecu<strong>en</strong>cia con barrido logaritmico<br />

var resultado:Object;<br />

for (indiceFrecu<strong>en</strong>cia in barridoFrecu<strong>en</strong>cia) {<br />

// -----------------------------------------------------------<br />

// Barrido <strong>de</strong> frecu<strong>en</strong>cias "barridoFrecu<strong>en</strong>cia[indiceFrecu<strong>en</strong>cia]"<br />

// -----------------------------------------------------------<br />

resultado = solucion.calcu<strong>la</strong>_Voltajes_Corri<strong>en</strong>tes_AC(<br />

barridoFrecu<strong>en</strong>cia[indiceFrecu<strong>en</strong>cia]);<br />

LD.g<strong>en</strong>erarListaSimu<strong>la</strong>ciones(indiceFrecu<strong>en</strong>cia,resultado);<br />

}<br />

55


-----------------------------------------------------------<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

// -----------------------------------------------------------<br />

/*trace(" ");<br />

trace("simu<strong>la</strong>dorAC - Metodo_Gauss_Jordan_Complejo::<br />

Solucion a frecu<strong>en</strong>cia especifica");<br />

solucion.imprime_Solucion_Matriz_Ab();*/<br />

}<br />

public function validarSimu<strong>la</strong>cionAC():Boolean {<br />

// -----------------------------------------------------------<br />

// Verifica que no existan errores <strong>en</strong> <strong>la</strong> simu<strong>la</strong>cion<br />

// Prueba que los resultados obt<strong>en</strong>idos sean "numericos" y<br />

// "finitos"<br />

// -----------------------------------------------------------<br />

var simu<strong>la</strong>cionValida = true;<br />

for (numeroDato=0; numeroDato


voltajesNodalesComplejos = new Array();<br />

}<br />

for (i=0; i Array: Valores <strong>de</strong> voltajes y corri<strong>en</strong>tes obt<strong>en</strong>idos <strong>en</strong> <strong>la</strong><br />

// simu<strong>la</strong>cion <strong>en</strong> AC con el sigui<strong>en</strong>te formato:<br />

// * LD[i][0][indiceFrecu<strong>en</strong>cia] = dato.xv[i]: String (id<strong>en</strong>tificador)<br />

// * LD[i][1][indiceFrecu<strong>en</strong>cia] = formaRectagu<strong>la</strong>r: Point(x, jy}<br />

// * LD[i][2][indiceFrecu<strong>en</strong>cia] = Fasor: Point(MAGNITUD, FASE}<br />

(Po<strong>la</strong>r)<br />

// * LD[i][3][indiceFrecu<strong>en</strong>cia] = Magnitud_dB: Number<br />

// * LD[i][4][indiceFrecu<strong>en</strong>cia] = Fase_Grados: Number<br />

//<br />

// * Funciones Publicas<br />

// -<br />

g<strong>en</strong>erarBarridoFrecu<strong>en</strong>cia(f_min=0.001,f_max=1000,numero_Muestras=400)<br />

57


// * Servicios <strong>de</strong> Impresion<br />

// - imprimir_Barrido_Frecu<strong>en</strong>cias() -> Imprime valores <strong>de</strong> frecu<strong>en</strong>cia<br />

// (<strong>de</strong><br />

"fmin" a "fmax")<br />

// - imprimir_LD() --> Imprime todos los datos <strong>de</strong>l Array LD<br />

//<br />

// **************************************************************<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

import com.red.simu<strong>la</strong>dor.ac.Operaciones_Numeros_Complejos;<br />

public c<strong>la</strong>ss G<strong>en</strong>erador_Lista_Datos {<br />

// --- Lista <strong>de</strong> Datos ---<br />

public var LD:Array;<br />

// --- Lista <strong>de</strong> Frecu<strong>en</strong>cias ---<br />

public var LF:Array;<br />

// --- Frecu<strong>en</strong>cias <strong>en</strong> Hz ---<br />

public var f_max:Number;<br />

// Valor maximo <strong>de</strong> frecu<strong>en</strong>cia<br />

// Valor minimo <strong>de</strong> frecu<strong>en</strong>cia<br />

public var f_min:Number;<br />

// --- Numero <strong>de</strong> muestras a g<strong>en</strong>erar ---<br />

public var numero_Muestras:Number;<br />

private var primeraEvaluacionFrecu<strong>en</strong>cia:Boolean;<br />

// --- Indices ---<br />

private var i:int;<br />

private var k:int;<br />

private var m:int;<br />

private var n:int;<br />

// --- Variables <strong>de</strong> conversion <strong>de</strong> barrido lineal a logaritmico ---<br />

public var numero_Decadas_Frecu<strong>en</strong>cia:Number;<br />

private var convierte_ValoresFrecu<strong>en</strong>cia_aDecadas:Number;<br />

private var convierte_Frecu<strong>en</strong>cia_aLogaritmica:Number;<br />

// --- Constante <strong>de</strong> conversion <strong>de</strong> logNatural a logDecimal ---<br />

static const LN_LOG:Number = 0.434294;<br />

// --- Variables compleja "s" ---<br />

private var s:Point;<br />

// --- Valores <strong>de</strong> "f" <strong>en</strong> variacion logaritmica ---<br />

private var Afrecu<strong>en</strong>cia:Array;<br />

// --- Variables fasoriales ---<br />

private var Fasor:Point;<br />

private var Magnitud_dB:Number;<br />

private var Fase_Grados:Number;<br />

// --- Matematicas: Operaciones con Numeros Complejos ---<br />

private var operacion_compleja:Operaciones_Numeros_Complejos;<br />

public function G<strong>en</strong>erador_Lista_Datos():void {<br />

// --- Lista <strong>de</strong> Frecu<strong>en</strong>cias ---<br />

58


LF = new Array();<br />

// --- Lista <strong>de</strong> Datos ---<br />

LD = new Array();<br />

// --- Operaciones con Numeros Complejos ---<br />

operacion_compleja = new Operaciones_Numeros_Complejos();<br />

// --- F<strong>la</strong>g ---<br />

primeraEvaluacionFrecu<strong>en</strong>cia = true;<br />

}<br />

BARRIDO<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> GENERACION DE VALORES DE FRECUENCIA CON<br />

// LOGARITMICO<br />

//<br />

// -----------------------------------------------------------<br />

f_max:Number=1000,<br />

public function g<strong>en</strong>erarBarridoFrecu<strong>en</strong>cia(f_min:Number=0.001,<br />

numero_Muestras:Number=400):Array {<br />

this.f_min = f_min;<br />

this.f_max = f_max;<br />

// --- Numero <strong>de</strong> puntos a calcu<strong>la</strong>r para el barrido <strong>en</strong> frecu<strong>en</strong>cia ---<br />

this.numero_Muestras = numero_Muestras;<br />

// --- Frecu<strong>en</strong>cia ---<br />

var frecu<strong>en</strong>cia:Number;<br />

// Calculo <strong>de</strong> parametros <strong>de</strong> conversion <strong>de</strong>:<br />

// barrido lineal --> "indice" <strong>de</strong>l arreglo "Afrecu<strong>en</strong>cia[inidce]"<br />

// a barrido logarítmico --> valores <strong>de</strong>l arreglo "Afrecu<strong>en</strong>cia"<br />

inicializar_Parametros_CalculoBarridoFrecu<strong>en</strong>cia();<br />

// -----------------------------------------------------------<br />

// G<strong>en</strong>era valores <strong>de</strong> frecu<strong>en</strong>cia (Hz) con variacion logaritmica<br />

// <strong>en</strong> el arreglo "LF"<br />

// -----------------------------------------------------------<br />

for (i=0; i


private function inicializar_Parametros_CalculoBarridoFrecu<strong>en</strong>cia():void {<br />

// --------------------------------------------------------<br />

// Calculo <strong>de</strong> parametros para g<strong>en</strong>erar valores <strong>de</strong> frecu<strong>en</strong>cia<br />

// que se puedan graficar <strong>en</strong> un eje <strong>de</strong> frecu<strong>en</strong>cia<br />

// logaritmico (por <strong>de</strong>cadas)<br />

// --------------------------------------------------------<br />

numero_Decadas_Frecu<strong>en</strong>cia =<br />

Math.round(LN_LOG*Math.log(f_max/f_min));<br />

convierte_ValoresFrecu<strong>en</strong>cia_aDecadas = numero_Muestras/<br />

numero_Decadas_Frecu<strong>en</strong>cia;<br />

convierte_Frecu<strong>en</strong>cia_aLogaritmica =<br />

convierte_ValoresFrecu<strong>en</strong>cia_aDecadas*<br />

LN_LOG*Math.log(f_min);<br />

}<br />

dato:Object):void {<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> GENERACION DE VALORES DE TODAS LAS VARIABLES<br />

// REPORTADAS POR EL SIMULADOR EN AC (voltajes y corri<strong>en</strong>tes),<br />

// PARA CADA VALOR DE FRECUENCIA CON BARRIDO LOGARITMICO<br />

//<br />

// -----------------------------------------------------------<br />

public function g<strong>en</strong>erarListaSimu<strong>la</strong>ciones(indiceFrecu<strong>en</strong>cia:Number,<br />

// -----------------------------------------------------------<br />

// Para cada valor <strong>de</strong> frecu<strong>en</strong>cia <strong>de</strong>l arreglo "LF", simu<strong>la</strong> el<br />

// circuito <strong>en</strong> "AC", convierte los resultados <strong>de</strong>l simu<strong>la</strong>dor<br />

// a difer<strong>en</strong>tes formatos y guarda los resultados para cada<br />

// "voltaje nodal" y cada "corri<strong>en</strong>te <strong>de</strong> mal<strong>la</strong>",<br />

// <strong>en</strong> el arreglo "LD"<br />

// -----------------------------------------------------------<br />

var xP:Number;<br />

var yP:Number;<br />

var formaRectagu<strong>la</strong>r:Point;<br />

if (primeraEvaluacionFrecu<strong>en</strong>cia) {<br />

// --- Definicion <strong>de</strong> datos para el "nodo <strong>de</strong> tierra" ---<br />

LD[0] = new Array();<br />

LD[0][0] = new Array(); // Id<strong>en</strong>tificador<br />

LD[0][1] = new Array(); // Formato Rectangu<strong>la</strong>r<br />

LD[0][2] = new Array(); // Formato Po<strong>la</strong>r (Fasor)<br />

LD[0][3] = new Array(); // Magntiud dB<br />

LD[0][4] = new Array(); // Fase Grados<br />

// Definicion <strong>de</strong> datos para cada variable cont<strong>en</strong>ida<br />

// <strong>en</strong> "Voltajes_Nodales_Ext<strong>en</strong>dido", <strong>la</strong>s cuales repres<strong>en</strong>tan<br />

// cada uno <strong>de</strong> los resultados g<strong>en</strong>erados por el simu<strong>la</strong>dor <strong>en</strong> AC<br />

for (i in dato.Voltajes_Nodales_Ext<strong>en</strong>dido) {<br />

60


}<br />

LD[i+1] = new Array();<br />

LD[i+1][0] = new Array();<br />

LD[i+1][1] = new Array();<br />

LD[i+1][2] = new Array();<br />

LD[i+1][3] = new Array();<br />

LD[i+1][4] = new Array();<br />

}<br />

primeraEvaluacionFrecu<strong>en</strong>cia = false;<br />

// Id<strong>en</strong>tificador<br />

// Formato Rectangu<strong>la</strong>r<br />

// Formato Po<strong>la</strong>r (Fasor)<br />

// Magntiud dB<br />

// Fase Grados<br />

// Evaluacion <strong>de</strong>l voltaje nodal <strong>de</strong> "tierra" para cada frecu<strong>en</strong>cia ---<br />

xP = 0;<br />

yP = 0;<br />

formaRectagu<strong>la</strong>r = new Point(xP, yP);<br />

LD[0][0].push("V0");<br />

// Id<strong>en</strong>tificador<br />

LD[0][1].push(formaRectagu<strong>la</strong>r);<br />

// Formato Rectangu<strong>la</strong>r<br />

calu<strong>la</strong>rMagnitudFase(formaRectagu<strong>la</strong>r);<br />

LD[0][2].push(Fasor);<br />

// Formato Po<strong>la</strong>r (Fasor)<br />

LD[0][3].push(Magnitud_dB);<br />

// Magntiud dB<br />

LD[0][4].push(Fase_Grados);<br />

// Fase Grados<br />

Rectangu<strong>la</strong>r<br />

Po<strong>la</strong>r (Fasor)<br />

// Evaluacion <strong>de</strong> <strong>la</strong>s variables cont<strong>en</strong>idas <strong>en</strong><br />

// "Voltajes_Nodales_Ext<strong>en</strong>dido" para cada frecu<strong>en</strong>cia<br />

for (i in dato.Voltajes_Nodales_Ext<strong>en</strong>dido) {<br />

xP = dato.Voltajes_Nodales_Ext<strong>en</strong>dido[i].x;<br />

yP = dato.Voltajes_Nodales_Ext<strong>en</strong>dido[i].y;<br />

formaRectagu<strong>la</strong>r = new Point(xP, yP);<br />

LD[i+1][0].push(dato.xv[i]);<br />

LD[i+1][1].push(formaRectagu<strong>la</strong>r);<br />

}<br />

calu<strong>la</strong>rMagnitudFase(formaRectagu<strong>la</strong>r);<br />

LD[i+1][2].push(Fasor);<br />

LD[i+1][3].push(Magnitud_dB);<br />

LD[i+1][4].push(Fase_Grados);<br />

// Id<strong>en</strong>tificador<br />

// Formato<br />

// Formato<br />

// Magntiud dB<br />

// Fase Grados<br />

}<br />

private function calu<strong>la</strong>rMagnitudFase(formaRectagu<strong>la</strong>r:Point):void {<br />

// -----------------------------------------------------------<br />

// Convertidor <strong>de</strong> "formato rectangu<strong>la</strong>r" a "formato fasorial"<br />

// -----------------------------------------------------------<br />

// --- Variables para operaciones complejas ---<br />

var forma_Po<strong>la</strong>r:Point;<br />

forma_Po<strong>la</strong>r = operacion_compleja.convierte_a_Po<strong>la</strong>r(formaRectagu<strong>la</strong>r);<br />

operacion_compleja.ajusta_VALOR(forma_Po<strong>la</strong>r);<br />

if (forma_Po<strong>la</strong>r.x == 0) {<br />

Magnitud_dB = 0;<br />

Fase_Grados = 0;<br />

forma_Po<strong>la</strong>r.y = 0;<br />

Fasor = forma_Po<strong>la</strong>r;<br />

} else {<br />

61


Magnitud_dB =<br />

Math.round(20*LN_LOG*Math.log(forma_Po<strong>la</strong>r.x)*100)/100;<br />

Fase_Grados = Math.round(forma_Po<strong>la</strong>r.y*100)/100;<br />

Fasor = forma_Po<strong>la</strong>r;<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> IMPRESION<br />

// Para fines <strong>de</strong> pruebas <strong>de</strong> funcionami<strong>en</strong>to <strong>de</strong>l simu<strong>la</strong>dor<br />

//<br />

// -----------------------------------------------------------<br />

public function imprimir_Barrido_Frecu<strong>en</strong>cias():void {<br />

trace(" ");<br />

trace("*****************************************************");<br />

trace(" --- LISTA DE FRECUENCIAS ---");<br />

trace("*****************************************************");<br />

trace(" ");<br />

}<br />

for(i=0; i


package com.red.simu<strong>la</strong>dor.ac<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Analisis_Nodal_Modificado_Complejo<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "simu<strong>la</strong>dorAC"<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - "C[n]" --> Arreglo <strong>de</strong> <strong>de</strong>scriptores <strong>de</strong> compon<strong>en</strong>tes con el formato:<br />

//<br />

// C[n] = id: xx c: n1,n2 valor: xx tipo: DC o AC<br />

// con:<br />

// id: --> Id<strong>en</strong>tificador <strong>de</strong>l compon<strong>en</strong>te<br />

// c: --> Arreglo <strong>de</strong> conexion <strong>de</strong> terminales<br />

// n1,n2,n3: --> nodos <strong>de</strong> conexion <strong>de</strong>l<br />

compon<strong>en</strong>te<br />

// valor: --> Valor <strong>de</strong>l compon<strong>en</strong>te<br />

// tipo: --> Tipo <strong>de</strong> fu<strong>en</strong>te: "DC" o "AC"<br />

//<br />

// SALIDA: Matriz compleja aum<strong>en</strong>tada "A", vector "xv"<br />

// y vector complejo "b"<br />

//<br />

// |A||xv| = |b|<br />

// con:<br />

// |A| --> Point: Matriz compleja aum<strong>en</strong>tada<br />

// |xv| --> String: Vector <strong>de</strong> variables a<br />

calcu<strong>la</strong>r<br />

// (voltajes nodales y<br />

corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Point: Vector complejo <strong>de</strong> excitacion<br />

//<br />

// - Servicios <strong>de</strong> Impresion<br />

// * imprime_Matriz_y_Vectores()<br />

// * imprime_Matriz_y_Vectores_FormatoMatricial()<br />

//<br />

// **************************************************************<br />

// --- Matematicas ---<br />

import f<strong>la</strong>sh.geom.Point;<br />

public c<strong>la</strong>ss Analisis_Nodal_Modificado_Complejo {<br />

// --- Lista <strong>de</strong> compon<strong>en</strong>tes ---<br />

public var C:Array;<br />

// --- Lista <strong>de</strong> Nodos ---<br />

public var N:Array;<br />

// --- |A||xv| = |b| ---<br />

public var A:Array;<br />

63


public var xv:Array;<br />

public var b:Array;<br />

// --- Indices ---<br />

private var i:int;<br />

private var j:int;<br />

private var k:int;<br />

// --- Tipo <strong>de</strong> analisis ---<br />

public var analisis:String;<br />

// --- Auxiliares ---<br />

private var numero_Ecuaciones_Adicionales:int;<br />

public function Analisis_Nodal_Modificado_Complejo(_C:Array):void {<br />

}<br />

// --- Recepcion <strong>de</strong>l arreglo <strong>de</strong>scriptor <strong>de</strong>l circuito ---<br />

C = _C;<br />

public function analizar(_analisis:String):void {<br />

// --- Tipo <strong>de</strong> analisis ---<br />

analisis = _analisis;<br />

// --- |A||xv| = |b| ---<br />

A = new Array();<br />

xv = new Array();<br />

b = new Array();<br />

}<br />

// --- G<strong>en</strong>erar lista <strong>de</strong> nodos <strong>de</strong>l circuito ---<br />

g<strong>en</strong>erarListaNodos();<br />

// --- Crear <strong>la</strong> matriz |A| y los vectores |xv| y |b| ---<br />

crear_Matriz_y_Vectores();<br />

// --- Inicializar <strong>la</strong> matriz |A| y los vectores |xv| y |b| ---<br />

inicializar_Matriz_y_Vectores();<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> g<strong>en</strong>eracion <strong>de</strong> <strong>la</strong> red <strong>de</strong>l circuito<br />

//<br />

// -----------------------------------------------------------<br />

private function g<strong>en</strong>erarListaNodos():void {<br />

N = new Array();<br />

// --- Lectura <strong>de</strong> Nodos <strong>de</strong> <strong>la</strong> Lista <strong>de</strong> Compon<strong>en</strong>tes ---<br />

for (i=0; i


--- Eliminacion <strong>de</strong> nodos repetidos ---<br />

for (var j=0; j


}<br />

}<br />

numero_Ecuaciones_Adicionales++;<br />

break;<br />

// Increm<strong>en</strong>to por Fu<strong>en</strong>te <strong>de</strong> VOLTAJE contro<strong>la</strong>da<br />

// por VOLTAJE<br />

case "E":<br />

numero_Ecuaciones_Adicionales++;<br />

break;<br />

// - Increm<strong>en</strong>to por AMPLIFICADOR OPERACIONAL ---<br />

case "A":<br />

numero_Ecuaciones_Adicionales++;<br />

break;<br />

}<br />

// --- Inicializacion <strong>de</strong> <strong>la</strong> MATRIZ "A" y los vectores "b" y "xv" ---<br />

for (i=0; i(re,s)<br />

}<br />

private function inicializar_Matriz_y_Vectores():void {<br />

// --- Auxiliares ------------<br />

var id:String;<br />

// --- Nodos <strong>de</strong> conexion -----<br />

var n1:int;<br />

var n2:int;<br />

// --- Nodos contro<strong>la</strong>dores ---<br />

var nc1:int;<br />

var nc2:int;<br />

// --- Valor <strong>de</strong> compon<strong>en</strong>te ---<br />

var valor:Number;<br />

// --- Tipo <strong>de</strong> fu<strong>en</strong>te <strong>de</strong> voltaje ---<br />

var tipo:String;<br />

// --- Contadores ------------<br />

numero_Ecuaciones_Adicionales = 0;<br />

// --- Inicializacion <strong>de</strong> <strong>la</strong> Matriz "A y los vectores<br />

// --- "b" y zvect<br />

for (i=0; i


V_0 = C[i].xxx<br />

switch(id.substr(0,1)) {<br />

// --- Resist<strong>en</strong>cia ------------------------------------<br />

case "R":<br />

A[n1][n1].x += 1/valor;<br />

A[n2][n2].x += 1/valor;<br />

A[n2][n1].x -= 1/valor;<br />

A[n1][n2].x -= 1/valor;<br />

break;<br />

// --- Capacitor --------------------------------------<br />

case "C":<br />

A[n1][n1].y += valor;<br />

A[n2][n2].y += valor;<br />

A[n2][n1].y -= valor;<br />

A[n1][n2].y -= valor;<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> Voltaje in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te ---------------<br />

case "V":<br />

numero_Ecuaciones_Adicionales++;<br />

A[n1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 1;<br />

A[n2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n2].x<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

if (tipo == analisis) {<br />

// Analisis <strong>en</strong> AC<br />

b[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= valor;<br />

} else {<br />

// Analisis <strong>en</strong> DC<br />

// --- Pasivacion <strong>de</strong> fu<strong>en</strong>tes <strong>de</strong> voltaje ---<br />

b[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 0;<br />

}<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> Corri<strong>en</strong>te in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te -------------<br />

case "I":<br />

if (tipo == analisis) {<br />

// Analisis <strong>en</strong> AC<br />

b[n1].x += valor;<br />

b[n2].x += -valor;<br />

} esle {<br />

// Analisis <strong>en</strong> DC<br />

b[n1].x += 0;<br />

b[n2].x += 0;<br />

}<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> CORRIENTE contro<strong>la</strong>da por VOLTAJE "G"<br />

// --- FCCV ----<br />

case "G":<br />

67


nc1 = C[i].c[2];<br />

nc2 = C[i].c[3];<br />

A[n1][nc1].x += valor; // +g<br />

A[n1][nc2].x += -valor; // -g<br />

A[n2][nc1].x += -valor; // -g<br />

A[n2][nc2].x += valor; // +g<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> CORRIENTE contro<strong>la</strong>da por CORRIENTE<br />

"F"<br />

// --- FCCC ---<br />

case "F":<br />

nc1 = C[i].c[2];<br />

nc2 = C[i].c[3];<br />

numero_Ecuaciones_Adicionales++;<br />

A[nc1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 1;<br />

A[nc2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[n1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

=<br />

valor;<br />

A[n2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

=<br />

// Beta<br />

-valor; // -Beta<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc2].x<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> VOLTAJE contro<strong>la</strong>da por CORRIENTE "H"<br />

// --- FVCC ---<br />

case "H":<br />

nc1 = C[i].c[2];<br />

nc2 = C[i].c[3];<br />

numero_Ecuaciones_Adicionales++;<br />

A[n1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 1;<br />

A[n2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n2].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales-1].x<br />

= -valor; // -r<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"Ir_"+id;<br />

numero_Ecuaciones_Adicionales++;<br />

A[nc1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 1;<br />

68


A[nc2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc2].x<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

break;<br />

// --- Fu<strong>en</strong>te <strong>de</strong> VOLTAJE contro<strong>la</strong>da por VOLTAJE "E"<br />

// --- FVCV ---<br />

case "E":<br />

nc1 = C[i].c[2];<br />

nc2 = C[i].c[3];<br />

numero_Ecuaciones_Adicionales++;<br />

A[n1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 1;<br />

A[n2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc1].x<br />

= -valor; // -u<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][nc2].x<br />

= valor; // u<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n2].x<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"Iu_"+id;<br />

break;<br />

// --- AMPLIFICADOR OERACIONAL "A" --- FVCV ---<br />

case "A": // n1(V+); n2(V-); nc1(Vo)<br />

nc1 = C[i].c[2];<br />

numero_Ecuaciones_Adicionales++;<br />

A[nc1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n2].x<br />

= -1;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

"I_"+id;<br />

break;<br />

// --- CORTO CIRCUITO ---------------------------------<br />

case "W":<br />

numero_Ecuaciones_Adicionales++;<br />

A[n1][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= 1;<br />

A[n2][A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n1].x<br />

= 1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][n2].x<br />

= -1;<br />

A[A[0].l<strong>en</strong>gthnumero_Ecuaciones_Adicionales][A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales].x<br />

= valor;<br />

69


"I_"+id;<br />

}<br />

}<br />

break;<br />

xv[A[0].l<strong>en</strong>gth-numero_Ecuaciones_Adicionales] =<br />

}<br />

// Cortar r<strong>en</strong>glon "0" <strong>de</strong> "A", "xv" y "b", correspondi<strong>en</strong>te<br />

// al nodo <strong>de</strong> "tierra"<br />

A.splice(0,1);<br />

xv.splice(0,1);<br />

b.splice(0,1);<br />

// --- Actualiza el vector "xv" ---<br />

for (i=0; i


public function imprime_Matriz_y_Vectores_FormatoMatricial():void {<br />

var r<strong>en</strong>glonX:Array;<br />

var r<strong>en</strong>glonY:Array;<br />

trace(" ");<br />

***");<br />

trace(" ");<br />

trace(":: FORMATO MATRICIAL *** MATRIZ ORIGINAL COMPLEJA [A]<br />

for (i=0; i


con:<br />

// |A| --> Point: Matriz compleja aum<strong>en</strong>tada<br />

// |xv| --> String: Vector <strong>de</strong> variables a<br />

calcu<strong>la</strong>r<br />

// (voltajes nodales y<br />

corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Point: Vector complejo <strong>de</strong> excitacion<br />

//<br />

// SALIDA: |xv| = |b = solucion|<br />

// con:<br />

// |xv| --> String: Vector <strong>de</strong> variables a<br />

calcu<strong>la</strong>r<br />

// (voltajes nodales y<br />

corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

// |b| --> Point: Vector solucion<br />

//<br />

// - Servicios <strong>de</strong> Impresion<br />

// * imprime_Solucion_Matriz_Ab()<br />

//<br />

// **************************************************************<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

public c<strong>la</strong>ss Metodo_Gauss_Jordan_Complejo {<br />

// --- Analisis_Nodal_Modificado_Complejo ---<br />

private var sistema:Analisis_Nodal_Modificado_Complejo;<br />

// --- Tipo <strong>de</strong> analisis ---<br />

public var analisis:String;<br />

// Voltajes Nodales + Corri<strong>en</strong>tes <strong>de</strong>:<br />

// Fu<strong>en</strong>te In<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> Voltaje, A<strong>la</strong>mbre o Capacitor<br />

public var Voltajes_Nodales_Ext<strong>en</strong>dido:Array;<br />

private var OA:Array;<br />

private var A:Array;<br />

public var xv:Array;<br />

private var b:Array;<br />

private var Ob:Array;<br />

// Matriz Original<br />

// Matriz <strong>de</strong> trabajo<br />

// Variables a calcu<strong>la</strong>r<br />

// Vector <strong>de</strong> trabajo<br />

// Vector Original<br />

// --- Indices ---<br />

private var i:int;<br />

private var j:int;<br />

private var k:int;<br />

// --- Auxiliares ---<br />

private var permutaciones:int;<br />

// --- Variable compleja ---<br />

private var s:Point;<br />

// --- Matematicas ---<br />

private var operacion_compleja:Operaciones_Numeros_Complejos;<br />

72


--- Frecu<strong>en</strong>cia especifica ---<br />

private var frecu<strong>en</strong>cia:Number;<br />

private var jw:Number;<br />

public function Metodo_Gauss_Jordan_Complejo(<br />

_sistema:Analisis_Nodal_Modificado_Complejo):void {<br />

// --- Recepcion <strong>de</strong> <strong>la</strong> matriz y los vectores ---<br />

sistema = _sistema;<br />

}<br />

// --- Operaciones complejas auxiliares -----------------<br />

operacion_compleja = new Operaciones_Numeros_Complejos();<br />

public function calcu<strong>la</strong>_Voltajes_Corri<strong>en</strong>tes_AC(<br />

frecu<strong>en</strong>cia:Number):Object {<br />

// Objeto para guardado <strong>de</strong> <strong>la</strong> solucion<br />

// <strong>de</strong>l sistema <strong>de</strong> ecuaciones<br />

var obj:Object = new Object();<br />

// --- Tipo <strong>de</strong> analisis ---<br />

analisis = sistema.analisis;<br />

// --- Frecu<strong>en</strong>cia (Hz) especifica <strong>de</strong> analisis ---<br />

this.frecu<strong>en</strong>cia = frecu<strong>en</strong>cia;<br />

// Frecu<strong>en</strong>cia compleja (rad/seg) como compon<strong>en</strong>te<br />

// <strong>de</strong> <strong>la</strong> variable compleja "s = jw"<br />

jw = (Math.round(2*Math.PI*frecu<strong>en</strong>cia*100))/100;<br />

// --- Variable compleja "s = jw"<br />

s = new Point(0,jw);<br />

// Arreglo para el guardado <strong>de</strong> <strong>la</strong> solucion <strong>de</strong>l<br />

// sistema <strong>de</strong> ecuaciones complejas<br />

Voltajes_Nodales_Ext<strong>en</strong>dido = new Array();<br />

// --- Creacion <strong>de</strong> <strong>la</strong> matriz compleja |A| ---<br />

crear_Matriz_A();<br />

// --- Solucion <strong>de</strong> <strong>la</strong> matriz compeja |A| ---<br />

solucion_Matriz_Ab(s);<br />

// --- Guardado <strong>de</strong> <strong>la</strong>s soluciones ---<br />

Voltajes_Nodales_Ext<strong>en</strong>dido = b;<br />

obj.xv = xv;<br />

obj.Voltajes_Nodales_Ext<strong>en</strong>dido = Voltajes_Nodales_Ext<strong>en</strong>dido;<br />

}<br />

return obj;<br />

private function crear_Matriz_A():void {<br />

// --- Matriz |A| y vector |b| <strong>de</strong> trabajo ---<br />

A = new Array();<br />

b = new Array();<br />

73


Matriz |OA| y vectores |Ob| y |xv| originales<br />

// Conti<strong>en</strong><strong>en</strong> <strong>la</strong> <strong>de</strong>scripcion matricial compleja<br />

// <strong>de</strong>l circuito que se va simu<strong>la</strong>r<br />

OA = sistema.A;<br />

xv = sistema.xv;<br />

Ob = sistema.b;<br />

}<br />

// --- Creacion <strong>de</strong> <strong>la</strong> matriz <strong>de</strong> trabajo |A| ---<br />

for (i=0; i


--- Busqueda <strong>de</strong>l mayor elem<strong>en</strong>to <strong>de</strong> <strong>la</strong> matriz ---<br />

for (j=i+1; j


1][A.l<strong>en</strong>gth-1]);<br />

// --- Continuacion <strong>de</strong>l proceso <strong>de</strong> sustitucion inversa ---<br />

for (i=1; i Vector <strong>de</strong> variables a calcu<strong>la</strong>r<br />

// (voltajes nodales y corri<strong>en</strong>tes <strong>de</strong> mal<strong>la</strong>)<br />

76


Voltajes_Nodales_Ext<strong>en</strong>dido[i].x --> Parte "real"<br />

//<br />

<strong>de</strong> <strong>la</strong> solucion compleja<br />

// Voltajes_Nodales_Ext<strong>en</strong>dido[i].y --> Parte "imaginaria"<br />

//<br />

<strong>de</strong> <strong>la</strong> solucion compleja<br />

// -----------------------------------------------------------<br />

trace(" ");<br />

trace("**********************************************************");<br />

trace(" VOLTAJES NODALES EXTENDIDO CALCULADOS A "+<br />

frecu<strong>en</strong>cia+"Hz, jw= "+jw+" Rad/s");<br />

trace("**********************************************************");<br />

trace(" ");<br />

trace(" Variable Magnitud Fase");<br />

for (i=0; i Point: don<strong>de</strong> "a" y "b" son numeros complejos<br />

// n --> Int o Number<br />

//<br />

// SALIDA: suma(a:Point,b:Point) --> Point<br />

// resta(a:Point,b:Point) --> Point<br />

// productoEsca<strong>la</strong>r(a:Point,b:Number) --> Point<br />

// producto(a:Point,b:Point) --> Point<br />

// conjugado(a:Point) --> Point<br />

// coci<strong>en</strong>teEsca<strong>la</strong>r(a:Point,b:Number) --> Point<br />

// coci<strong>en</strong>te(a:Point,b:Point) --> Point<br />

// coci<strong>en</strong>tePo<strong>la</strong>r(a:Point,b:Point) --> Point<br />

// modulo(a:Point) --> Number<br />

// fase(a:Point) --> Number<br />

// convierte_a_Po<strong>la</strong>r(a:Point) --> Point<br />

// compara_CERO(a:Point) --> Boolean<br />

// ajusta_VALOR(a:Point)<br />

//<br />

// g<strong>en</strong>erar_Puntos_Equidistantes(n:int) --> Array<br />

// (<strong>en</strong> el circulo unitario: "exp(jw)")<br />

// pot<strong>en</strong>cia(a:Point,n:Number) --> Point<br />

77


expon<strong>en</strong>cialCompleja(n:Number) --> Point<br />

// (exp(n) = cos(2*pi*n) + js<strong>en</strong>(2*pi*n))<br />

//<br />

// **************************************************************<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

public c<strong>la</strong>ss Operaciones_Numeros_Complejos {<br />

private var refer<strong>en</strong>cia:Number = 1.0e-12;<br />

private var redon<strong>de</strong>o:Number = 1.0e7;<br />

public function Operaciones_Numeros_Complejos():void {<br />

// CONSTRUCTOR<br />

}<br />

public function suma(a:Point,b:Point):Point {<br />

//return a.add(b);<br />

return new Point(a.x+b.x,a.y+b.y);<br />

}<br />

public function resta(a:Point,b:Point):Point {<br />

return a.subtract(b);<br />

}<br />

public function productoEsca<strong>la</strong>r(a:Point,b:Number):Point {<br />

return new Point(a.x*b,a.y*b);<br />

}<br />

public function producto(a:Point,b:Point):Point {<br />

return new Point((a.x*b.x)-(a.y*b.y), (a.x*b.y)+(a.y*b.x));<br />

}<br />

public function conjugado(a:Point):Point {<br />

return new Point(a.x,-a.y);<br />

}<br />

public function coci<strong>en</strong>teEsca<strong>la</strong>r(a:Point,b:Number):Point {<br />

return new Point(a.x/b, a.y/b);<br />

}<br />

public function coci<strong>en</strong>te(a:Point,b:Point):Point {<br />

return coci<strong>en</strong>teEsca<strong>la</strong>r(producto(a,conjugado(b)),<br />

producto(b,conjugado(b)).x);<br />

}<br />

public function coci<strong>en</strong>tePo<strong>la</strong>r(a:Point,b:Point):Point {<br />

return new Point(a.x/b.x,a.y-b.y);<br />

}<br />

public function modulo(a:Point):Number {<br />

return Math.abs(Math.sqrt(a.x*a.x+a.y*a.y));<br />

}<br />

public function fase(a:Point):Number {<br />

78


var fase_real:Number;<br />

if ((a.y != 0) && (a.x != 0)) {<br />

fase_real = 180*(Math.atan2(a.y,a.x))/Math.PI;<br />

} else if ((a.y == 0) && (a.x > 0)) {<br />

fase_real = 0;<br />

} else if ((a.y == 0) && (a.x < 0)) {<br />

fase_real = -180;<br />

} else if ((a.y == 0) && (a.x == 0)) {<br />

fase_real = 0;<br />

} else if ((a.y > 0) && (a.x == 0)) {<br />

fase_real = 90;<br />

} else if ((a.y < 0) && (a.x == 0)) {<br />

fase_real = -90;<br />

}<br />

}<br />

return fase_real;<br />

public function convierte_a_Po<strong>la</strong>r(a:Point):Point {<br />

return new Point(modulo(a),fase(a));<br />

}<br />

public function compara_CERO(a:Point):Boolean {<br />

if (modulo(a) < refer<strong>en</strong>cia) {<br />

return true;<br />

} else {<br />

return false;<br />

}<br />

}<br />

public function ajusta_VALOR(a:Point):void {<br />

if ((Math.abs(a.x) < refer<strong>en</strong>cia) &&<br />

(Math.abs(a.y) < refer<strong>en</strong>cia)) {<br />

a.x = 0;<br />

a.y = 0;<br />

} else if (Math.abs(a.x) < refer<strong>en</strong>cia) {<br />

a.x = 0<br />

} else if (Math.abs(a.y) < refer<strong>en</strong>cia) {<br />

a.y = 0<br />

}<br />

}<br />

if (Math.abs(a.x)) {<br />

a.x = Math.round(a.x*redon<strong>de</strong>o)/redon<strong>de</strong>o;<br />

}<br />

if (Math.abs(a.y)) {<br />

a.y = Math.round(a.y*redon<strong>de</strong>o)/redon<strong>de</strong>o;<br />

}<br />

public function g<strong>en</strong>erar_Puntos_Equidistantes(n:int):Array {<br />

var s:Array = new Array();<br />

var k:int;<br />

var re:Number;<br />

79


var im:Number;<br />

var temp:Point;<br />

for (k=0; k


package Vistas.dc<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: VistasDC<br />

//<br />

// Patrones <strong>de</strong> Programacion:<br />

//<br />

// (1) "MVC" (MODELO - VISTA - CONTROLADOR)<br />

//<br />

// (2) "COMPOSICION" (motor<strong>3D</strong>_dc graficaBarras)<br />

// |<br />

// V<br />

2010<br />

// listaDatos<br />

//<br />

// septiembre /<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.Sprite;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.TextField;<br />

import f<strong>la</strong>sh.text.TextFieldAutoSize;<br />

import f<strong>la</strong>sh.text.TextFieldType;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.MouseEv<strong>en</strong>t;<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.Ev<strong>en</strong>t;<br />

// Repres<strong>en</strong>taciones <strong>en</strong> 2D y <strong>3D</strong><br />

import Vistas.dc.graficas.graficaBarras;<br />

import Vistas.dc.listas.listaDatos;<br />

import Vistas.dc.animacion<strong>3D</strong>.motor<strong>3D</strong>_dc;<br />

// Mo<strong>de</strong>lo MVC<br />

import Mo<strong>de</strong>lo.Mo<strong>de</strong>loCircuito;<br />

//import Vistas.dc.graficas.graficaLineas;<br />

//import com.bin.v<strong>en</strong>tana;<br />

public c<strong>la</strong>ss vistasDC ext<strong>en</strong>ds Sprite {<br />

// --- Parametros recibidos ---<br />

private var spEditor:Sprite;<br />

private var nodosVisuales:Array;<br />

private var elem<strong>en</strong>tosCircuito:Array;<br />

// --- Repres<strong>en</strong>taciones <strong>en</strong> 2D y <strong>3D</strong> ---<br />

private var barrasVoltaje:graficaBarras;<br />

private var listaCompon<strong>en</strong>tes:listaDatos;<br />

private var circuito<strong>3D</strong>:motor<strong>3D</strong>_dc;<br />

// --- Mo<strong>de</strong>lo MVC ---<br />

public var mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito;<br />

public function vistasDC (mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito) {<br />

this.mo<strong>de</strong>lo = mo<strong>de</strong>lo;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Mostrar resultados <strong>en</strong> "grafica <strong>de</strong> barras" y "circuito <strong>en</strong> <strong>3D</strong>"<br />

//<br />

// -----------------------------------------------------------<br />

public function mostrarDatos(spEditor:Sprite,nodosVisuales:Array):void<br />

{<br />

this.spEditor = spEditor;<br />

1


this.nodosVisuales = nodosVisuales;<br />

// --- Captura refer<strong>en</strong>cias a los compon<strong>en</strong>tes <strong>de</strong>l circuito ---<br />

elem<strong>en</strong>tosCircuito = new Array();<br />

for (i=0; i "motor<strong>3D</strong>"<br />

//<br />

// -----------------------------------------------------------<br />

public function seleccionarNodo(id:String):void {<br />

// --- Conexion con "motor<strong>3D</strong>" ---<br />

circuito<strong>3D</strong>.seleccionarNodo(id);<br />

}<br />

public function quitarSeleccion(id:String):void {<br />

// --- Conexion con "motor<strong>3D</strong>" ---<br />

circuito<strong>3D</strong>.quitarSeleccion(id);<br />

}<br />

public function <strong>de</strong>spliegaNodosTerminales(voltajesNodales:Array):void {<br />

circuito<strong>3D</strong>.<strong>de</strong>spliegaNodosTerminales(voltajesNodales);<br />

}<br />

2


package Vistas.dc.animacion<strong>3D</strong><br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: motor<strong>3D</strong>_dc<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "COMPOSICION" (motor<strong>3D</strong>_dc graficaBarras)<br />

// |<br />

// V<br />

2010<br />

// listaDatos<br />

//<br />

// septiembre /<br />

// **************************************************************<br />

//<br />

// ENTRADA: - Compon<strong>en</strong>tes <strong>de</strong>l circuito <strong>en</strong> "spEditor" (Object)<br />

// - Nodos visuales <strong>en</strong> "nodosVisuales" (Array)<br />

//<br />

// CONEXIONES INTERACTIVAS:<br />

// - Con "graficaBarras" a traves <strong>de</strong> "vistasDC"<br />

//<br />

// SALIDA:<br />

// - Circuito <strong>en</strong> <strong>3D</strong> <strong>en</strong> pantal<strong>la</strong><br />

// - Voltajes nodales <strong>en</strong> DC (altura <strong>de</strong> nodos)<br />

// - Corri<strong>en</strong>tes <strong>de</strong> rama <strong>en</strong> DC (flechas)<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Sli<strong>de</strong>rs<br />

import fl.controls.Sli<strong>de</strong>r;<br />

import fl.ev<strong>en</strong>ts.Sli<strong>de</strong>rEv<strong>en</strong>t;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.*;<br />

public c<strong>la</strong>ss motor<strong>3D</strong>_dc ext<strong>en</strong>ds Sprite {<br />

// --- Parametros recibidos ---<br />

public var spEditor:Object;<br />

public var compon<strong>en</strong>te:Object;<br />

private var elem<strong>en</strong>tosCircuito:Array;<br />

private var nodosVisuales:Array;<br />

// --- P<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia y "linea <strong>de</strong> pot<strong>en</strong>cial positivo" ---<br />

private var refer<strong>en</strong>cia:MovieClip;<br />

private var <strong>la</strong>doP<strong>la</strong>noRefer<strong>en</strong>cia:Number = 200;<br />

// --- Refer<strong>en</strong>cias a "Compon<strong>en</strong>tes" y "Nodos Visuales" ---<br />

public var vectorElem<strong>en</strong>tos<strong>3D</strong>:Vector.;<br />

// --- Coord<strong>en</strong>adas <strong>3D</strong> <strong>de</strong> los "Compon<strong>en</strong>tes" y "Nodos Visuales" ---<br />

public var vectorCoord<strong>en</strong>adas<strong>3D</strong>:Vector.;<br />

// Cubo virtual cont<strong>en</strong>edor <strong>de</strong> los<br />

// "Compon<strong>en</strong>tes" y "Nodos Visuales"<br />

public var cuboCont<strong>en</strong>edorVirtual:Sprite;<br />

// --- Auxiliares para control <strong>de</strong> rotacion <strong>de</strong>l cubo virtual ---<br />

public var estaRotandoCubo:Boolean;<br />

public var prevX:Number;<br />

public var prevY:Number;<br />

// --- Cont<strong>en</strong>edor <strong>de</strong>l cubo virtual ---<br />

3


public var container:Sprite;<br />

// --- Sli<strong>de</strong>rs ---<br />

public var sli<strong>de</strong>rs:Array;<br />

private var xSli<strong>de</strong>r:Sli<strong>de</strong>r;<br />

private var ySli<strong>de</strong>r:Sli<strong>de</strong>r;<br />

private var zSli<strong>de</strong>r:Sli<strong>de</strong>r;<br />

// --- Auxiliares para Sli<strong>de</strong>rs ---<br />

public var prevXVal:Number;<br />

public var prevYVal:Number;<br />

public var prevZVal:Number;<br />

// Auxiliar para separar <strong>la</strong>s refer<strong>en</strong>cias a los<br />

// "Compon<strong>en</strong>tes" y los "Nodos Visuales"<br />

private var offset:uint;<br />

public function motor<strong>3D</strong>_dc(spEditor:Sprite,nodosVisuales:Array):void {<br />

// --- Recepcion <strong>de</strong> parametros ---<br />

this.spEditor = spEditor;<br />

this.container = spEditor;<br />

this.nodosVisuales = nodosVisuales;<br />

nodosVisuales.l<strong>en</strong>gth+1);<br />

nodosVisuales.l<strong>en</strong>gth+1);<br />

// --- Inicializacion <strong>de</strong> Vectores ---<br />

vectorElem<strong>en</strong>tos<strong>3D</strong> = new Vector.(spEditor.numChildr<strong>en</strong> +<br />

vectorCoord<strong>en</strong>adas<strong>3D</strong> = new Vector.(spEditor.numChildr<strong>en</strong> +<br />

// --- Coord<strong>en</strong>adas <strong>en</strong> <strong>3D</strong> ---<br />

var x_coord:Number;<br />

var y_coord:Number;<br />

var z_coord:Number;<br />

}<br />

construirMotor<strong>3D</strong>();<br />

internal function construirMotor<strong>3D</strong>():void {<br />

// --- Inicializar elem<strong>en</strong>tos <strong>3D</strong> ---<br />

inicializarElem<strong>en</strong>tos<strong>3D</strong>();<br />

construirP<strong>la</strong>noRefer<strong>en</strong>cia();<br />

// --- Inicializar cubo virtual <strong>3D</strong> ---<br />

inicializarCuboVirtual();<br />

construirCuboVirtual();<br />

inicializarList<strong>en</strong>ersCubo();<br />

// --- Crear Sli<strong>de</strong>rs ---<br />

crearSli<strong>de</strong>rs();<br />

inicializarList<strong>en</strong>ersSli<strong>de</strong>rs();<br />

}<br />

// Funcion <strong>de</strong> c<strong>la</strong>sificacion y ord<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> <strong>la</strong> distancia,<br />

// <strong>en</strong> <strong>3D</strong>, <strong>de</strong> los elem<strong>en</strong>tos visuales al observador<br />

c<strong>la</strong>sificarElem<strong>en</strong>tos<strong>3D</strong>Z();<br />

// -----------------------------------------------------------<br />

//<br />

// Inicializacion <strong>de</strong> los vectores:<br />

// "vectorElem<strong>en</strong>tos<strong>3D</strong>" y "vectorCoord<strong>en</strong>adas<strong>3D</strong>"<br />

//<br />

// -----------------------------------------------------------<br />

internal function inicializarElem<strong>en</strong>tos<strong>3D</strong>():void {<br />

// -----------------------------------------------------------<br />

// Tras<strong>la</strong>do <strong>de</strong> elem<strong>en</strong>tos <strong>de</strong> los "Compon<strong>en</strong>tes" y los "Nodos Visuales" a los<br />

// vectores "vectorElem<strong>en</strong>tos<strong>3D</strong>" y sus coord<strong>en</strong>adas <strong>3D</strong> a los<br />

// vectores "vectorCoord<strong>en</strong>adas<strong>3D</strong>", para po<strong>de</strong>r manejarlos <strong>en</strong><br />

4


espacio <strong>3D</strong><br />

// -----------------------------------------------------------<br />

for (i=0; i


public function inicializarCuboVirtual():void {<br />

// --- Construye cubo virtual como cont<strong>en</strong>edor para animacion <strong>3D</strong> ---<br />

cuboCont<strong>en</strong>edorVirtual = new Sprite();<br />

cuboCont<strong>en</strong>edorVirtual.name = cuboCont<strong>en</strong>edorVirtual;<br />

container.addChild(cuboCont<strong>en</strong>edorVirtual);<br />

}<br />

cuboCont<strong>en</strong>edorVirtual.x=0;<br />

cuboCont<strong>en</strong>edorVirtual.y=0;<br />

cuboCont<strong>en</strong>edorVirtual.z=0;<br />

// --- F<strong>la</strong>g ---<br />

estaRotandoCubo = false;<br />

public function construirCuboVirtual() {<br />

}<br />

// -----------------------------------------------------------<br />

// Todos los elem<strong>en</strong>tos visuales (compon<strong>en</strong>tes y nodos visuales)<br />

// se tras<strong>la</strong>dan <strong>de</strong>l editor (spEditor) al "cuboCont<strong>en</strong>edorVirtual"<br />

// para repres<strong>en</strong>tarse <strong>en</strong> <strong>3D</strong><br />

// -----------------------------------------------------------<br />

var i:int;<br />

for (i=0; i


-----------------------------------------------------------<br />

// Funcion <strong>de</strong> c<strong>la</strong>sificacion y ord<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> <strong>la</strong> distancia,<br />

// <strong>en</strong> <strong>3D</strong>, <strong>de</strong> los elem<strong>en</strong>tos visuales al observador<br />

// -----------------------------------------------------------<br />

var arregloDistanciasElem<strong>en</strong>tos:Array=new Array();<br />

var i:int;<br />

var matriz<strong>3D</strong>Actual:Matrix<strong>3D</strong>;<br />

var puntosMediosElem<strong>en</strong>tos:Vector<strong>3D</strong>;<br />

matriz<strong>3D</strong>Actual = cuboCont<strong>en</strong>edorVirtual.transform.matrix<strong>3D</strong>.clone();<br />

// -----------------------------------------------------------<br />

// Preparacion <strong>de</strong> los elem<strong>en</strong>tos visuales cont<strong>en</strong>idos <strong>en</strong> el<br />

// vector "puntosMediosElem<strong>en</strong>tos" <strong>en</strong> el arreglo<br />

// "arregloDistanciasElem<strong>en</strong>tos" para su c<strong>la</strong>sificacion<br />

// -----------------------------------------------------------<br />

for(i=0; i0){<br />

cuboCont<strong>en</strong>edorVirtual.removeChildAt(0);<br />

}<br />

// -----------------------------------------------------------<br />

// Ll<strong>en</strong>ar el "cuboCont<strong>en</strong>edorVirtual" con los elem<strong>en</strong>tos ya<br />

// c<strong>la</strong>sificados por su distancia al observador, <strong>de</strong> acuerod a<br />

// <strong>la</strong> posicion actual <strong>de</strong>l "cuboCont<strong>en</strong>edorVirtual" <strong>de</strong>spues <strong>de</strong><br />

// haberlo rotado<br />

// -----------------------------------------------------------<br />

for(i=0; i


-----------------------------------------------------------<br />

//<br />

// Conexion <strong>en</strong>tre "graficaBarras" --> "motor<strong>3D</strong>"<br />

// (activacion <strong>de</strong> <strong>la</strong> animacion <strong>de</strong> los "nodosVisuales" <strong>de</strong>s<strong>de</strong><br />

// <strong>la</strong> "graficaBarras")<br />

//<br />

// -----------------------------------------------------------<br />

public function seleccionarNodo(id:String):void {<br />

for (i in nodosVisuales) {<br />

if (id == nodosVisuales[i].name) {<br />

nodosVisuales[i].iniciarAnimacion();<br />

}<br />

}<br />

}<br />

public function quitarSeleccion(id:String):void {<br />

for (i in nodosVisuales) {<br />

if (id == nodosVisuales[i].name) {<br />

nodosVisuales[i].<strong>de</strong>t<strong>en</strong>erAnimacion();<br />

}<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> "Sli<strong>de</strong>rs"<br />

//<br />

// -----------------------------------------------------------<br />

private function crearSli<strong>de</strong>rs():void {<br />

// --- Creacion y colocacion <strong>de</strong> "xSli<strong>de</strong>r" ---<br />

xSli<strong>de</strong>r = new Sli<strong>de</strong>r();<br />

xSli<strong>de</strong>r.setSize(180,10);<br />

xSli<strong>de</strong>r.maximum = 180;<br />

xSli<strong>de</strong>r.minimum = -180;<br />

xSli<strong>de</strong>r.x = 780;<br />

xSli<strong>de</strong>r.y = 300;<br />

addChild(xSli<strong>de</strong>r);<br />

// --- Creacion y colocacion <strong>de</strong> <strong>la</strong> etiqueta para "xSli<strong>de</strong>r" ---<br />

var xLabel:mc_<strong>la</strong>bel_Sli<strong>de</strong>rX = new mc_<strong>la</strong>bel_Sli<strong>de</strong>rX();<br />

xLabel.x = xSli<strong>de</strong>r.x + 78;<br />

xLabel.y = xSli<strong>de</strong>r.y + 9;<br />

addChild(xLabel);<br />

// --- Creacion y colocacion <strong>de</strong> "ySli<strong>de</strong>r" ---<br />

ySli<strong>de</strong>r = new Sli<strong>de</strong>r();<br />

ySli<strong>de</strong>r.setSize(180,10);<br />

ySli<strong>de</strong>r.maximum = 180;<br />

ySli<strong>de</strong>r.minimum = -180;<br />

ySli<strong>de</strong>r.x = 780;<br />

ySli<strong>de</strong>r.y = 340;<br />

addChild(ySli<strong>de</strong>r);<br />

// --- Creacion y colocacion <strong>de</strong> <strong>la</strong> etiqueta para "ySli<strong>de</strong>r" ---<br />

var yLabel:mc_<strong>la</strong>bel_Sli<strong>de</strong>rY = new mc_<strong>la</strong>bel_Sli<strong>de</strong>rY();<br />

yLabel.x = ySli<strong>de</strong>r.x + 78;<br />

yLabel.y = ySli<strong>de</strong>r.y + 9;<br />

addChild(yLabel);<br />

// --- Creacion y colocacion <strong>de</strong> "zSli<strong>de</strong>r" ---<br />

zSli<strong>de</strong>r = new Sli<strong>de</strong>r();<br />

zSli<strong>de</strong>r.setSize(180,10);<br />

zSli<strong>de</strong>r.maximum = 180;<br />

zSli<strong>de</strong>r.minimum = -180;<br />

zSli<strong>de</strong>r.x = 780;<br />

zSli<strong>de</strong>r.y = 380;<br />

addChild(zSli<strong>de</strong>r);<br />

// --- Creacion y colocacion <strong>de</strong> <strong>la</strong> etiqueta para "zSli<strong>de</strong>r" ---<br />

var zLabel:mc_<strong>la</strong>bel_Sli<strong>de</strong>rZ = new mc_<strong>la</strong>bel_Sli<strong>de</strong>rZ();<br />

8


zLabel.x = zSli<strong>de</strong>r.x + 78;<br />

zLabel.y = zSli<strong>de</strong>r.y + 9;<br />

addChild(zLabel);<br />

}<br />

// --- Inicializacion <strong>de</strong> variables <strong>de</strong> Sli<strong>de</strong>rs ---<br />

prevXVal = 0;<br />

prevYVal = 0;<br />

prevZVal = 0;<br />

}<br />

}<br />

internal function inicializarList<strong>en</strong>ersSli<strong>de</strong>rs():void {<br />

xSli<strong>de</strong>r.addEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rX);<br />

ySli<strong>de</strong>r.addEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rY);<br />

zSli<strong>de</strong>r.addEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rZ);<br />

}<br />

function cambioSli<strong>de</strong>rX(e:Sli<strong>de</strong>rEv<strong>en</strong>t):void {<br />

var curXVal:Number=e.target.value;<br />

rotarCuboVirtual(curXVal-prevXVal,0,0);<br />

prevXVal=curXVal;<br />

}<br />

function cambioSli<strong>de</strong>rY(e:Sli<strong>de</strong>rEv<strong>en</strong>t):void {<br />

var curYVal:Number=e.target.value;<br />

rotarCuboVirtual(0,curYVal-prevYVal,0);<br />

prevYVal=curYVal;<br />

}<br />

function cambioSli<strong>de</strong>rZ(e:Sli<strong>de</strong>rEv<strong>en</strong>t):void {<br />

var curZVal:Number=e.target.value;<br />

rotarCuboVirtual(0,0,curZVal-prevZVal);<br />

prevZVal=curZVal;<br />

}<br />

9


package Vistas.dc.graficas<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: graficaBarras<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "COMPOSICION" (motor<strong>3D</strong>_dc graficaBarras)<br />

// |<br />

// V<br />

// listaDatos<br />

//<br />

// septiembre /<br />

2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: - Voltajes nodales <strong>en</strong> "arregloDatos" (Array)<br />

// Estructura <strong>de</strong> "arregloDatos"<br />

// - arregloDatos[0][0] --> voltaje nodal "normalizado"<br />

// <strong>en</strong><br />

"mo<strong>de</strong>loCircuito"<br />

// - arregloDatos[0][1] --> voltaje nodal calcu<strong>la</strong>do<br />

// por<br />

el simu<strong>la</strong>dor<br />

//<br />

// CONEXIONES INTERACTIVAS:<br />

// - Con "motor<strong>3D</strong>_dc" a traves <strong>de</strong> "vistasDC"<br />

//<br />

// SALIDA:<br />

// - Grafica <strong>de</strong> barras <strong>de</strong> voltajes nodales<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Vistas<br />

import Vistas.vistasDC;<br />

public c<strong>la</strong>ss graficaBarras ext<strong>en</strong>ds Sprite {<br />

// --- Parametros recibidos ---<br />

private var arregloDatos:Array;<br />

private var vistas:Object;<br />

// --- Variables para graficacion <strong>de</strong> datos ---<br />

private var b:Array;<br />

private var maximo:Number=0;<br />

private var indiceMaximo:Number=0;<br />

private var refer<strong>en</strong>ciaEjeY:Number;<br />

private var rangoDinamico:uint =160;<br />

private var anchoBarra:Number;<br />

private var alturaBarra:Number;<br />

// --- Parametros para <strong>de</strong>finicion <strong>de</strong> grafica ---<br />

private var anchoGrafica:Number = 210;<br />

private var altoGrafica:Number = rangoDinamico+20;<br />

private var <strong>de</strong>ltaAcotacion:Number = 20; //(altoGrafica-10)/10;<br />

private var posicionX:Number;<br />

// --- Acotaciones y etiquetas ---<br />

private var acotacionesY:Array=[];<br />

private var etiquetasX:Array=[];<br />

private var etiquetasY:Array=[];<br />

11


private var valorVoltaje:TextField;<br />

private var etiquetaNodo:TextField;<br />

private var linea:Sprite;<br />

// --- Cont<strong>en</strong>edor ---<br />

private var cont<strong>en</strong>edor:Sprite;<br />

public function graficaBarras (vistas:Object,datos:Array) {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

this.vistas = vistas;<br />

this.arregloDatos = datos;<br />

// --- Creacion <strong>de</strong> cont<strong>en</strong>edor <strong>de</strong> <strong>la</strong> grafica ---<br />

cont<strong>en</strong>edor = new Sprite();<br />

addChild(cont<strong>en</strong>edor);<br />

linea = new Sprite();<br />

}<br />

contruirGraficaBarras();<br />

private function contruirGraficaBarras():void {<br />

inicializarGraficaBarras();<br />

dibujarFondoGrafica();<br />

dibujarAcotacionesY();<br />

dibujarEtiquetasX();<br />

dibujarEtiquetasY();<br />

dibujarGraficaBarras();<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> Grafica <strong>de</strong> Barras<br />

//<br />

// -----------------------------------------------------------<br />

private function inicializarGraficaBarras():void {<br />

// Selecciona maximo valor <strong>de</strong> los<br />

// voltajes nodales normalizados<br />

for (var i in arregloDatos) {<br />

if (Math.abs(arregloDatos[i][0]) > maximo) {<br />

maximo = Math.abs(arregloDatos[i][0]);<br />

indiceMaximo = i;<br />

}<br />

}<br />

}<br />

// --- Normaliza altura <strong>de</strong> barras ---<br />

alturaBarra = rangoDinamico/2;<br />

b = new Array();<br />

for (i in arregloDatos) {<br />

if (maximo != 0) {<br />

b.push((arregloDatos[i][0]/maximo)*alturaBarra);<br />

} else {<br />

b.push(arregloDatos[i][0]*alturaBarra);<br />

}<br />

}<br />

// --- Calcu<strong>la</strong> ancho <strong>de</strong> cada barra ---<br />

anchoBarra = 200/b.l<strong>en</strong>gth - 2;<br />

// --- Calcu<strong>la</strong> posicion <strong>de</strong> cada barra ---<br />

posicionX = anchoBarra + 2;<br />

// --- Inicializa refer<strong>en</strong>cia <strong>de</strong> voltaje CERO ---<br />

refer<strong>en</strong>ciaEjeY = -altoGrafica/2;<br />

public function dibujarFondoGrafica():void {<br />

var fondo:Shape = new Shape();<br />

fondo.graphics.lineStyle(1,0xffffff);<br />

fondo.graphics.beginFill(0x000000);<br />

fondo.graphics.drawRect(-5,0,anchoGrafica,-altoGrafica);<br />

12


}<br />

fondo.graphics.<strong>en</strong>dFill();<br />

cont<strong>en</strong>edor.addChild(fondo);<br />

public function dibujarAcotacionesY():void {<br />

}<br />

var acotaY:Shape;<br />

for (dy=10; dy


V";<br />

etiquetasY[i].x = -40;<br />

etiquetasY[i].y = acotacionesY[i].y - 8;<br />

etiquetasY[i].width = 35;<br />

etiquetasY[i].height = 15;<br />

<strong>de</strong>ltaValorAcotacion)*10)/10).toString()+"<br />

}<br />

}<br />

// --- Formato <strong>de</strong> Texto ---<br />

var format:TextFormat = new TextFormat();<br />

format.font = "_sans";<br />

format.size = 10;<br />

format.color = 0xffffff;<br />

etiquetasY[i].setTextFormat(format);<br />

cont<strong>en</strong>edor.addChild (etiquetasY[i]);<br />

private function dibujarGraficaBarras():void {<br />

// --- Dibujo <strong>de</strong> <strong>la</strong> grafica <strong>de</strong> barras ---<br />

var grafica:Sprite = new Sprite();<br />

var bar:Sprite;<br />

var alturaBarra:Number;<br />

for (i in b) {<br />

bar = new Sprite();<br />

bar.buttonMo<strong>de</strong> = true;<br />

bar.name = "n"+i;<br />

bar.alpha = 0.7;<br />

// --- Agrega "List<strong>en</strong>ers" para grafica interactiva ---<br />

bar.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_OVER, seleccionarNodo);<br />

bar.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_OUT, quitarSeleccion);<br />

// --- Dibujo <strong>de</strong> <strong>la</strong> barra ---<br />

bar.graphics.lineStyle (0,0x000000);<br />

bar.graphics.beginFill (0x0099cc);<br />

if (b[i] != 0) {<br />

bar.graphics.lineStyle(0,0x0099cc);<br />

bar.graphics.beginFill(0x0099cc);<br />

alturaBarra = b[i];<br />

if (b[i] > 0) {<br />

// --- Voltaje positivo ---<br />

bar.graphics.drawRect(posicionX*i,(refer<strong>en</strong>ciaEjeY-b[i]-1),<br />

anchoBarra,alturaBarra);<br />

} else {<br />

// --- Voltaje negativo ---<br />

bar.graphics.drawRect(posicionX*i,(refer<strong>en</strong>ciaEjeY-b[i]+1),<br />

anchoBarra,alturaBarra);<br />

anchoBarra,alturaBarra/2);<br />

} else {<br />

}<br />

// Si el voltaje a graficar es CERO, dibuja un cuadro negro<br />

// como barra, para t<strong>en</strong>er interactividad cuando el mouse<br />

// pase sobre dicho cuadro<br />

bar.graphics.lineStyle(0,0x000000);<br />

bar.graphics.beginFill(0x000000);<br />

alturaBarra = -30;<br />

bar.graphics.drawRect(posicionX*i,(refer<strong>en</strong>ciaEjeY-b[i]-1),<br />

bar.graphics.drawRect(posicionX*i,(refer<strong>en</strong>ciaEjeY-b[i]+1),<br />

anchoBarra,-alturaBarra/2);<br />

}<br />

}<br />

bar.graphics.<strong>en</strong>dFill();<br />

grafica.addChild(bar);<br />

14


}<br />

cont<strong>en</strong>edor.addChild (grafica);<br />

// -----------------------------------------------------------<br />

//<br />

// Conexion <strong>en</strong>tre "graficaBarras" --> "motor<strong>3D</strong>"<br />

// (activacion <strong>de</strong> <strong>la</strong> animacion <strong>de</strong> los "nodosVisuales" <strong>de</strong>s<strong>de</strong><br />

// <strong>la</strong> "graficaBarras")<br />

//<br />

// -----------------------------------------------------------<br />

public function seleccionarNodo(evt:Ev<strong>en</strong>t):void {<br />

}<br />

vistas.seleccionarNodo(evt.target.name);<br />

evt.target.alpha = 1;<br />

mostrarValorVoltaje(evt.target.name);<br />

public function quitarSeleccion(evt:Ev<strong>en</strong>t):void {<br />

vistas.quitarSeleccion(evt.target.name);<br />

evt.target.alpha = 0.7;<br />

}<br />

cont<strong>en</strong>edor.removeChild(etiquetaNodo);<br />

cont<strong>en</strong>edor.removeChild (valorVoltaje);<br />

cont<strong>en</strong>edor.removeChild(linea);<br />

V";<br />

refer<strong>en</strong>ciaEjeYb[numNodo]);<br />

private function mostrarValorVoltaje(indice:String):void {<br />

var numNodo:Number;<br />

numNodo = Number(indice.substr(1,2))<br />

// --- Valor <strong>de</strong>l voltaje ---<br />

valorVoltaje=new TextField();<br />

valorVoltaje.text = (Math.round(arregloDatos[numNodo][1]*<br />

valorVoltaje.x=anchoGrafica + 10;<br />

valorVoltaje.y=refer<strong>en</strong>ciaEjeY-b[numNodo]-10;<br />

valorVoltaje.bor<strong>de</strong>r = true;<br />

valorVoltaje.bor<strong>de</strong>rColor = 0xffffff;<br />

valorVoltaje.background = true;<br />

valorVoltaje.backgroundColor = 0x0099cc;<br />

valorVoltaje.width = 40;<br />

valorVoltaje.height = 15;<br />

// --- Formato <strong>de</strong> Texto ---<br />

var format:TextFormat = new TextFormat();<br />

format.font = "_sans";<br />

format.size = 10;<br />

format.color = 0xffffff;<br />

valorVoltaje.setTextFormat(format);<br />

linea.graphics.clear();<br />

linea.graphics.lineStyle(0.2,0xffffff,0.8);<br />

linea.graphics.moveTo(etiquetasX[numNodo].x+anchoBarra/2,<br />

linea.graphics.lineTo(anchoGrafica + 10,refer<strong>en</strong>ciaEjeY-b[numNodo]);<br />

// --- Etiqueta <strong>de</strong>l Nodo ---<br />

etiquetaNodo=new TextField();<br />

etiquetaNodo.text = "V"+numNodo;<br />

etiquetaNodo.x=etiquetasX[numNodo].x;<br />

etiquetaNodo.y=etiquetasX[numNodo].y;<br />

etiquetaNodo.bor<strong>de</strong>r = true;<br />

etiquetaNodo.bor<strong>de</strong>rColor = 0xffffff;<br />

etiquetaNodo.background = true;<br />

etiquetaNodo.backgroundColor = 0x0099cc;<br />

100)/100).toString()+"<br />

15


etiquetaNodo.width = 20;<br />

etiquetaNodo.height = 15;<br />

// --- Formato <strong>de</strong> Texto ---<br />

var format2:TextFormat = new TextFormat();<br />

format2.font = "_sans";<br />

format2.size = 10;<br />

format2.color = 0xffffff;<br />

etiquetaNodo.setTextFormat(format2);<br />

}<br />

}<br />

}<br />

cont<strong>en</strong>edor.addChild(linea);<br />

cont<strong>en</strong>edor.addChild(valorVoltaje);<br />

cont<strong>en</strong>edor.addChild(etiquetaNodo);<br />

16


package Vistas.dc.listas<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: listasDatos<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "COMPOSICION" (motor<strong>3D</strong>_dc graficaBarras)<br />

// |<br />

// V<br />

/ 2010<br />

// listaDatos<br />

//<br />

// septiembre<br />

// **************************************************************<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

import fl.controls.*;<br />

import fl.controls.DataGrid;<br />

import fl.containers.*;<br />

import fl.core.UICompon<strong>en</strong>t;<br />

import fl.data.DataProvi<strong>de</strong>r;<br />

public c<strong>la</strong>ss listaDatos ext<strong>en</strong>ds Sprite {<br />

public var dp:DataProvi<strong>de</strong>r;<br />

public var dg:DataGrid;<br />

private var arregloDatos:Array;<br />

public var info:Sprite;<br />

public function listaDatos(lista:Array):void {<br />

arregloDatos = lista;<br />

dp = new DataProvi<strong>de</strong>r();<br />

for (var indice in arregloDatos) {<br />

if (arregloDatos[indice].name.substr(0,1) != "W" &&<br />

arregloDatos[indice].name.substr(0,1) != "T") {<br />

dp.addItem( { <strong>la</strong>bel:<br />

arregloDatos[indice].datosCompon<strong>en</strong>te[0], data:arregloDatos[indice].name} );<br />

//dp.addItem( { <strong>la</strong>bel:<br />

"e"+(indice)+"="+arregloDatos[indice].datosCompon<strong>en</strong>te[0], data:arregloDatos[indice].name} );<br />

//listaUI.addItem({<strong>la</strong>bel:"e"+(indice)+"="+arregloDatos[indice].datosCompon<strong>en</strong>te[0],data:arre<br />

gloDatos[indice].name});<br />

}<br />

}<br />

var cb:ComboBox = new ComboBox();<br />

cb.move(10,10);<br />

cb.setSize(200,25);<br />

17


cb.prompt = "Select a compon<strong>en</strong>t to view its info";<br />

cb.rowCount = 12;<br />

cb.dataProvi<strong>de</strong>r = dp;<br />

cb.addEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.CHANGE, showStyleDefinition);<br />

addChild(cb);<br />

info = new Sprite();<br />

info.graphics.lineStyle(1,0x00ff99,0.8);<br />

info.graphics.beginFill(0x22cc00,0.5);<br />

info.graphics.drawRect(0,0,300,100);<br />

info.graphics.<strong>en</strong>dFill();<br />

info.x = 20;<br />

info.y = 100;<br />

//addChild(info);<br />

/*dg = new DataGrid();<br />

//dg.setSize(425,300);<br />

dg.setSize(170, 250);<br />

dg.move(450,120);<br />

dg.columns = [ "Name", "Goals" ];<br />

//dg.columns = [ new DataGridColumn("StyleName"), new<br />

DataGridColumn("DefaultValue") ];<br />

dg.dataProvi<strong>de</strong>r = dp;<br />

addChild(dg);*/<br />

}<br />

}<br />

}<br />

public function showStyleDefinition(e:Ev<strong>en</strong>t):void {<br />

trace(e.target);<br />

trace(e.target.selectedItem.data);<br />

addChild(info);<br />

/*var compon<strong>en</strong>tC<strong>la</strong>ss:C<strong>la</strong>ss = e.target.selectedItem.data as C<strong>la</strong>ss;<br />

var styles:Object = compon<strong>en</strong>tC<strong>la</strong>ss["getStyleDefinition"].call(this);<br />

trace(styles.toString());<br />

var styleData:DataProvi<strong>de</strong>r = new DataProvi<strong>de</strong>r();<br />

for(var i:* in styles) {<br />

trace(i + " : " + styles[i]);<br />

styleData.addItem( { StyleName:i, DefaultValue:styles[i] } );<br />

}<br />

styleData.sortOn("StyleName");<br />

dg.dataProvi<strong>de</strong>r = styleData;*/<br />

}<br />

18


package Vistas.ac<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: VistasAC<br />

//<br />

// Patrones <strong>de</strong> Programacion:<br />

//<br />

// (1) "MVC" (MODELO - VISTA - CONTROLADOR)<br />

//<br />

// (2) "COMPOSICION" (motor<strong>3D</strong>_ac graficaBarras)<br />

// |<br />

// V<br />

// Graficador_Respuesta_Frecu<strong>en</strong>cia)<br />

//<br />

// septiembre<br />

/ 2010<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.Sprite;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.TextField;<br />

import f<strong>la</strong>sh.text.TextFieldAutoSize;<br />

import f<strong>la</strong>sh.text.TextFieldType;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.MouseEv<strong>en</strong>t;<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.Ev<strong>en</strong>t;<br />

// Repres<strong>en</strong>taciones <strong>en</strong> 2D y <strong>3D</strong><br />

import Vistas.dc.graficas.graficaBarras;<br />

import Vistas.ac.respuestaFrecu<strong>en</strong>cia.Graficador_Respuesta_Frecu<strong>en</strong>cia;<br />

import Vistas.ac.respuestaFrecu<strong>en</strong>cia.Cursor_Respuesta_Frecu<strong>en</strong>cia;<br />

import Vistas.ac.animacion<strong>3D</strong>.motor<strong>3D</strong>_ac;<br />

// Mo<strong>de</strong>lo MVC<br />

import Mo<strong>de</strong>lo.G<strong>en</strong>erador_Lista_Datos;<br />

import Mo<strong>de</strong>lo.Mo<strong>de</strong>loCircuito;<br />

public c<strong>la</strong>ss vistasAC ext<strong>en</strong>ds Sprite {<br />

// --- Parametros recibidos ---<br />

private var spEditor:Sprite;<br />

private var elem<strong>en</strong>tosCircuito:Array;<br />

private var nodosVisuales:Array;<br />

private var LD:G<strong>en</strong>erador_Lista_Datos;<br />

// --- Repres<strong>en</strong>taciones <strong>en</strong> 2D y <strong>3D</strong> ---<br />

private var graficaRF:Graficador_Respuesta_Frecu<strong>en</strong>cia;<br />

private var cursor:Cursor_Respuesta_Frecu<strong>en</strong>cia;<br />

private var barrasVoltaje:graficaBarras;<br />

private var circuito<strong>3D</strong>:motor<strong>3D</strong>_ac;<br />

// --- Mo<strong>de</strong>lo MVC ---<br />

public var mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito;<br />

19


public function vistasAC (mo<strong>de</strong>lo:Mo<strong>de</strong>loCircuito):void {<br />

this.mo<strong>de</strong>lo = mo<strong>de</strong>lo;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Mostrar <strong>la</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia <strong>en</strong>tre "f_min" y "f_max"<br />

//<br />

// -----------------------------------------------------------<br />

public function mostrarRespuestaFrecu<strong>en</strong>cia(LD:G<strong>en</strong>erador_Lista_Datos,<br />

cont<strong>en</strong>edor:Sprite):void {<br />

this.LD = LD;<br />

// --- Construccion <strong>de</strong> <strong>la</strong> grafica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia ---<br />

graficaRF = new Graficador_Respuesta_Frecu<strong>en</strong>cia(LD);<br />

graficaRF.graficarMagnituFase();<br />

addChild(graficaRF);<br />

}<br />

// --- Colocacion <strong>de</strong>l CURSOR interactivo ---<br />

cursor = new Cursor_Respuesta_Frecu<strong>en</strong>cia(this,LD,graficaRF);<br />

cursor.inicializaCursorInteractivo();<br />

cursor.selecciona_Grafica_Nodo(0);<br />

addChild(cursor);<br />

// PENDIENTE:: Por <strong>de</strong>sarrol<strong>la</strong>r<br />

public function actualiza_CoordX_CURSOR(coord<strong>en</strong>adaX:Number):void {<br />

trace("vistasAC <strong>la</strong>nzada <strong>de</strong>s<strong>de</strong> el motor<strong>3D</strong>_AC:: coord<strong>en</strong>adaX= "+coord<strong>en</strong>adaX);<br />

//mo<strong>de</strong>lo.asignarResultadosSimu<strong>la</strong>cionAC(coord<strong>en</strong>adaX);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Mostrar resultados <strong>en</strong> "grafica <strong>de</strong> barras",<br />

// "circuito <strong>en</strong> <strong>3D</strong>" y "Respuesta <strong>en</strong> Frecu<strong>en</strong>cia"<br />

//<br />

// -----------------------------------------------------------<br />

public function mostrarDatos(spEditor:Sprite,nodosVisuales:Array):void<br />

{<br />

this.spEditor = spEditor;<br />

this.nodosVisuales = nodosVisuales;<br />

// --- Captura refer<strong>en</strong>cias a los compon<strong>en</strong>tes <strong>de</strong>l circuito ---<br />

elem<strong>en</strong>tosCircuito = new Array();<br />

for (i=0; i


voltajesNodales.push([-<br />

nodosVisuales[i].magnitud,nodosVisuales[i].voltajeNodalPico]);<br />

}<br />

// --- Grafica <strong>de</strong> barras para magnitu<strong>de</strong>s <strong>de</strong> voltajes nodales ---<br />

barrasVoltaje = new graficaBarras(this,voltajesNodales);<br />

addChild (barrasVoltaje);<br />

barrasVoltaje.x = 480;<br />

barrasVoltaje.y = 400;<br />

}<br />

// --- Grafica <strong>de</strong>l circuito <strong>en</strong> <strong>3D</strong> ---<br />

circuito<strong>3D</strong> = new motor<strong>3D</strong>_ac(spEditor,nodosVisuales);<br />

circuito<strong>3D</strong>.g<strong>en</strong>eraSeñalS<strong>en</strong>oidal();<br />

addChild(circuito<strong>3D</strong>);<br />

// -----------------------------------------------------------<br />

//<br />

// Liberacion <strong>de</strong> objetos para regresar al EDITOR<br />

//<br />

// -----------------------------------------------------------<br />

public function liberarDatos():void {<br />

circuito<strong>3D</strong>.removerElem<strong>en</strong>tos();<br />

removeChild (circuito<strong>3D</strong>);<br />

removeChild (barrasVoltaje);<br />

removeChild(graficaRF);<br />

removeChild(cursor);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Conexion <strong>en</strong>tre:<br />

// * "graficaBarras" --> "motor<strong>3D</strong>"<br />

// * "graficaBarras" --> "Graficador_Respuesta_Frecu<strong>en</strong>cia"<br />

//<br />

// -----------------------------------------------------------<br />

public function seleccionarNodo(id:String):void {<br />

// --- Conexion con "motor<strong>3D</strong>" ---<br />

circuito<strong>3D</strong>.seleccionarNodo(id);<br />

// --- Conexion con "Graficador_Respuesta_Frecu<strong>en</strong>cia" ---<br />

cursor.selecciona_Grafica_Nodo(id);<br />

graficaRF.mostrarNodoSeleccionado(id);<br />

}<br />

public function quitarSeleccion(id:String):void {<br />

// --- Conexion con "motor<strong>3D</strong>" ---<br />

circuito<strong>3D</strong>.quitarSeleccion(id);<br />

}<br />

}<br />

}<br />

21


package Vistas.ac.animacion<strong>3D</strong><br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: motor<strong>3D</strong>_ac<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "COMPOSICION" (motor<strong>3D</strong>_ac graficaBarras)<br />

// |<br />

// V<br />

// Graficador_Respuesta_Frecu<strong>en</strong>cia)<br />

//<br />

// septiembre /<br />

2010<br />

// **************************************************************<br />

//<br />

// ENTRADA: - Compon<strong>en</strong>tes <strong>de</strong>l circuito <strong>en</strong> "spEditor" (Object)<br />

// - Nodos visuales <strong>en</strong> "nodosVisuales" (Array)<br />

//<br />

// CONEXIONES INTERACTIVAS:<br />

// - Con "graficaBarras" a traves <strong>de</strong> "vistasAC"<br />

//<br />

// SALIDA:<br />

// - Circuito <strong>en</strong> <strong>3D</strong> <strong>en</strong> pantal<strong>la</strong><br />

// - Voltajes nodales complejos <strong>en</strong> AC<br />

// magnitud y fase (movimi<strong>en</strong>to <strong>en</strong> "z" <strong>de</strong> nodos)<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Sli<strong>de</strong>rs<br />

import fl.controls.Sli<strong>de</strong>r;<br />

import fl.ev<strong>en</strong>ts.Sli<strong>de</strong>rEv<strong>en</strong>t;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.*;<br />

public c<strong>la</strong>ss motor<strong>3D</strong>_ac ext<strong>en</strong>ds Sprite {<br />

// --- Parametros recibidos ---<br />

public var spEditor:Object;<br />

public var compon<strong>en</strong>te:Object;<br />

private var elem<strong>en</strong>tosCircuito:Array;<br />

private var nodosVisuales:Array;<br />

// --- P<strong>la</strong>no <strong>de</strong> refer<strong>en</strong>cia y "linea <strong>de</strong> pot<strong>en</strong>cial positivo" ---<br />

private var refer<strong>en</strong>cia:MovieClip;<br />

private var <strong>la</strong>doP<strong>la</strong>noRefer<strong>en</strong>cia:Number = 200;<br />

// --- Refer<strong>en</strong>cias a "Compon<strong>en</strong>tes" y "Nodos Visuales" ---<br />

public var vectorElem<strong>en</strong>tos<strong>3D</strong>:Vector.;<br />

// --- Coord<strong>en</strong>adas <strong>3D</strong> <strong>de</strong> los "Compon<strong>en</strong>tes" y "Nodos Visuales" ---<br />

public var vectorCoord<strong>en</strong>adas<strong>3D</strong>:Vector.;<br />

// Cubo virtual cont<strong>en</strong>edor <strong>de</strong> los<br />

// "Compon<strong>en</strong>tes" y "Nodos Visuales"<br />

public var cuboCont<strong>en</strong>edorVirtual:Sprite;<br />

// --- Auxiliares para control <strong>de</strong> rotacion <strong>de</strong>l cubo virtual ---<br />

public var estaRotandoCubo:Boolean;<br />

public var prevX:Number;<br />

public var prevY:Number;<br />

// --- Cont<strong>en</strong>edor <strong>de</strong>l cubo virtual ---<br />

public var container:Sprite;<br />

23


--- Sli<strong>de</strong>rs ---<br />

public var sli<strong>de</strong>rs:Array;<br />

private var xSli<strong>de</strong>r:Sli<strong>de</strong>r;<br />

private var ySli<strong>de</strong>r:Sli<strong>de</strong>r;<br />

private var zSli<strong>de</strong>r:Sli<strong>de</strong>r;<br />

// --- Auxiliares para Sli<strong>de</strong>rs ---<br />

public var prevXVal:Number;<br />

public var prevYVal:Number;<br />

public var prevZVal:Number;<br />

// Auxiliar para separar <strong>la</strong>s refer<strong>en</strong>cias a los<br />

// "Compon<strong>en</strong>tes" y los "Nodos Visuales"<br />

private var offset:uint;<br />

// Variable in<strong>de</strong>p<strong>en</strong>di<strong>en</strong>te <strong>de</strong> tiempo para <strong>la</strong> g<strong>en</strong>eracion<br />

// <strong>de</strong> <strong>la</strong> funcion "cos<strong>en</strong>oidal" para <strong>la</strong> repres<strong>en</strong>tacion<br />

// dinamica <strong>de</strong>l circuito simu<strong>la</strong>do<br />

private var t:Number = 1;<br />

public function motor<strong>3D</strong>_ac(spEditor:Sprite,nodosVisuales:Array):void {<br />

// --- Recepcion <strong>de</strong> parametros ---<br />

this.spEditor = spEditor;<br />

this.container = spEditor;<br />

this.nodosVisuales = nodosVisuales;<br />

nodosVisuales.l<strong>en</strong>gth+1);<br />

nodosVisuales.l<strong>en</strong>gth+1);<br />

// --- Inicializacion <strong>de</strong> Vectores ---<br />

vectorElem<strong>en</strong>tos<strong>3D</strong> = new Vector.(spEditor.numChildr<strong>en</strong> +<br />

vectorCoord<strong>en</strong>adas<strong>3D</strong> = new Vector.(spEditor.numChildr<strong>en</strong> +<br />

// --- Coord<strong>en</strong>adas <strong>en</strong> <strong>3D</strong> ---<br />

var x_coord:Number;<br />

var y_coord:Number;<br />

var z_coord:Number;<br />

}<br />

construirMotor<strong>3D</strong>();<br />

internal function construirMotor<strong>3D</strong>():void {<br />

// --- Inicializar elem<strong>en</strong>tos <strong>3D</strong> ---<br />

inicializarElem<strong>en</strong>tos<strong>3D</strong>();<br />

construirP<strong>la</strong>noRefer<strong>en</strong>cia();<br />

// --- Inicializar cubo virtual <strong>3D</strong> ---<br />

inicializarCuboVirtual();<br />

construirCuboVirtual();<br />

inicializarList<strong>en</strong>ersCubo();<br />

// --- Crear Sli<strong>de</strong>rs ---<br />

crearSli<strong>de</strong>rs();<br />

inicializarList<strong>en</strong>ersSli<strong>de</strong>rs();<br />

}<br />

// Funcion <strong>de</strong> c<strong>la</strong>sificacion y ord<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> <strong>la</strong> distancia,<br />

// <strong>en</strong> <strong>3D</strong>, <strong>de</strong> los elem<strong>en</strong>tos visuales al observador<br />

c<strong>la</strong>sificarElem<strong>en</strong>tos<strong>3D</strong>Z();<br />

// -----------------------------------------------------------<br />

//<br />

// Inicializacion <strong>de</strong> los vectores:<br />

// "vectorElem<strong>en</strong>tos<strong>3D</strong>" y "vectorCoord<strong>en</strong>adas<strong>3D</strong>"<br />

//<br />

// -----------------------------------------------------------<br />

internal function inicializarElem<strong>en</strong>tos<strong>3D</strong>():void {<br />

24


-----------------------------------------------------------<br />

// Tras<strong>la</strong>do <strong>de</strong> elem<strong>en</strong>tos <strong>de</strong> los "Compon<strong>en</strong>tes" y los "Nodos Visuales" a los<br />

// vectores "vectorElem<strong>en</strong>tos<strong>3D</strong>" y sus coord<strong>en</strong>adas <strong>3D</strong> a los<br />

// vectores "vectorCoord<strong>en</strong>adas<strong>3D</strong>", para po<strong>de</strong>r manejarlos <strong>en</strong><br />

// espacio <strong>3D</strong><br />

// -----------------------------------------------------------<br />

for (i=0; i


elem<strong>en</strong>tos visbles que se pres<strong>en</strong>tan <strong>en</strong> <strong>3D</strong><br />

//<br />

// -----------------------------------------------------------<br />

public function inicializarCuboVirtual():void {<br />

// --- Construye cubo virtual como cont<strong>en</strong>edor para animacion <strong>3D</strong> ---<br />

cuboCont<strong>en</strong>edorVirtual = new Sprite();<br />

cuboCont<strong>en</strong>edorVirtual.name = cuboCont<strong>en</strong>edorVirtual;<br />

container.addChild(cuboCont<strong>en</strong>edorVirtual);<br />

}<br />

cuboCont<strong>en</strong>edorVirtual.x=0;<br />

cuboCont<strong>en</strong>edorVirtual.y=0;<br />

cuboCont<strong>en</strong>edorVirtual.z=0;<br />

// --- F<strong>la</strong>g ---<br />

estaRotandoCubo = false;<br />

public function construirCuboVirtual() {<br />

}<br />

// -----------------------------------------------------------<br />

// Todos los elem<strong>en</strong>tos visuales (compon<strong>en</strong>tes y nodos visuales)<br />

// se tras<strong>la</strong>dan <strong>de</strong>l editor (spEditor) al "cuboCont<strong>en</strong>edorVirtual"<br />

// para repres<strong>en</strong>tarse <strong>en</strong> <strong>3D</strong><br />

// -----------------------------------------------------------<br />

var i:int;<br />

for (i=0; i


-----------------------------------------------------------<br />

public function c<strong>la</strong>sificarElem<strong>en</strong>tos<strong>3D</strong>Z():void {<br />

// -----------------------------------------------------------<br />

// Funcion <strong>de</strong> c<strong>la</strong>sificacion y ord<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> <strong>la</strong> distancia,<br />

// <strong>en</strong> <strong>3D</strong>, <strong>de</strong> los elem<strong>en</strong>tos visuales al observador<br />

// -----------------------------------------------------------<br />

var arregloDistanciasElem<strong>en</strong>tos:Array=new Array();<br />

var i:int;<br />

var matriz<strong>3D</strong>Actual:Matrix<strong>3D</strong>;<br />

var puntosMediosElem<strong>en</strong>tos:Vector<strong>3D</strong>;<br />

matriz<strong>3D</strong>Actual = cuboCont<strong>en</strong>edorVirtual.transform.matrix<strong>3D</strong>.clone();<br />

// -----------------------------------------------------------<br />

// Preparacion <strong>de</strong> los elem<strong>en</strong>tos visuales cont<strong>en</strong>idos <strong>en</strong> el<br />

// vector "puntosMediosElem<strong>en</strong>tos" <strong>en</strong> el arreglo<br />

// "arregloDistanciasElem<strong>en</strong>tos" para su c<strong>la</strong>sificacion<br />

// -----------------------------------------------------------<br />

for(i=0; i0){<br />

cuboCont<strong>en</strong>edorVirtual.removeChildAt(0);<br />

}<br />

// -----------------------------------------------------------<br />

// Ll<strong>en</strong>ar el "cuboCont<strong>en</strong>edorVirtual" con los elem<strong>en</strong>tos ya<br />

// c<strong>la</strong>sificados por su distancia al observador, <strong>de</strong> acuerod a<br />

// <strong>la</strong> posicion actual <strong>de</strong>l "cuboCont<strong>en</strong>edorVirtual" <strong>de</strong>spues <strong>de</strong><br />

// haberlo rotado<br />

// -----------------------------------------------------------<br />

for(i=0; i


}<br />

ySli<strong>de</strong>r.removeEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rY);<br />

zSli<strong>de</strong>r.removeEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rZ);<br />

removeChild(xSli<strong>de</strong>r);<br />

removeChild(ySli<strong>de</strong>r);<br />

removeChild(zSli<strong>de</strong>r);<br />

// -----------------------------------------------------------<br />

//<br />

// Conexion <strong>en</strong>tre "graficaBarras" --> "motor<strong>3D</strong>"<br />

// (activacion <strong>de</strong> <strong>la</strong> animacion <strong>de</strong> los "nodosVisuales" <strong>de</strong>s<strong>de</strong><br />

// <strong>la</strong> "graficaBarras")<br />

// -----------------------------------------------------------<br />

public function seleccionarNodo(id:String):void {<br />

for (i in nodosVisuales) {<br />

if (id == nodosVisuales[i].name) {<br />

nodosVisuales[i].iniciarAnimacion();<br />

}<br />

}<br />

}<br />

public function quitarSeleccion(id:String):void {<br />

for (i in nodosVisuales) {<br />

if (id == nodosVisuales[i].name) {<br />

nodosVisuales[i].<strong>de</strong>t<strong>en</strong>erAnimacion();<br />

}<br />

}<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> G<strong>en</strong>eracion <strong>de</strong> S<strong>en</strong>ial S<strong>en</strong>oidal<br />

//<br />

// -----------------------------------------------------------<br />

public function g<strong>en</strong>eraSeñalS<strong>en</strong>oidal():void {<br />

addEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, onEnterFrame);<br />

}<br />

public function onEnterFrame(ev<strong>en</strong>t:Ev<strong>en</strong>t):void {<br />

}<br />

// --- G<strong>en</strong>eracion <strong>de</strong> tiempo ---<br />

t++;<br />

if (t >= 62) {<br />

t=0;<br />

}<br />

// -----------------------------------------------------------<br />

// Asignacion dinamica <strong>de</strong> pot<strong>en</strong>ciales a los elem<strong>en</strong>tos<br />

// cont<strong>en</strong>idos <strong>en</strong> el cubo virtual a traves <strong>de</strong> <strong>la</strong> funcion<br />

// "asignaPot<strong>en</strong>cial(t)"<br />

// -----------------------------------------------------------<br />

for (i=0; i


xSli<strong>de</strong>r.setSize(180,10);<br />

xSli<strong>de</strong>r.maximum = 180;<br />

xSli<strong>de</strong>r.minimum = -180;<br />

xSli<strong>de</strong>r.x = 780;<br />

xSli<strong>de</strong>r.y = 300;<br />

addChild(xSli<strong>de</strong>r);<br />

// --- Creacion y colocacion <strong>de</strong> <strong>la</strong> etiqueta para "xSli<strong>de</strong>r" ---<br />

var xLabel:mc_<strong>la</strong>bel_Sli<strong>de</strong>rX = new mc_<strong>la</strong>bel_Sli<strong>de</strong>rX();<br />

xLabel.x = xSli<strong>de</strong>r.x + 78;<br />

xLabel.y = xSli<strong>de</strong>r.y + 9;<br />

addChild(xLabel);<br />

// --- Creacion y colocacion <strong>de</strong> "ySli<strong>de</strong>r" ---<br />

ySli<strong>de</strong>r = new Sli<strong>de</strong>r();<br />

ySli<strong>de</strong>r.setSize(180,10);<br />

ySli<strong>de</strong>r.maximum = 180;<br />

ySli<strong>de</strong>r.minimum = -180;<br />

ySli<strong>de</strong>r.x = 780;<br />

ySli<strong>de</strong>r.y = 340;<br />

addChild(ySli<strong>de</strong>r);<br />

// --- Creacion y colocacion <strong>de</strong> <strong>la</strong> etiqueta para "ySli<strong>de</strong>r" ---<br />

var yLabel:mc_<strong>la</strong>bel_Sli<strong>de</strong>rY = new mc_<strong>la</strong>bel_Sli<strong>de</strong>rY();<br />

yLabel.x = ySli<strong>de</strong>r.x + 78;<br />

yLabel.y = ySli<strong>de</strong>r.y + 9;<br />

addChild(yLabel);<br />

// --- Creacion y colocacion <strong>de</strong> "zSli<strong>de</strong>r" ---<br />

zSli<strong>de</strong>r = new Sli<strong>de</strong>r();<br />

zSli<strong>de</strong>r.setSize(180,10);<br />

zSli<strong>de</strong>r.maximum = 180;<br />

zSli<strong>de</strong>r.minimum = -180;<br />

zSli<strong>de</strong>r.x = 780;<br />

zSli<strong>de</strong>r.y = 380;<br />

addChild(zSli<strong>de</strong>r);<br />

// --- Creacion y colocacion <strong>de</strong> <strong>la</strong> etiqueta para "zSli<strong>de</strong>r" ---<br />

var zLabel:mc_<strong>la</strong>bel_Sli<strong>de</strong>rZ = new mc_<strong>la</strong>bel_Sli<strong>de</strong>rZ();<br />

zLabel.x = zSli<strong>de</strong>r.x + 78;<br />

zLabel.y = zSli<strong>de</strong>r.y + 9;<br />

addChild(zLabel);<br />

}<br />

// --- Inicializacion <strong>de</strong> variables <strong>de</strong> Sli<strong>de</strong>rs ---<br />

prevXVal = 0;<br />

prevYVal = 0;<br />

prevZVal = 0;<br />

internal function inicializarList<strong>en</strong>ersSli<strong>de</strong>rs():void {<br />

xSli<strong>de</strong>r.addEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rX);<br />

ySli<strong>de</strong>r.addEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rY);<br />

zSli<strong>de</strong>r.addEv<strong>en</strong>tList<strong>en</strong>er(Sli<strong>de</strong>rEv<strong>en</strong>t.THUMB_DRAG,cambioSli<strong>de</strong>rZ);<br />

}<br />

function cambioSli<strong>de</strong>rX(e:Sli<strong>de</strong>rEv<strong>en</strong>t):void {<br />

var curXVal:Number=e.target.value;<br />

rotarCuboVirtual(curXVal-prevXVal,0,0);<br />

prevXVal=curXVal;<br />

}<br />

function cambioSli<strong>de</strong>rY(e:Sli<strong>de</strong>rEv<strong>en</strong>t):void {<br />

var curYVal:Number=e.target.value;<br />

rotarCuboVirtual(0,curYVal-prevYVal,0);<br />

prevYVal=curYVal;<br />

}<br />

}<br />

function cambioSli<strong>de</strong>rZ(e:Sli<strong>de</strong>rEv<strong>en</strong>t):void {<br />

var curZVal:Number=e.target.value;<br />

rotarCuboVirtual(0,0,curZVal-prevZVal);<br />

prevZVal=curZVal;<br />

}<br />

29


}<br />

package Vistas.ac.respuestaFrecu<strong>en</strong>cia<br />

30


{<br />

/ 2010<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Graficador_Respuesta_Frecu<strong>en</strong>cia<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// "COMPOSICION" (motor<strong>3D</strong>_ac graficaBarras)<br />

// |<br />

// V<br />

// Graficador_Respuesta_Frecu<strong>en</strong>cia)<br />

//<br />

// abril<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - LF --> Array: Valores <strong>de</strong> Frecu<strong>en</strong>cia <strong>en</strong> variacion logaritmica<br />

// (<strong>de</strong> "fmin" a "fmax")<br />

// * LD[i][0][indiceFrecu<strong>en</strong>cia] = dato.xv[i]: String (id<strong>en</strong>tificador)<br />

// * LD[i][1][indiceFrecu<strong>en</strong>cia] = formaRectagu<strong>la</strong>r: Point(x, jy}<br />

// * LD[i][2][indiceFrecu<strong>en</strong>cia] = Fasor: Point(MAGNITUD, FASE} (Po<strong>la</strong>r)<br />

// * LD[i][3][indiceFrecu<strong>en</strong>cia] = Magnitud_dB: Number<br />

// * LD[i][4][indiceFrecu<strong>en</strong>cia] = Fase_Grados: Number<br />

//<br />

// CONEXIONES INTERACTIVAS:<br />

// - Con "graficaBarras" a traves <strong>de</strong> "vistasDC"<br />

//<br />

// SALIDA: Graficas <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia <strong>de</strong> cada variable<br />

// calcu<strong>la</strong>da por el simu<strong>la</strong>dor a cada frecu<strong>en</strong>cia <strong>de</strong>l barrido<br />

// <strong>de</strong> frecu<strong>en</strong>cias cont<strong>en</strong>ido <strong>en</strong> el archivo LF<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Matematicas<br />

import f<strong>la</strong>sh.geom.Point;<br />

// G<strong>en</strong>erador_Lista_Datos<br />

import Mo<strong>de</strong>lo.G<strong>en</strong>erador_Lista_Datos;<br />

// Operaciones con numeros complejos<br />

import com.red.simu<strong>la</strong>dor.ac.Operaciones_Numeros_Complejos;<br />

public c<strong>la</strong>ss Graficador_Respuesta_Frecu<strong>en</strong>cia ext<strong>en</strong>ds Sprite{<br />

// --- Refer<strong>en</strong>cia al objeto "LD" ---<br />

private var LD:G<strong>en</strong>erador_Lista_Datos<br />

// --- Datos cont<strong>en</strong>idos <strong>en</strong> el objeto "LD" ---<br />

public var numero_Decadas_Frecu<strong>en</strong>cia:Number;<br />

public var numero_Muestras:Number;<br />

private var voltajesMagnituddB:Array;<br />

private var voltajesFaseGrados:Array;<br />

public var funcion_a_Graficar:Array;<br />

// --- Graficas <strong>de</strong> Magnitud y Fase ---<br />

public var graficas_Frecu<strong>en</strong>cia:Array;<br />

public var g_Magnitud:Sprite;<br />

public var g_Fase:Sprite;<br />

private var posXMag:Number = 60;<br />

private var posYMag:Number = 500;<br />

private var posXFase:Number = 550;<br />

private var posYFase:Number = 500;<br />

private var f<strong>la</strong>gInicio:Boolean = true;<br />

31


--- Arreglos <strong>de</strong> valores maximos y minimos<br />

// <strong>de</strong> los valores a graficar<br />

private var max_min_MagnituddB:Array;<br />

private var max_min_FaseGrados:Array;<br />

// --- Variables para formato <strong>de</strong> <strong>la</strong>s graficas ---<br />

public var posicion_Etiqueta_Frecu<strong>en</strong>cia:Array;<br />

public var altura_Graficas_MagFase:Number = 100;<br />

public var ancho_Graficas_MagFase:Number;<br />

// --- Indices ---<br />

private var i:int;<br />

private var j:int;<br />

private var k:int;<br />

// --- "Sprite" <strong>de</strong> refer<strong>en</strong>cia para graficar ---<br />

public var cont<strong>en</strong>edor:Sprite;<br />

// --- Colores ---<br />

public var color_Background:Number;<br />

public var color_Fondo_Graficas:Number;<br />

public var color_Lineas_Acotaciones:Number;<br />

public var color_Letras_Acotaciones:Number;<br />

public var color_Grafica:Number;<br />

// --- Frecu<strong>en</strong>cias maxima y minima para barrido <strong>de</strong> frecu<strong>en</strong>cia ---<br />

// Valor maximo <strong>de</strong> frecu<strong>en</strong>cia<br />

public var f_max:Number;<br />

// Valor minimo <strong>de</strong> frecu<strong>en</strong>cia<br />

public var f_min:Number;<br />

public var numero_<strong>de</strong>cadas:Number;<br />

// "alfa" <strong>de</strong> rejil<strong>la</strong> <strong>de</strong> graficas<br />

private var alfa:Number = 0.3;<br />

// --- Parametros para graficacion <strong>de</strong> <strong>la</strong> Magnitud <strong>en</strong> dB ---<br />

// Array auxiliar <strong>de</strong> datos <strong>de</strong> graficas por nodo<br />

public var datos_Graficacion:Array;<br />

// <strong>de</strong>lta <strong>de</strong> separacion <strong>en</strong> acotami<strong>en</strong>to magnitud<br />

public var <strong>de</strong>lta_dB:Number = 20;<br />

// Maximo valor <strong>en</strong> dB <strong>de</strong> acotami<strong>en</strong>to <strong>de</strong> <strong>la</strong> Magnitud<br />

public var MAX_ACOTAMIENTO_dB:Number = 200;<br />

// Minimo valor <strong>en</strong> dB <strong>de</strong> acotami<strong>en</strong>to <strong>de</strong> <strong>la</strong> Magnitud<br />

public var MIN_ACOTAMIENTO_dB:Number = -200;<br />

// --- Parametros para graficacion <strong>de</strong> <strong>la</strong> Fase <strong>en</strong> Grados ---<br />

public var grafica_Phase:Array = new Array();<br />

// <strong>de</strong>lta <strong>de</strong> separacion <strong>en</strong> acotami<strong>en</strong>to Fase<br />

public var <strong>de</strong>lta_Grados:Number = 90;<br />

// Maximo valor <strong>en</strong> grados <strong>de</strong> acotami<strong>en</strong>to <strong>de</strong> <strong>la</strong> Fase<br />

public var MAX_ACOTAMIENTO_FASE:Number = 180;<br />

// Minimo valor <strong>en</strong> grados <strong>de</strong> acotami<strong>en</strong>to <strong>de</strong> <strong>la</strong> Fase<br />

public var MIN_ACOTAMIENTO_FASE:Number = -180;<br />

// --- Constante <strong>de</strong> conversion <strong>de</strong> logaritmo Natural a logaritmo Decimal ---<br />

private var LN_LOG:Number = 0.434294;<br />

// --- Operaciones con numeros complejos ---<br />

private var operacion_compleja:Operaciones_Numeros_Complejos;<br />

public function Graficador_Respuesta_Frecu<strong>en</strong>cia(_LD:G<strong>en</strong>erador_Lista_Datos):void {<br />

// --- Refer<strong>en</strong>cia al objeto "LD" (Lista <strong>de</strong> Datos) -------<br />

LD = _LD;<br />

// --- Inicializacion <strong>de</strong> parametros ---<br />

numero_Decadas_Frecu<strong>en</strong>cia = LD.numero_Decadas_Frecu<strong>en</strong>cia;<br />

numero_Muestras = LD.numero_Muestras;<br />

ancho_Graficas_MagFase = numero_Muestras;<br />

f_max = LD.f_max;<br />

32


f_min = LD.f_min;<br />

// --- Propieda<strong>de</strong>s <strong>de</strong> color por <strong>de</strong>fault ---<br />

color_Background = 0x000000;<br />

color_Fondo_Graficas = 0x000000;<br />

color_Lineas_Acotaciones = 0xffffff; // B<strong>la</strong>nco<br />

color_Letras_Acotaciones = 0xffffff; // B<strong>la</strong>nco<br />

color_Grafica = 0xff9900;<br />

// Negro<br />

// Negro<br />

// Naranja<br />

}<br />

// --- Arreglo <strong>de</strong> graficas <strong>de</strong> Magnitud y Fase para cada Nodo ---<br />

graficas_Frecu<strong>en</strong>cia = new Array();<br />

public function graficarMagnituFase() {<br />

// --- Graficacion ---<br />

inicializa_Graficas_MagFase();<br />

graficar_Magnitud_Fase();<br />

// --- Grafica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia <strong>de</strong>l nodo <strong>de</strong> tierra ---<br />

mostrarNodoSeleccionado("n0");<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> preparacion <strong>de</strong> graficas <strong>de</strong> <strong>la</strong> Respuesta <strong>en</strong><br />

// Frecu<strong>en</strong>cia (magnitud o fase)<br />

//<br />

// -----------------------------------------------------------<br />

private function inicializa_Graficas_MagFase():void {<br />

"Frecu<strong>en</strong>cia (Hz)"));<br />

var g_Titulos:Sprite<br />

// -----------------------------------------------------------<br />

// Grafica <strong>de</strong> Magnitud<br />

// -----------------------------------------------------------<br />

g_Magnitud = new Sprite();<br />

g_Magnitud.x = posXMag;<br />

g_Magnitud.y = posYMag;<br />

addChild(g_Magnitud);<br />

// --- Capa 1: Fondo<br />

g_Magnitud.addChild(dibuja_Fondo_Grafica());<br />

// --- Capa 2: Acotami<strong>en</strong>to <strong>de</strong> Frecu<strong>en</strong>cia<br />

g_Magnitud.addChild(dibuja_Acotami<strong>en</strong>to_Frecu<strong>en</strong>cia());<br />

// --- Capa 3: Textos> Titulo, TituloY, TituloX y TituloNodo<br />

g_Magnitud.addChild(dibuja_Titulos_Grafica("Magnitud","dB",<br />

"Frecu<strong>en</strong>cia (Hz)"));<br />

// -----------------------------------------------------------<br />

// Grafica <strong>de</strong> Fase<br />

// -----------------------------------------------------------<br />

g_Fase = new Sprite();<br />

g_Fase.x = posXFase;<br />

g_Fase.y = posYFase;<br />

addChild(g_Fase);<br />

// --- Capa 1: Fondo<br />

g_Fase.addChild(dibuja_Fondo_Grafica());<br />

// --- Capa 2: Acotami<strong>en</strong>to <strong>de</strong> Frecu<strong>en</strong>cia<br />

g_Fase.addChild(dibuja_Acotami<strong>en</strong>to_Frecu<strong>en</strong>cia());<br />

// --- Capa 3: Textos> Titulo, TituloY, TituloX y TituloNodo<br />

g_Fase.addChild(dibuja_Titulos_Grafica("Fase","Grados",<br />

33


}<br />

private function graficar_Magnitud_Fase():void {<br />

var nodo:int;<br />

var magnitud:int = 3;<br />

var fase:int = 4;<br />

var obj:Object;<br />

// -----------------------------------------------------------<br />

// Prepara todas <strong>la</strong>s graficas <strong>de</strong> cada nodo <strong>de</strong>l circuito <strong>en</strong> su<br />

// "sprite" correspondi<strong>en</strong>te y se guardan <strong>en</strong> el arreglo<br />

// "graficas_Frecu<strong>en</strong>cia" para su posterior acceso a traves<br />

// <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "Cursor_Respuesta_Frecu<strong>en</strong>cia"<br />

// -----------------------------------------------------------<br />

// --- Funciones a graficar: "magnitudDB" o "faseGrados"<br />

funcion_a_Graficar = new Array();<br />

}<br />

// --- Inicializa nodos 0 al "n" ---<br />

for (nodo=0; nodo


var arg:Array = new Array();<br />

arg.push(MIN_ACOTAMIENTO_FASE);<br />

arg.push(MAX_ACOTAMIENTO_FASE);<br />

arg.push(<strong>de</strong>lta_Grados);<br />

arg.push(max_min_FaseGrados);<br />

arg.push(nodo);<br />

arg.push(tipo);<br />

// Guarda <strong>la</strong> grafica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia<br />

// "fase <strong>en</strong> Grados" correspondi<strong>en</strong>te al nodo<br />

var fase_Grados:Sprite = new Sprite();<br />

fase_Grados.addChild(draw_Funcion(arg));<br />

}<br />

return fase_Grados;<br />

private function dibuja_Fondo_Grafica():Sprite {<br />

var sp:Sprite = new Sprite();<br />

sp.graphics.lineStyle(1,0xffffff,.8);<br />

sp.graphics.beginFill(color_Fondo_Graficas);<br />

sp.graphics.drawRect(0,0,numero_Muestras,altura_Graficas_MagFase);<br />

sp.graphics.<strong>en</strong>dFill();<br />

return sp;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> titulos y acotami<strong>en</strong>tos <strong>de</strong> <strong>la</strong>s graficas <strong>de</strong><br />

// Respuesta <strong>en</strong> Frecu<strong>en</strong>cia (magnitud o fase)<br />

//<br />

// -----------------------------------------------------------<br />

private function dibuja_Acotami<strong>en</strong>to_Frecu<strong>en</strong>cia():Sprite {<br />

var sp:Sprite = new Sprite();<br />

var frecu<strong>en</strong>cia:Number;<br />

var valor_Etiqueta_Frecu<strong>en</strong>cia:Array = new Array();<br />

// --- Calcu<strong>la</strong> posiciones <strong>de</strong> etiquetas ---<br />

posicion_Etiqueta_Frecu<strong>en</strong>cia = new Array();<br />

posicion_Etiqueta_Frecu<strong>en</strong>cia.push(0);<br />

// --- Grafica lineas verticales ---<br />

sp.graphics.lineStyle(1,color_Lineas_Acotaciones,alfa);<br />

for (k=0; k


--- Colocar etiqueta <strong>de</strong> frecu<strong>en</strong>cia ---<br />

g<strong>en</strong>erar_Etiquetas_Frecu<strong>en</strong>cia(sp,posicion_Etiqueta_Frecu<strong>en</strong>cia,<br />

valor_Etiqueta_Frecu<strong>en</strong>cia,<br />

altura_Graficas_MagFase);<br />

}<br />

return sp;<br />

posicion:Array,<br />

valor:Array,<br />

posicion_etiqueta_y:Number):void {<br />

private function g<strong>en</strong>erar_Etiquetas_Frecu<strong>en</strong>cia(sp:Sprite,<br />

// --- Define nuevo "sprite" para escritura <strong>de</strong> etiquetas ---<br />

var sp_Etiqueta_Frecu<strong>en</strong>cia:Sprite = new Sprite();<br />

// --- Posicionami<strong>en</strong>to <strong>de</strong>l Sprite "sp" <strong>de</strong>bajo <strong>de</strong> <strong>la</strong> grafica ---<br />

sp_Etiqueta_Frecu<strong>en</strong>cia.x = -10;<br />

sp_Etiqueta_Frecu<strong>en</strong>cia.y = posicion_etiqueta_y;<br />

sp.addChild(sp_Etiqueta_Frecu<strong>en</strong>cia);<br />

var campo_Texto:TextField;<br />

var formato_Texto:TextFormat = new TextFormat();<br />

// --- Valor numerico <strong>de</strong> <strong>la</strong> etiqueta ---<br />

var valor_Etiqueta_Frecu<strong>en</strong>cia:Number;<br />

// --- Seleccion y colocacion <strong>de</strong> etiquetas ---<br />

for (i=0; i3 && i


}<br />

}<br />

asigna_Formato_Texto(campo_Texto,formato_Texto,"CENTER");<br />

private function dibuja_Titulos_Grafica(Titulo:String,TituloY:String,<br />

TituloX:String,<br />

TituloNodo:String=" "):Sprite {<br />

var sp:Sprite = new Sprite();<br />

// --- Define nuevos "sprite" para escritura <strong>de</strong> Titulos ---<br />

var sp_Titulo:Sprite = new Sprite();<br />

var sp_TituloY:Sprite = new Sprite();<br />

var sp_TituloX:Sprite = new Sprite();<br />

var sp_TituloNodo:Sprite = new Sprite();<br />

// --- Posicionami<strong>en</strong>to <strong>de</strong> cada Sprite "sp" <strong>en</strong> <strong>la</strong> grafica ---<br />

// <strong>la</strong>bel: "Titulo Principal"<br />

sp_Titulo.x = numero_Muestras/2;<br />

sp_Titulo.y = -20;<br />

// <strong>la</strong>bel: "TituloY"<br />

sp_TituloY.x = -45;<br />

sp_TituloY.y = -20;<br />

// <strong>la</strong>bel: "TituloX"<br />

sp_TituloX.x = numero_Muestras/2;<br />

sp_TituloX.y = altura_Graficas_MagFase + 15;<br />

// <strong>la</strong>bel: "TituloNodo"<br />

sp_TituloNodo.x = 300 //numero_Muestras/3;<br />

sp_TituloNodo.y = -20; //altura_Graficas_MagFase + 40;<br />

sp.addChild(sp_Titulo);<br />

sp.addChild(sp_TituloY);<br />

sp.addChild(sp_TituloX);<br />

sp.addChild(sp_TituloNodo);<br />

var campo_Texto:TextField;<br />

var formato_Texto:TextFormat = new TextFormat();<br />

// --- Titulo <strong>de</strong> <strong>la</strong> Grafica ---<br />

campo_Texto = new TextField();<br />

sp_Titulo.addChild(campo_Texto);<br />

campo_Texto.text = Titulo;<br />

asigna_Formato_Texto(campo_Texto,formato_Texto,"CENTER");<br />

// --- Titulo <strong>de</strong> <strong>la</strong>s acotaciones <strong>en</strong> el eje Y ---<br />

campo_Texto = new TextField();<br />

sp_TituloY.addChild(campo_Texto);<br />

campo_Texto.text = TituloY;<br />

asigna_Formato_Texto(campo_Texto,formato_Texto,"CENTER");<br />

// --- Titulo <strong>de</strong> <strong>la</strong>s acotaciones <strong>en</strong> el eje X ---<br />

campo_Texto = new TextField();<br />

sp_TituloX.addChild(campo_Texto);<br />

campo_Texto.text = TituloX;<br />

asigna_Formato_Texto(campo_Texto,formato_Texto,"CENTER");<br />

// --- Titulo <strong>de</strong>l Nodo cuya grafica se esta pres<strong>en</strong>tando---<br />

campo_Texto = new TextField();<br />

sp_TituloNodo.addChild(campo_Texto);<br />

campo_Texto.text = TituloNodo;<br />

asigna_Formato_Texto(campo_Texto,formato_Texto,"CENTER");<br />

sp.name = "titulo";<br />

}<br />

return sp;<br />

private function asigna_Formato_Texto(campo_Texto:TextField,<br />

37


formato_Texto:TextFormat,<br />

alineacion:String):void {<br />

}<br />

formato_Texto.font = "_sans";<br />

formato_Texto.size = 10<br />

campo_Texto.width = 25;<br />

campo_Texto.textColor = 0xffffff;<br />

switch (alineacion) {<br />

case "CENTER":<br />

campo_Texto.autoSize = TextFieldAutoSize.CENTER;<br />

break;<br />

case "LEFT":<br />

campo_Texto.autoSize = TextFieldAutoSize.LEFT;<br />

break;<br />

case "RIGHT":<br />

campo_Texto.autoSize = TextFieldAutoSize.RIGHT;<br />

break;<br />

}<br />

campo_Texto.setTextFormat(formato_Texto);<br />

valor_Etiqueta:Array):void {<br />

private function g<strong>en</strong>erar_Etiquetas_Y(sp:Sprite,posicion_Etiqueta:Array,<br />

// --- Define nuevo "sprite" para escritura <strong>de</strong> etiquetas ---<br />

var sp_Etiqueta:Sprite = new Sprite();<br />

sp_Etiqueta.x = -25;<br />

sp_Etiqueta.y = -8;<br />

sp.addChild(sp_Etiqueta);<br />

var campo_Texto:TextField;<br />

var formato_Texto:TextFormat = new TextFormat();<br />

}<br />

// --- Imprime etiquetas ---<br />

for (i=0; i


sp.addChild(acotami<strong>en</strong>to);<br />

// --- Auxiliares ---<br />

var <strong>de</strong>lta_Acotami<strong>en</strong>to:Number;<br />

var separacion_Lineas:Number;<br />

// --- Valores maximo y minimo para acotar <strong>en</strong> el eje Y ---<br />

var valor_max_Acotami<strong>en</strong>to:Number;<br />

var valor_min_Acotami<strong>en</strong>to:Number;<br />

// --- Calcu<strong>la</strong> posiciones <strong>de</strong> etiquetas ---<br />

var posicion_Etiqueta:Array = new Array();<br />

var valor_Etiqueta:Array = new Array();<br />

// --- Selecciona acotami<strong>en</strong>to proximo superior al valor maximo ---<br />

if (max_min[0] == -Infinity) {<br />

max_min[0] = max_Acotami<strong>en</strong>to;<br />

max_min[1] = min_Acotami<strong>en</strong>to;<br />

}<br />

for (i=min_Acotami<strong>en</strong>to; i=0) {<br />

valor_max_Acotami<strong>en</strong>to = i;<br />

break;<br />

}<br />

}<br />

// --- Selecciona acotami<strong>en</strong>to proximo inferior al valor minimo ---<br />

for (i=max_Acotami<strong>en</strong>to; i>=min_Acotami<strong>en</strong>to; i-=<strong>de</strong>lt) {<br />

if((i-max_min[1])


}<br />

return sp;<br />

private function calcu<strong>la</strong>_Maximo_Minimo(datos:Array):Array {<br />

// --- Auxiliares ---<br />

var aux:Array = new Array();<br />

var maximo:Number;<br />

var minimo:Number;<br />

aux = datos.concat();<br />

aux.sort(Array.DESCENDING | Array.NUMERIC);<br />

maximo = Math.round(aux[0]*100)/100;<br />

minimo = Math.round(aux[aux.l<strong>en</strong>gth-1]*100)/100;<br />

}<br />

return new Array(maximo,minimo);<br />

valor_min_Acotami<strong>en</strong>to:Number,<br />

private function graficar_Funcion(datos:Array,<br />

valor_max_Acotami<strong>en</strong>to:Number):Sprite {<br />

var sp:Sprite = new Sprite();<br />

var fx:Number; // Funcion a graficar<br />

var p<strong>en</strong>di<strong>en</strong>te:Number;<br />

var ord<strong>en</strong>ada:Number;<br />

var top_margin:Number = 10;<br />

datos_Graficacion = new Array();<br />

// -----------------------------------------------------------<br />

// Funcion(frecu<strong>en</strong>cia) = p<strong>en</strong>di<strong>en</strong>te*frecu<strong>en</strong>cia + ord<strong>en</strong>ada<br />

// normaliza mediante los valores maximo y minimo <strong>de</strong><br />

// acotami<strong>en</strong>to <strong>de</strong> <strong>la</strong> magnitud<br />

// -----------------------------------------------------------<br />

p<strong>en</strong>di<strong>en</strong>te = altura_Graficas_MagFase/(valor_max_Acotami<strong>en</strong>to -<br />

valor_min_Acotami<strong>en</strong>to);<br />

altura_Graficas_MagFase;<br />

}<br />

ord<strong>en</strong>ada = -p<strong>en</strong>di<strong>en</strong>te*valor_max_Acotami<strong>en</strong>to +<br />

// -----------------------------------------------------------<br />

// Grafica <strong>de</strong> <strong>la</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia <strong>de</strong> <strong>la</strong> variable<br />

// -----------------------------------------------------------<br />

sp.graphics.lineStyle(1,color_Grafica);<br />

fx = p<strong>en</strong>di<strong>en</strong>te*datos[0] + ord<strong>en</strong>ada;<br />

sp.graphics.moveTo(0,altura_Graficas_MagFase-fx);<br />

for (i=1; i "G<strong>en</strong>erador_Respuesta_Frecu<strong>en</strong>cia"<br />

// (activacion <strong>de</strong>l "texto" que id<strong>en</strong>tifica a <strong>la</strong> grafica <strong>de</strong> Respuesta<br />

// <strong>en</strong> Frecu<strong>en</strong>cia correspondi<strong>en</strong>te al nodo seleccionado <strong>en</strong> <strong>la</strong><br />

// "graficaBarras")<br />

//<br />

// -----------------------------------------------------------<br />

public function mostrarNodoSeleccionado(id:String):void {<br />

if (!f<strong>la</strong>gInicio) {<br />

40


}<br />

removeChild(getChildByName("nodoSeleccionadoMagnitud"));<br />

removeChild(getChildByName("nodoSeleccionadoFase"));<br />

// -----------------------------------------------------------<br />

// Para cada nodo seleccionado <strong>en</strong> <strong>la</strong> "graficaBarras", se<br />

// muestra el "texto" <strong>en</strong>cerraddo <strong>en</strong> un cuadro b<strong>la</strong>nco con fondo<br />

// azul, correspondi<strong>en</strong>te a <strong>la</strong>s graficas <strong>de</strong> <strong>la</strong> magntiud y fase<br />

// <strong>de</strong> <strong>la</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia <strong>de</strong> dicho nodo<br />

// -----------------------------------------------------------<br />

// --- Nodo Seleccionado Magnitud ---<br />

var nodoSeleccionadoMagnitud:TextField =new TextField();<br />

nodoSeleccionadoMagnitud.text = "V"+id.substr(1,2);<br />

nodoSeleccionadoMagnitud.x = g_Magnitud.x + 15;<br />

nodoSeleccionadoMagnitud.y = g_Magnitud.y -20;<br />

nodoSeleccionadoMagnitud.autoSize = TextFieldAutoSize.CENTER;<br />

nodoSeleccionadoMagnitud.bor<strong>de</strong>r = true;<br />

nodoSeleccionadoMagnitud.bor<strong>de</strong>rColor = 0xffffff;<br />

nodoSeleccionadoMagnitud.background = true;<br />

nodoSeleccionadoMagnitud.backgroundColor = 0x0099cc;<br />

nodoSeleccionadoMagnitud.width = 20;<br />

nodoSeleccionadoMagnitud.height = 15;<br />

nodoSeleccionadoMagnitud.name = "nodoSeleccionadoMagnitud";<br />

// --- Formato <strong>de</strong> Texto Magnitud ---<br />

var formatMagnitud:TextFormat = new TextFormat();<br />

formatMagnitud.font = "_sans";<br />

formatMagnitud.size = 10;<br />

formatMagnitud.color = 0xffffff;<br />

nodoSeleccionadoMagnitud.setTextFormat(formatMagnitud);<br />

addChild(nodoSeleccionadoMagnitud);<br />

// --- Nodo Seleccionado Fase ---<br />

var nodoSeleccionadoFase:TextField =new TextField();<br />

nodoSeleccionadoFase.text = "V"+id.substr(1,2);<br />

nodoSeleccionadoFase.x = g_Fase.x + 15;<br />

nodoSeleccionadoFase.y = g_Fase.y - 20;<br />

nodoSeleccionadoFase.autoSize = TextFieldAutoSize.CENTER;<br />

nodoSeleccionadoFase.bor<strong>de</strong>r = true;<br />

nodoSeleccionadoFase.bor<strong>de</strong>rColor = 0xffffff;<br />

nodoSeleccionadoFase.background = true;<br />

nodoSeleccionadoFase.backgroundColor = 0x0099cc;<br />

nodoSeleccionadoFase.width = 20;<br />

nodoSeleccionadoFase.height = 15;<br />

nodoSeleccionadoFase.name = "nodoSeleccionadoFase";<br />

// --- Formato <strong>de</strong> Texto Fase ---<br />

var formatFase:TextFormat = new TextFormat();<br />

formatFase.font = "_sans";<br />

formatFase.size = 10;<br />

formatFase.color = 0xffffff;<br />

nodoSeleccionadoFase.setTextFormat(formatFase);<br />

addChild(nodoSeleccionadoFase);<br />

}<br />

f<strong>la</strong>gInicio = false;<br />

}<br />

}<br />

41


package Vistas.ac.respuestaFrecu<strong>en</strong>cia<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: Cursor_Respuesta_Frecu<strong>en</strong>cia<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "Graficador_Respuesta_Frecu<strong>en</strong>cia"<br />

//<br />

//<br />

abril / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - Refer<strong>en</strong>cia a <strong>la</strong> grafica <strong>de</strong> <strong>la</strong> c<strong>la</strong>se<br />

// "Graficador_Respuesta_Frecu<strong>en</strong>cia"<br />

//<br />

// - LF --> Array: Valores <strong>de</strong> Frecu<strong>en</strong>cia <strong>en</strong> variacion logaritmica<br />

// (<strong>de</strong> "fmin" a "fmax")<br />

// * LD[i][3][indiceFrecu<strong>en</strong>cia] = Magnitud_dB: Number<br />

// * LD[i][4][indiceFrecu<strong>en</strong>cia] = Fase_Grados: Number<br />

//<br />

// CONEXIONES INTERACTIVAS:<br />

// - Con <strong>la</strong> c<strong>la</strong>se "Graficador_Respuesta_Frecu<strong>en</strong>cia"<br />

//<br />

// SALIDA:<br />

// - Refer<strong>en</strong>cia a <strong>la</strong> c<strong>la</strong>se "CURSOR" (cursor interactivo)<br />

// * Cursor activo sobre <strong>la</strong>s graficas <strong>de</strong> magnitud y fase<br />

// * Texto informativo: (magnitud/fase vs. frecu<strong>en</strong>cia)<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Mo<strong>de</strong>lo y Vistas<br />

import Mo<strong>de</strong>lo.G<strong>en</strong>erador_Lista_Datos;<br />

import Vistas.ac.vistasAC;<br />

public c<strong>la</strong>ss Cursor_Respuesta_Frecu<strong>en</strong>cia ext<strong>en</strong>ds Sprite {<br />

// --- Graficas <strong>de</strong> Magnitud y Fase ---<br />

public var g_Magnitud:Sprite;<br />

public var g_Fase:Sprite;<br />

// --- Cursores ---<br />

private var Magnitud:CURSOR;<br />

private var Fase:CURSOR;<br />

private var cursor_Magnitud:Sprite;<br />

private var cursor_Fase:Sprite;<br />

// --- Grupo <strong>de</strong> cursores <strong>en</strong>cad<strong>en</strong>ados ---<br />

43


private var grupo_Cursores:Array;<br />

// --- Valores <strong>de</strong> Magnitud y Fase ---<br />

private var LD:G<strong>en</strong>erador_Lista_Datos;<br />

private var datos_Frecu<strong>en</strong>cia:Array;<br />

private var datos_Magnitud:Array;<br />

private var datos_Fase:Array;<br />

private var graficas_Frecu<strong>en</strong>cia:Array;<br />

// grafica.funcion_a_Graficar[nodo][magnitud] --> Datos Magnitud_dB<br />

private var magnitud:int = 0;<br />

// grafica.funcion_a_Graficar[nodo][fase] --> Datos Fase_Grados<br />

private var fase:int = 1;<br />

private var nodo:Number;<br />

// --- Indices ---<br />

private var i:int;<br />

private var j:int;<br />

private var k:int;<br />

// --- Parametros <strong>de</strong> graficas ---<br />

public var altura_Graficas_MagFase:Number;<br />

public var ancho_Graficas_MagFase:Number;<br />

// --- Colores ---<br />

// --- Fondo -----------------------<br />

public var color_Fondo:Number;<br />

public var alfa_Fondo:Number;<br />

public var color_Linea:Number;<br />

public var alfa_Linea:Number;<br />

// --- Punto <strong>de</strong> interseccion -------<br />

public var color_Fondo_Punto:Number;<br />

public var alfa_Fondo_Punto:Number;<br />

public var color_Linea_Punto:Number;<br />

public var alfa_Linea_Punto:Number;<br />

// Refer<strong>en</strong>cia para <strong>en</strong>vio <strong>de</strong> actualizacion <strong>de</strong> "coord<strong>en</strong>adaX"<br />

// <strong>de</strong>l CURSOR<br />

public var vistas_ac:vistasAC;<br />

// --- Composicion: Refer<strong>en</strong>cia a "Graficador_Respuesta_Frecu<strong>en</strong>cia" ---<br />

private var grafica:Graficador_Respuesta_Frecu<strong>en</strong>cia;<br />

public function Cursor_Respuesta_Frecu<strong>en</strong>cia(_vistas_ac:vistasAC,<br />

_LD:G<strong>en</strong>erador_Lista_Datos,<br />

_grafica:Graficador_Respuesta_Frecu<strong>en</strong>cia):void {<br />

vistas_ac = _vistas_ac;<br />

// --- Recepcion <strong>de</strong> datos ---<br />

grafica = _grafica;<br />

graficas_Frecu<strong>en</strong>cia = grafica.graficas_Frecu<strong>en</strong>cia;<br />

// --- Acceso a parametros <strong>de</strong> graficas ---<br />

altura_Graficas_MagFase = grafica.altura_Graficas_MagFase;<br />

44


ancho_Graficas_MagFase = grafica.ancho_Graficas_MagFase;<br />

// --- Acceso a composicion <strong>de</strong> graficas ---<br />

g_Magnitud = grafica.g_Magnitud;<br />

g_Fase = grafica.g_Fase;<br />

// --- Acceso a <strong>la</strong> Lista <strong>de</strong> Datos ---<br />

// --- Lista <strong>de</strong> Datos ---<br />

LD = _LD;<br />

// grafica.funcion_a_Graficar[nodo][magnitud] --> Datos Magnitud_dB<br />

magnitud = 0;<br />

// grafica.funcion_a_Graficar[nodo][fase] --> Datos Fase_Grados<br />

fase = 1;<br />

// Datos <strong>de</strong> frecu<strong>en</strong>cia<br />

datos_Frecu<strong>en</strong>cia = LD.LF;<br />

grupo_Cursores = new Array();<br />

// -----------------------------------------------------------<br />

// Construccion <strong>de</strong>l cursor <strong>de</strong> Magnitud<br />

// -----------------------------------------------------------<br />

Magnitud = new CURSOR(this,"Magnitud",altura_Graficas_MagFase,<br />

ancho_Graficas_MagFase,datos_Frecu<strong>en</strong>cia);<br />

Magnitud.construye_Cursor();<br />

Magnitud.construye_Texto("Mag = "," dB","f = "," Hz");<br />

cursor_Magnitud = new Sprite();<br />

grupo_Cursores.push(Magnitud);<br />

// -----------------------------------------------------------<br />

// Construccion <strong>de</strong>l cursor <strong>de</strong> Fase<br />

// -----------------------------------------------------------<br />

Fase = new CURSOR(this,"Fase",altura_Graficas_MagFase,<br />

ancho_Graficas_MagFase,datos_Frecu<strong>en</strong>cia);<br />

Fase.construye_Cursor();<br />

Fase.construye_Texto("Fase = "," Gr","f = "," Hz");<br />

cursor_Fase = new Sprite();<br />

grupo_Cursores.push(Fase);<br />

// -----------------------------------------------------------<br />

// Encad<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> cursores<br />

// -----------------------------------------------------------<br />

Magnitud.<strong>en</strong>cad<strong>en</strong>ar_Cursores(grupo_Cursores);<br />

Fase.<strong>en</strong>cad<strong>en</strong>ar_Cursores(grupo_Cursores);<br />

}<br />

// --- Colores por <strong>de</strong>fault ---<br />

color_Fondo = 0x0099ff;<br />

alfa_Fondo = 0.4;<br />

color_Linea = 0xffffff;<br />

alfa_Linea = 1;<br />

color_Fondo_Punto = 0xcccccc;<br />

alfa_Fondo_Punto = 0.4;<br />

color_Linea_Punto = 0xffffff;<br />

alfa_Linea_Punto = 1;<br />

45


-----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> Cursores interactivos<br />

//<br />

// -----------------------------------------------------------<br />

public function inicializaCursorInteractivo():void {<br />

var refer<strong>en</strong>cias_Cursores:Array = new Array();<br />

// -----------------------------------------------------------<br />

// Formacion <strong>de</strong>l cursor <strong>de</strong> Magnitud<br />

// -----------------------------------------------------------<br />

cursor_Magnitud.addChild(Magnitud.cursor);<br />

cursor_Magnitud.addChild(Magnitud.texto);<br />

// -----------------------------------------------------------<br />

// Formacion <strong>de</strong>l cursor <strong>de</strong> Fase<br />

// -----------------------------------------------------------<br />

cursor_Fase.addChild(Fase.cursor);<br />

cursor_Fase.addChild(Fase.texto);<br />

// -----------------------------------------------------------<br />

// Despliega <strong>la</strong> grafica <strong>de</strong>l nodo <strong>de</strong> tierra <strong>de</strong>l circuito,<br />

// por <strong>de</strong>faul<br />

// -----------------------------------------------------------<br />

// Grafica <strong>de</strong> Magnitud<br />

// -----------------------------------------------------------<br />

// --- Layer 4: Funcion y Acotami<strong>en</strong>to <strong>de</strong> Magnitud<br />

nodo = graficas_Frecu<strong>en</strong>cia.l<strong>en</strong>gth-1;<br />

g_Magnitud.addChild(graficas_Frecu<strong>en</strong>cia[nodo].Magnitud_dB);<br />

g_Magnitud.addChild(cursor_Magnitud);<br />

Magnitud.actualiza_Datos(graficas_Frecu<strong>en</strong>cia[nodo].datos_Grafica_Magnitud,<br />

grafica.funcion_a_Graficar[nodo][magnitud]);<br />

grafica.funcion_a_Graficar[nodo][fase]);<br />

// -----------------------------------------------------------<br />

// Grafica <strong>de</strong> Fase<br />

// -----------------------------------------------------------<br />

// --- Layer 4: Funcion y Acotami<strong>en</strong>to <strong>de</strong> Fase<br />

g_Fase.addChild(graficas_Frecu<strong>en</strong>cia[nodo].Fase_Grados);<br />

g_Fase.addChild(cursor_Fase);<br />

Fase.actualiza_Datos(graficas_Frecu<strong>en</strong>cia[nodo].datos_Grafica_Fase,<br />

// -----------------------------------------------------------<br />

// Animacion inical <strong>de</strong> cursores<br />

// -----------------------------------------------------------<br />

Magnitud.animacion_inicial();<br />

// -----------------------------------------------------------<br />

// Interactividad <strong>de</strong> cursores<br />

// -----------------------------------------------------------<br />

46


Magnitud.cursor.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_DOWN,<br />

Magnitud.mover_cursor);<br />

Magnitud.cursor.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_UP,<br />

Magnitud.<strong>de</strong>t<strong>en</strong>er_cursor);<br />

Magnitud.cursor.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.ROLL_OUT,<br />

Magnitud.<strong>de</strong>t<strong>en</strong>er_cursor);<br />

Fase.cursor.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_DOWN,<br />

Fase.mover_cursor);<br />

Fase.<strong>de</strong>t<strong>en</strong>er_cursor);<br />

Fase.cursor.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.MOUSE_UP,<br />

Fase.cursor.addEv<strong>en</strong>tList<strong>en</strong>er(MouseEv<strong>en</strong>t.ROLL_OUT,<br />

Fase.<strong>de</strong>t<strong>en</strong>er_cursor);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Conexion <strong>en</strong>tre:<br />

// "graficaBarras" --> "G<strong>en</strong>erador_Respuesta_Frecu<strong>en</strong>cia"<br />

// (activacion <strong>de</strong> <strong>la</strong> grafica <strong>de</strong> Respuesta <strong>en</strong> Frecu<strong>en</strong>cia<br />

// correspondi<strong>en</strong>te al nodo seleccionado <strong>en</strong> <strong>la</strong> "graficaBarras")<br />

//<br />

// -----------------------------------------------------------<br />

public function selecciona_Grafica_Nodo(id:String):void {<br />

// -----------------------------------------------------------<br />

// Para cada nodo seleccionado <strong>en</strong> <strong>la</strong> "graficaBarras", se<br />

// muestra <strong>la</strong> grafica correspondi<strong>en</strong>te <strong>de</strong> <strong>la</strong> magntiud y fase<br />

// <strong>de</strong> <strong>la</strong> respuesta <strong>en</strong> frecu<strong>en</strong>cia <strong>de</strong> dicho nodo<br />

// -----------------------------------------------------------<br />

nodo = Number(id.substr(1,2));<br />

// --- Remueve <strong>la</strong> grafica anterior -------------------------<br />

g_Magnitud.removeChildAt(g_Magnitud.numChildr<strong>en</strong>-1); // Cursor<br />

g_Magnitud.removeChildAt(g_Magnitud.numChildr<strong>en</strong>-1); // Grafica<br />

g_Fase.removeChildAt(g_Fase.numChildr<strong>en</strong>-1);<br />

g_Fase.removeChildAt(g_Fase.numChildr<strong>en</strong>-1);<br />

// --- Agrega <strong>la</strong> grafica <strong>de</strong>l nodo seleccionado -------------<br />

g_Magnitud.addChild(graficas_Frecu<strong>en</strong>cia[nodo].Magnitud_dB);<br />

g_Magnitud.addChild(cursor_Magnitud);<br />

g_Fase.addChild(graficas_Frecu<strong>en</strong>cia[nodo].Fase_Grados);<br />

g_Fase.addChild(cursor_Fase);<br />

// --- Actualizar datos a <strong>de</strong>splegar ------------------------<br />

Magnitud.actualiza_Datos(graficas_Frecu<strong>en</strong>cia[nodo].datos_Grafica_Magnitud,<br />

grafica.funcion_a_Graficar[nodo][magnitud]);<br />

Fase.actualiza_Datos(graficas_Frecu<strong>en</strong>cia[nodo].datos_Grafica_Fase,<br />

47


grafica.funcion_a_Graficar[nodo][fase]);<br />

}<br />

private function actualiza_Grafica_Nodo(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

nodo = Number(Disp<strong>la</strong>yObject(ev<strong>en</strong>t.target).name);<br />

// --- Remueve <strong>la</strong> grafica anterior -------------------------<br />

g_Magnitud.removeChildAt(g_Magnitud.numChildr<strong>en</strong>-1); // Cursor<br />

g_Magnitud.removeChildAt(g_Magnitud.numChildr<strong>en</strong>-1); // Grafica<br />

g_Fase.removeChildAt(g_Fase.numChildr<strong>en</strong>-1);<br />

g_Fase.removeChildAt(g_Fase.numChildr<strong>en</strong>-1);<br />

// --- Agrega <strong>la</strong> grafica <strong>de</strong>l nodo seleccionado -------------<br />

g_Magnitud.addChild(graficas_Frecu<strong>en</strong>cia[nodo].Magnitud_dB);<br />

g_Magnitud.addChild(cursor_Magnitud);<br />

g_Fase.addChild(graficas_Frecu<strong>en</strong>cia[nodo].Fase_Grados);<br />

g_Fase.addChild(cursor_Fase);<br />

// --- Actualizar datos a <strong>de</strong>splegar ------------------------<br />

Magnitud.actualiza_Datos(graficas_Frecu<strong>en</strong>cia[nodo].datos_Grafica_Magnitud,<br />

grafica.funcion_a_Graficar[nodo][magnitud]);<br />

Fase.actualiza_Datos(graficas_Frecu<strong>en</strong>cia[nodo].datos_Grafica_Fase,<br />

grafica.funcion_a_Graficar[nodo][fase]);<br />

}<br />

public function actualiza_CoordX_CURSOR(coord<strong>en</strong>adaX:Number):void {<br />

vistas_ac.actualiza_CoordX_CURSOR(coord<strong>en</strong>adaX);<br />

}<br />

}<br />

}<br />

48


package Vistas.ac.respuestaFrecu<strong>en</strong>cia<br />

{<br />

// **************************************************************<br />

//<br />

// C<strong>la</strong>se: CURSOR<br />

//<br />

// Patron <strong>de</strong> Programacion:<br />

//<br />

// Auxiliar <strong>de</strong> <strong>la</strong> c<strong>la</strong>se "Cursor_Respuesta_Frecu<strong>en</strong>cia"<br />

//<br />

//<br />

abril / 2010<br />

// **************************************************************<br />

//<br />

// ENTRADA:<br />

// - Refer<strong>en</strong>cia a <strong>la</strong> c<strong>la</strong>se "Cursor_Respuesta_Frecu<strong>en</strong>cia"<br />

// * Valores <strong>de</strong> Frecu<strong>en</strong>cia <strong>en</strong> variacion logaritmica<br />

// * Magnitud_dB<br />

// * Fase_Grados<br />

//<br />

// CONEXIONES INTERACTIVAS:<br />

// - Con <strong>la</strong> c<strong>la</strong>se "Cursor_Respuesta_Frecu<strong>en</strong>cia"<br />

//<br />

// SALIDA: - Cursor activo sobre <strong>la</strong>s graficas <strong>de</strong> magnitud y fase<br />

// - Texto informativo: (magnitud/fase vs. frecu<strong>en</strong>cia)<br />

//<br />

// **************************************************************<br />

// F<strong>la</strong>sh principal<br />

import f<strong>la</strong>sh.disp<strong>la</strong>y.*;<br />

// Campos <strong>de</strong> texto para etiquetas<br />

import f<strong>la</strong>sh.text.*;<br />

// Ev<strong>en</strong>tos<br />

import f<strong>la</strong>sh.ev<strong>en</strong>ts.*;<br />

// Timer<br />

import f<strong>la</strong>sh.utils.*;<br />

public c<strong>la</strong>ss CURSOR ext<strong>en</strong>ds Sprite {<br />

// --- Cursores ---<br />

// Layer 1:<br />

public var cursor:Sprite;<br />

public var fondo:Sprite;<br />

public var marcador:Sprite;<br />

// Layer 2:<br />

public var texto:Sprite;<br />

// --- Conexion <strong>de</strong> cursores ---<br />

private var grupo_Cursores:Array;<br />

// --- Animacion ---<br />

private var tm0:Timer;<br />

// --- Lista <strong>de</strong> Datos ---<br />

private var datosX:Array;<br />

private var datosY:Array;<br />

// Eje "x" <strong>de</strong> <strong>la</strong> grafica<br />

// Eje "y" <strong>de</strong> <strong>la</strong> grafica<br />

49


public var coord<strong>en</strong>adaX:Number;<br />

grafica actual<br />

// --- Posicion Marcador ---<br />

private var datosY_marcador:Array;<br />

// Posicion <strong>de</strong>l "marcador"<br />

// sobre <strong>la</strong><br />

// --- Indices ---<br />

private var i:int;<br />

private var j:int;<br />

private var k:int;<br />

public var altura_Grafica:Number;<br />

public var ancho_Grafica:Number;<br />

// --- Colores ---<br />

// --- Fondo ---<br />

public var color_Fondo:Number;<br />

public var alfa_Fondo:Number;<br />

public var color_Linea:Number;<br />

public var alfa_Linea:Number;<br />

// --- Punto <strong>de</strong> interseccion ---<br />

public var color_Fondo_Punto:Number;<br />

public var alfa_Fondo_Punto:Number;<br />

public var color_Linea_Punto:Number;<br />

public var alfa_Linea_Punto:Number;<br />

// --- Auxiliares ---<br />

private var campo_Texto1:TextField;<br />

private var campo_Texto2:TextField;<br />

private var formato_Texto:TextFormat;<br />

private var frecu<strong>en</strong>cia:Number;<br />

private var ancho_Caja_Texto:Number = 90;<br />

private var alto_Caja_Texto:Number = 30;<br />

// --- Ley<strong>en</strong>das <strong>de</strong> texto ---<br />

private var ley<strong>en</strong>da1:String;<br />

private var unida<strong>de</strong>s_ley<strong>en</strong>da1:String;<br />

private var ley<strong>en</strong>da2:String;<br />

private var unida<strong>de</strong>s_ley<strong>en</strong>da2:String;<br />

// Refer<strong>en</strong>cia para <strong>en</strong>vio <strong>de</strong> actualizacion <strong>de</strong><br />

// "coord<strong>en</strong>adaX" <strong>de</strong>l CURSOR<br />

public var cursorRespuestaFrecu<strong>en</strong>cia:Cursor_Respuesta_Frecu<strong>en</strong>cia;<br />

public function<br />

CURSOR(_cursorRespuestaFrecu<strong>en</strong>cia:Cursor_Respuesta_Frecu<strong>en</strong>cia,<br />

_id:String,altura:Number,<br />

ancho:Number,_datosX:Array):void {<br />

// --- Recepcion <strong>de</strong> datos ---<br />

cursorRespuestaFrecu<strong>en</strong>cia = _cursorRespuestaFrecu<strong>en</strong>cia;<br />

altura_Grafica = altura;<br />

ancho_Grafica = ancho;<br />

50


datosX = _datosX;<br />

// --- Inicializacion <strong>de</strong> cursores ---<br />

// Layer 1:<br />

cursor = new Sprite();<br />

cursor.name = _id;<br />

fondo = new Sprite();<br />

marcador = new Sprite();<br />

// Layer 2:<br />

texto = new Sprite();<br />

campo_Texto1 = new TextField();<br />

campo_Texto2 = new TextField();<br />

formato_Texto = new TextFormat();<br />

// --- Colores por <strong>de</strong>fault ---<br />

color_Fondo = 0x0099ff;<br />

alfa_Fondo = 0.4;<br />

color_Linea = 0xffffff;<br />

alfa_Linea = 1;<br />

color_Fondo_Punto = 0xcccccc;<br />

alfa_Fondo_Punto = 0.4;<br />

color_Linea_Punto = 0xffffff;<br />

alfa_Linea_Punto = 1;<br />

// -- Iniciliza "timer" para animacion ---<br />

tm0 = new Timer(1000,1);<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> construccion <strong>de</strong> "cursores interactivos"<br />

// y "textos informativos <strong>de</strong> cursores"<br />

//<br />

// -----------------------------------------------------------<br />

public function construye_Cursor():Sprite {<br />

// -----------------------------------------------------------<br />

// Construccion <strong>de</strong>l cursor azul<br />

// -----------------------------------------------------------<br />

// --- Layer 1: --> sub<strong>la</strong>yer: "Fondo" --------------------------<br />

fondo.graphics.lineStyle(1,color_Linea,0.4);<br />

fondo.graphics.beginFill(color_Fondo,alfa_Fondo)<br />

fondo.graphics.drawRect(-10,0,20,-altura_Grafica);<br />

fondo.graphics.<strong>en</strong>dFill();<br />

fondo.y = altura_Grafica;<br />

// --- Linea c<strong>en</strong>tral ---<br />

fondo.graphics.lineStyle(1,color_Linea,alfa_Linea);<br />

fondo.graphics.moveTo(0,0);<br />

fondo.graphics.lineTo(0,-altura_Grafica);<br />

// -----------------------------------------------------------<br />

// Construccion <strong>de</strong>l "Punto mobil"<br />

// -----------------------------------------------------------<br />

51


--- Layer 1: --> sub<strong>la</strong>yer: "Punto" --------------------------<br />

// --- Punto <strong>de</strong> interseccion con <strong>la</strong> grafica ---<br />

marcador.graphics.lineStyle(1,color_Linea_Punto,0.5);<br />

marcador.graphics.beginFill(color_Fondo_Punto,alfa_Fondo_Punto)<br />

marcador.graphics.drawCircle(0,0,5);<br />

marcador.graphics.<strong>en</strong>dFill();<br />

// --- Formacion <strong>de</strong> Layer 1:<br />

cursor.addChild(fondo);<br />

cursor.addChild(marcador);<br />

// --- Interactividad ---<br />

cursor.buttonMo<strong>de</strong> = true;<br />

cursor.visible = false;<br />

}<br />

return cursor;<br />

public function construye_Texto(_ley<strong>en</strong>da1:String,<br />

_unida<strong>de</strong>s_ley<strong>en</strong>da1:String,<br />

_ley<strong>en</strong>da2:String,<br />

_unida<strong>de</strong>s_ley<strong>en</strong>da2:String):Sprite {<br />

// -----------------------------------------------------------<br />

// Construccion <strong>de</strong>l texto informativo<br />

// -----------------------------------------------------------<br />

ley<strong>en</strong>da1 = _ley<strong>en</strong>da1;<br />

unida<strong>de</strong>s_ley<strong>en</strong>da1 = _unida<strong>de</strong>s_ley<strong>en</strong>da1;<br />

ley<strong>en</strong>da2 = _ley<strong>en</strong>da2;<br />

unida<strong>de</strong>s_ley<strong>en</strong>da2 = _unida<strong>de</strong>s_ley<strong>en</strong>da2;<br />

// --- Layer 2: ---<br />

// --- Marco <strong>de</strong> texto ---<br />

texto.graphics.lineStyle(2,0xffffff,0.8);<br />

texto.graphics.beginFill(color_Fondo,alfa_Fondo);<br />

texto.graphics.drawRect(0,0,ancho_Caja_Texto,alto_Caja_Texto);<br />

texto.graphics.<strong>en</strong>dFill();<br />

// --- Formacion <strong>de</strong> Layer 2 ---<br />

texto.addChild(campo_Texto1);<br />

texto.addChild(campo_Texto2);<br />

texto.alpha = 0;<br />

// --- Define formato para etiquetas ---<br />

formato_Texto.font = "_sans";<br />

formato_Texto.size = 10;<br />

formato_Texto.color = 0xffffff;<br />

// --- campo_Texto1 ---<br />

campo_Texto1.x = 5;<br />

campo_Texto1.y = 0;<br />

campo_Texto1.height = 12;<br />

campo_Texto1.width = 20;<br />

campo_Texto1.autoSize = TextFieldAutoSize.LEFT;<br />

52


campo_Texto1.setTextFormat(formato_Texto);<br />

// --- campo_Texto2 ---<br />

campo_Texto2.x = 5;<br />

campo_Texto2.y = 12;<br />

campo_Texto2.height = 12;<br />

campo_Texto2.width = 20;<br />

campo_Texto2.autoSize = TextFieldAutoSize.LEFT;<br />

campo_Texto2.setTextFormat(formato_Texto);<br />

}<br />

return texto;<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> actualizacion <strong>de</strong> datos <strong>de</strong><br />

// "cursores interactivos" y "textos informativos <strong>de</strong> cursores"<br />

//<br />

// -----------------------------------------------------------<br />

{<br />

public function actualiza_Datos(_datosY_marcador:Array,<br />

}<br />

// -----------------------------------------------------------<br />

// Actualizacion <strong>de</strong> datos <strong>de</strong> "magnitud" o "fase"<br />

// -----------------------------------------------------------<br />

datosY_marcador = _datosY_marcador;<br />

datosY = _datosY;<br />

actualizar();<br />

_datosY:Array):void<br />

private function actualiza_Texto(mY:Number,mX:Number): void {<br />

// -----------------------------------------------------------<br />

// Actualizacion <strong>de</strong> textos <strong>de</strong> "magnitud" o "fase"<br />

// -----------------------------------------------------------<br />

campo_Texto1.text = ley<strong>en</strong>da1+mY.toString()+unida<strong>de</strong>s_ley<strong>en</strong>da1;<br />

campo_Texto1.setTextFormat(formato_Texto);<br />

}<br />

campo_Texto2.text = ley<strong>en</strong>da2+mX.toString()+unida<strong>de</strong>s_ley<strong>en</strong>da2;<br />

campo_Texto2.setTextFormat(formato_Texto);<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> moviemi<strong>en</strong>to <strong>de</strong> "cursores interactivos"<br />

//<br />

// -----------------------------------------------------------<br />

public function mover_cursor(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

cursor.startDrag();<br />

cursor.addEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, <strong>de</strong>sp<strong>la</strong>zarX);<br />

}<br />

public function <strong>de</strong>t<strong>en</strong>er_cursor(ev<strong>en</strong>t:MouseEv<strong>en</strong>t):void {<br />

cursor.stopDrag();<br />

cursor.y = 0;<br />

53


cursor.removeEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, <strong>de</strong>sp<strong>la</strong>zarX);<br />

// Comunica "coord<strong>en</strong>adaX" a vista <strong>en</strong> <strong>3D</strong><br />

cursorRespuestaFrecu<strong>en</strong>cia.actualiza_CoordX_CURSOR(coord<strong>en</strong>adaX);<br />

}<br />

public function <strong>de</strong>sp<strong>la</strong>zarX(e:Ev<strong>en</strong>t):void {<br />

cursor.y = 0;<br />

}<br />

if (cursor.x < 0) {<br />

cursor.x = 0;<br />

cursor.stopDrag();<br />

}<br />

if (cursor.x > ancho_Grafica-1) {<br />

cursor.x = ancho_Grafica-1;<br />

cursor.stopDrag();<br />

cursor.removeEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME, <strong>de</strong>sp<strong>la</strong>zarX);<br />

} else {<br />

actualizar();<br />

conectar_Cursores();<br />

}<br />

private function actualizar():void {<br />

// -----------------------------------------------------------<br />

// Actualizacion <strong>de</strong> datos <strong>de</strong> "magnitud" o "fase"<br />

// -----------------------------------------------------------<br />

coord<strong>en</strong>adaX = Math.round(cursor.x);<br />

marcador.y = datosY_marcador[coord<strong>en</strong>adaX];<br />

}<br />

// --- Actualiza <strong>de</strong>spliegue <strong>de</strong> datos -------------------<br />

if (datosX[coord<strong>en</strong>adaX] > 1) {<br />

// --- Frecu<strong>en</strong>cia > 1 Hz ---<br />

frecu<strong>en</strong>cia = Math.round(datosX[coord<strong>en</strong>adaX]*100)/100;<br />

} else {<br />

// --- Frecu<strong>en</strong>cia < 1 Hz ---<br />

frecu<strong>en</strong>cia = Math.round(datosX[coord<strong>en</strong>adaX]*10000)/10000;<br />

}<br />

actualiza_Texto(datosY[coord<strong>en</strong>adaX],frecu<strong>en</strong>cia);<br />

posiciona_Cajas_Texto();<br />

public function posiciona_Cajas_Texto():void {<br />

// -----------------------------------------------------------<br />

// Posiciona "cajas <strong>de</strong> texto" <strong>en</strong> forma dinamica d<strong>en</strong>tro <strong>de</strong>l<br />

// area <strong>de</strong> graficacion <strong>de</strong> <strong>la</strong> "magnitud" o "fase"<br />

// -----------------------------------------------------------<br />

if (cursor.x >= 0) {<br />

if (cursor.x < ancho_Grafica - ancho_Caja_Texto - 30) {<br />

texto.x = cursor.x + 25;<br />

if (marcador.y > alto_Caja_Texto + 15) {<br />

texto.y = marcador.y - alto_Caja_Texto - 10;<br />

} else {<br />

54


}<br />

}<br />

} else {<br />

}<br />

}<br />

texto.y = marcador.y + 10;<br />

texto.x = cursor.x - ancho_Caja_Texto - 25;<br />

if (marcador.y > alto_Caja_Texto + 15) {<br />

texto.y = marcador.y - alto_Caja_Texto - 10;<br />

} else {<br />

texto.y = marcador.y + 10;<br />

}<br />

// -----------------------------------------------------------<br />

//<br />

// Seccion <strong>de</strong> <strong>en</strong>cad<strong>en</strong>ami<strong>en</strong>to <strong>de</strong> "cursores interactivos"<br />

//<br />

// -----------------------------------------------------------<br />

public function <strong>en</strong>cad<strong>en</strong>ar_Cursores(_grupo_Cursores:Array):void {<br />

}<br />

grupo_Cursores = _grupo_Cursores;<br />

public function conectar_Cursores():void {<br />

for (i=0; i ancho_Grafica-1) {<br />

cursor.x = ancho_Grafica-1;<br />

cursor.stopDrag();<br />

}<br />

marcador.y = datosY_marcador[coord<strong>en</strong>adaX];<br />

Math.round(datosX[coord<strong>en</strong>adaX]*100)/100;<br />

Math.round(datosX[coord<strong>en</strong>adaX]*10000)/<br />

// --- Actualiza <strong>de</strong>spliegue <strong>de</strong> datos ---<br />

if (datosX[cursor.x] > 1) {<br />

frecu<strong>en</strong>cia =<br />

} else {<br />

frecu<strong>en</strong>cia =<br />

55


10000;<br />

}<br />

actualiza_Texto(datosY[coord<strong>en</strong>adaX],frecu<strong>en</strong>cia);<br />

posiciona_Cajas_Texto();<br />

--<br />

// --- Increm<strong>en</strong>ta "alpha" <strong>de</strong> <strong>la</strong> caja <strong>de</strong> texto "texto" -<br />

if (((ancho_Grafica/2 - cursor.x)


}<br />

if(dx > 1) {<br />

vx = dx*easing;<br />

cursor.x += vx;<br />

} else if (texto.alpha < 1) {<br />

texto.alpha += 0.1;<br />

} else {<br />

stop_animation();<br />

}<br />

actualizar();<br />

conectar_Cursores();<br />

private function stop_animation():void {<br />

// Comunica "coord<strong>en</strong>adaX" a vista <strong>en</strong> <strong>3D</strong><br />

cursorRespuestaFrecu<strong>en</strong>cia.actualiza_CoordX_CURSOR(coord<strong>en</strong>adaX);<br />

this.removeEv<strong>en</strong>tList<strong>en</strong>er(Ev<strong>en</strong>t.ENTER_FRAME,inicia_animacion_1);<br />

}<br />

}<br />

}<br />

57

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!