P oyec o Fin de Ca e a
Ingenie ía de Telecomunicación
Fo ma o de Publicación de la Escuela Técnica
Supe io de Ingenie ía
Au o : F. Ja ie Payán Some
Tu o : Juan José Mu illo Fuen es
Dep. Teo ía de la Señal y Comunicaciones
Escuela Técnica Supe io de Ingenie ía
Uni e sidad de Se illa
Se illa, 2013
T abajo Fin de G ado
G ado en Ingenie ía Ae oespacial
Desa ollo de una aplicación adap a i a en
C# pa a la gene ación au omá ica de diag a-
mas de Gan
Au o : Se gio Da id Ma ín Medina
Tu o : Víc o Fe nández-Viagas Escude o
Dp o. O ganización Indus ial y Ges ión de
Emp esas I
Escuela Técnica Supe io de Ingenie ía
Uni e sidad de Se illa
Se illa, 2020
T abajo Fin de G ado
G ado en Ingenie ía Ae oespacial
Desa ollo de una aplicación adap a i a en C#
pa a la gene ación au omá ica de diag amas de
Gan
Au o :
Se gio Da id Ma ín Medina
Tu o :
Víc o Fe nández-Viagas Escude o
P o eso Con a ado Doc o
Dp o. O ganización Indus ial y Ges ión de Emp esas I
Escuela Técnica Supe io de Ingenie ía
Uni e sidad de Se illa
Se illa, 2020
T abajo Fin de G ado: Desa ollo de una aplicación adap a i a en C# pa a la gene ación
au omá ica de diag amas de Gan
Au o : Se gio Da id Ma ín Medina
Tu o : Víc o Fe nández-Viagas Escude o
El ibunal nomb ado pa a juzga el abajo a iba indicado, compues o po los siguien es p o eso es:
P esiden e:
Vocal/es:
Sec e a io:
acue dan o o ga le la cali icación de:
El Sec e a io del T ibunal
Fecha:
Ag adecimien os
A Víc o , a quien ag adezco su ayuda y su implicación en es e p oyec o.
A mi amilia y amigos, po habe me hecho más amenos es os úl imos 4 años y sin los cuales no
se ía quién soy aho a.
A Ma ía, po es a ahí siemp e, acompañándome an o en los buenos como en los malos momen os.
Se gio Da id Ma ín Medina
Se illa, 2020
I
Resumen
En
cualquie en o no p oduc i o o sani a io exis e una g an can idad elemen os que han de
se plani icados y o ganizados en el iempo. El obje i o de es e abajo de in de g ado es
desa olla una aplicación in o má ica en el lenguaje C#, que pe mi a ep esen a g á icamen e
el esul ado de la p og amación de la p oducción median e un diag ama de Gan in e ac i o.
Asimismo, se p e ende do a al usua io con las he amien as necesa ias pa a ealiza cambios en la
p og amación p opues a, con su consiguien e modi icación en el diag ama de Gan . Con el in de
acili a es a a ea, se a a p esen a oda la in o mación disponible median e paneles in o ma i os,
los cuales p opo cionen al usua io los da os esenciales de cada elemen o p oduc i o.
III
XÍndice
4.3.1 Clase Diag amaGan 38
Implemen ación del sc oll y ep esen ación del diag ama 38
In e acción del usua io 41
Implemen ación del zoom 42
Op imización de los g á icos 42
4.3.2 Clase Lis BoxGan 46
4.3.3 Clase LabelGan 46
5 Conclusiones 49
5.1 Posibles mejo as 51
Apéndice A Código empleado 53
A.1 Ven ana p incipal de la aplicación 53
A.2 Clase T abajo 65
A.3 Clase Maquina 76
A.4 Clase Ope a io 81
A.5 In e aces implemen adas 83
A.6 Lec u a y esc i u a de los iche os 84
A.7 Clase abs ac a Con olGan 94
A.7.1 Con ol Diag amaGan 95
A.7.2 Clase abs ac a Lis BoxGan y con oles he edados 120
A.7.3 Clase abs ac a LabelGan y con oles he edados 124
Índice de Figu as 133
Índice de Códigos 135
Bibliog a ía 137
1 In oducción
La
ges ión e icien e de los ecu sos disponibles es cla e pa a consegui un endimien o óp imo
en un ambien e qui ú gico, p opo cionando así se icios médicos con un cos e azonable,
man eniendo la sa is acción del pacien e [
Dios e al., 2015
]. Es po es e mo i o que po pa e de la
comunidad in es igado a de la Escuela Técnica Supe io de Ingenie ía (E.T.S.I.) se han sumado
es ue zos pa a aplica écnicas de o ganización y con ol de p oducción al en o no médico con el in
de mejo a los se icios sani a ios. Es e enómeno puede e se e lejado en di e sos a ículos cien-
í icos como [
Molina-Pa ien e e al., 2015a
], [
Molina-Pa ien e e al., 2015b
] o [
Dios e al., 2015
],
los cuales aba can emá icas como me odologías de esolución del p oblema de plani icación y
o ganización de qui ó anos con iempos de ci ugía dependien es del ci ujano, aplicación de me odo-
logía heu ís ica pa a la plani icación/p og amación de qui ó anos, o el desa ollo de un sis ema de
ayuda a la oma de decisiones pa a la plani icación de los qui ó anos po pa e del di ec o de cada
unidad qui ú gica, espec i amen e.
Es os p oyec os se han ealizado con el in de mejo a los se icios sani a ios p es ados po el
Hospi al Vi gen del Rocío (Se illa, España), buscando la op imización en la ges ión de los ecu sos
disponibles, cen ándose en el á ea de qui ó anos. Se a a de un p oblema complejo en el que se
debe ene en conside ación la disponibilidad de los dis in os qui ó anos, en e los que pod ía habe
alguno especializado, el pe sonal clínico, den o del cual des acan los ci ujanos y los pacien es, en e
o as es icciones [
Dios e al., 2015
]. Además, dada la a iabilidad inhe en e de las in e enciones
qui ú gicas, la moni o ización de los qui ó anos y la aplicación de medidas co ec i as (debido a
ajus es de úl ima ho a p o ocados po ausencias de los pacien es o cancelaciones) son necesa ias.
1.1 Desc ipción del en o no del p oblema
Es e abajo de in de g ado p e ende segui con ibuyendo a la mejo a de los se icios del Hospi al
Vi gen del Rocío, al igual que los a ículos ya mencionados, median e el desa ollo de una apli-
cación in o má ica. Es e hospi al es uno de los más g andes de España y cuen a con 1400 camas,
50 qui ó anos y ealiza más de 60,000 in e enciones qui ú gicas al año [
Dios e al., 2015
]. Los
qui ó anos es án dis ibuidos en dis in as unidades qui ú gicas, las cuales se cen an en un ipo de
in e ención conc e a, no malmen e po amas clínicas.
El di ec o a ca go de cada unidad qui ú gica debe ealiza la plani icación/p og amación de
las in e enciones, es o incluye la es imación de los iempos de cada in e ención, su o denación
en el iempo y la asignación de los ci ujanos a cada ope ación. Es a compleja a ea es undamen-
al pa a la co ec a ges ión de los ecu sos y su consiguien e inc emen o en el endimien o qui ú gico.
1
2Capí ulo 1. In oducción
Aunque, como se de alla á a lo la go del p esen e documen o, la aplicación desa ollada iene
un ca ác e gené ico, se p esen a á con una pa ame ización ajus ada a los sec o es p oduc i os y
sani a ios, con especial a ención a la p og amación de pacien es en qui ó anos. Así, la mayo ía
de los ejemplos analizados en el documen o y es icciones conside adas, su gen de la Unidad
de Ci ugía Ca dio ascula y G andes Quemados. Po es e mo i o, se a a esumi el p oceso de
plani icación que se sigue dicha unidad qui ú gica, pasando po cada una de sus ases, comen ando
los incon enien es que pueden su gi en cada una de ellas:
1. Asignación del ci ujano al pacien e.
Lo p ime o que se ealiza p e io a una in e ención es una consul a con el pacien e, son una
se ie de p uebas que ga an icen la necesidad de dicha in e ención. El enca gado de pasa esa
consul a suele se un ci ujano po lo que po sencillez y con eniencia del pacien e se suele
ija el ci ujano al pacien e que se a endió en consul a. No obs an e, las in e enciones son
ejecu adas po un equipo qui ú gico, usualmen e con o mado po más de un ci ujano, po lo
que la asignación del es o del equipo sí es a ea del di ec o . Las p incipales complicaciones
a la ho a de hace es a asignación es la de cuad a los ho a ios de odos los ci ujanos que
in e ienen en cada ope ación y ges iona a los especialis as.
2. Es imación de los iempos de ope ación.
Una ez de e minados los ci ujanos y la ipología de la in e ención, se ha de ealiza una
es imación del iempo que a a se necesa io pa a su inalización. Pa a ealiza es a es imación
el equipo de plani icación se basa p incipalmen e en la expe iencia. Es o se debe a que la
na u aleza de las in e enciones es poco de e minis a dada la can idad de a iables exis en es,
po lo que la expe iencia es imp escindible pa a ealiza una ap oximación acep able.
Den o de las múl iples a iables que a ec an al iempo de ope ación se encuen a el ipo
de in e ención, el cual es conocido, po lo que es posible emplea una eg esión his ó ica
pa a calcula el iempo medio de ope aciones simila es en el pasado. El his o ial clínico del
pacien e ambién es de g an impo ancia, ya que hay in e enciones que pueden e se al e adas
en unción de la edad o sexo del pacien e o de pa ologías p e ias que es e p esen e. Po úl imo,
el ci ujano que ealice la in e ención in luye en la du ación de la misma, ya que el núme o de
eces que haya ealizado esa ope ación en conc e o, su expe iencia como ci ujano, o la p opia
des eza del mismo an a modi ica el iempo es imado conside ando únicamen e el ipo de
ope ación y el his o ial del pacien e.
El equipo médico disponible en el qui ó ano ambién puede in lui en la du ación de la ope a-
ción pe o no malmen e suelen es a equipados simila men e o, si ienen di e en e equipo, es
po que se ealizan ope aciones de dis in a índole en su in e io [
Molina-Pa ien e e al., 2015a
].
Des aca que, den o del iempo de in e ención, se incluyen los cambios en e equipos de ci-
ujanos, en el caso de se una in e ención muy la ga, o el iempo de p epa ación del qui ó ano.
3. Plani icación de las in e enciones.
La plani icación de las in e enciones cons a de dos ac i idades cla amen e di e enciadas,
la p ime a de ellas es la o denación de las mismas en el iempo y la segunda la asignación
de cada una de ellas a un qui ó ano. Es as pueden en a en con lic o, ya que el o den que
op imice el núme o de ope aciones que se lle an a cabo a lo la go del iempo puede no se
1.2 Obje i os y equisi os de diseño 3
compa ible con la disponibilidad de los qui ó anos o los ci ujanos.
Siendo el caso de los qui ó anos especialmen e c í ico, ya que cie as ope aciones necesi an
un equipamien o especí ico que solamen e es á disponible en salas especializadas. Dada la
can idad de a iables p esen es se dispone de una aplicación que o ganice las ope aciones en
base a algo i mos de op imización y, a pesa de es o, ealiza una plani icación con más de
dos semanas de an icipación es una a ea casi imposible.
4. Rep esen ación de la plani icación en un diag ama.
Po úl imo, se debe ep esen a la p og amación ob enida en un diag ama que sea ácilmen e
comp ensible po la plan illa, pa a que se iden i iquen y moni o icen las ope aciones que
se deben de es a ealizando en cada momen o, así como los ci ujanos in oluc ados. Es a
ep esen ación se suele ealiza median e una aplicación in e na del hospi al.
Una ez explicado el p oceso de plani icación de los qui ó anos, se pueden ap ecia nume osas
simili udes con el en o no indus ial p oduc i o. Si bien es cie o que el núme o de ope aciones
ealizadas en un hospi al, especialmen e si se a a de ci ugía mayo , es no ablemen e educido en
compa ación con una áb ica de p oduc os en se ie, como puedan se en la indus ia alimen a ia o
la au omo ilís ica, los p incipios de p og amación son pe ec amen e aplicables.
En es e caso se iene a los pacien es, que en el en o no p oduc i o se ían conside ados como
" abajos", los qui ó anos, que se ían análogos a las máquinas de p oducción y po úl imo los
ci ujanos, los cuales cumpli ían el papel de ope a ios. En el caso de los ci ujanos, es os oman
un papel de mayo ele ancia que los ope a ios en un en o no indus ial ípico, ya que son un
ecu so que es capaz de ope a en cualquie máquina, pe o que puede no se especialis a en odas las
ope aciones. Además en es e caso los pacien es solo han de se p ocesados una ez en una máquina
cualquie a, sal o excepciones po al a de equipamien o.
Po es e mo i o se puede encon a una g an simili ud con el en o no ae onáu ico, especialmen e
en las úl imas e apas de ab icación, cuando las ope aciones son las de mon aje y p uebas de
la ae ona e en la FAL
1
o la PRE-FAL
2
. Es as e apas se ca ac e izan po el educido núme o de
ope aciones que se ealizan (hablando a g andes asgos) y el ele ado iempo que es as equie en,
simila al de las in e enciones qui ú gicas. Además, el pe sonal de la indus ia ae oespacial suele
es a al amen e especializado, al igual que ocu e con los ci ujanos en cada una de las amas clínicas.
También exis e una analogía de los qui ó anos con las máquinas de con ol numé ico de a ios ejes,
ya que ambos se ca ac e izan po la poli alencia de las ope aciones que pueden lle a a cabo.
1.2 Obje i os y equisi os de diseño
Aunque las posibilidades de mejo a en el p oceso de plani icación an e io men e desc i o son
amplias, es imposible aba ca las odas. Es e abajo de in de g ado p e ende p osegui con la ónica
de lle a he amien as de la plani icación de la p oducción al en o no sani a io, ocalizándose en
la úl ima e apa de la plani icación, la ep esen ación de la misma en un diag ama. En conc e o, se
busca desa olla una aplicación in o má ica que ealice dicha ep esen ación median e un diag ama
de Gan in e ac i o, el cual pe mi a, median e di e sas acciones po pa e del usua io, ob ene
1
Final Assembly Line (línea inal de ensamblado), po sus siglas en inglés, es la plan a de ab icación donde se ealiza la
in eg ación de los g andes conjun os de la ae ona e con el uselaje así como las p uebas de línea de uelo.
2
Plan a de ab icación p e ia a la FAL en la cual se ealiza el mon aje y p uebas de los g andes conjun os de una ae ona e
como puedan se los es abilizado es, alas, uselaje, e c.
4Capí ulo 1. In oducción
da os de las dis in as ope aciones, los ci ujanos, pacien es o qui ó anos, además de ealiza modi i-
caciones en la p og amación p opues a. El lenguaje de p og amación empleado se á C#, u ilizando
su he amien a in eg ada Windows Fo ms en la IDE3Visual S udio Comuni y.
Es a aplicación busca sol en a cie os p oblemas que su gen a la ho a de ob ene el diag ama,
algunos de los cuales ienen su aíz en la he amien a que se es á empleando en la ac ualidad. El
p incipal de ellos es el ele ado g ado de so is icación de aplicación ac ual, ya que se uel e di ícil
de maneja pa a el equipo de plani icación del hospi al, es o es debido a que p e ende in eg a la
pa e de plani icación con la de ep esen ación del diag ama. O o de los p oblemas que su ge es
que, una ez ob enidos los da os de la p og amación po pa e de la he amien a de op imización, la
modi icación de los mismos es compleja, po lo que, en el caso de que una ope ación se adelan e o
se cancele po mo i os ajenos al qui ó ano, como una ausencia po pa e del pacien e, po ejemplo,
no se posible sus i ui lo po o o de una o ma cómoda.
Es cie o que exis en a ias opciones de aplicaciones en el me cado que pe mi en al usua io
ealiza un diag ama de Gan en base a unos da os de plani icación de la p oducción, pe o es án de-
masiado en ocadas al en o no indus ial con di ícil aplicabilidad en el ambien e qui ú gico. Además,
el p oduci una he amien a p opia pe mi e ealiza modi icaciones y mejo as al so wa e en un u-
u o, así como unos ni eles de pe sonalización imposibles de consegui con una aplicación come cial.
Una ez acla ados es os concep os y los p oblemas que se p e enden sol en a , se pueden ex ae
los equisi os de diseño de la aplicación. La aplicación debe cumpli con las siguien es especi ica-
ciones, odas ellos p esen es en la igu a 1.1:
•In oducción de los da os median e la lec u a de un a chi o de ex o.
•Inclusión de una zona que mues e una lis a con los abajos no asignados (Zona A).
•
Inclusión de una zona que ep esen e el diag ama de Gan de los da os in oducidos (Zona
B).
•
Inclusión de una panel de in o mación que mues e da os de los dis in os elemen os del
diag ama al hace clic sob e ellos (Zona C).
•
Inclusión de un panel de in o mación gené ico que mues e da os gene ales (o indicado es de
endimien o) de la solución ac ual (Zona D).
•
Mecánica de modi ica la solución p opues a modi icando el o den de la plani icación o los
qui ó anos asignados.
3En o no de Desa ollo In eg ado, po sus siglas en inglés.
1.2 Obje i os y equisi os de diseño 5
Figu a 1.1 Esquema de las dis in as zonas de la aplicación, elabo ación p opia.
Pa a ealiza cambios en la p og amación se implemen a á una mecánica d ag and d op que
pe mi a desplaza las ope aciones a ealiza de un qui ó ano a o o o elimina las de la p og amación,
pe o sin al e a el iempo de ope ación den o del mismo qui ó ano. En la igu a 1.1 exis en zonas
adicionales a las exigidas como equisi os de diseño, es o es debido a que du an e el desa ollo de
la he amien a se han ido incluyendo uncionalidades que puedan se de u ilidad, como un zoom o
la posibilidad de gua da las modi icaciones ealizadas en un a chi o di e en e.
Rema ca que el obje i o de es a aplicación no es del de op imiza la p og amación ni plani ica
las in e enciones, sino el de p opo ciona un sopo e g á ico sencillo que pe mi a la modi ica-
ción de los da os p opo cionados ex e namen e. La posición de la aplicación en la cadena de
plani icación/p og amación es la del diag ama de la igu a 1.2.
Figu a 1.2
Esquema del p oceso de plani icación de las in e enciones qui ú gicas, elabo ación
p opia.
Como se puede obse a en la igu a 1.2, los da os del op imizado se end án que ans o ma a
un a chi o de ex o legible po la aplicación empleando un con e so , el cual ampoco se desa olla á
en el ma co de es e abajo de in de g ado.
Jun o a los obje i os que ha de cumpli la aplicación, se han ma cado una se ie de pau as pa a
que el desa ollo de la misma pueda se con inuado en un u u o. Se a a in en a en odo momen o
6Capí ulo 1. In oducción
espe a las con enciones del lenguaje C# con el in de acili a la comp ensión del código. Además,
se a a a a de saca el máximo p o echo a la capacidad de emplea POO
4
que o ece el lenguaje
pa a minimiza el núme o o al de líneas de código.
Asimismo, es a ul ima cualidad pe mi i ía expandi la aplicación, ya que la eu ilización del
código es no ablemen e más sencilla. También se a a busca la op imización del iempo de ejecución
del p og ama ya que, al a a se de una aplicación que maneja g á icos, si se ejecu a en o denado es
con peo p ocesado se pod ía ap ecia lag en la pan alla.
Po úl imo, aunque la necesidad de es a aplicación su ge den o de un g upo de in es igación
en el en o no sani a io, se a a emplea una e minología indus ial con el in de p oduci un
p oduc o gené ico que pueda se implemen ado an o en el en o no sani a io como en la indus ia
con encional. Po es e mo i o se a a emplea du an e odo el documen o la e minología indus ial
( abajo, maquina y ope a io), en luga de la médica. Asimismo, en caso de que la p oducción
del a chi o de en ada sea lo su icien emen e sencilla, es a he amien a se pod ía inco po a a la
docencia en algunas asigna u as adsc i as al depa amen o de O ganización Indus ial y Ges ión de
Emp esas I de la E.T.S.I.
4P og amación O ien ada a Obje os
2 Ma co Teó ico
En
es e capí ulo se a a ealiza una b e e explicación de los undamen os eó icos en los que
se basa la aplicación. De es a mane a, se acili a la comp ensión de la es uc u a in e na del
código, ya que exis e co espondencia cla a en e las clases empleadas en el código y los elemen os
de la plani icación de la p oducción.
Se an a aba ca es concep os p incipales, comenzando po unas nociones básicas que se i án
pa a de ini los elemen os de la o ganización indus ial, los cuales se e án incluidos en la aplicación.
Se con inua á con una in oducción a las me odologías de plani icación, que, a pesa de no se
el obje i o de es a aplicación, son undamen ales pa a ene una isión global de los concep os
an e io men e mencionados. Po úl imo, se explica á con de alle qué es un diag ama de Gan ,
sus pa es y unciones. En caso de que el lec o desee p o undiza en la eo ía de plani icación se
ecomienda acuda a los lib os e e en es de la li e a u a, [F aminan e al., 2014] y [Pinedo, 2012].
2.1 O ganización de la p oducción
La o ganización de la p oducción es la ama de la ingenie ía que se enca ga de dis ibui las dis in as
ó denes de ab icación en el iempo buscando maximiza la u ilización de los ecu sos de la plan a
p oduc i a, op imizando así su endimien o. Den o de la o ganización de la p oducción exis en dos
elemen os p incipales que con o man odo p oblema de plani icación, es os son:
•T abajos
Se en iende po abajo a un obje o el cual debe de se p ocesado en una máquina con el
in de p opo ciona le un alo añadido. A cada uno de es os p ocesos se les conoce con el
nomb e de ope ación y el iempo empleado po la máquina en ealiza los se conoce como
iempo de p oceso. Un abajo puede su i un núme o inde inido de ope aciones en di e en es
máquinas, en unción de su ipología o de la es uc u a de la áb ica, odo es o queda á
explicado con pos e io idad. Exis en di e sos ipos de abajo, como puedan se la p oducción
de una la a de aluminio desde la ma e ia p ima o la ab icación de una ae ona e come cial.
En el ámbi o clínico los pacien es son el equi alen e a los abajos pues o que son los que su-
en las "ope aciones", an o en el sen ido clínico como en el de o ganización de la p oducción.
•Máquinas
Las máquinas son elemen os p oduc i os que o man pa e de la plan a indus ial y pe -
mi en ealiza las dis in as ope aciones sob e los abajos, ya sean de ans o mación o de
anspo e. La dis ibución y es uc u a de las máquinas sob e la áb ica se conoce como
7
8Capí ulo 2. Ma co Teó ico
dis ibución en plan a y puede oma una g an a iedad de o mas, las cuales se explica-
án más adelan e. Las máquinas pueden se desde un simple o no mecánico, has a una
compleja máquina especializada de la indus ia. Den o de la plani icación o ien ada al ámbi-
o clínico los qui ó anos se conside an las máquinas en las que los pacien es son "p ocesados".
T as acla a los elemen os p incipales hay que explica la nomencla u a que se emplea ípicamen e
en p og amación de la p oducción. Además, se emplea una no ación ma icial pa a iden i ica a los
abajos y las máquinas. La no ación más común es:
•n: Núme o de abajos
•m: Núme o de máquinas
•pi j : Tiempo de p oceso del abajo j en la máquina i
•Ci j : Tiempo de inalización del abajo j en la máquina i
•Si j : Tiempo de comienzo del abajo j en la máquina i
•Rj: Ru a de ab icación del abajo j
Como puede ap ecia se la no ación empleada es ma icial, lo que sugie e que el código a a ene
que emplea es o pa a almacena los da os. Cabe des aca que el "ope a io" no se con empla como
elemen o p oduc i o, en el caso de los ci ujanos es os a ec an únicamen e al iempo de p oceso
de cada abajo, pe o es impo an e conside a los pa a cuad a los ho a ios de la plan illa. Si se
habla de la plan a p oduc o a como conjun o exis en una se ie de a iables que si en pa a medi su
p oduc i idad. Es as son las siguien es:
•Capacidad (K)
Núme o máximo de unidades po ho a que puede p oduci la plan a, no malmen e de e minado
po la máquina más len a, denominado cuello de bo ella.
•Tiempo de ciclo
Tiempo anscu ido en e dos unidades consecu i as.
•Tasa de ab icación
Núme o de unidades que se ab ican po unidad de iempo, es la in e sa del iempo de ciclo.
•Tak ime
Tiempo de ciclo con el que se debe ía de p oduci pa a sa is ace la demanda.
Con es o acla ado, al a ía comen a los dis in os ipos de dis ibución de la plan a p oduc o a, en
unción del núme o de máquinas empleadas y el o den de p ocesado de los abajos. O denadas en
unción de su complejidad las dis ibuciones más comunes son las siguien es:
•Máquina única
Es e es el caso más sencillo y se cuen a con una única máquina po el cual han de p ocesa se
odos los abajos. No malmen e es a dis ibución solamen e se encuen a en la eo ía.
•Máquinas pa alelas
Simila a la dis ibución en máquina única pe o añadiendo o as máquinas en pa alelo, el
abajo iene que p ocesa se una única ez en cualquie a de ellas. Es as máquinas pueden se
idén icas, lo cual implica iempos de p oceso idén icos, no elacionadas, donde los iempos
de p oceso a ían con cada máquina, o elacionadas, lo cual implica que el iempo de p oceso
depende de la máquina en unción de un coe icien e que mul iplica el iempo de p oceso de
la máquina "ideal".
2.2 Me odologías de p og amación 9
•Talle de lujo egula
Cons a de un conjun o de máquinas en se ie, de secuencia p e ijada, po las cuales se p ocesa
cada abajo.
•Talle de abajos
Cons a de un conjun o de máquinas en pa alelo, no malmen e con p opósi o di e en es po
las cuales se p ocesa cada abajo, cada uno con una u a p ede e minada.
•Talle abie o
Simila al alle de abajos, pe o en es e caso los abajos deben p ocesa se en cada máquina.
Sin emba go, la u a de es os no es á ijada, po lo que es el obje i o de la p og amación.
•En o no híb ido
El en o no híb ido busca mezcla las dis ibuciones an e io es uniendo máquinas pa alelas
con algún alle . De es a mane a se ienen es ados en luga de máquinas y, en unción del
ipo de alle seleccionado se ob iene la u a de ab icación. En cada uno de esos es ados se
encuen an máquinas en pa alelo, que pueden es a elacionadas o no, o se idén icas.
Pa a el caso de la plani icación en qui ó anos, se iene una dis ibución de máquinas en pa alelo,
las cuales no malmen e son idén icas. Aun así se p e ende da lexibilidad en la aplicación pa a
aba ca cualquie a de los casos p opues os.
2.2 Me odologías de p og amación
En es a sección, se busca analiza las me odologías más comunes de plani icación así como las
es icciones que se han de ene en cuen a a la ho a de plani ica . Es cie o que muchas de es as
es icciones son i iales, pe o no deben pasa se po al o, pues o que al pe mi i en la aplicación
ealiza cambios manuales en la p og amación se puede conside a como una me odología de
p og amación en sí misma, po es e mo i o hay que p e eni que los posibles e o es del usua io e
impedi que es os se p oduzcan, diseñando p o ecciones en el sis ema. Den o de es as es icciones
se encuen an:
•Plani icación ue a de ho a io.
•P ocesa a ios abajos simul áneamen e en la misma máquina.
La p og amación ue a de ho a io signi ica emplea iempo en el cual se supone que la maqui-
na ia es á pa ada como ú il pa a la p og amación. Es a si uación es p oblemá ica, ya que puede
supone paga ho as ex as po pa e de la emp esa. A pesa de es o, en la aplicación se a a pe mi i
p og ama ue a de ho a io (es deci es ando el qui ó ano ce ado) siemp e y cuando se encuen e
den o del ango ep esen ado en el diag ama de Gan . Aún así se an a esal a las zonas ue a de
ho a io pa a que el p opio usua io sepa que esa acción puede supone un cos e adicional pa a la
emp esa. No pe mi i el p ocesado de a ios abajos simul áneamen e en una misma máquina ya
que puede da se el caso de que la capacidad de es a sea supe io a la unidad. Sin emba go, esul a
no ablemen e más sencillo ep esen a una máquina de mayo amaño como a ias "máquinas" de
capacidad uni a ia que hace lo como una única unidad.
Las me odologías de p og amación buscan esol e un p oblema de plani icación conc e o, es e
cons a de unos da os conocidos, en base a los cuales gi a á oda la plani icación. Una ez ijado el
p oblema, los da os que se han de conoce pa a cada abajo son:
• j: Tiempo de llegada del abajo j
16 Capí ulo 3. Manual de uso
Figu a 3.5
Plano de alle del panel de in o mación de los dis in os elemen os del diag ama en unción
de cuál de ellos es é seleccionado, elabo ación p opia.
ealiza zoom desplazando su ma cado . El panel de in o mación gené ica pe mi e conoce el
núme o o al de pacien es an o asignados como no asignados. Además, ambién mues a el iempo
o al p og amado jun o al disponible, de es a o ma se puede ex ae una es imación del ap o echa-
mien o de los ecu sos. En la igu a 3.6 se ep esen a una cap u a de allada de es e panel in o ma i o.
Figu a 3.6
Plano de alle del panel de in o mación gene al de la p og amación, elabo ación p opia.
Debajo de es e panel se encuen a la ba a de zoom, la cual iene un amplio ango de alo es,
pe mi iendo así ep esen a desde una semana en el ancho del diag ama has a únicamen e unas
ho as. Pa a pode p og ama con p ecisión de minu os no es necesa io emplea el zoom al máximo,
con un alo in e medio debe ía de se su icien e. Sin emba go, en caso de que exis an abajos
de la mínima du ación admi ida (1 minu o), se necesi a amplia el diag ama odo lo posible pa a
pode hace clic en los mismos y modi ica su p og amación. Un ejemplo de es e enómeno puede
ap ecia se en la igu a 3.7, donde, si no exis iese el zoom, se ía imposible selecciona la ope ación
3.1 Guía de la in e az 17
del abajo 2 en la máquina 1.
Figu a 3.7
Cap u as de la aplicación que mues an la impo ancia del zoom pa a la selección de
ope aciones, elabo ación p opia.
Po úl imo, cabe menciona que odas las zonas explicadas has a aho a, sal o es as dos úl imas,
disponen de sepa ado es que pueden se modi icados a gus o del usua io. En la igu a 3.8 se
ep esen an dos posibles con igu aciones de la aplicación, una que maximiza el ancho de la lis a,
pa a pode lee los nomb es comple os, y o a que p io iza el amaño del diag ama, con el in de
acili a las modi icaciones en la p og amación.
18 Capí ulo 3. Manual de uso
Figu a 3.8
Compa ación en e dos con igu aciones posibles pa a la aplicación, una que p io iza el
amaño del diag ama (izquie da) y o a que p io iza la lis a y los paneles de in o mación
(de echa), elabo ación p opia.
3.2 Ca ga y gua da a chi os
La ca ga de un a chi o es la p ime a acción que se iene que ealiza al ab i la aplicación. P ime o se
ha de pulsa en el bo ón de a chi o en la esquina supe io izquie da de la pan alla, donde apa ece á
un desplegable. Después se debe selecciona la opción a chi o en el desplegable, ab iéndose un
cuad o de diálogo que pe mi i á selecciona el a chi o de ex o deseado. Comen a que el di ec o io
inicial del cuad o de diálogo, an o pa a gua da como pa a ca ga , es la ca pe a Fiche osEn ada
que se encuen a jun o a los a chi os de la aplicación.
Figu a 3.9 Plano de alle de la opción ab i de la aplicación desa ollada, elabo ación p opia.
Si el p oceso se ha ealizado co ec amen e debe á de apa ece el diag ama de Gan ya ep esen-
ado. En caso de e o de lec u a en el a chi o apa ece á un mensaje desplegable diciendo la línea
del a chi o de ex o en la que se ha p oducido el allo, pe o el código se segui á ejecu ando. Es o da
una pis a al usua io del mo i o del allo en la lec u a. Los e o es más comunes son:
•In oduci un espacio o un ca ác e ilegal donde debe ía de es a una palab a cla e.
•
Fallo o og á ico en las palab as cla e, las cuales deben coincidi en acen os y mayúsculas o
minúsculas.
•La p opiedad an e io a la línea del allo iene un núme o de lineas dis in o al necesa io.
•Inclusión de una p opiedad sin desa olla o de la clase Ope a io sin emplea la.
Comen a que la aplicación no dispone de p o ecciones que e isen el a chi o de en ada, ya que
en un p incipio la plani icación in oducida p o iene de un so wa e especializado de al a iabilidad.
Po es e mo i o, al in oduci el a chi o se pe mi e que dos abajos se solapen en una máquina
o es én ue a de ho a io. En caso de que se in oduzca un a chi o elabo ado a esanalmen e se
ecomienda e isa que es os enómenos no se hayan p oducido.
3.3 Modi icación de la p og amación 19
Figu a 3.10
Ejemplo de cuad o de diálogo pa a la selección de a chi o en la aplicación desa ollada,
elabo ación p opia.
El p oceso pa a gua da el a chi o es igual de sencillo, se accede al mismo menú desplegable
y se selecciona la opción de gua da como. En el cuad o de diálogo que apa ece se debe esc ibi
un nomb e pa a el a chi o, si se desea c ea uno nue o, o selecciona un a chi o exis en e pa a
sob esc ibi lo. Una ez ealizada es a ope ación el a chi o ac i o pasa a se el gua dado.
3.3 Modi icación de la p og amación
Po úl imo queda comen a como se han de ealiza las acciones d ag and d op pa a modi ica la
plani icación. La p ime a condición que se ha de cumpli es la de que el abajo es é seleccionado,
ya sea pa a inicia el d ag and d op en la lis a o en el diag ama. Una ez es e es á seleccionado, se
debe pulsa el bo ón izquie do del a ón sob e el abajo seleccionado y desplaza lo man eniendo el
bo ón p esionado, lo cual p oduci á que un ec ángulo con el amaño y el colo del abajo al cual
ep esen a apa ezca bajo el cu so y lo pe siga. Es o queda ep esen ado en la igu a 3.11 En el caso
de comenza el d ag and d op desde la lis a, se ha de lle a el a ón has a la zona del diag ama pa a
que apa ezca el ec ángulo.
Pa a lis as ambién exis e o a condición, la de que el abajo no es é p og amado comple amen e,
pa a conoce si la cumple o no, se puede mi a en el panel de in o mación o il a la lis a po
abajos no p og amados. En caso de que se in en e p og ama un abajo que ya lo es á, apa ece á
un mensaje en la pan alla. Des aca que si en la lis a se selecciona un ope a io, puede pa ece en el
diag ama que el abajo es á seleccionado, cuando solamen e apa ece esal ado. Pa a comp oba lo
bas a con mi a en el panel de in o mación, busca si hay más de un abajo esal ado o hace clic
de nue o en el abajo pa a asegu a su selección.
Du an e la ejecución se pueden ap ecia lige os cambios en la aplicación, odos ilus ados en
la igu a 3.12, donde se es á modi icando el abajo de colo osa. El cambio más llama i o de
ellos es que mien as el a ón es e p esionado el cu so no pod á sali del ec ángulo cons i uido
20 Capí ulo 3. Manual de uso
Figu a 3.11
Cap u a que mues a cómo se comienza un e en o d ag and d op en la aplicación con
la consiguien e desp og amación del abajo seleccionado, elabo ación p opia.
Figu a 3.12 Cap u a de la aplicación du an e el e en o d ag and d op,elabo ación p opia.
po el diag ama ( ec ángulo ojo). Además, en caso de ap oxima se a los bo des el diag ama se
desplaza á en esa di ección, acili ando la colocación del abajo. Cuando el ec ángulo se desplace
sob e las di e en es máquinas, i á a iando de amaño en unción del iempo de p oceso del abajo
seleccionado en la máquina sob e la que se encuen e. Además, a modo de ayuda, en la esquina
supe io izquie da del diag ama apa ece án las ho as de inicio y de in del abajo en la posición en
la que se encuen e.
3.3 Modi icación de la p og amación 21
3.3.1 Validación de las nue as echas y eliminación de ope aciones
Una ez en endidas las modi icaciones en la aplicación, es necesa io es udia los c i e ios que
emplea la aplicación pa a alida la nue a p og amación. T as inicia el d ag and d op, la ope ación
del abajo seleccionado se elimina, po lo que apa ece ía en la lis a de abajos no asignados como
puede e se indicado en la igu a 3.11. En caso de que el abajo es é p og amado pa cialmen e o se
inco po e desde la p opia lis a, no se p oduci ía ningún cambio en la misma. Cuando se ha hecho
es o se puede desplaza el abajo lib emen e po el in e io del diag ama. Con o me se coloca el
abajo en dis in as posiciones, se puede ap ecia que apa ece un ec ángulo somb eado ep esen ado
en el diag ama, el cual indica las zonas donde se puede coloca el abajo en cues ión. Además,
siemp e que es e apa ezca ep esen ado, la ayuda de la esquina supe io izquie da ambién lo ha á.
En la igu a 3.13 apa ece el ec ángulo somb a que se á el des ino del abajo en caso de que e
ealiza la asignación en ese momen o.
Figu a 3.13
Cap u a que mues a el p oceso de asignación de un abajo una ez se ha iniciado el
d ag and d op,elabo ación p opia.
En caso de que se libe e el a ón mien as el ec ángulo somb eado no es á dibujado, el abajo
queda á eliminado de la p og amación, como queda ilus ado en la igu a 3.14. Aunque la o ma de
elimina los abajos más in ui i a puede se el desplaza el abajo has a la lis a, es o no es posible,
ya que los bo des del diag ama se emplean pa a la implemen ación de su sc oll. Po es e mo i o se
incluye a con inuación una lis a de posiciones en las cuales el ec ángulo somb a no apa ece á, pa a
que sea más sencilla la eliminación de ope aciones:
•El abajo se es á in en ando p og ama en e dos días di e en es.
•
El abajo se es á in en ando p og ama en una máquina que ya iene ope aciones p og amadas
en el in e alo empo al deseado.
•
El abajo se es á in en ando p og ama en una máquina en la que ya iene una ope ación
asignada.
•
El abajo se es á in en ando p og ama en una máquina, la cual se encuen a en una posición
pos e io /an e io en su u a de ab icación, siendo la echa de es e an e io /pos e io a la
22 Capí ulo 3. Manual de uso
ope ación ya p og amada en la o a máquina. Es a es icción solamen e es á ac i a pa a el
caso de alle de abajos o alle de lujo.
•
El abajo se es á in en ando p og ama en un in e alo empo al en el que ya es a p og amada
una ope ación del mismo en o a máquina. Como es lógico el modelo de máquinas pa alelas
no es a suje o a es a es icción.
•
El abajo se encuen a ue a del diag ama, ya sea en la zona in e io o en el ma gen de echo.
Figu a 3.14
Cap u a que mues a el p oceso de eliminación de un abajo una ez se ha iniciado el
d ag and d op,elabo ación p opia.
3.3.2 Ayudas a la p og amación
Como se puede deduci de la lis a de es icciones, p og ama dos abajos consecu i os es una
a ea complicada, ya que si se solapan aunque sea po un minu o el ec ángulo somb a deja de
apa ece . Po es e mo i o se han inco po ado una se ie de ayudas pa a p og ama los abajos, las
cuales son aplicables an o pa a p og ama un abajo al inicio o in del día como con inuación de
una ope ación ya p og amada, ya sea del mismo abajo en o a máquina o de o os abajos en la
máquina deseada. Es e sis ema de ayudas se puede e ep esen ado en la igu a 3.15 y básicamen e
consis e en ep esen a el ec ángulo somb a en la posición más ce cana pe mi ida, la cual se ob iene
haciendo un ba ido de posiciones den o de unos lími es espec o a la posición ac ual del abajo
que es á siendo p og amado.
3.4 Ejemplos
En es a sección se p e enden inco po a dis in os ejemplos que e lejen las posibilidades de diag amas
de Gan que la aplicación puede ep esen a . No se en a á en de alle en los a chi os de en ada
pues o que es o se comen a á en el capí ulo de es uc u a del código. La aplicación puede ep esen a
diag amas pa a las dis ibuciones en plan a más comunes, como puedan se máquinas pa alelas
( igu a 3.16), alle de lujo ( igu a 3.17) o alle abie o ( igu a 3.18). También se puede ep esen a
3.4 Ejemplos 23
Figu a 3.15
Ilus ación de las di e en es ayudas a la p og amación inco po adas en la aplicación,
es as son el ajus e al in/inicio del día (a iba a la izquie da), ajus e con espec o a
o as ope aciones del mismo abajo (a iba a la de echa) y ajus e con espec o a o as
ope aciones (abajo), elabo ación p opia.
un alle de abajos, pe o es e es simila al ejemplo de alle abie o (ya que lo único que a ía es
que la u a no se puede modi ica ) y po an o se ha omi ido como ejemplo.
Figu a 3.16
Ejemplo de un diag ama de Gan de un modelo de máquinas pa alelas p oducido po
la aplicación desa ollada, elabo ación p opia.
24 Capí ulo 3. Manual de uso
Figu a 3.17
Ejemplo de un diag ama de Gan de un alle de lujo p oducido po la aplicación
desa ollada, elabo ación p opia.
Figu a 3.18
Ejemplo de un diag ama de Gan de un alle abie o p oducido po la aplicación
desa ollada, elabo ación p opia.
4 Es uc u a del código
Una
ez acla ados los concep os básicos de la p og amación de la p oducción y las uncio-
nalidades de la aplicación, se puede p ocede con el análisis de las decisiones de diseño
omadas pa a su desa ollo. A lo la go de es e capí ulo se expond á la es uc u a de clases empleada
pa a el backend de la he amien a, así como de los con oles pe sonalizados necesa ios pa a la
ep esen ación de los da os. También se da á una explicación del código empleado pa a la lec u a
del a chi o de ex o así como ins ucciones sob e cómo elabo a la es uc u a del mismo.
Asimismo, se explica án las en ajas de la solución escogida en e a o as posibilidades exis en es
y se comen a á el mo i o de ás de las uncionalidades adicionales inco po adas en la he amien a.
Como la ex ensión del código es conside able, se ha op ado po no comen a cada una de las uncio-
nes p og amadas con de alle, pe o se deja á indicado una b e e desc ipción del uncionamien o de
las más ele an es.
En caso de que se quie a expe imen a con el código, o e en de alle la mane a de ope a de una
unción, se anexa á odo el código al inal del documen o. Además, de es a mane a, un u u o p o-
g amado pod á emplea es e documen o como pun o de pa ida pa a las labo es de man enimien o
de la he amien a o añadi nue as uncionalidades.
El ni el de las explicaciones que se encon a án a con inuación asume que se conocen an o el
lenguaje C# como la he amien a Windows Fo ms a ni el usua io. En el caso de es a amilia izado
con o os lenguajes POO y desa ollo de in e aces g á icas, la comp ensión de los concep os de
es e capí ulo no debe de se complicada. En caso de que no sea así, se ecomienda una lec u a p e ia
de algún manual o u o ial del lenguaje y, en caso de que su ja alguna duda de e minología, se
acuda a la documen ación o icial de C# p opo cionada po Mic oso .
4.1 Es uc u a de clases
Una es uc u a de clases bien plani icada es esencial pa a educi el olumen o al de líneas de
código de cualquie aplicación in o má ica, y en es e caso no iba a se di e en e. Po es e mo i o se
ha op ado po c ea una clase pa a cada elemen o p oduc i o, una pa a los abajos, o a pa a las
maquinas y o a pa a los ope a ios. De es a mane a, cada uno de los obje os de las clases iene una
se ie de p opiedades como puedan se su nomb e o una b e e desc ipción de sí mismos, en luga de
emplea ec o es pa a almacena los da os.
Es e en oque se aleja conside ablemen e del adicional, en el que se abaja únicamen e con
ma ices (una con los iempos de p oceso y o a con las echas de inicio o in), pe mi iendo almacena
25
32 Capí ulo 4. Es uc u a del código
pa a la p og amación, es os son el núme o o al de abajos, núme o de máquinas y días o ales de
la p og amación (con ando el o igen de p og amación den o de es a cuen a), in oducidos como
en e os sepa ados po espacios.
Con es os da os ya se puede comenza con la lec u a del es o de bloques, po lo que se pueden
deja una o a ias líneas en blanco an es de in oduci la palab a cla e Maquina, seguida de an as
ilas como máquinas haya. En cada una de las ilas se encon a an los iempos de p oceso de cada
abajo en cada máquina o denados po columnas. En caso de que las máquinas sean idén icas dichos
iempos debe án de se iguales. Después hay que de e mina los días que la máquina es á ope a i a,
po lo que se ha de in oduci el ho a io de cada máquina pa a odos los días de la p og amación.
Si es os ho a ios no ue an in oducidos, las máquinas conside a án pa adas (qui ó anos ce ados)
odos los días. Pa a ello se debe esc ibi la palab a cla e Ho a io seguida de an as ilas como
máquinas haya. En cada una de es as ilas se esc ibi án los ho a ios de cada día, comenzando po el
o igen, sepa adas en e ellas po el ampe sand (&). Es os ho a ios se esc ibi án como una cadena
de núme os decimales sepa ados po espacios, es uc u a ya explicada en la sección dedicada a la
clase máquina.
Es muy impo an e que pa a los decimales se emplee una coma y que el núme o de ho as de
ape u a y cie e sean iguales. Si se deja un espacio acío en e dos ampe sand (& &) el qui ó ano
se conside a á ce ado ese día. A con inuación i ían las dis in as p opiedades, pe o la esc i u a de
las mismas se explica á más adelan e.
T as deja una línea acía comenza ía el bloque de ope a ios, en caso de que se quisie a inclui ,
si se omi e no se debe á esc ibi nada. Pa a inco po a es e bloque se debe in oduci la palab a
cla e ope a io y en la siguien e línea el núme o o al de ope a ios. Con es o se ía su icien e y se
pod ía con inua con las p opiedades.
Po úl imo se ealiza la lec u a de los abajos, pa a ello se esc ibe la palab a cla e T abajo
seguida de la palab a cla e Ru aFab icacion. A con inuación se esc iben an as líneas como aba-
jos haya y en cada línea la u a de ab icación al y como se ha explicado en el apa ado clase T abajo.
Después se debe esc ibi la palab a FechaFin o FechaInicio, según se quie an in oduci las
echas en las cuales inalizan o comienzan a p ocesa se los abajos en cada una de las máquinas.
Pos e io men e se in oducen an as ilas como abajos haya y en cada columna el núme o en e o
de minu os desde la echa o igen de p og amación (conside ando las 00:00 de ese día) que ma can
la echa de inicio o in de p oceso de ese abajo en cada máquina, sepa adas po espacios. En caso
de que ese abajo no se asigne se esc ibi á un núme o nega i o, no malmen e -1.
Finalmen e, en caso de que haya op ado po inclui los ope a ios asignados a cada abajo se debe
de inclui la palab a cla e Ope a ioAsignado seguida de la palab a cla e ID, la cual indica que se
an a emplea los iden i icado es de los ope a ios pa a asigna los. Se deben esc ibi an as ilas
como abajos haya y en cada una de ellas los iden i icado es de los ope a ios asignados al abajo
en cues ión sepa ados po espacios. Si un abajo no u iese ope a io asignado se debe á deja la
línea que le co esponda en blanco.
P opiedades
Una ez explicado el g ueso del a chi o se a a con inua con la o ma en la que se ha de in oduci
cada p opiedad y los elemen os a los cuales a asignado. Todas es as p opiedades se comienzan a
lee cuando se esc ibe su palab a cla e y ienen que encon a se den o del bloque en el cual an a
4.2 Mé odo de in oducción y ex acción de da os 33
se aplicadas, sin deja una línea acía en e el in de esc i u a de una p opiedad y la palab a cla e
de la siguien e.
•Nomb e
P opiedad aplicable a abajo, ope a ios y máquinas puede se una máquina un abajo o un
ope a io. Pa a su lec u a se esc iben en la línea siguien e a la palab a cla e los nomb es en
cues ión de cada elemen o sepa ados po ampe sand (&).
•Desc ipción
P opiedad aplicable a abajo, ope a ios y máquinas puede se una máquina un abajo o un
ope a io.. T as la palab a cla e se in oducen an as líneas como elemen os haya y en cada
ila se esc ibe la desc ipción.
•Rendimien o
Es a p opiedad únicamen e aplicable a máquinas y se in oduce como alo es decimales,
empleando la coma como el sepa ado de decimales, di ididos po espacios, en la línea que
sigue a la palab a cla e. El p ime alo co esponde a la p ime a máquina, el segundo a la
segunda y así sucesi amen e. En caso de no in oduci se el alo p ede e minado es 1 po lo
que en caso de máquinas idén icas odas end án los mismos iempos de p oceso.
Es as p opiedades son odas opcionales y se pueden inco po a más a gus o del consumido .
Algunas posibilidades son el DNI o el núme o de la segu idad social.
4.2.2 Ejemplos de iche o de en ada
En es a sección se adjun an dos iche os de en ada jun o a sus diag amas p oducidos. Se ha in en ado
que cada iche o sea lo más b e e posible, pe o que incluya odos los elemen os ca ac e ís icos del
iche o de en ada. La única di e encia en e ambos iche os es que el p ime o incluye ope a ios y
es de máquinas pa alelas mien as que el segundo no incluye ope a ios y es un alle de lujo.
Ejemplo máquinas pa alelas
7 9 2020
733
Maquina
214 220 133 66 126 37 118
214 220 133 66 126 37 118
214 220 133 66 126 37 118
Ho a io
7 14 17 20 & &7 14 17 20
7,5 14,5 & &7,5 14,5
7 15 & &7 15
Nomb e
Qui o ano 0&Qui o ano 1&Qui o ano 2
Desc ipcion
Desc ipcion Qui o ano 0
Desc ipcion Qui o ano 1
Desc ipcion Qui o ano 2
Rendimien o
111
Ope a io
34 Capí ulo 4. Es uc u a del código
4
Nomb e
Ci ujano 0&Ci ujano 1&Ci ujano 2&Ci ujano 3
Desc ipcion
Desc ipción Ci ujano 0
Desc ipción Ci ujano 1
Desc ipción Ci ujano 2
Desc ipción Ci ujano 3
T abajo
Ru aFab icacion
-1
-1
-1
-1
-1
-1
-1
FechaInicio
-1 -1 420
-1 -1 3300
3300 -1 -1
420 -1 -1
-1 453 -1
-1 599 -1
486 -1 -1
Nomb e
T abajo 0&T abajo 1&T abajo 2&T abajo 3&T abajo 4&T abajo 5&T abajo 6
Desc ipcion
Desc ipcion T abajo 0
Desc ipcion T abajo 1
Desc ipcion T abajo 2
Desc ipcion T abajo 3
Desc ipcion T abajo 4
Desc ipcion T abajo 5
Desc ipcion T abajo 6
Ope a ioAsignado
ID
0 3
2 3
2
1 2
0
0 2
4.2 Mé odo de in oducción y ex acción de da os 35
Figu a 4.3
Diag ama de Gan ep esen ando un modelo de máquinas pa alelas, p oducido po el
iche o de ejemplo co espondien e, elabo ación p opia.
Ejemplo alle de lujo
4 9 2020
741
Maquina
42 7 13 10 39 25 49
23 17 35 28 13 19 45
9 44 42 21 40 18 36
54 25 8 15 30 40 51
Ho a io
7 15
7 15
7 15
7 15
Nomb e
Maquina 0&Maquina 1&Maquina 2&Maquina 3
Desc ipcion
Desc ipcion Maquina 0
Desc ipcion Maquina 1
Desc ipcion Maquina 2
Desc ipcion Maquina 3
Rendimien o
1111
T abajo
Ru aFab icacion
0123
0123
0123
0123
0123
0123
0123
FechaInicio
420 462 485 494
462 485 502 548
36 Capí ulo 4. Es uc u a del código
469 502 546 588
482 537 588 609
492 565 609 649
531 578 649 679
556 605 667 719
Nomb e
T abajo 0&T abajo 1&T abajo 2&T abajo 3&T abajo 4&T abajo 5&T abajo 6
Desc ipcion
Desc ipcion T abajo 0
Desc ipcion T abajo 1
Desc ipcion T abajo 2
Desc ipcion T abajo 3
Desc ipcion T abajo 4
Desc ipcion T abajo 5
Desc ipcion T abajo 6
Figu a 4.4
Diag ama de Gan ep esen ando un alle de lujo, p oducido po el iche o de ejemplo
co espondien e, elabo ación p opia.
4.2.3 Me odología de lec u a y esc i u a
En es e apa ado se an a da unas nociones básicas del uncionamien o de los mé odos que pe mi en
la lec u a y la esc i u a del a chi o. Ambos necesi an como a gumen o la u a que llega has a el
4.3 Con oles de la aplicación 37
a chi o que debe se leído o gua dado, la cual se ob iene de los cuad os de diálogo.
Con es o in oducido se c ea un S eamReade o S eamW i e pa a modi ica el a chi o. En el
caso de la lec u a del a chi o p ime o se leen las líneas de los da os gene ales y después se an
leyendo las clases. Más a de se leen las ca ac e ís icas gene ales de cada clase y después una palab a
cla e seguida de an as líneas como necesi e la p opiedad. En caso de que cuando se lea una línea
en la que debe de es a una palab a cla e no haya sal a un mensaje de e o con la línea en cues ión.
La esc i u a es no ablemen e más sencilla ya que consis e en ep oduci el iche o de en ada con
los da os que se ienen. Cabe des aca que el mé odo de de esc i u a inco po a odas las p opiedades
en el a chi o de salida, independien emen e de si se han in oducido en la en ada o no, de ol iendo
cadenas de ex o acías en las p opiedades de las que no se in odujo alo .
4.3 Con oles de la aplicación
Pa a pode ep esen a in o mación en cualquie aplicación in o má ica desa ollada en Windows
Fo ms es necesa ia la implemen ación de con oles de usua io, especialmen e si se p e ende pe mi i
in e acción con el mismo. De es e modo los da os almacenados, que han sido in oducidos em-
pleando el código in e no analizado con an e io idad, pueden p esen a se de una mane a o denada,
concisa y cla a. Desa o unadamen e, los con oles p opues os en la he amien a Windows Fo ms
son simples, po lo que no bas a con emplea los pa a que cub an las necesidades de uncionamien o
de la aplicación. Po es e mo i o se han enido que desa olla di e sos con oles complemen a ios,
los cuales ienen una base común llamada Con olGan , de i ada de la clase base Con ol p opo -
cionada po Windows Fo ms.
El p incipal obje i o de la clase es acili a la sinc onización de los con oles que he eden de
la misma, pe mi iendo ac ualiza sus g á icos simul áneamen e sin necesidad de emplea código
ex e no a los mismos. La clase Con olGan do a a odos sus con oles he edados de una lis a in e na
llamada con olesEnlazados que ag upa el conjun o de con oles con los cuales es án enlazados.
Un Con olGan que iene o os en su lis a con olesEnlazados dispone de a ios mé odos que
le pe mi en ac ualiza sus g á icos de la mane a que se desee. Es os mé odos son idén icos a los
adicionales, los cuales se analiza án con de alle jun o a la clase Diag amaGan , pe o se les añade
la palab a Linked a con inuación, uno ejemplo de ellos es el mé odo Re eshLinked().
Pa a enlaza y desenlaza los con oles de la clase Con olGan se emplean dos mé odos es á icos
de la misma, UnLink( a a gs) y link( a a gs). Ambos oman como a gumen os un a ay de
Con olGan , el p ime o desenlaza cada con ol del a ay de los con oles en los que es é enlazado
y el segundo enlaza odos los con oles in oducidos en e si, llamando a Unlink( a a gs) pa a cada
con ol an es de ealiza los enlaces.
La igu a 4.5 ep esen a el diag ama de clases de i adas de Con olGan , las cuales con o man
los con oles empleados pa a la elabo ación de la aplicación. Las p incipales son Lis BoxGan , la
LabelGan y Diag amaGan , las cuales ep esen an la clase gené ica de la lis a de elemen os de
plani icación, la clase gené ica de paneles de in o mación y el diag ama de Gan , espec i amen e.
Un pun o posi i o de es a implemen ación es que, en caso de que e elabo a una aplicación
simila , se pueden ecicla odos los con oles sin la necesidad de implemen a los odos en la nue a
he amien a. Po ejemplo, se pod ía c ea una aplicación únicamen e con el diag ama y el panel de
in o mación o solamen e la lis a de abajos y el diag ama.
38 Capí ulo 4. Es uc u a del código
Figu a 4.5 Diag ama de clases que de i an de Con olGan , elabo ación p opia.
4.3.1 Clase Diag amaGan
La ep esen ación del diag ama es la uncionalidad p incipal de la aplicación, po es e mo i o es en
la clase Diag amaGan donde se ha in e ido una mayo can idad de ho as de abajo. El obje i o
de es a clase es ep esen a un diag ama de Gan in e ac i o, sal agua dando posibles p oblemas
de lag a la ho a de e esca la pan alla. Exis en a ias mane as elabo a un diag ama de Gan con
es as ca ac e ís icas, cada una con sus en ajas e incon enien es.
Una de ellas consis e en ep esen a los ejes del diag ama de Gan como un dibujo en un Pic-
u eBox, mien as que pa a los abajos ep esen ados en su in e io se emplean paneles c eados
dinámicamen e. Es o acili a la implemen ación de la mecánica de selección po clic o el d ag and
d op. El p incipal p oblema su ge al ele a el núme o de abajos, ya que es o p o oca que exis a
una can idad excesi a de paneles ac i os al mismo iempo, po lo que el lag del p og ama se uel e
limi an e. Po es e mo i o es ecomendable que la ep esen ación del diag ama no sea con inua y se
deba agmen a po pe iodos empo ales, como puedan se semanas.
Aunque es a solución ha sido p obada con cie o g ado de éxi o en una aplicación del depa a-
men o [
Dios e al., 2015
], se ha buscado explo a nue as soluciones que pe mi an la elabo ación de
un diag ama con inuo sin que se penalice el endimien o de la he amien a. La p incipal p opues a
es emplea un diag ama dibujado en un Pic u eBox, que incluya an o a los ejes del diag ama como
la ep esen ación de los abajos, necesi ando así un único con ol. De es a o ma se educe el
núme o o al de con oles de un alo inde inido a un alo ijo, aunque el amaño o al del diag ama
segui á a ec ando al endimien o, ya que el iempo necesa io pa a ep esen a lo es p opo cional a
sus dimensiones.
El p incipal incon enien e de es a p opues a es que implemen a la mecánica de clic es lige a-
men e más complicada que en o as soluciones, ya que no se puede basa en el e en o clic de cada
Panel sino en el del con ol p incipal. No obs an e las en ajas que se ob ienen compensan es os
incon enien es, ya que se puede ealiza sc oll empleando la mecánica click and d ag y además se
gana en endimien o.
Implemen ación del sc oll y ep esen ación del diag ama
A la ho a de ealiza un diag ama con inuo la p ime a di icul ad que su ge es la de ep esen a los
ejes el diag ama en odo momen o mien as el usua io se desplaza po el mismo. Se puede op a po
4.3 Con oles de la aplicación 39
no inco po a es a ca ac e ís ica pe o, si el diag ama es excesi amen e g ande, es p obable que los
ejes de empo ales o de máquinas se escondan di icul ando la in e p e ación del mismo. La solución
a es e p oblema no es i ial pe o se puede llega a ob ene un esul ado de una calidad acep able
di idiendo el diag ama p incipal en 4 paneles independien es como se indica en la igu a 4.6.
Figu a 4.6
Di isión del con ol Diag amaGan en los paneles independien es que lo con o man,
elabo ación p opia .
Cada uno de es os paneles ep esen a á uno de los elemen os básicos del diag ama, siendo es os
los ejes ( ojo y ama illo), la esquina supe io (azul), la cual es empleada p incipalmen e pa a ocul a
los paneles al hace sc oll, y el diag ama en sí mismo ( e de). Todos ellos ienen en su in e io
inco po ados una Pic u eBox donde se ep esen a á el agmen o del diag ama co espondien e, el
cual le da á las dimensiones al con ol. El panel de la esquina y el del diag ama ienen el amaño
jus o pa a apa ece den o del panel p incipal, pe o los ejes ienen las dimensiones de sus espec i os
Pic u eBox. Es o úl imo ha de se así pa a pode acopla el mo imien o de los ejes al Au oSc oll del
panel del diag ama p incipal, el cual es a á ac i o y se eajus a á su amaño mínimo pa a acomoda
la Pic u eBox del diag ama.
Pa a consegui que los g á icos del diag ama se man engan sinc onizados se han p og amado
dos mé odos, Ajus a PosicionesSc oll() y Ajus a Geome iaPaneles(). El p ime o sinc oniza la
posición de los ejes con el diag ama y el segundo eajus a el amaño de los paneles en caso de que
se modi ique el amaño del diag ama, además de llama a Ajus a PosicionesSc oll().
Con es a ca ac e ís ica pulida e implemen ada ya se puede p ocede a dibuja el diag ama, ya que
si el sc oll no uese posible no end ía sen ido p osegui con el desa ollo del diag ama empleando
es a solución. La me odología de ep esen ación de los g á icos se á analizada al inal de es a sección
debido a que no se ha empleado un mé odo con encional, como pueda se dibuja los elemen os
en el e en o Pain , con el in de mejo a el endimien o. Al a a se de un con ol se ha buscado
pa ame iza odas las p opiedades del diag ama con el in de acili a modi icaciones del mismo,
ya sea en iempo de ejecución o a sus alo es p ede e minados. Es as p opiedades se pueden e en
la igu a 4.7 en la que apa ecen los componen es básicos sin inclui ni abajos ni ho a ios. A modo
de leyenda de la igu a 4.7 se a a inclui a con inuación un lis ado con dichas p opiedades:
•AAl oMaquina
•BSepa acionMaquina
•CAnchoHo a
•DSepa acionHo a
40 Capí ulo 4. Es uc u a del código
•EAl oEjeDias
•FExcesoSupe io LineasVe icales
•GAnchoEjeMaquinas
•HExcesoIzquie doLineasHo izon ales
•IExcesoIn io LineasVe icales
•JExcesoDe echoLineasHo izon ales
•KExcesoLíneasSecunda ias
Figu a 4.7
Esquema de las di e en es p opiedades que modi ican el aspec o ísico del diag ama de
Gan ep esen ado, elabo ación p opia.
De odas es as p opiedades las más ele an es son el al o de la máquina y el ancho de la ho a,
ya que de inen en g an medida las dimensiones del diag ama. No se ha seleccionado el ancho del
día como pa áme o p incipal debido a que es e depende del núme o de ho as po día que se hayan
de inido, po lo que puede ocu i que es e amaño sea demasiado pequeño como pa a ep esen a
co ec amen e el diag ama. A la p opiedad AnchoHo a solamen e se le pe mi e oma alo es que
sean múl iplos de 4, es o se debe a que es el alo necesa io pa a que la ep esen ación de las líneas
secunda ias y e cia ias sea iel al núme o de píxeles exis en es. De es a mane a no se ob ienen
acciones de píxeles al di idi las ho as en medias ho as o cua os de ho a.
Todas las p opiedades que comienzan po exceso indican la longi ud de las líneas que sob esalen
po cada uno de los ex emos del diag ama. En el caso de las líneas secunda ias es o sucede an o
po encima como po debajo del diag ama.
Exis en una se ie de p opiedades que ambién o man pa e del diag ama y pod ían se al e adas
en iempo de ejecución en unción del diag ama ep esen ado si ue a necesa io, como el núme o
de días de la p og amación, la echa de o igen o la ho a más emp ana y más a día ep esen adas,
pe o que son ob enidas di ec amen e de la clases p incipales en las que es án almacenadas. También
se puede modi ica la uen e y el amaño de los ex os que apa ecen en el diag ama.
Dibuja el esquele o del diag ama una ez de inidas las p opiedades es i ial, aún así se es ima
opo uno comen a los mé odos DibujaLineasPa alelas( a a gs), DibujaSe ieS ings( a a gs). El
4.3 Con oles de la aplicación 41
p ime o, como su nomb e indica, se emplea pa a dibuja líneas pa alelas a lo la go de un eje con un
ángulo de e minado. El segundo calcula una se ie de ec ángulos en base aun eje y en el in e io de
cada uno ep esen a un s ing in oducido.
Pa a dibuja las ope aciones de cada abajo se ha de abaja únicamen e con el panel dedicado
a esa unción, po lo que la a ea se acili a. El p incipal p oblema es ubica cada ope ación en
un ec ángulo den o del Pic u eBox del diag ama, es a a ea se consigue empleando un mé odo
llamado Ge Rec anguloDiag ama( a a gs), el cual oma como a gumen os un iempo de p oceso,
una máquina y una echa de inicio.
Con es os da os el mé odo de uel e las coo denadas y el amaño del ec ángulo que ep esen a ía
a la ope ación in oducida en el in e io del diag ama. De es a o ma se puede ep esen a cada
abajo en el diag ama, ya que bas a ía con dibuja ese ec ángulo, pe o ambién se puede de ec a
si la posición del a ón es á con enida den o de dicho ec ángulo, lo cual se á de u ilidad pa a
implemen a los e en os clic.
Po úl imo, ep esen a los ho a ios de las máquinas no es excesi amen e complicado, pe o se ha
de ene cla o la mane a en la que se o ganizan los ho a ios. Se ha p og amado un mé odo llamado
DibujaHo a io( a a gs) que dibuja el ho a io de un día conc e o dadas las ape u as, los cie es, el
día con espec o al o igen y la máquina.
In e acción del usua io
Una ez ep esen ado el diag ama el siguien e obje i o ha de se el de pe mi i que el p opio usua io
pueda in e ac ua con él. Es a clase pe mi e es o mas de in e acción que son el de clic and d ag , la
del clic y la de d ag and d op. La p ime a habili a el desplazamien o po el diag ama sin necesidad
de usa las ba as la e ales, la segunda es necesa ia pa a selecciona los abajos o maquinas en el
diag ama y la e ce a pe mi e la modi icación de la plani icación.
Aunque no es es ic amen e necesa ia la implemen ación de un click and d ag, es a ca ac e ís ica
es muy ag adecida, ya que es p e e ible desplaza se po una imagen o diag ama empleando el a ón
en luga de las ba as la e ales. Además, una ez la mecánica del sc oll es á conseguida, elabo a
un código que pe mi a ealiza un click and d ag es una a ea bas an e sencilla. Bas a con egis a
la posición del a ón cuando se pulsa el bo ón izquie do y, si es e se desplaza man eniendo el bo ón
p esionado, modi ica los alo es de las Sc ollBa s del Au oSc oll una can idad igual a la di e encia
de posiciones del cu so en e el inicio y el in. Es e p oceso se debe á epe i siemp e que el bo ón
se man enga p esionado.
Pa a la implemen ación del e en o clic es necesa io emplea el mé odo Ge Rec anguloDiag a-
ma( a a gs) jus o cuando se dispa a el e en o. Se ealiza un bucle de dicho mé odo pa a odos los
abajos exis en es en ese momen o y, en el caso de que uno de esos ec ángulos con enga la posición
del cu so , se cambia el alo de su p opiedad seleccionado y se edibuja el diag ama. Empleando
la misma écnica se puede iden i ica si el abajo que con iene al cu so es á seleccionado, po lo
que, si en ez de hace clic se mue e el a ón sob e el abajo seleccionado, se dispa a ía un e en o
de D agEn e en luga de inicia se un click and d ag.
Una ez dispa ado el e en o D agEn e se elimina la ope ación seleccionada del abajo y se
uel e a pin a el diag ama. En es e momen o un panel con el nomb e de panelT abajo es mos ado
y desplazado a la posición del cu so , con el amaño y colo de la ope ación eliminada. Además, se
es inge el desplazamien o del a ón al cuad o del diag ama si se man iene el bo ón p esionado.
5 Conclusiones
Con
la aplicación ya inalizada, es necesa io hace un análisis de la misma, pa a e alua si los
obje i os plan eados han sido alcanzados sa is ac o iamen e. Asimismo, es ecomendable
ex ae conclusiones del abajo ealizado, pa a analiza los e o es come idos y e i a epe i los en
un u u o. En es e capí ulo, ambién se an a deja p opues as de mejo a y suge encias de nue as
uncionalidades que se pueden implemen a en la aplicación.
La aplicación p opues a cumple los obje i os p opues os con c eces, apo ando uncionalidades
ex a a las eque idas po diseño. Se ha ob enido una he amien a que puede implemen a se en un
en o no p oduc i o gené ico y además con iene las uncionalidades necesa ias pa a su u ilización
en el en o no sani a io. La aplicación no solamen e b inda la posibilidad de gene a diag amas
au omá icamen e, sino que además pe mi e la modi icación de la p og amación. Es o habili a la
posibilidad de inco po a nue os abajos en el ho izon e o, en el caso del en ono qui ú gico, añadi
pacien es de u gencia.
La implemen ación del d ag and d op an o en la lis a como en el diag ama pe mi en una modi ica-
ción in ui i a de la p og amación, así como la isualización de los abajos no asignados en el in e io
de la lis a. Asimismo, la inco po ación de la mecánica click and d ag pa a el desplazamien o en
el in e io del diag ama es de g an comodidad pa a el usua io, acili ando la na egación po el mismo.
El hecho de añadi la posibilidad de hace zoom inc emen a no ablemen e la p ecisión al p og a-
ma , es o sumado a las ayudas implemen adas en el d ag and d op pe mi en al usua io modi ica las
echas con exac i ud de minu os. La somb a implemen ada acili a la iden i icación de los huecos
donde los abajos pueden se colocados, mos ando al usua io en qué luga es puede libe a el a ón
pa a elimina la asignación de los abajos.
La es uc u a de clases esul a en un código comp ensible y al amen e eu ilizable. Sin emba go,
el hecho de que las en idades se almacenen en una lis a es á ica den o de la clase puede p esen a
di icul ades en el caso de que se in en asen inco po a a ios diag amas de Gan simul áneamen e,
ya que hay p opiedades como Seleccionado que es án p og amadas pa a unciona con un úni-
co diag ama. Una posible mane a de habili a es o se ía almacena los da os de los abajos en
una lis a ex e na dis in a de la es á ica, aunque implica ía algunas modi icaciones en el código.
Aun así, emplea a ios diag amas de Gan simul áneamen e es ex año pues o que no malmen e
la plani icación se ep esen a solamen e en un diag ama, po lo que es o no debe ía de se p io i a io.
Pa a la ealización de los enlaces en e los con oles se ha empleado una me odología que ha
p opo cionado muy buenos esul ados. Al o za que odos de i en de la clase Con olGan no
49
50 Capí ulo 5. Conclusiones
solamen e se ha educido eno memen e la can idad de código necesa io, sino que inclui o o ipo
de con oles en el u u o se pod á ealiza de una mane a más sencilla. Si se hubiese p og amado
las ac ualizaciones del es o de con oles manualmen e, el código no se ía eu ilizable, ya que los
enlaces en una aplicación di e en e no unciona ían.
El esul ado que se ha ob enido de la ep esen ación del diag ama empleando dibujos en luga de
paneles ha supe ado las expec a i as. Si bien es cie o que no se ha podido ealiza una p ueba de un
núme o signi ica i o de abajos (del o den de miles), el endimien o ob enido con es a me odología
es mejo que el de la me odología adicional [
Dios e al., 2015
]. Además, la escalabilidad de es e
modelo es cla a, po lo que inc emen a el amaño no penaliza ía en exceso el endimien o. No
obs an e, en caso de que el lag uese excesi o, se pod ían emplea dis in as écnicas a los g á icos
pa a educi sus iempos de ejecución. Un ejemplo pod ía se el agmen a el bi map del diag ama
en di e sos ozos pa a que solamen e se ac ualicen las pa es necesa ias.
Aunque la o ma en la que se ha p og amado la clase Diag amaGan o ece buenos esul ados, de
ca a al u u o se ía aconsejable modi ica pa e de su es uc u a, p incipalmen e el hecho de que se
usen a ios paneles. Con la implemen ación de la me odología de los g á icos en bi maps, es posible
p escindi de es os paneles secunda ios y ep esen a el diag ama como agmen os de un bi map
más g ande. En la igu a 5.1 se puede ap ecia un esquema del uncionamien o del nue o con ol,
en el Pic u eBox se ep esen a ían de o ma adyacen e los ec ángulos des acados del in e io del
bi map comple o del diag ama. El ajus e de los sc oll pod ía hace se empleando Sc ollBa s en luga
de la p opiedad Au oSc oll, o adap a la p opiedad Au oSc oll del panel a la ep esen ación de los
mapas de bi s.
Figu a 5.1
Esquema de como pod ía emplea se un único bi map y un Pic u eBox pa a elabo a el
con ol Diag amaGan .
Si bien no se sabe a ciencia cie a si es o mejo a ía el endimien o, es muy p obable que suceda,
especialmen e pa a diag amas g andes, ya que se e i a ía la necesidad de ene paneles de g an
amaño, además de educi el núme o de con oles. Asimismo, deja ían de exis i p oblemas de
desinc onización en e los ejes y el diag ama pues o que pe enece ían al mismo con ol.
5.1 Posibles mejo as 51
Con inuando con las debilidades del código, la p incipal ca encia que es e iene ac ualmen e es la
ausencia de p o ecciones en e a excepciones. Du an e el desa ollo de la aplicación es cie o que
han su gido pocos allos debido a es o, ya que la in e acción del usua io con la aplicación es mínima
y es á muy con olada. Sin emba go, la lec u a del a chi o de ex o pe mi e in oduci cualquie
da o po lo que se pueden p oduci odo ipo de excepciones den o de ese en o no.
El de ec o de allos en la lec u a que iene la aplicación ac ualmen e es bas an e básico, po lo que
se ía una buena idea mejo a lo incluyendo ambién las p o ecciones en e a excepciones. También
se debe ía de inclui con es o la p o ección en e a la in oducción de allos en la p og amación
(que dos abajos es én solapados, po ejemplo) ya que, aunque en es e caso se ha con iado en
el so wa e, de ca a a la elabo ación del iche o de o ma manual es ecomendable implemen a
alguna p o ección en e a allos. Es o se ía de o al p io idad, sob e odo si se p e ende emplea
es a aplicación en el ámbi o académico, ya que un g an núme o de alumnos necesi a ía p oduci su
p opio iche o.
5.1 Posibles mejo as
En es a sección, se an a ecopila dis in as suge encias de mejo a pa a la aplicación, es os consejos
no buscan analiza posibles cambios en el código, ya que es o se ha ealizado con an e io idad en
es e capí ulo, sino da ideas pa a la inco po ación de nue as uncionalidades.
La p ime a mejo a se ía la de inco po a un desplegable que apa ezca cuando se in en e ce a la
aplicación sin habe gua dado diciendo si se quie en gua da los cambios. Es o e i a ía posibles
e o es que implica ían la pé dida de odo el p og eso y los cambios ealizados. Además, se puede
inclui un bo ón de "gua da " jun o a "gua da como" que pe mi a sob esc ibi el a chi o ac i o, no
sin an es mos a un desplegable que consul e al usua io si desea sob esc ibi el a chi o. En es a
ba a de menús ambién se pod ía coloca un bo ón que pe mi a ab i un a chi o ecien e, y así se
e i a ía busca lo en el di ec o io.
O a posible inco po ación a la aplicación es un apa ado de p e e encias en el menú. Al pulsa lo
apa ece ía un desplegable en el que se puedan modi ica en iempo de ejecución las p opiedades
es é icas del diag ama. Los cambios se pod ían almacena en un a chi o de p e e encias de usua io
pa a que se man engan al ol e a co e el p og ama.
Inclui un il o más complejo en las lis as puede se una uncionalidad muy p ác ica en el caso
de ene muchos abajos. Se pod ían il a los abajos en unción de las máquinas en las que
son p ocesados, los ope a ios que los p ocesan o el día en que son p ocesados. O a conside ación
in e esan e se ía añadi la posibilidad de hace clic en un hueco sin p og ama del diag ama y
ob ene el iempo lib e disponible en ese espacio. Es o acili a ía la selección de los abajos pa a
inclui los en los huecos. Po es e mo i o ambién se ía a ac i o inco po a un iso de los iempos
de p oceso del abajo seleccionado en cada máquina.
También se ía de g an ayuda inco po a un sis ema que impida al usua io p og ama dos abajos
que engan asignado al mismo ope a io en el mismo in e alo empo al, es a es icción es idén ica
al hecho de que un abajo no puede ene dos ope aciones asignadas en el mismo in e alo empo al.
Se pod ían esal a odos los abajos de ese ope a io en el diag ama du an e el d ag and d op, ya
sea median e colo es o dibujos, pa a que sea más sencillo iden i ica los luga es en los cuales se
puede p og ama el abajo seleccionado.
52 Capí ulo 5. Conclusiones
Po úl imo, una uncionalidad muy p ác ica se ía la de pe mi i añadi y elimina abajos desde
la p opia aplicación. De es a mane a se pod ía edi a plenamen e el diag ama, y, pa a el caso de los
qui ó anos, se pod ían añadi pacien es de u gencia. Además, la aplicación acili a ía la c eación
del a chi o añadiendo abajos a un iche o que únicamen e iene máquinas.
Apéndice A
Código empleado
A.1 Ven ana p incipal de la aplicación
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Linq;
using Sys em.Th eading.Tasks;
using Sys em.Windows.Fo ms;
namespace Gan Diag amGene a o
{
s a ic pa ial class P og am
{
/// <summa y>
/// Pun o de en ada p incipal pa a la aplicación.
/// </summa y>
[STATh ead]
s a ic oid Main()
{
Applica ion.EnableVisualS yles();
Applica ion.Se Compa ibleTex Rende ingDe aul ( alse);
Applica ion.Run(new Ven anaP incipal());
}
}
}
Código A.1 Código empleado pa a inicializa el p og ama.
using Sys em;
namespace Gan Diag amGene a o
{
pa ial class Ven anaP incipal
{
/// <summa y>
/// Va iable del diseñado necesa ia.
/// </summa y>
p i a e Sys em.Componen Model.ICon aine componen s = null;
53
54 Capí ulo A. Código empleado
/// <summa y>
/// Limpia los ecu sos que se es én usando.
/// </summa y>
/// <pa am name="disposing"> ue si los ecu sos adminis ados se
deben desecha ; alse en caso con a io.</pa am>
p o ec ed o e ide oid Dispose(bool disposing)
{
i (disposing && (componen s != null))
{
componen s.Dispose();
}
base.Dispose(disposing);
}
# egion Código gene ado po el Diseñado de Windows Fo ms
/// <summa y>
/// Mé odo necesa io pa a admi i el Diseñado . No se puede modi ica
/// el con enido de es e mé odo con el edi o de código.
/// </summa y>
p i a e oid Ini ializeComponen ()
{
his.dialogEleccionA chi o = new
Sys em.Windows.Fo ms.OpenFileDialog();
his.menuP incipal = new Sys em.Windows.Fo ms.MenuS ip();
his.a chi oToolS ipMenuI em = new
Sys em.Windows.Fo ms.ToolS ipMenuI em();
his.ab i ToolS ipMenuI em = new
Sys em.Windows.Fo ms.ToolS ipMenuI em();
his.gua da ComoToolS ipMenuI em = new
Sys em.Windows.Fo ms.ToolS ipMenuI em();
his.dialogGua da A chi o = new
Sys em.Windows.Fo ms.Sa eFileDialog();
his.scVe icalP incipal = new
Sys em.Windows.Fo ms.Spli Con aine ();
his. cLis Box = new Sys em.Windows.Fo ms.TabCon ol();
his.pageT abajos = new Sys em.Windows.Fo ms.TabPage();
his.lis BoxT abajosP incipal = new
Gan Diag amGene a o .Lis BoxT abajos();
his.pageOpe a ios = new Sys em.Windows.Fo ms.TabPage();
his.lis BoxOpe a iosP incipal = new
Gan Diag amGene a o .Lis BoxOpe a ios();
his.scHo izon alP incipal = new
Sys em.Windows.Fo ms.Spli Con aine ();
his.diag amaP incipal = new Gan Diag amGene a o .Diag amaGan ();
his.scIn e io = new Sys em.Windows.Fo ms.Spli Con aine ();
his.In oBoxElemen os = new
Gan Diag amGene a o .LabelGan Elemen os();
his.scEsquina = new Sys em.Windows.Fo ms.Spli Con aine ();
his.In oBoxGene al = new Gan Diag amGene a o .LabelGan Gene al();
his.ZoomBa = new Sys em.Windows.Fo ms.T ackBa ();
his.lblZoom = new Sys em.Windows.Fo ms.Label();
his.menuP incipal.SuspendLayou ();
((Sys em.Componen Model.ISuppo Ini ialize)(
his.scVe icalP incipal)).BeginIni ();
his.scVe icalP incipal.Panel1.SuspendLayou ();
A.1 Ven ana p incipal de la aplicación 55
his.scVe icalP incipal.Panel2.SuspendLayou ();
his.scVe icalP incipal.SuspendLayou ();
his. cLis Box.SuspendLayou ();
his.pageT abajos.SuspendLayou ();
his.pageOpe a ios.SuspendLayou ();
((Sys em.Componen Model.ISuppo Ini ialize)(
his.scHo izon alP incipal)).BeginIni ();
his.scHo izon alP incipal.Panel1.SuspendLayou ();
his.scHo izon alP incipal.Panel2.SuspendLayou ();
his.scHo izon alP incipal.SuspendLayou ();
((Sys em.Componen Model.ISuppo Ini ialize)(
his.scIn e io )).BeginIni ();
his.scIn e io .Panel1.SuspendLayou ();
his.scIn e io .Panel2.SuspendLayou ();
his.scIn e io .SuspendLayou ();
((Sys em.Componen Model.ISuppo Ini ialize)
( his.scEsquina)).BeginIni ();
his.scEsquina.Panel1.SuspendLayou ();
his.scEsquina.Panel2.SuspendLayou ();
his.scEsquina.SuspendLayou ();
((Sys em.Componen Model.ISuppo Ini ialize)( his.ZoomBa )).BeginIni ();
his.SuspendLayou ();
//
// dialogEleccionA chi o
//
his.dialogEleccionA chi o.Fil e = "A chi os de ex o
(*. x )|*. x ";
his.dialogEleccionA chi o.Ti le = "Eleccion A chi o";
his.dialogEleccionA chi o.FileOk += new
Sys em.Componen Model.CancelE en Handle (
his.dialogEleccionA chi o_FileOk);
//
// menuP incipal
//
his.menuP incipal.BackColo = Sys em.D awing.Sys emColo s.Con ol;
his.menuP incipal.Fon = new Sys em.D awing.Fon ("A ial", 9F);
his.menuP incipal.I ems.AddRange(new
Sys em.Windows.Fo ms.ToolS ipI em[] {
his.a chi oToolS ipMenuI em});
his.menuP incipal.Layou S yle =
Sys em.Windows.Fo ms.ToolS ipLayou S yle.Ho izon alS ackWi hO e low;
his.menuP incipal.Loca ion = new Sys em.D awing.Poin (0, 0);
his.menuP incipal.Name = "menuP incipal";
his.menuP incipal.Size = new Sys em.D awing.Size(1264, 24);
his.menuP incipal.TabIndex = 2;
his.menuP incipal.Tex = "Menú pRINCIPAL";
//
// a chi oToolS ipMenuI em
//
his.a chi oToolS ipMenuI em.D opDownI ems.AddRange(new
Sys em.Windows.Fo ms.ToolS ipI em[] {
his.ab i ToolS ipMenuI em,
his.gua da ComoToolS ipMenuI em});
his.a chi oToolS ipMenuI em.Name = "a chi oToolS ipMenuI em";
his.a chi oToolS ipMenuI em.Size = new Sys em.D awing.Size(58,
20);
56 Capí ulo A. Código empleado
his.a chi oToolS ipMenuI em.Tex = "A chi o";
//
// ab i ToolS ipMenuI em
//
his.ab i ToolS ipMenuI em.Name = "ab i ToolS ipMenuI em";
his.ab i ToolS ipMenuI em.Size = new Sys em.D awing.Size(156, 22);
his.ab i ToolS ipMenuI em.Tex = "Ab i ";
his.ab i ToolS ipMenuI em.Click += new
Sys em.E en Handle ( his.ab i ToolS ipMenuI em_Click);
//
// gua da ComoToolS ipMenuI em
//
his.gua da ComoToolS ipMenuI em.Name =
"gua da ComoToolS ipMenuI em";
his.gua da ComoToolS ipMenuI em.Size = new
Sys em.D awing.Size(156, 22);
his.gua da ComoToolS ipMenuI em.Tex = "Gua da Como";
his.gua da ComoToolS ipMenuI em.Click += new
Sys em.E en Handle ( his.gua da ComoToolS ipMenuI em_Click);
//
// dialogGua da A chi o
//
his.dialogGua da A chi o.Fil e = "A chi os de ex o
(*. x )|*. x ";
his.dialogGua da A chi o.Ti le = "Gua da a chi o";
his.dialogGua da A chi o.FileOk += new
Sys em.Componen Model.CancelE en Handle (
his.dialogGua da A chi o_FileOk);
//
// scVe icalP incipal
//
his.scVe icalP incipal.Dock = Sys em.Windows.Fo ms.DockS yle.Fill;
his.scVe icalP incipal.Loca ion = new Sys em.D awing.Poin (0, 24);
his.scVe icalP incipal.Name = "scVe icalP incipal";
//
// scVe icalP incipal.Panel1
//
his.scVe icalP incipal.Panel1.BackColo =
Sys em.D awing.Sys emColo s.Con ol;
his.scVe icalP incipal.Panel1.Con ols.Add( his. cLis Box);
his.scVe icalP incipal.Panel1MinSize = 140;
//
// scVe icalP incipal.Panel2
//
his.scVe icalP incipal.Panel2.Con ols.Add(
his.scHo izon alP incipal);
his.scVe icalP incipal.Panel2MinSize = 870;
his.scVe icalP incipal.Size = new Sys em.D awing.Size(1264, 657);
his.scVe icalP incipal.Spli e Dis ance = 140;
his.scVe icalP incipal.TabIndex = 3;
his.scVe icalP incipal.Spli e Mo ed += new
Sys em.Windows.Fo ms.Spli e E en Handle (
his.scVe icalP incipal_Spli e Mo ed);
//
// cLis Box
//
A.1 Ven ana p incipal de la aplicación 57
his. cLis Box.Con ols.Add( his.pageT abajos);
his. cLis Box.Con ols.Add( his.pageOpe a ios);
his. cLis Box.Dock = Sys em.Windows.Fo ms.DockS yle.Fill;
his. cLis Box.Fon = new Sys em.D awing.Fon ("A ial", 9F);
his. cLis Box.Loca ion = new Sys em.D awing.Poin (0, 0);
his. cLis Box.Name = " cLis Box";
his. cLis Box.Selec edIndex = 0;
his. cLis Box.Size = new Sys em.D awing.Size(140, 657);
his. cLis Box.TabIndex = 0;
//
// pageT abajos
//
his.pageT abajos.BackColo = Sys em.D awing.Sys emColo s.Con ol;
his.pageT abajos.Con ols.Add( his.lis BoxT abajosP incipal);
his.pageT abajos.Loca ion = new Sys em.D awing.Poin (4, 24);
his.pageT abajos.Name = "pageT abajos";
his.pageT abajos.Padding = new Sys em.Windows.Fo ms.Padding(3);
his.pageT abajos.Size = new Sys em.D awing.Size(132, 629);
his.pageT abajos.TabIndex = 0;
his.pageT abajos.Tex = "T abajos";
//
// lis BoxT abajosP incipal
//
his.lis BoxT abajosP incipal.AllowD op = ue;
his.lis BoxT abajosP incipal.Dock =
Sys em.Windows.Fo ms.DockS yle.Fill;
his.lis BoxT abajosP incipal.Loca ion = new
Sys em.D awing.Poin (3, 3);
his.lis BoxT abajosP incipal.Name = "lis BoxT abajosP incipal";
his.lis BoxT abajosP incipal.Size = new Sys em.D awing.Size(126,
623);
his.lis BoxT abajosP incipal.TabIndex = 0;
his.lis BoxT abajosP incipal.Tex = "lis BoxT abajosP incipal";
//
// pageOpe a ios
//
his.pageOpe a ios.BackColo = Sys em.D awing.Sys emColo s.Con ol;
his.pageOpe a ios.Con ols.Add( his.lis BoxOpe a iosP incipal);
his.pageOpe a ios.Loca ion = new Sys em.D awing.Poin (4, 24);
his.pageOpe a ios.Name = "pageOpe a ios";
his.pageOpe a ios.Padding = new Sys em.Windows.Fo ms.Padding(3);
his.pageOpe a ios.Size = new Sys em.D awing.Size(132, 629);
his.pageOpe a ios.TabIndex = 1;
his.pageOpe a ios.Tex = "Ope a ios";
//
// lis BoxOpe a iosP incipal
//
his.lis BoxOpe a iosP incipal.Dock =
Sys em.Windows.Fo ms.DockS yle.Fill;
his.lis BoxOpe a iosP incipal.Loca ion = new
Sys em.D awing.Poin (3, 3);
his.lis BoxOpe a iosP incipal.Name = "lis BoxOpe a iosP incipal";
his.lis BoxOpe a iosP incipal.Size = new Sys em.D awing.Size(126,
623);
his.lis BoxOpe a iosP incipal.TabIndex = 0;
his.lis BoxOpe a iosP incipal.Tex = "lis BoxOpe a iosP incipal";
64 Capí ulo A. Código empleado
}
p i a e oid ReubicalblZoom()
{
in anchoCon enedo = scEsquina.Wid h;
lblZoom.Loca ion = new Poin (anchoCon enedo / 2 - lblZoom.Wid h /
2, lblZoom.Loca ion.Y);
}
p i a e oid ReubicalblDa osGene ales()
{
in anchoCon enedo = scEsquina.Wid h;
}
p i a e oid scVe icalP incipal_Spli e Mo ed(objec sende ,
Spli e E en A gs e)
{
i ( u aA chi oAc i o != null)
diag amaP incipal.Ajus a Geome iaPaneles();
lis BoxT abajosP incipal.Se Spli e Posi ion();
ReubicalblZoom();
ReubicalblDa osGene ales();
}
p i a e oid dialogGua da A chi o_FileOk(objec sende ,
CancelE en A gs e)
{
i (dialogEleccionA chi o.FileName != "" && u aA chi oAc i o !=
null)
{
u aA chi oAc i o = dialogGua da A chi o.FileName;
P og am.Esc i u aSalida( u aA chi oAc i o);
}
}
p i a e oid Ven anaP incipal_Resize(objec sende , E en A gs e)
{
diag amaP incipal.Ajus a Geome iaPaneles();
}
}
}
Código A.3
Código empleado pa a los E en Handle s de los con oles de la aplicación (excluyedo a
los he edados de Con olGan ), así como la inicialización de la en ana p incipal.
A.2 Clase T abajo 65
A.2 Clase T abajo
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.D awing;
using Sys em.Componen Model;
using Sys em.Da a.Common;
using Sys em.Linq;
using Sys em.Tex ;
using Sys em.Diagnos ics.Con ac s;
using Sys em.Windows.Fo ms;
namespace Gan Diag amGene a o
{
public pa ial class T abajo : IDa osIden i ica i os, ISeleccionable
{
public T abajo( in [] u aFab icacion)
{
iden i icado = s a icLis aT abajos.Coun ;
s a icLis aT abajos.Add( his);
his. u aFab icacion = u aFab icacion;
}
public T abajo(Da eTime[] echasInicio, in [] u aFab icacion) :
his( u aFab icacion)
{
o ( a i = 0; i < echasInicio.Leng h; i++)
{
i (Da eTime.Compa e( echasInicio[i], S a icO igenP og amacion)
>= 0) AddOpe acion( echasInicio[i], i);
}
}
public T abajo(in [] u aFab icacion, Da eTime[] echasFin) :
his( u aFab icacion)
{
o ( a i = 0; i < echasFin.Leng h; i++)
{
i (Da eTime.Compa e( echasFin[i], S a icO igenP og amacion) >=
0) AddOpe acion(i, echasFin[i]);
}
}
public o e ide s ing ToS ing()
{
i (Nomb e != null) e u n Nomb e;
else e u n $"T abajo {iden i icado }";
}
public s ing Ge In oS ing()
{
s ing mensaje = "T abajo " + iden i icado ;
i (Nomb e != null) mensaje += " n" +"Nomb e: " + Nomb e;
in i = 1;
o each (Ope acion elemen o in lis aOpe acionesPlani icadas)
{
66 Capí ulo A. Código empleado
i (elemen o != null)
{
mensaje +=$" nOpe acion {i} n{elemen o}";
i++;
}
}
o each (Ope a io elemen o in lis aOpe a iosAsignados)
{
i (elemen o != null)
{
mensaje += $" n{elemen o}";
}
}
i (Desc ipcion != null) mensaje += " n" +"Desc ipcion: " +
Desc ipcion +" n";
e u n mensaje;
}
public s ing[] ToS ingA ay()
{
Lis <s ing> lineasA ay = new Lis <s ing>();
lineasA ay.Add($"T abajo {iden i icado }");
i (Nomb e != null) lineasA ay.Add($"Nomb e: {Nomb e}");
o ( a i = 0; i < lis aOpe acionesPlani icadas.Coun ; i++)
{
lineasA ay.Add($"Ope acion {i}");
lineasA ay.Add($"Maquina asignada:
{Ge IDMaquinaOpe acion(i)}");
lineasA ay.Add($"Fecha de inicio: {Ge InicioOpe acion(i)} ,
Fecha de inalización: {Ge FinOpe acion(i)} , Tiempo de
p oceso: {Ge TiempoP ocesoOpe acion(i)}");
}
i (Desc ipcion != null) lineasA ay.Add($"Desc ipción:
{Desc ipcion}");
e u n lineasA ay.ToA ay();
}
public oid Se Iden i icado (in iden i icado ) => his.iden i icado
= iden i icado ;
public s ing Desc ipcion { ge ; se ; }
public s ing Nomb e { ge ; se ; }
public in Iden i icado { ge => iden i icado ; }
p i a e in iden i icado ;
p i a e s a ic Lis <T abajo> s a icLis aT abajos = new Lis <T abajo>();
public Colo Colo Dibujo
{ ge
{
i (colo Dibujo == Colo .Black)
{
A.2 Clase T abajo 67
Asigna Colo ();
}
e u n colo Dibujo;
}
}
p i a e Colo colo Dibujo = Colo .Black;
p i a e oid Asigna Colo ()
{
bool esUnico;
bool esAdecuado;
Colo colo Alea o io;
Random ndSeed = new Random();
Random ndRed = new Random( ndSeed.Nex (1000000));
Random ndBlue = new Random( ndSeed.Nex (100000));
Random ndG een = new Random( ndSeed.Nex (100000));
in i = 0;
do
{
esUnico = ue;
colo Alea o io = Colo .F omA gb( ndRed.Nex (256),
ndG een.Nex (256), ndBlue.Nex (256));
i (colo Alea o io.Ge B igh ness() > 0.60 &&
colo Alea o io.Ge B igh ness() < 0.95 &&
colo Alea o io.Ge Sa u a ion() > 0.4)
{
esAdecuado = ue;
o each (T abajo elemen o in T abajo.Ge A ay())
{
i (colo Alea o io.R < elemen o.colo Dibujo.R +
di e enciaMinimaColo &&
colo Alea o io.R > elemen o.colo Dibujo.R -
di e enciaMinimaColo &&
colo Alea o io.G < elemen o.colo Dibujo.G +
di e enciaMinimaColo &&
colo Alea o io.G > elemen o.colo Dibujo.G -
di e enciaMinimaColo &&
colo Alea o io.B < elemen o.colo Dibujo.B +
di e enciaMinimaColo &&
colo Alea o io.B > elemen o.colo Dibujo.B -
di e enciaMinimaColo )
{
esUnico = alse;
}
}
}
else
{
esAdecuado = alse;
}
i (i>5000)
{
Di e enciaMinimaColo = di e enciaMinimaColo - 1;
}
68 Capí ulo A. Código empleado
i++;
}while (!esUnico || !esAdecuado);
colo Dibujo = colo Alea o io;
}
s a ic in Di e enciaMinimaColo
{
se
{
i ( alue <= 0)
{
di e enciaMinimaColo = 0;
MessageBox.Show("Se han ago ado odos los colo es posibles");
}
}
}
s a ic in di e enciaMinimaColo = 20;
public bool Seleccionado
{
ge { e u n seleccionado; }
se
{
i ( alue)
{
o each (T abajo elemen o in T abajo.Ge A ay())
elemen o.Seleccionado = alse;
o each (Maquina elemen o in Maquina.Ge A ay())
elemen o.Seleccionado = alse;
o each (Ope a io elemen o in Ope a io.Ge A ay())
elemen o.Seleccionado = alse;
}
seleccionado = alue;
}
}
p i a e bool seleccionado = alse;
public s a ic T abajo Ge T abajoSeleccionado()
{
o each (T abajo elemen o in s a icLis aT abajos)
{
i (elemen o.Seleccionado) e u n elemen o;
}
e u n null;
}
public bool Resal ado
{
ge
{
i (seleccionado) e u n ue;
else
A.2 Clase T abajo 69
{
o each (Ope a io elemen o in lis aOpe a iosAsignados)
{
i (elemen o.Seleccionado) e u n ue;
}
}
e u n alse;
}
}
public s a ic in Ge T abajosNoP og amados()
{
in abajosNoP og amados = 0;
o each (T abajo elemen o in s a icLis aT abajos)
{
i (!elemen o.P og amado) abajosNoP og amados++;
}
e u n abajosNoP og amados;
}
public s a ic in Ge T abajosP og amados()
{
e u n s a icLis aT abajos.Coun - Ge T abajosNoP og amados();
}
public bool P og amado
{
ge
{
i (lis aOpe acionesPlani icadas.Coun ==
Ru aFab icacion.Leng h) e u n ue;
e u n alse;
}
}
public in [] Ru aFab icacion { ge => u aFab icacion; }
p i a e in [] u aFab icacion;
public in [] Ru aFab icacionP og amada
{
ge
{
Lis <in > u aFab icacion = new Lis <in >();
o each (Ope acion elemen o in lis aOpe acionesPlani icadas)
{
u aFab icacion.Add(elemen o.Ge Iden i icado MaquinaAsignada());
}
e u n u aFab icacion.ToA ay();
}
}
public bool SecuenciaRigida
{
ge
{
70 Capí ulo A. Código empleado
bool igidez = ue;
o each (in elemen o in Ru aFab icacion) i (elemen o < 0)
igidez = alse;
i (! igidez)
{
bool e o = alse;
o ( a i = 0; i < Ru aFab icacion.Leng h; i++)
{
i (Ru aFab icacion[i] > 0)
{
Ru aFab icacion[i] = -Ru aFab icacion[i];
e o = ue;
}
}
i (e o ) MessageBox.Show($"E o en la secuencia deseada
del abajo {iden i icado }," +
$" se es ablece como secuencia lexible");
}
e u n igidez;
}
}
public s a ic T abajo Ge (in iden i icado ) =>
s a icLis aT abajos[iden i icado ];
public s a ic T abajo[] Ge A ay() => s a icLis aT abajos.ToA ay();
public s a ic oid Clea () => T abajo.s a icLis aT abajos.Clea ();
public s a ic Da eTime S a icO igenP og amacion { se ; ge ; }
public Ope a io[] Ge Ope a ios() => lis aOpe a iosAsignados.ToA ay();
p i a e Lis <Ope a io> lis aOpe a iosAsignados = new Lis <Ope a io>();
public oid AddOpe a io(in iden i icado Ope a io) =>
lis aOpe a iosAsignados.Add(Ope a io.Ge (iden i icado Ope a io));
}
}
Código A.4 Código empleado pa a elabo a la pa e p incipal de la clase T abajo.
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Linq;
using Sys em.Tex ;
namespace Gan Diag amGene a o
{
pa ial class T abajo
{
public oid AddOpe acion(Da eTime echaInicio, in
iden i icado MaquinaAsignada)
{
lis aOpe acionesPlani icadas.Add(new Ope acion(iden i icado ,
echaInicio, iden i icado MaquinaAsignada));
A.2 Clase T abajo 71
lis aOpe acionesPlani icadas.So ((opA, opB) =>
opA.Ge FechaInicio().Compa eTo(opB.Ge FechaInicio()));
}
public oid AddOpe acion(in iden i icado MaquinaAsignada, Da eTime
echaFin)
{
Da eTime echaInicio =
echaFin.Sub ac (Maquina.Ge (iden i icado MaquinaAsignada).Ge TiempoP oceso(iden i icado ));
lis aOpe acionesPlani icadas.Add(new Ope acion(iden i icado ,
echaInicio, iden i icado MaquinaAsignada));
lis aOpe acionesPlani icadas.So ((opA, opB) =>
opA.Ge FechaInicio().Compa eTo(opB.Ge FechaInicio()));
}
p i a e s a ic bool CheckOpe acionValida(Da eTime echaInicio,
TimeSpan iempoP oceso, in iden i icado Maquina)
{
Da eTime echaFin = echaInicio.Add( iempoP oceso);
i ( echaInicio.Hou <
Ma h.Floo (Maquina.Ge Ape u aMasTemp ana())) e u n alse;
i ( echaInicio.Hou + 1 >
Ma h.Ceiling(Maquina.Ge Cie eMasTa dio()) &&
echaInicio.Minu e > 0) e u n alse;
i ( echaInicio.Hou > Ma h.Ceiling(Maquina.Ge Cie eMasTa dio()))
e u n alse;
i ( echaFin.Hou < Ma h.Floo (Maquina.Ge Ape u aMasTemp ana()))
e u n alse;
i ( echaFin.Hou + 1 > Ma h.Ceiling(Maquina.Ge Cie eMasTa dio())
&& echaFin.Minu e > 0) e u n alse;
i ( echaFin.Hou > Ma h.Ceiling(Maquina.Ge Cie eMasTa dio()) )
e u n alse;
i ( echaFin.Day != echaInicio.Day && ( echaFin.Minu e != 0 ||
echaFin.Hou != 0)) e u n alse;
Da eTime[] a ayFechasInicio =
Ge FechasInicioMaquina(iden i icado Maquina);
Da eTime[] a ayFechasFin =
Ge FechasFinMaquina(iden i icado Maquina);
o ( a i = 0; i < a ayFechasInicio.Leng h; i ++)
{
i ( echaFin > a ayFechasInicio[i] && echaInicio <
a ayFechasFin[i]) e u n alse;
}
e u n ue;
}
p i a e s a ic bool CheckOpe acionValida(TimeSpan iempoP oceso,
Da eTime echaFin, in iden i icado Maquina)
{
e u n CheckOpe acionValida( echaFin.Sub ac ( iempoP oceso),
iempoP oceso, iden i icado Maquina);
}
72 Capí ulo A. Código empleado
public bool CheckOpe acionValidaT abajo(Da eTime echaInicio, TimeSpan
iempoP oceso, in iden i icado Maquina)
{
i (P og amado) e u n alse;
Da eTime echaFin = echaInicio.Add( iempoP oceso);
i ( echaInicio < S a icO igenP og amacion) e u n alse;
i ( echaFin > S a icO igenP og amacion.AddDays(
Maquina.S a icNume oDiasP og amacion)) e u n alse;
o each (Ope acion elemen o in lis aOpe acionesPlani icadas)
{
i (iden i icado Maquina ==
elemen o.Ge Iden i icado MaquinaAsignada()) e u n alse;
i (SecuenciaRigida)
{
in o denOpe acionRe isada =
Ge O denMaquina(iden i icado Maquina);
in o denOpe acionCompa ada =
Ge O denMaquina(elemen o.Ge Iden i icado MaquinaAsignada());
i ( echaFin <= elemen o.Ge FechaFin() &&
o denOpe acionRe isada > o denOpe acionCompa ada)
{
e u n alse;
}
else i ( echaInicio >= elemen o.Ge FechaInicio() &&
o denOpe acionRe isada < o denOpe acionCompa ada)
{
e u n alse;
}
else i ( echaFin > elemen o.Ge FechaInicio() && echaInicio
< elemen o.Ge FechaFin())
{
e u n alse;
}
}
else i ( u aFab icacion.Leng h > 1)
{
Lis <in > maquinasReco idas = new Lis <in >();
bool maquinaPendien e = alse;
o each (in id in u aFab icacion)
maquinasReco idas.Add(id * -1);
o each (in id in maquinasReco idas)
{
i (id == iden i icado Maquina) maquinaPendien e = ue;
}
i (!maquinaPendien e) e u n alse;
A.2 Clase T abajo 73
i ( echaFin > elemen o.Ge FechaInicio() && echaInicio <
elemen o.Ge FechaFin()) e u n alse;
}
}
e u n CheckOpe acionValida( echaInicio, iempoP oceso,
iden i icado Maquina);
}
public bool CheckOpe acionValidaT abajo(TimeSpan iempoP oceso,
Da eTime echaFin, in iden i icado Maquina)
{
e u n
CheckOpe acionValidaT abajo( echaFin.Sub ac ( iempoP oceso),
iempoP oceso, iden i icado Maquina);
}
p i a e in Ge O denMaquina(in iden i icado Maquina)
{
o ( a i = 0; i < u aFab icacion.Leng h; i++)
{
i ( u aFab icacion[i] == iden i icado Maquina) e u n i;
}
e u n -1;
}
public s a ic Da eTime[] Ge FechasInicioMaquina(in
iden i icado Maquina)
{
Lis <Da eTime> lis aFechasInicio = new Lis <Da eTime>();
o each (T abajo elemen o in s a icLis aT abajos)
{
Ope acion[] ope acionesAsignadas =
elemen o.Ge Ope acionesMaquina(iden i icado Maquina);
o each (Ope acion op in ope acionesAsignadas)
lis aFechasInicio.Add(op.Ge FechaInicio());
}
e u n lis aFechasInicio.ToA ay();
}
public s a ic Da eTime[] Ge FechasFinMaquina(in iden i icado Maquina)
{
Lis <Da eTime> lis aFechasFin = new Lis <Da eTime>();
o each (T abajo elemen o in s a icLis aT abajos)
{
Ope acion[] ope acionesAsignadas =
elemen o.Ge Ope acionesMaquina(iden i icado Maquina);
o each(Ope acion op in ope acionesAsignadas)
lis aFechasFin.Add(op.Ge FechaFin());
}
e u n lis aFechasFin.ToA ay();
}
p i a e Ope acion[] Ge Ope acionesMaquina(in iden i icado Maquina)
{
Lis <Ope acion> lis aOpe aciones = new Lis <Ope acion>();
80 Capí ulo A. Código empleado
{
ho aMasTa dia = Ma h.Max(ho aMasTa dia,
elemen o.Ge Cie es(i)[
elemen o.Ge Cie es(i).Ge Uppe Bound(0)].To alHou s);
}
}
}
e u n ho aMasTa dia;
}
public oid Se Ho a io(in diasDesdeO igen, TimeSpan[] lis aHo as)
{
lis aHo a ios[diasDesdeO igen].Se Ho a io(lis aHo as);
i (lis aHo as.Leng h == 0) lis aHo a ios[diasDesdeO igen].Abie o
= alse;
else lis aHo a ios[diasDesdeO igen].Abie o = ue;
}
p i a e Ho a io Ge Ho a io(in diasDesdeo igen) =>
lis aHo a ios[diasDesdeo igen];
p i a e class Ho a io
{
public Ho a io(bool abie o)
{
Abie o = abie o;
}
public oid Se Ho a io(TimeSpan[] lis aHo as)
{
ape u as.Clea ();
cie es.Clea ();
o ( a i = 0; i < lis aHo as.Leng h; i++)
{
i (i % 2 == 0) ape u as.Add(lis aHo as[i]);
else cie es.Add(lis aHo as[i]);
}
}
public TimeSpan[] Ge Ape u as() => ape u as.ToA ay();
public TimeSpan[] Ge Cie es() => cie es.ToA ay();
p i a e Lis <TimeSpan> ape u as = new Lis <TimeSpan>();
p i a e Lis <TimeSpan> cie es = new Lis <TimeSpan>();
public bool Abie o { ge ; se ; }
}
}
}
Código A.7
Código empleado pa a elabo a odo lo elacionado con ho a ios de la clase Maquina.
A.4 Clase Ope a io 81
A.4 Clase Ope a io
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Tex ;
namespace Gan Diag amGene a o
{
public class Ope a io : IDa osIden i ica i os, ISeleccionable
{
public Ope a io()
{
iden i icado = s a icLis aOpe a ios.Coun ;
s a icLis aOpe a ios.Add( his);
}
public o e ide s ing ToS ing()
{
i (Nomb e != null) e u n Nomb e;
else e u n "Ope a io " + iden i icado ;
}
public in Ge T abajosAsignados()
{
in abajosAsignados = 0;
o each(T abajo elemen o in T abajo.Ge A ay())
{
o each (Ope a io op in elemen o.Ge Ope a ios())
{
i (iden i icado == op.iden i icado ) abajosAsignados++;
}
}
e u n abajosAsignados;
}
public s a ic Ope a io Ge (in iden i icado ) =>
s a icLis aOpe a ios[iden i icado ];
public s a ic Ope a io[] Ge A ay() => s a icLis aOpe a ios.ToA ay();
public s ing Desc ipcion { ge ; se ; }
public s ing Nomb e { ge ; se ; }
public in Iden i icado { ge { e u n iden i icado ; } }
p i a e in iden i icado ;
public bool Seleccionado
{
ge { e u n seleccionado; }
se
{
i ( alue)
{
82 Capí ulo A. Código empleado
o each (T abajo elemen o in T abajo.Ge A ay())
elemen o.Seleccionado = alse;
o each (Maquina elemen o in Maquina.Ge A ay())
elemen o.Seleccionado = alse;
o each (Ope a io elemen o in Ope a io.Ge A ay())
elemen o.Seleccionado = alse;
}
seleccionado = alue;
}
}
p i a e bool seleccionado = alse;
p i a e s a ic Lis <Ope a io> s a icLis aOpe a ios = new
Lis <Ope a io>();
public s a ic oid Clea () => s a icLis aOpe a ios.Clea ();
}
}
Código A.8 Código empleado pa a elabo a la clase Ope a io.
A.5 In e aces implemen adas 83
A.5 In e aces implemen adas
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Tex ;
namespace Gan Diag amGene a o
{
public in e ace IDa osIden i ica i os
{
s ing Desc ipcion { se ; ge ; }
s ing Nomb e { se ; ge ; }
in Iden i icado { ge ; }
}
public in e ace IElemen oP oduc i o
{
double Rendimien o { se ; ge ; }
}
public in e ace ISeleccionable
{
bool Seleccionado { se ; ge ; }
}
}
Código A.9
Código que de ine las in e aces que han de implemen a las clases T abajo, Maquina y
Ope a io.
84 Capí ulo A. Código empleado
A.6 Lec u a y esc i u a de los iche os
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Diagnos ics.CodeAnalysis;
using Sys em.Diagnos ics.Con ac s;
using Sys em.Globaliza ion;
using Sys em.IO;
using Sys em.Linq;
using Sys em.Run ime.Compile Se ices;
using Sys em.Tex ;
using Sys em.Windows.Fo ms;
namespace Gan Diag amGene a o
{
s a ic pa ial class P og am
{
public s a ic oid Lec u aEn ada(s ing u aA chi oAc i o)
{
S eamReade lec o A chi o = new S eamReade ( u aA chi oAc i o,
Encoding.Ge Encoding("iso-8859-1"));
s ing linea;
s ing[] a ayLinea;
in con ado = 0;
a ayLinea = lec o A chi o.ReadLine().T im().Spli (’ ’);
con ado ++;
T abajo.S a icO igenP og amacion = new
Da eTime(In 32.Pa se(a ayLinea[2]),
In 32.Pa se(a ayLinea[1]), In 32.Pa se(a ayLinea[0]));
a ayLinea = lec o A chi o.ReadLine().T im().Spli ( );
con ado ++;
in nume oT abajos = in .Pa se(a ayLinea[0]);
in nume oMaquinas = in .Pa se(a ayLinea[1]);
Maquina.S a icNume oDiasP og amacion = in .Pa se(a ayLinea[2]);
do
{
linea = lec o A chi o.ReadLine();
i (linea != null) linea = linea.T im();
con ado ++;
swi ch (linea)
{
case "Maquina":
o ( a i = 0; i < nume oMaquinas; i++)
{
a ayLinea = lec o A chi o.ReadLine().T im().Spli (’
’);
con ado ++;
TimeSpan[] iemposP oceso =
A ay.Con e All(a ayLinea, a => new TimeSpan(0,
in .Pa se(a), 0));
_=new Maquina( iemposP oceso);
}
A.6 Lec u a y esc i u a de los iche os 85
do
{
linea = lec o A chi o.ReadLine().T im();
con ado ++;
swi ch (linea)
{
case "Ho a io":
o each (Maquina elemen o in
Maquina.Ge A ay())
{
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’&’);
con ado ++;
in diasDesdeO igen = 0;
o each (s ing s ingHo as in a ayLinea)
{
bool exis eHo a io = ue;
o each (s ing agmen o in
s ingHo as.T im().Spli (’ ’))
{
i ( agmen o == "") exis eHo a io
= alse;
}
i (exis eHo a io)
{
TimeSpan[] a ayHo as =
A ay.Con e All(s ingHo as.T im(
).Spli (’ ’),
s => TimeSpan.F omHou s(
double.Pa se(s,
Numbe S yles.AllowDecimalPoin )));
elemen o.Se Ho a io(diasDesdeO igen,
a ayHo as);
}
diasDesdeO igen++;
}
}
b eak;
case "Nomb e":
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’&’);
o ( a i = 0; i < a ayLinea.Leng h; i++)
a ayLinea[i] = a ayLinea[i].T im();
Ac ualizaNomb es(Maquina.Ge A ay(),
a ayLinea);
con ado ++;
b eak;
case "Desc ipcion":
a ayLinea = new s ing[nume oMaquinas];
o ( a i = 0; i < nume oMaquinas; i++)
{
a ayLinea[i] = lec o A chi o.ReadLine();
con ado ++;
}
86 Capí ulo A. Código empleado
Ac ualizaDesc ipciones(Maquina.Ge A ay(),
a ayLinea);
b eak;
case "Rendimien o":
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’
’);
double[] a ayRendimien os =
A ay.Con e All(a ayLinea, a =>
double.Pa se(a,
Numbe S yles.AllowDecimalPoin ));
Ac ualizaRendimien os(Maquina.Ge A ay(),
a ayRendimien os);
con ado ++;
b eak;
case "":
b eak;
de aul :
MessageBox.Show($"E o en la línea
{con ado }.");
b eak;
}
}while (linea != "" && linea != null);
b eak;
case "Ope a io":
in nume oOpe a ios =
in .Pa se(lec o A chi o.ReadLine().T im());
con ado ++;
o ( a i = 0; i < nume oOpe a ios; i++) _ = new
Ope a io();
do
{
linea = lec o A chi o.ReadLine().T im();
con ado ++;
swi ch (linea)
{
case "Nomb e":
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’&’);
o ( a i = 0; i < a ayLinea.Leng h; i++)
a ayLinea[i] = a ayLinea[i].T im();
Ac ualizaNomb es(Ope a io.Ge A ay(),
a ayLinea);
con ado ++;
b eak;
case "Desc ipcion":
a ayLinea = new s ing[nume oOpe a ios];
o ( a i = 0; i < nume oOpe a ios; i++)
{
a ayLinea[i] = lec o A chi o.ReadLine();
con ado ++;
A.6 Lec u a y esc i u a de los iche os 87
}
Ac ualizaDesc ipciones(Ope a io.Ge A ay(),
a ayLinea);
b eak;
case "":
b eak;
de aul :
MessageBox.Show($"E o en la línea
{con ado }.");
b eak;
}
}while (linea != "" && linea != null);
b eak;
case "T abajo":
linea = lec o A chi o.ReadLine().T im();
con ado ++;
Lis <in []> secuenciaMaquinas = new Lis <in []>();
i (linea == "Ru aFab icacion")
{
o ( a i = 0; i < nume oT abajos; i++)
{
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’ ’);
secuenciaMaquinas.Add(A ay.Con e All(a ayLinea,
in .Pa se));
con ado ++;
}
linea = lec o A chi o.ReadLine().T im();
con ado ++;
}
else
{
o ( a i = 0; i < nume oT abajos; i++)
secuenciaMaquinas.Add(new in [] { -1 });
}
swi ch (linea)
{
case "FechaFin":
o ( a i = 0; i < nume oT abajos; i++)
{
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’
’);
con ado ++;
TimeSpan[] iempoDesdeO igen =
A ay.Con e All(a ayLinea, a => new
TimeSpan(0, in .Pa se(a), 0));
Da eTime[] echasFin =
A ay.Con e All( iempoDesdeO igen, a =>
T abajo.S a icO igenP og amacion.Add(a));
_=new T abajo(secuenciaMaquinas[i],
echasFin);
88 Capí ulo A. Código empleado
}
b eak;
case "FechaInicio":
o ( a i = 0; i < nume oT abajos; i++)
{
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’
’);
con ado ++;
TimeSpan[] iempoDesdeO igen =
A ay.Con e All(a ayLinea, a => new
TimeSpan(0, in .Pa se(a), 0));
Da eTime[] echasInicio =
A ay.Con e All( iempoDesdeO igen, a =>
T abajo.S a icO igenP og amacion.Add(a));
_=new T abajo( echasInicio,
secuenciaMaquinas[i]);
}
b eak;
case "":
b eak;
de aul :
MessageBox.Show($"E o en la línea {con ado }.");
b eak;
}
do
{
linea = lec o A chi o.ReadLine();
i (linea != null) linea = linea.T im();
con ado ++;
swi ch (linea)
{
case "Nomb e":
a ayLinea =
lec o A chi o.ReadLine().T im().Spli (’&’);
o ( a i = 0; i < a ayLinea.Leng h; i++)
a ayLinea[i] = a ayLinea[i].T im();
Ac ualizaNomb es(T abajo.Ge A ay(),
a ayLinea);
con ado ++;
b eak;
case "Desc ipcion":
a ayLinea = new s ing[nume oT abajos];
o ( a i = 0; i < nume oT abajos; i++)
{
a ayLinea[i] =
lec o A chi o.ReadLine().T im();
con ado ++;
}
Ac ualizaDesc ipciones(T abajo.Ge A ay(),
a ayLinea);
b eak;
A.6 Lec u a y esc i u a de los iche os 89
case "Ope a ioAsignado":
linea = lec o A chi o.ReadLine().T im();
con ado ++;
swi ch (linea)
{
case "ID":
o ( a i = 0; i <
T abajo.Ge A ay().Leng h; i++)
{
a ayLinea =
lec o A chi o.ReadLine().T im(
).Spli (’ ’);
con ado ++;
o each (s ing elemen o in
a ayLinea)
{
i (elemen o != "")
T abajo.Ge (
i).AddOpe a io(in .Pa se(
elemen o));
}
}
b eak;
de aul :
b eak;
}
b eak;
case "":
b eak;
case null:
b eak;
de aul :
MessageBox.Show($"E o en la línea
{con ado }.");
b eak;
}
}while (linea != "" && linea != null);
b eak;
case "":
b eak;
case null:
b eak;
de aul :
MessageBox.Show($"E o en la línea {con ado }.");
b eak;
}
}while (linea != null);
96 Capí ulo A. Código empleado
using Sys em.Secu i y.Policy;
using Sys em.Tex ;
using Sys em.Th eading.Tasks;
using Sys em.Windows.Fo ms;
namespace Gan Diag amGene a o
{
public pa ial class Diag amaGan : Con olGan
{
public Diag amaGan () : base()
{
Inicializa ();
}
public oid Inicializa ()
{
Inicializa Elemen osG a icos();
Inicializa Pic u eBoxes();
Inicializa Paneles();
Ajus a Geome iaPaneles();
Con ols.Add(ejeMaquina);
Con ols.Add(ejeDias);
Con ols.Add(esquinaSupe io );
Con ols.Add(diag ama);
}
p i a e oid Inicializa Pic u eBoxes()
{
dibujoEsquinaSupe io .Dock = DockS yle.Fill;
dibujoEsquinaSupe io .MouseDown += new
MouseE en Handle (Ac ualizaDiag ama_MouseMo e);
dibujoEsquinaSupe io .Pain += new
Pain E en Handle (EsquinaSupe io _Pain );
dibujoEsquinaSupe io .MouseDown += new
MouseE en Handle (D agSc oll_MouseDown);
dibujoEsquinaSupe io .MouseMo e += new
MouseE en Handle (D agSc oll_MouseMo e);
dibujoEjeDias.Dock = DockS yle.Fill;
dibujoEjeDias.Size = ejeDias.Size;
dibujoEjeDias.MouseMo e += new
MouseE en Handle (Ac ualizaDiag ama_MouseMo e);
dibujoEjeDias.Pain += new Pain E en Handle (EjeDias_Pain );
dibujoEjeDias.MouseDown += new
MouseE en Handle (D agSc oll_MouseDown);
dibujoEjeDias.MouseMo e += new
MouseE en Handle (D agSc oll_MouseMo e);
dibujoDiag ama.Dock = DockS yle.Fill;
dibujoDiag ama.Size = diag ama.Size;
dibujoDiag ama.MouseMo e += new
MouseE en Handle (Ac ualizaDiag ama_MouseMo e);
dibujoDiag ama.MouseMo e += new
MouseE en Handle (Diag ama_MouseMo e);
A.7 Clase abs ac a Con olGan 97
dibujoDiag ama.Pain += new Pain E en Handle (Diag ama_Pain );
dibujoDiag ama.MouseDown += new
MouseE en Handle (D agSc oll_MouseDown);
dibujoDiag ama.AllowD op = ue;
dibujoDiag ama.D agEn e += new
D agE en Handle (D agT abajo_D agEn e );
dibujoDiag ama.D agO e += new
D agE en Handle (D agT abajo_D agO e );
dibujoDiag ama.D agD op += new
D agE en Handle (D agT abajo_D agD op);
dibujoDiag ama.Click += new E en Handle (Diag ama_Click);
panelT abajo.Visible = alse;
dibujoDiag ama.Con ols.Add(panelT abajo);
dibujoEjeMaquina.Dock = DockS yle.Fill;
dibujoEjeMaquina.Size = ejeMaquina.Size;
dibujoEjeMaquina.MouseMo e += new
MouseE en Handle (Ac ualizaDiag ama_MouseMo e);
dibujoEjeMaquina.Pain += new Pain E en Handle (EjeMaquina_Pain );
dibujoEjeMaquina.MouseDown += new
MouseE en Handle (D agSc oll_MouseDown);
dibujoEjeMaquina.MouseMo e += new
MouseE en Handle (D agSc oll_MouseMo e);
dibujoEjeMaquina.Click += new E en Handle (EjeMaquina_Click);
}
p i a e oid Inicializa Paneles()
{
esquinaSupe io .Visible = ue;
esquinaSupe io .Con ols.Add(dibujoEsquinaSupe io );
ejeDias.Visible = ue;
ejeDias.Con ols.Add(dibujoEjeDias);
diag ama.Visible = ue;
diag ama.Con ols.Add(dibujoDiag ama);
diag ama.Au oSc oll = ue;
diag ama.Au oSc ollMa gin = ma genAu osc oll;
diag ama.Sc oll += new Sc ollE en Handle (Diag ama_Sc oll);
diag ama.MouseWheel += new MouseE en Handle (Diag ama_OnMouseWheel);
ejeMaquina.Visible = ue;
ejeMaquina.Con ols.Add(dibujoEjeMaquina);
panelT abajo.Bo de S yle = Bo de S yle.FixedSingle;
}
public oid Ajus a Geome iaPaneles()
{
esquinaSupe io .Loca ion = new Poin (0, 0);
esquinaSupe io .Size = new Size(AnchoEjeMaquinas, Al oEjeDias);
diag ama.Loca ion = new Poin (AnchoEjeMaquinas, Al oEjeDias);
diag ama.Size = new Size(Wid h - AnchoEjeMaquinas - Ma gin.Le ,
Heigh - Al oEjeDias - Ma gin.Bo om);
98 Capí ulo A. Código empleado
diag ama.Au oSc ollMinSize = new Size(AnchoDiag ama +
ExcesoDe echoLineasHo izon ales, Al oDiag ama +
ExcesoIn e io LineasVe icales);
ejeDias.Loca ion = new Poin (AnchoEjeMaquinas, 0);
ejeDias.Size = new Size(Wid h + AnchoDiag ama + AnchoEjeMaquinas +
ExcesoDe echoLineasHo izon ales + ma genAu osc oll.Wid h,
Al oEjeDias);
ejeMaquina.Loca ion = new Poin (0, Al oEjeDias);
ejeMaquina.Size = new Size(AnchoEjeMaquinas, Heigh + Al oDiag ama
+ ExcesoIn e io LineasVe icales + ma genAu osc oll.Heigh );
Ajus a PosicionesSc oll();
}
public oid Ajus a PosicionesSc oll()
{
ejeMaquina.Se Bounds(0, Al oEjeDias -
diag ama.Ve icalSc oll.Value, ejeMaquina.Wid h,
ejeMaquina.Heigh );
ejeDias.Se Bounds(AnchoEjeMaquinas -
diag ama.Ho izon alSc oll.Value, 0, ejeDias.Wid h,
ejeDias.Heigh );
dibujoDiag ama.B ingToF on ();
esquinaSupe io .B ingToF on ();
}
public oid Se Bi mapDiag ama()
{
bmpDiag ama = new Bi map(AnchoDiag ama +
ExcesoDe echoLineasHo izon ales, Al oDiag ama +
ExcesoIn e io LineasVe icales);
G aphics lienzo = G aphics.F omImage(bmpDiag ama);
Dibuja Diag ama(lienzo);
lienzo.Dispose();
bi mapAc ualizado = ue;
}
public oid Desac ualiza Bi map() => bi mapAc ualizado = alse;
public Rec angle Ge Rec anguloDiag ama(Da eTime echaInicio, TimeSpan
iempoP oceso, in iden i icado Maquina)
{
TimeSpan iempoDesdeO igen =
echaInicio.Sub ac (FechaInicioP og amacion);
TimeSpan iempoDesdeApe u a = iempoDesdeO igen -
TimeSpan.F omDays( iempoDesdeO igen.Days) -
TimeSpan.F omHou s(Ho aInicioDia);
in xInicio = (in )( iempoDesdeO igen.Days * (Sepa acionDia +
AnchoDias) + iempoDesdeApe u a.To alHou s * AnchoHo a);
in ancho = (in )( iempoP oceso.To alHou s * AnchoHo a);
in yInicio = iden i icado Maquina * (Sepa acionMaquina +
Al oMaquina);
in al o = Al oMaquina;
e u n new Rec angle(xInicio, yInicio, ancho, al o);
A.7 Clase abs ac a Con olGan 99
}
public bool T abajoCon ienePosicion(T abajo abajoComp obado, Poin
posicionLocal)
{
o ( a i = 0; i <
abajoComp obado.Ge Nume oOpe acionesAsignadas(); i++)
{
Rec angle ec anguloDiag ama =
Ge Rec anguloDiag ama( abajoComp obado.Ge InicioOpe acion(i),
abajoComp obado.Ge TiempoP ocesoOpe acion(i),
abajoComp obado.Ge IDMaquinaOpe acion(i));
i ( ec anguloDiag ama.Con ains(posicionLocal)) e u n ue;
}
e u n alse;
}
p i a e oid Se Rec anguloSomb a()
{
dibujoDiag ama.In alida e( ec anguloSomb a);
ec anguloSomb a = CalculaRec anguloSomb a();
dibujoDiag ama.In alida e( ec anguloSomb a);
}
p i a e Rec angle CalculaRec anguloSomb a()
{
Poin posicionRec angulo = new Poin (panelT abajo.Loca ion.X,
panelT abajo.Loca ion.Y +
(in )Ma h.Round(panelT abajo.Heigh /2.0));
Maquina maquinaOpe acion = Ge MaquinaPosicion(posicionRec angulo.Y);
i (maquinaOpe acion != null)
{
TimeSpan iempoP oceso =
Ge TiempoP ocesoPosicion(posicionRec angulo,
T abajo.Ge T abajoSeleccionado());
in di e enciaMinu os = 1;
in i = 1;
Da eTime echaInicio =
Ge FechaInicioPosicion(posicionRec angulo);
do
{
i (T abajo.Ge T abajoSeleccionado(
).CheckOpe acionValidaT abajo( echaInicio,
iempoP oceso, maquinaOpe acion.Iden i icado ))
{
echaInicioRec anguloSomb a = echaInicio;
iden i icado MaquinaRec anguloSomb a =
maquinaOpe acion.Iden i icado ;
Rec angle ec anguloSomb a =
Ge Rec anguloDiag ama( echaInicio, iempoP oceso,
maquinaOpe acion.Iden i icado );
i ( ec anguloSomb a.X > AnchoDiag ama) e u n
Rec angle.Emp y;
else e u n ec anguloSomb a;
100 Capí ulo A. Código empleado
}
echaInicio = echaInicio.AddMinu es(di e enciaMinu os);
i ( echaInicio.Hou == Ho aFinDia)
{
echaInicio = new Da eTime( echaInicio.Yea ,
echaInicio.Mon h, echaInicio.Day +
1,Ho aInicioDia, 0, 0);
}
di e enciaMinu os = -1 * Ma h.Sign(di e enciaMinu os) *
(Ma h.Abs(di e enciaMinu os) + 1);
}while (di e enciaMinu os <= 60);
}
e u n Rec angle.Emp y;
}
p i a e Da eTime Ge FechaInicioPosicion(Poin posicionDiag ama)
{
in diaDiag ama = posicionDiag ama.X / (AnchoDias + Sepa acionDia);
double ho aDiag ama = (double)(posicionDiag ama.X - diaDiag ama *
(AnchoDias + Sepa acionDia)) / AnchoHo a + Ho aInicioDia;
Da eTime echaInicio = FechaInicioP og amacion.AddDays(diaDiag ama);
echaInicio = echaInicio.AddHou s(ho aDiag ama);
Da eTime echaInicioT uncada = new Da eTime( echaInicio.Yea ,
echaInicio.Mon h, echaInicio.Day, echaInicio.Hou ,
echaInicio.Minu e,0);
e u n echaInicioT uncada;
}
p i a e TimeSpan Ge TiempoP ocesoPosicion(Poin posicionDiag ama,
T abajo abajoSeleccionado)
{
Maquina maquinaOpe acion = Ge MaquinaPosicion(posicionDiag ama.Y);
i (maquinaOpe acion != null)
{
e u n maquinaOpe acion.Ge TiempoP oceso(
abajoSeleccionado.Iden i icado );
}
else
{
e u n TimeSpan.F omHou s(-1);
}
}
p i a e Maquina Ge MaquinaPosicion(in al u aDiag ama)
{
o ( a i = 0; i < Nume oMaquinas; i++)
{
i (al u aDiag ama > (i * (sepa acionMaquina + Al oMaquina)) &&
al u aDiag ama < (i * (sepa acionMaquina + Al oMaquina)) +
Al oMaquina)
{
e u n Maquina.Ge (i);
}
}
e u n null;
A.7 Clase abs ac a Con olGan 101
}
p i a e Rec angle C eaRec anguloCen adoDiag ama(in ma genIn e no)
{
in xRec angulo =
diag ama.Poin ToSc een(diag ama.Clien Rec angle.Loca ion).X +
ma genIn e no;
in yRec angulo =
diag ama.Poin ToSc een(diag ama.Clien Rec angle.Loca ion).Y +
ma genIn e no;
in wid hRec angulo = diag ama.Clien Rec angle.Wid h - 2 *
ma genIn e no;
in heigh Rec angulo = diag ama.Clien Rec angle.Heigh - 2 *
ma genIn e no;
e u n new Rec angle(xRec angulo, yRec angulo, wid hRec angulo,
heigh Rec angulo);
}
p i a e oid Sc ollDiag ama (in ma genSc oll, in alo Sc oll)
{
in xCu so = diag ama.Poin ToClien (Cu so .Posi ion).X;
in yCu so = diag ama.Poin ToClien (Cu so .Posi ion).Y;
in xAdd = 0;
in yAdd = 0;
i (xCu so <= ma genSc oll)
{
xAdd = - alo Sc oll;
}
else i (xCu so >= diag ama.Clien Rec angle.Loca ion.X +
diag ama.Clien Rec angle.Wid h - ma genSc oll)
{
xAdd = alo Sc oll;
}
i (yCu so <= ma genSc oll)
{
yAdd = - alo Sc oll;
}
else i (yCu so >= diag ama.Clien Rec angle.Loca ion.Y +
diag ama.Clien Rec angle.Heigh - ma genSc oll)
{
yAdd = alo Sc oll;
}
diag ama.Au oSc ollPosi ion = new
Poin (diag ama.Ho izon alSc oll.Value + xAdd,
diag ama.Ve icalSc oll.Value + yAdd);
Ajus a PosicionesSc oll();
}
p i a e double[] De e minaPosicionLineasTe cia ias()
{
Lis <double> lis aHo as = new Lis <double>();
i (AnchoHo a >= limi eCua oHo a)
{
102 Capí ulo A. Código empleado
o ( a i = 0; i <= Ho asXDia * 4; i++) lis aHo as.Add(i *
anchoHo a / 4.0);
}
else i (AnchoHo a >= limi eMediaHo a)
{
o ( a i = 0; i <= Ho asXDia * 2; i++) lis aHo as.Add(i *
anchoHo a / 2.0);
}
else i (AnchoHo a >= limi eHo a)
{
o ( a i = 0; i <= Ho asXDia; i++) lis aHo as.Add(i *
anchoHo a);
}
e u n lis aHo as.ToA ay();
}
p i a e double[] De e minaPosicionLineasSecunda ias()
{
Lis <double> lis aHo as = new Lis <double>();
i (AnchoHo a >= limi eCua oHo a)
{
o ( a i = 1; i < Ho asXDia * 2; i++) lis aHo as.Add(i *
anchoHo a / 2.0);
}
else i (AnchoHo a >= limi eHo a)
{
o ( a i = 1; i < Ho asXDia; i++) lis aHo as.Add(i *
anchoHo a);
}
e u n lis aHo as.ToA ay();
}
p i a e oid Mos a PanelT abajo(Rec angle ec anguloPanel, Colo
colo Panel)
{
panelT abajo.BackColo = colo Panel;
panelT abajo.Size = ec anguloPanel.Size;
panelT abajo.Loca ion = ec anguloPanel.Loca ion;
panelT abajo.Visible = ue;
di e enciaPosicion = panelT abajo.Poin ToClien (Cu so .Posi ion);
}
p i a e oid Mos a PanelT abajo(Colo colo Panel)
{
Poin posicionCu so = diag ama.Poin ToClien (Cu so .Posi ion);
panelT abajo.BackColo = colo Panel;
panelT abajo.Size = new Size (AnchoHo a,Al oMaquina);
Maquina maquinaAsignada;
in i = 0;
do
A.7 Clase abs ac a Con olGan 103
{
maquinaAsignada = Ge MaquinaPosicion(panelT abajo.Loca ion.Y +
(in )Ma h.Round(panelT abajo.Heigh / 2.0) - i);
i++;
}while (maquinaAsignada == null);
TimeSpan iempoP oceso = maquinaAsignada.Ge TiempoP oceso(
T abajo.Ge T abajoSeleccionado().Iden i icado );
panelT abajo.Wid h = (in )Ma h.Round( iempoP oceso.To alHou s *
AnchoHo a);
panelT abajo.Visible = ue;
di e enciaPosicion = new Poin (panelT abajo.Wid h / 2,
panelT abajo.Heigh / 2);
}
p i a e in Nume oMaquinas { ge => Maquina.Ge A ay().Leng h; }
p i a e in Nume oDias { ge => Maquina.S a icNume oDiasP og amacion; }
public Da eTime FechaInicioP og amacion { ge =>
T abajo.S a icO igenP og amacion; }
public Da eTime FechaFinP og amacion { ge =>
FechaInicioP og amacion.AddDays(Nume oDias); }
public in Al oDiag ama { ge => Al oMaquina * Nume oMaquinas +
Sepa acionMaquina * (Nume oMaquinas - 1); }
public in AnchoDiag ama { ge => AnchoDias * Nume oDias +
Sepa acionDia * (Nume oDias - 1); }
public in Al oEjeDias { ge => al oEjeDias; se => al oEjeDias =
alue; }
p i a e in al oEjeDias = 60;
public in AnchoEjeMaquinas { ge => anchoEjeMaquinas; se =>
anchoEjeMaquinas = alue; }
p i a e in anchoEjeMaquinas = 80;
public in Sepa acionDia { ge => sepa acionDia; se => sepa acionDia
= alue; }
p i a e in sepa acionDia = 20;
public in Sepa acionMaquina { ge => sepa acionMaquina; se =>
sepa acionMaquina = alue; }
p i a e in sepa acionMaquina = 10;
public in AnchoHo a
{
ge
{
e u n anchoHo a;
}
se
{
bi mapAc ualizado = alse;
104 Capí ulo A. Código empleado
i ( alue % 4 != 0) anchoHo a = alue / 4 * 4;
else anchoHo a = alue;
Ajus a Geome iaPaneles();
In alida e( ue);
}
}
p i a e Panel esquinaSupe io = new Panel();
p i a e Panel diag ama = new Panel();
p i a e Panel ejeMaquina = new Panel();
p i a e Panel ejeDias = new Panel();
p i a e Panel panelT abajo = new Panel();
p i a e Poin di e enciaPosicion;
p i a e Pic u eBox dibujoEjeDias = new Pic u eBox();
p i a e Pic u eBox dibujoEjeMaquina = new Pic u eBox();
p i a e Pic u eBox dibujoDiag ama = new Pic u eBox();
p i a e Pic u eBox dibujoEsquinaSupe io = new Pic u eBox();
p i a e Bi map bmpDiag ama;
p i a e in anchoHo a = 40;
p i a e in limi eHo a = 10;
p i a e in limi eMediaHo a = 30;
p i a e in limi eCua oHo a = 60;
public in AnchoDias { ge => anchoHo a * Ho asXDia; }
public in Al oMaquina { ge => al oMaquina; se => al oMaquina =
alue; }
p i a e in al oMaquina = 80;
public in ExcesoSupe io LineasVe icales { ge =>
excesoSupe io LineasVe icales; se =>
excesoSupe io LineasVe icales = alue; }
p i a e in excesoSupe io LineasVe icales = 50;
public in ExcesoIn e io LineasVe icales { ge =>
excesoIn e io LineasVe icales; se =>
excesoIn e io LineasVe icales = alue; }
A.7 Clase abs ac a Con olGan 105
p i a e in excesoIn e io LineasVe icales = 10;
public in ExcesoIzquie doLineasHo izon ales { ge =>
excesoIzquie doLineasHo izon ales; se =>
excesoIzquie doLineasHo izon ales = alue; }
p i a e in excesoIzquie doLineasHo izon ales = 60;
public in ExcesoDe echoLineasHo izon ales { ge =>
excesoDe echoLineasHo izon ales; se =>
excesoDe echoLineasHo izon ales = alue; }
p i a e in excesoDe echoLineasHo izon ales = 10;
public in ExcesoLineasSecunda ias { ge => excesoLineasSecunda ias;
se => excesoLineasSecunda ias = alue; }
p i a e in excesoLineasSecunda ias = 10;
p i a e Size ma genAu osc oll = new Size(20, 20);
public in Ho asXDia { ge => Ho aFinDia - Ho aInicioDia; }
public in Ho aInicioDia { ge =>
(in )Ma h.Floo (Maquina.Ge Ape u aMasTemp ana()); }
public in Ho aFinDia { ge =>
(in )Ma h.Ceiling(Maquina.Ge Cie eMasTa dio()); }
public in Sepa acionHo as = 20;
p i a e bool d agD opCheck = alse;
p i a e bool ese Somb aCheck = alse;
p i a e bool bi mapAc ualizado = alse;
p i a e Poin posicionInicialSc oll;
p i a e Poin posicionInicialCu so ;
p i a e Rec angle ec anguloSomb a;
p i a e Da eTime echaInicioRec anguloSomb a;
p i a e in iden i icado MaquinaRec anguloSomb a;
public o e ide Colo BackColo
{
ge => base.BackColo ;
se
{
base.BackColo = alue;
ejeMaquina.BackColo = alue;
esquinaSupe io .BackColo = alue;
ejeDias.BackColo = alue;
diag ama.BackColo = alue;
112 Capí ulo A. Código empleado
{
ope acionSeleccionada = i;
ec anguloOpe acionSeleccionada = ec anguloDiag ama;
}
}
Mos a PanelT abajo( ec anguloOpe acionSeleccionada,
T abajo.Ge T abajoSeleccionado().Colo Dibujo);
panelT abajo.Loca ion = new
Poin (dibujoDiag ama.Poin ToClien (Cu so .Posi ion).X -
di e enciaPosicion.X,
dibujoDiag ama.Poin ToClien (Cu so .Posi ion).Y -
di e enciaPosicion.Y);
abajoSeleccionado.Bo aOpe acion(ope acionSeleccionada);
Re eshLinked();
dibujoDiag ama.DoD agD op(diag ama, D agD opE ec s.All);
}
else
{
posicionInicialCu so = new Poin (-1, -1);
i (! ec anguloLimi e.Con ains(Cu so .Posi ion) && e.Bu on
== MouseBu ons.Le )
{
in sumaH = posicionInicialSc oll.X - Cu so .Posi ion.X;
in sumaV = posicionInicialSc oll.Y - Cu so .Posi ion.Y;
diag ama.Au oSc ollPosi ion = new
Poin (diag ama.Ho izon alSc oll.Value + sumaH,
diag ama.Ve icalSc oll.Value + sumaV);
Ajus a PosicionesSc oll();
posicionInicialSc oll = Cu so .Posi ion;
}
}
}
}
p i a e oid D agT abajo_D agEn e (objec sende , D agE en A gs e)
{
Se Bi mapDiag ama();
i (!panelT abajo.Visible)
Mos a PanelT abajo(T abajo.Ge T abajoSeleccionado().Colo Dibujo);
e.E ec = D agD opE ec s.All;
Cu so .Clip = C eaRec anguloCen adoDiag ama(1);
d agD opCheck = ue;
ec anguloSomb a = Rec angle.Emp y;
diag ama.In alida e();
esquinaSupe io .In alida e();
}
p i a e oid D agT abajo_D agD op(objec sende , D agE en A gs e)
{
panelT abajo.Loca ion = new
Poin (dibujoDiag ama.Poin ToClien (Cu so .Posi ion).X -
di e enciaPosicion.X,
A.7 Clase abs ac a Con olGan 113
dibujoDiag ama.Poin ToClien (Cu so .Posi ion).Y -
di e enciaPosicion.Y);
d agD opCheck = alse;
panelT abajo.Visible = alse;
Cu so .Clip = Rec angle.Emp y;
i ( ec anguloSomb a != Rec angle.Emp y)
{
T abajo.Ge T abajoSeleccionado().AddOpe acion( echaInicioRec anguloSomb a,
iden i icado MaquinaRec anguloSomb a);
Ac ualizaLis BoxEnlazadas();
}
Re eshLinked();
Se Bi mapDiag ama();
diag ama.Re esh();
esquinaSupe io .Re esh();
}
p i a e oid D agT abajo_D agO e (objec sende , D agE en A gs e)
{
in ma genRec angulo = 10;
Rec angle ec anguloIn e no =
C eaRec anguloCen adoDiag ama(ma genRec angulo);
panelT abajo.Loca ion = new
Poin (dibujoDiag ama.Poin ToClien (Cu so .Posi ion).X -
di e enciaPosicion.X,
dibujoDiag ama.Poin ToClien (Cu so .Posi ion).Y -
di e enciaPosicion.Y);
i ( ec anguloIn e no.Con ains(Cu so .Posi ion))
{
Se Rec anguloSomb a();
i ( ec anguloSomb a != Rec angle.Emp y)
{
panelT abajo.Wid h = ec anguloSomb a.Wid h;
}
else
{
Maquina maquinaAsignada =
Ge MaquinaPosicion(panelT abajo.Loca ion.Y +
(in )Ma h.Round(panelT abajo.Heigh / 2.0));
i (maquinaAsignada != null)
{
TimeSpan iempoP oceso =
maquinaAsignada.Ge TiempoP oceso(T abajo.Ge T abajoSeleccionado().Iden i icado );
panelT abajo.Wid h =
(in )Ma h.Round( iempoP oceso.To alHou s *
AnchoHo a);
}
}
esquinaSupe io .Re esh();
ese Somb aCheck = alse;
114 Capí ulo A. Código empleado
}
else
{
i (dibujoDiag ama.Poin ToClien (Cu so .Posi ion).X <=
ma genRec angulo * 2)
{
Se Rec anguloSomb a();
}
else i (! ese Somb aCheck)
{
dibujoDiag ama.In alida e( ec anguloSomb a);
ec anguloSomb a = Rec angle.Emp y;
esquinaSupe io .Re esh();
ese Somb aCheck = ue;
}
i (posicionInicialCu so == Cu so .Posi ion)
Sc ollDiag ama(ma genRec angulo, AnchoHo a / 2);
posicionInicialCu so = Cu so .Posi ion;
}
dibujoDiag ama.Upda e();
}
}
}
Código A.14
Código empleado pa a elabo a los E en Handle s del con ol he edado
Diag amaGan .
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Linq;
using Sys em.Tex ;
using Sys em.Th eading.Tasks;
using Sys em.D awing;
using Sys em.D awing.D awing2D;
using Sys em.Windows.Fo ms;
using Sys em.Run ime.Compile Se ices;
namespace Gan Diag amGene a o
{
public pa ial class Diag amaGan : Con olGan
{
public s a ic oid DibujaLineasPa alelas(G aphics lienzo, Poin
o igenEje, double anguloEje, in can idadLineas, in
sepa acionLineas, in longi udLineas, double anguloLineas, Pen
d awPen)
{
o ( a i = 0; i < can idadLineas; i++)
{
Poin inicioLinea = new Poin ((in )(o igenEje.X + i *
sepa acionLineas * Ma h.Cos(anguloEje)),
(in )(o igenEje.Y - i * sepa acionLineas *
Ma h.Sin(anguloEje)));
Poin inLinea = new Poin ((in )(inicioLinea.X + longi udLineas
* Ma h.Cos(anguloLineas)),
A.7 Clase abs ac a Con olGan 115
(in )(inicioLinea.Y - longi udLineas *
Ma h.Sin(anguloLineas)));
lienzo.D awLine(d awPen, inicioLinea, inLinea);
}
}
public s a ic oid DibujaSe ieS ings(G aphics lienzo, Poin
o igenEje, double anguloEje, Size amañoRec angulo, in
sepa acionRec angulos, s ing[] d awTex , B ush d awB ush,
S ingFo ma d awS ingFo ma , Fon d awFon )
{
o ( a i = 0; i < d awTex .Leng h; i++)
{
Poin posicionRecangulo = new Poin ((in )(o igenEje.X +
(sepa acionRec angulos + amañoRec angulo.Wid h) *
Ma h.Cos(anguloEje) * i),
(in )(o igenEje.Y - (sepa acionRec angulos +
amañoRec angulo.Heigh ) * Ma h.Sin(anguloEje) * i));
Rec angleF d awRec angle = new Rec angle(posicionRecangulo,
amañoRec angulo);
lienzo.D awS ing(d awTex [i], d awFon , d awB ush,
d awRec angle, d awS ingFo ma );
}
}
public s a ic oid DibujaRec anguloRayado(G aphics lienzo, Rec angle
ec angulo, in espaciadoLineas, double anguloLineas, Pen
bo de Pen, Pen inne Pen, Colo backColo )
{
lienzo.FillRec angle(new SolidB ush(backColo ), ec angulo);
lienzo.D awRec angle(bo de Pen, ec angulo);
Poin inicioLinea = new Poin ( ec angulo.X, ec angulo.Y);
Poin inLinea = inicioLinea;
in yAdd = (in )(espaciadoLineas / Ma h.Cos(anguloLineas));
in xAdd = (in )(espaciadoLineas / Ma h.Sin(anguloLineas));
do
{
i (inicioLinea.Y <= (in )( ec angulo.Y + ec angulo.Wid h *
Ma h.Tan(anguloLineas)) && inicioLinea.X == ec angulo.X)
{
inLinea = new Poin ((in )( ec angulo.X + (inicioLinea.Y -
ec angulo.Y) / Ma h.Tan(anguloLineas)), ec angulo.Y);
}
else i (inicioLinea.Y > (in )( ec angulo.Y + ec angulo.Wid h
* Ma h.Tan(anguloLineas)) && inicioLinea.X == ec angulo.X)
{
inLinea = new Poin ( ec angulo.X + ec angulo.Wid h,
(in )(inicioLinea.Y - ec angulo.Wid h *
Ma h.Tan(anguloLineas)));
}
else i (inicioLinea.Y == ec angulo.Y + ec angulo.Heigh &&
inicioLinea.X <= ec angulo.X + ec angulo.Wid h -
ec angulo.Heigh / Ma h.Tan(anguloLineas))
{
116 Capí ulo A. Código empleado
inLinea = new Poin ((in )(inicioLinea.X + ec angulo.Heigh
/ Ma h.Tan(anguloLineas)), ec angulo.Y);
}
else i (inicioLinea.Y == ec angulo.Y + ec angulo.Heigh &&
inicioLinea.X > ec angulo.X + ec angulo.Wid h -
ec angulo.Heigh / Ma h.Tan(anguloLineas))
{
inLinea = new Poin ( ec angulo.X + ec angulo.Wid h,
(in )(inicioLinea.Y - ( ec angulo.X + ec angulo.Wid h -
inicioLinea.X) * Ma h.Tan(anguloLineas)));
}
lienzo.D awLine(inne Pen, inicioLinea, inLinea);
i (inicioLinea.Y + yAdd < ec angulo.Y + ec angulo.Heigh )
{
inicioLinea = new Poin (inicioLinea.X, inicioLinea.Y + yAdd);
}
else i (inicioLinea.Y != ( ec angulo.Y + ec angulo.Heigh ))
{
inicioLinea = new Poin ((in )(inicioLinea.X + xAdd -
( ec angulo.Y + ec angulo.Heigh - inicioLinea.Y) /
Ma h.Tan(anguloLineas)),
ec angulo.Y + ec angulo.Heigh );
}
else
{
inicioLinea = new Poin (inicioLinea.X + xAdd, ec angulo.Y +
ec angulo.Heigh );
}
}while (inicioLinea.X < ( ec angulo.X + ec angulo.Wid h) ||
inicioLinea.Y < ( ec angulo.Y + ec angulo.Heigh ));
}
p i a e oid DibujaOpe acion(G aphics lienzo, Rec angle ec angulo,
s ing ex oIn e io , Colo colo Fondo)
{
lienzo.FillRec angle(new SolidB ush(colo Fondo), ec angulo);
lienzo.D awRec angle(penLineasP incipales, ec angulo);
}
p i a e oid DibujaOpe acionSeleccionada(G aphics lienzo, Rec angle
ec angulo, s ing ex oIn e io , Colo colo Fondo)
{
lienzo.FillRec angle(new Sys em.D awing.D awing2D.Ha chB ush(
Sys em.D awing.D awing2D.Ha chS yle.Do edDiamond,
Colo .Black, colo Fondo), ec angulo);
lienzo.D awRec angle(penLineasP incipales, ec angulo);
}
p i a e oid DibujaOpe acionesT abajo(G aphics lienzo, T abajo
abajoDibujado)
{
o ( a i = 0; i <
abajoDibujado.Ge Nume oOpe acionesAsignadas(); i++)
A.7 Clase abs ac a Con olGan 117
{
Rec angle ec anguloDibujo =
Ge Rec anguloDiag ama( abajoDibujado.Ge InicioOpe acion(i),
abajoDibujado.Ge TiempoP ocesoOpe acion(i),
abajoDibujado.Ge IDMaquinaOpe acion(i));
i ( abajoDibujado.Resal ado)
DibujaOpe acionSeleccionada(lienzo, ec anguloDibujo, " ",
abajoDibujado.Colo Dibujo);
else DibujaOpe acion(lienzo, ec anguloDibujo, " ",
abajoDibujado.Colo Dibujo);
}
}
p i a e oid DibujaHo a io(G aphics lienzo, TimeSpan[] a ayApe u as,
TimeSpan[] a ayCie es, in dia, in nume oMaquina)
{
Colo colo Fondo = Colo .T anspa en ;
in xDiaHo a io = (AnchoDias + Sepa acionDia) * dia;
in yHo a io = nume oMaquina * (Sepa acionMaquina + Al oMaquina);
i (a ayApe u as.Leng h != 0 || a ayCie es.Leng h != 0)
{
in anchoHo a io = (in )(AnchoHo a *
(a ayApe u as[0].To alHou s - Ho aInicioDia));
in xHo a io = xDiaHo a io;
Rec angle ec anguloSomb eado = new Rec angle(xHo a io,
yHo a io, anchoHo a io, al oMaquina);
DibujaRec anguloRayado(lienzo, ec anguloSomb eado, 10, Ma h.PI
/ 4, penLineasP incipales, penLineasP incipales,
colo Fondo);
anchoHo a io = AnchoDias - (in )(AnchoHo a *
(a ayCie es[a ayCie es.Leng h - 1].To alHou s -
Ho aInicioDia));
xHo a io = xDiaHo a io + (in )(AnchoHo a *
(a ayCie es[a ayCie es.Leng h - 1].To alHou s -
Ho aInicioDia));
ec anguloSomb eado = new Rec angle(xHo a io, yHo a io,
anchoHo a io, al oMaquina);
DibujaRec anguloRayado(lienzo, ec anguloSomb eado, 10, Ma h.PI
/ 4, penLineasP incipales, penLineasP incipales,
colo Fondo);
o ( a i = 1; i < a ayApe u as.Leng h; i++)
{
anchoHo a io = (in )(AnchoHo a *
(a ayApe u as[i].To alHou s - a ayCie es[i -
1].To alHou s));
xHo a io = xDiaHo a io + (in )(AnchoHo a * (a ayCie es[i -
1].To alHou s - Ho aInicioDia));
ec anguloSomb eado = new Rec angle(xHo a io, yHo a io,
anchoHo a io, al oMaquina);
118 Capí ulo A. Código empleado
DibujaRec anguloRayado(lienzo, ec anguloSomb eado, 10,
Ma h.PI / 4, penLineasP incipales, penLineasP incipales,
colo Fondo);
}
}
else
{
Rec angle ec anguloCie e = new Rec angle(xDiaHo a io,
yHo a io, AnchoDias, Al oMaquina);
DibujaRec anguloRayado(lienzo, ec anguloCie e, 10, Ma h.PI /
4, penLineasP incipales, penLineasP incipales, colo Fondo);
}
}
p i a e oid DibujaHo a iosMaquina(G aphics lienzo, Maquina
maquinaSeleccionada)
{
o ( a i = 0; i < Nume oDias; i++)
{
DibujaHo a io(lienzo, maquinaSeleccionada.Ge Ape u as(i),
maquinaSeleccionada.Ge Cie es(i),
i, maquinaSeleccionada.Iden i icado );
}
}
public oid Dibuja Diag ama(G aphics lienzo)
{
o each (double elemen o in De e minaPosicionLineasTe cia ias())
{
o ( a i = 0; i < Maquina.Ge A ay().Leng h; i++)
{
DibujaLineasPa alelas(lienzo, new
Poin ((in )Ma h.Round(elemen o), i * (Al oMaquina +
Sepa acionMaquina)), 0, Nume oDias, AnchoHo a *
Ho asXDia + Sepa acionDia, Al oMaquina, -Ma h.PI / 2,
penLineasTe cia ias);
}
}
o each (T abajo elemen o in T abajo.Ge A ay())
DibujaOpe acionesT abajo(lienzo, elemen o);
in Longi udLineasHo izon alesP incipales = AnchoDiag ama +
ExcesoDe echoLineasHo izon ales;
in Longi udLineasVe icalesP incipales = Al oDiag ama +
ExcesoIn e io LineasVe icales;
lienzo.D awLine(penLineasP incipales, new Poin (0, 0), new Poin (0,
Longi udLineasVe icalesP incipales));
lienzo.D awLine(penLineasP incipales, new Poin (AnchoDiag ama, 0),
new Poin (AnchoDiag ama, Longi udLineasVe icalesP incipales));
DibujaLineasPa alelas(lienzo, new Poin (AnchoDias, 0), 0,
Nume oDias - 1, AnchoHo a * Ho asXDia + Sepa acionDia,
Longi udLineasVe icalesP incipales, -Ma h.PI / 2,
penLineasP incipales);
A.7 Clase abs ac a Con olGan 119
DibujaLineasPa alelas(lienzo, new Poin (AnchoDias + Sepa acionDia,
0), 0, Nume oDias - 1, AnchoHo a * Ho asXDia + Sepa acionDia,
Longi udLineasVe icalesP incipales, -Ma h.PI / 2,
penLineasP incipales);
lienzo.D awLine(penLineasP incipales, new Poin (0, 0), new
Poin (Longi udLineasHo izon alesP incipales, 0));
lienzo.D awLine(penLineasP incipales, new Poin (0, Al oDiag ama),
new Poin (Longi udLineasHo izon alesP incipales, Al oDiag ama));
DibujaLineasPa alelas(lienzo, new Poin (0, Al oMaquina), -Ma h.PI /
2, Nume oMaquinas - 1, Al oMaquina + Sepa acionMaquina,
Longi udLineasHo izon alesP incipales, 0, penLineasP incipales);
DibujaLineasPa alelas(lienzo, new Poin (0, Al oMaquina +
Sepa acionMaquina), -Ma h.PI / 2, Nume oMaquinas - 1,
Al oMaquina + Sepa acionMaquina,
Longi udLineasHo izon alesP incipales, 0, penLineasP incipales);
o each (double elemen o in De e minaPosicionLineasSecunda ias())
{
DibujaLineasPa alelas(lienzo, new
Poin ((in )Ma h.Round(elemen o), 0), 0, Nume oDias,
AnchoHo a * Ho asXDia + Sepa acionDia, Al oDiag ama +
ExcesoLineasSecunda ias, -Ma h.PI / 2,
penLineasSecunda ias);
}
o each (Maquina elemen o in Maquina.Ge A ay())
DibujaHo a iosMaquina(lienzo, elemen o);
}
public oid Inicializa Elemen osG a icos()
{
s EjeMaquina.Alignmen = S ingAlignmen .Cen e ;
s EjeMaquina.LineAlignmen = S ingAlignmen .Cen e ;
s EjeDias.Alignmen = S ingAlignmen .Cen e ;
penLineasSecunda ias.DashS yle = DashS yle.Dash;
penLineasTe cia ias.DashS yle = DashS yle.Do ;
}
p i a e SolidB ush b EjesP incipales = new SolidB ush(Colo .Black);
p i a e Colo colo Somb a = Colo .Ligh G ay;
p i a e Fon Fuen eEjes { ge => new Fon (Fon .Name,
amañoFuen eEjes); }
p i a e loa amañoFuen eEjes = 10;
p i a e Fon Fuen eTi ulosHo as { ge => new Fon (Fon .Name,
amañoFuen eTi ulosHo as); }
p i a e loa amañoFuen eTi ulosHo as = 8;
p i a e S ingFo ma s EjeMaquina = new S ingFo ma ();
p i a e S ingFo ma s EjeDias = new S ingFo ma ();
p i a e Pen penLineasP incipales = new Pen(Colo .Black, 2);
120 Capí ulo A. Código empleado
p i a e Pen penBo des = new Pen(Colo .Black, 6);
p i a e Pen penLineasSecunda ias = new Pen(Colo .Black, 1);
p i a e Pen penLineasTe cia ias = new Pen(Colo .Black, 1);
}
}
Código A.15
Código empleado pa a elabo a los elemen os g á icos del con ol he edado
Diag amaGan .
A.7.2 Clase abs ac a Lis BoxGan y con oles he edados
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Linq;
using Sys em.Tex ;
using Sys em.Th eading.Tasks;
using Sys em.D awing;
using Sys em.D awing.D awing2D;
using Sys em.Windows.Fo ms;
namespace Gan Diag amGene a o
{
public abs ac class Lis BoxGan <T> : Con olGan whe e T :
IDa osIden i ica i os , ISeleccionable
{
public Lis BoxGan ()
{
Inicializa MainLis Box();
}
p o ec ed oid Inicializa MainLis Box()
{
mainLis Box.Dock = DockS yle.Fill;
mainLis Box.Ho izon alSc ollba = ue;
mainLis Box.In eg alHeigh = alse;
mainLis Box.BackColo = Colo .Whi e;
mainLis Box.Fo ma ingEnabled = ue;
mainLis Box.I emHeigh = 16;
mainLis Box.Bo de S yle = Bo de S yle.Fixed3D;
mainLis Box.Fon = Fon ;
mainLis Box.Selec edValueChanged += new
E en Handle (Seleccion_Selec edValueChanged);
}
p i a e oid Seleccion_Selec edValueChanged(objec sende , E en A gs e)
{
T elemen oSeleccionado = (T)mainLis Box.Selec edI em;
i (elemen oSeleccionado != null)
{
elemen oSeleccionado.Seleccionado = ue;
In alida eLinked();
}
A.7 Clase abs ac a Con olGan 121
}
public abs ac oid Con en Upda e();
public oid Clea () => mainLis Box.I ems.Clea ();
p o ec ed Lis Box mainLis Box = new Lis Box();
}
public class Lis BoxT abajos : Lis BoxGan <T abajo>
{
public Lis BoxT abajos() :base()
{
Inicializa ();
Con ols.Add(scFondo);
}
p o ec ed oid Inicializa ()
{
scFondo.IsSpli e Fixed = ue;
scFondo.O ien a ion = O ien a ion.Ho izon al;
scFondo.Dock = DockS yle.Fill;
scFondo.BackColo = Sys emColo s.Con ol;
scFondo.Panel1.BackColo = BackColo ;
scFondo.Panel1.Con ols.Add(mainLis Box);
scFondo.Panel2.BackColo = Sys emColo s.Con ol;
scFondo.Panel2.Con ols.Add( lpBo ones);
lpBo ones.Dock = DockS yle.Fill;
b nNoAsignados.Fon = Fon ;
b nNoAsignados.Tex = "No Asignados";
b nNoAsignados.CheckedChanged += new
E en Handle ( adioBu on_CheckedChanged);
b nNoAsignados.Checked = ue;
b nAsignados.Fon = Fon ;
b nAsignados.Tex = "Asignados";
b nAsignados.CheckedChanged += new
E en Handle ( adioBu on_CheckedChanged);
b nT abajos.Fon = Fon ;
b nT abajos.Tex = "Ambos";
b nT abajos.CheckedChanged += new
E en Handle ( adioBu on_CheckedChanged);
lpBo ones.Con ols.Add(b nNoAsignados);
lpBo ones.Con ols.Add(b nAsignados);
lpBo ones.Con ols.Add(b nT abajos);
G aphics g x_ lpBo ones = lpBo ones.C ea eG aphics();
b nNoAsignados.Wid h =
g x_ lpBo ones.Measu eS ing(b nNoAsignados.Tex ,
b nNoAsignados.Fon ).ToSize().Wid h + 25;
128 Capí ulo A. Código empleado
i (maquinasFal an es.Coun > 1)
{
yLinea = D awS ingLines(lienzo, new Poin F(xLinea,
yLinea), Ancho,
$"T abajo no p og amado comple amen e, al an las
máquinas ({s ingMaquinasFal an es})",
Fon , b ushFo eColo );
}
else
{
yLinea = D awS ingLines(lienzo, new Poin F(xLinea,
yLinea), Ancho,
$"T abajo no p og amado comple amen e, al a la
máquina {s ingMaquinasFal an es}",
Fon , b ushFo eColo );
}
}
lienzo.D awS ing($"Ope aciones asignadas:
{ abajoSeleccionado.Ge Nume oOpe acionesAsignadas()}",
Fon , b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
o ( a i = 0; i <
abajoSeleccionado.Ge Nume oOpe acionesAsignadas(); i++)
{
s ing mensajeOpe acion;
mensajeOpe acion = $"Inicio:
{ abajoSeleccionado.Ge InicioOpe acion(i)}, " +
$"Fin: { abajoSeleccionado.Ge FinOpe acion(i)}," +
$" Du ación:
{ abajoSeleccionado.Ge TiempoP ocesoOpe acion(i)},"
+
$" Máquina:
{ abajoSeleccionado.Ge IDMaquinaOpe acion(i)}";
lienzo.D awS ing(mensajeOpe acion, Fon , b ushFo eColo ,
xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
}
}
else
{
lienzo.D awS ing("T abajo no p og amado.", Fon ,
b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
}
i ( abajoSeleccionado.Ge Ope a ios().Leng h > 0)
{
lienzo.D awS ing($"Ope a ios asignados:
{ abajoSeleccionado.Ge Ope a ios().Leng h}", Fon ,
b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
o ( a i = 0; i < abajoSeleccionado.Ge Ope a ios().Leng h;
i++)
{
A.7 Clase abs ac a Con olGan 129
lienzo.D awS ing(
abajoSeleccionado.Ge Ope a ios()[i].Nomb e, Fon ,
b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
}
}
else
{
lienzo.D awS ing("Sin ope a ios asignados.", Fon ,
b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
}
e u n (in )Ma h.Ceiling(yLinea);
}
in DibujaTex oElemen o(G aphics lienzo, Maquina maquinaSeleccionada)
{
loa yLinea = ma genes.Y;
loa xLinea = ma genes.X;
yLinea = DibujaTi ulo<Maquina>(lienzo, new Poin F(xLinea, yLinea),
maquinaSeleccionada);
lienzo.D awS ing($"Tiempo o al disponible:
{maquinaSeleccionada.Ge TiempoDisponible()} minu os", Fon ,
b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
lienzo.D awS ing($"Tiempo o al p og amado:
{maquinaSeleccionada.Ge TiempoP og amado()} minu os", Fon ,
b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
e u n (in )Ma h.Ceiling(yLinea);
}
in DibujaTex oElemen o(G aphics lienzo, Ope a io ope a ioSeleccionado)
{
loa yLinea = ma genes.Y;
loa xLinea = ma genes.X;
yLinea = DibujaTi ulo<Ope a io>(lienzo, new Poin F(xLinea, yLinea),
ope a ioSeleccionado);
in nume oT abajosAsignados =
ope a ioSeleccionado.Ge T abajosAsignados();
i (nume oT abajosAsignados > 0)
{
lienzo.D awS ing($"T abajos asignados:
{nume oT abajosAsignados}", Fon , b ushFo eColo , xLinea,
yLinea);
}
else
{
lienzo.D awS ing("Sin abajos asignados.", Fon ,
b ushFo eColo , xLinea, yLinea);
}
yLinea += Fon .Ge Heigh (lienzo);
130 Capí ulo A. Código empleado
e u n (in )Ma h.Ceiling(yLinea);
}
p i a e loa DibujaTi ulo<T>(G aphics lienzo, Poin F o igen, T
elemen oDibujado) whe e T : IDa osIden i ica i os
{
loa xLinea = o igen.X;
loa yLinea = o igen.Y;
S ingFo ma s = new S ingFo ma ();
s .Alignmen = S ingAlignmen .Cen e ;
s .LineAlignmen = S ingAlignmen .Cen e ;
i (elemen oDibujado.Nomb e != null)
{
lienzo.D awS ing(elemen oDibujado.Nomb e, on Ti ulo,
b ushFo eColo , new Rec angleF(xLinea, yLinea, Ancho,
Fon .Ge Heigh (lienzo)), s );
yLinea += Fon .Ge Heigh (lienzo);
}
else
{
lienzo.D awS ing($"T abajo {elemen oDibujado.Iden i icado }",
Fon , b ushFo eColo , xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
}
i (elemen oDibujado.Desc ipcion != null)
{
yLinea = D awS ingLines(lienzo, new Poin F(xLinea, yLinea),
Ancho, elemen oDibujado.Desc ipcion, Fon , b ushFo eColo );
}
lienzo.D awS ing($"Iden i icado :
{elemen oDibujado.Iden i icado }", Fon , b ushFo eColo ,
xLinea, yLinea);
yLinea += Fon .Ge Heigh (lienzo);
e u n yLinea;
}
}
public class LabelGan Gene al : LabelGan
{
public LabelGan Gene al() : base()
{
}
p o ec ed o e ide in DibujaTex oIn o ma i o(G aphics lienzo)
{
loa xLinea = ma genes.X;
loa yLinea = ma genes.Y;
S ingFo ma s = new S ingFo ma ();
s .Alignmen = S ingAlignmen .Cen e ;
s .LineAlignmen = S ingAlignmen .Cen e ;
A.7 Clase abs ac a Con olGan 131
lienzo.D awS ing("Da os gene ales", on Ti ulo, b ushFo eColo ,
new Rec angleF(xLinea, yLinea, Ancho,
on Ti ulo.Ge Heigh (lienzo)), s );
yLinea += on Ti ulo.Ge Heigh (lienzo);
yLinea += 5;
s .Alignmen = S ingAlignmen .Nea ;
s .LineAlignmen = S ingAlignmen .Cen e ;
lienzo.D awS ing($"Pacien es P og amados:
{T abajo.Ge T abajosP og amados()}", Fon , b ushFo eColo , new
Rec angleF(xLinea, yLinea, Ancho, Fon .Ge Heigh (lienzo)), s );
yLinea += Fon .Ge Heigh (lienzo);
lienzo.D awS ing($"Pacien es No Asignados:
{T abajo.Ge T abajosNoP og amados()}", Fon , b ushFo eColo ,
new Rec angleF(xLinea, yLinea, Ancho, Fon .Ge Heigh (lienzo)),
s );
yLinea += Fon .Ge Heigh (lienzo);
lienzo.D awS ing($"Tiempo To al Disponible:
{Maquina.Ge TiempoTo alDisponible()} minu os", Fon ,
b ushFo eColo , new Rec angleF(xLinea, yLinea, Ancho,
Fon .Ge Heigh (lienzo)), s );
yLinea += Fon .Ge Heigh (lienzo);
lienzo.D awS ing($"Tiempo To al P og amado :
{Maquina.Ge TiempoTo alP og amado()} minu os", Fon ,
b ushFo eColo , new Rec angleF(xLinea, yLinea, Ancho,
Fon .Ge Heigh (lienzo)), s );
yLinea += Fon .Ge Heigh (lienzo);
e u n (in )Ma h.Ceiling(yLinea);
}
}
}
Código A.17
Código empleado pa a elabo a la clase abs ac a he edada LabelGan y sus es
con oles he edados, LabelGan Elemen os y LabelGan Gene al.
Índice de Figu as
1.1 Esquema de las dis in as zonas de la aplicación, elabo ación p opia 5
1.2 Esquema del p oceso de plani icación de las in e enciones qui ú gicas, elabo ación p opia 5
2.1 Diag amas de Gan o ien ado a abajo y a máquina, [Domschke e al., 1997] 11
2.2 Ejemplo del diag ama de Gan p esen e en la aplicación, elabo ación p opia 12
3.1 Cap u a de la aplicación desa ollada con odas sus zonas esal adas, elabo ación p opia 14
3.2 Compa ación en e los e ec os que la selección en la lis a de un ope a io (izquie da) y un
abajo (de echa) iene en el diag ama p incipal, elabo ación p opia 14
3.3 Diag ama de Gan con la máquina 1 seleccionada, elabo ación p opia 14
3.4 Cap u a de la aplicación en la que se ep esen a un diag ama con Ho a ios, elabo ación p opia 15
3.5 Plano de alle del panel de in o mación de los dis in os elemen os del diag ama en unción
de cuál de ellos es é seleccionado, elabo ación p opia 16
3.6 Plano de alle del panel de in o mación gene al de la p og amación, elabo ación p opia 16
3.7 Cap u as de la aplicación que mues an la impo ancia del zoom pa a la selección de
ope aciones, elabo ación p opia 17
3.8 Compa ación en e dos con igu aciones posibles pa a la aplicación, una que p io iza el
amaño del diag ama (izquie da) y o a que p io iza la lis a y los paneles de in o mación
(de echa), elabo ación p opia 18
3.9 Plano de alle de la opción ab i de la aplicación desa ollada, elabo ación p opia 18
3.10 Ejemplo de cuad o de diálogo pa a la selección de a chi o en la aplicación desa ollada,
elabo ación p opia 19
3.11 Cap u a que mues a cómo se comienza un e en o d ag and d op en la aplicación con la
consiguien e desp og amación del abajo seleccionado, elabo ación p opia 20
3.12 Cap u a de la aplicación du an e el e en o d ag and d op,elabo ación p opia 20
3.13 Cap u a que mues a el p oceso de asignación de un abajo una ez se ha iniciado el
d ag and d op,elabo ación p opia 21
3.14 Cap u a que mues a el p oceso de eliminación de un abajo una ez se ha iniciado el
d ag and d op,elabo ación p opia 22
3.15 Ilus ación de las di e en es ayudas a la p og amación inco po adas en la aplicación, es-
as son el ajus e al in/inicio del día (a iba a la izquie da), ajus e con espec o a o as
ope aciones del mismo abajo (a iba a la de echa) y ajus e con espec o a o as ope a-
ciones (abajo), elabo ación p opia 23
3.16 Ejemplo de un diag ama de Gan de un modelo de máquinas pa alelas p oducido po la
aplicación desa ollada, elabo ación p opia 23
133
134 Índice de Figu as
3.17 Ejemplo de un diag ama de Gan de un alle de lujo p oducido po la aplicación desa-
ollada, elabo ación p opia 24
3.18 Ejemplo de un diag ama de Gan de un alle abie o p oducido po la aplicación desa-
ollada, elabo ación p opia 24
4.1 Gama de colo es ep esen ada en un diag ama de Gan , ob enida empleando el mé odo
de gene ación in eg ado en la aplicación, elabo ación p opia 29
4.2 Compa ación en e la ep esen ación g á ica de un abajo seleccionado ( abajo cen al)
en la aplicación en e al es o, elabo ación p opia 30
4.3 Diag ama de Gan ep esen ando un modelo de máquinas pa alelas, p oducido po el
iche o de ejemplo co espondien e, elabo ación p opia 35
4.4 Diag ama de Gan ep esen ando un alle de lujo, p oducido po el iche o de ejemplo
co espondien e, elabo ación p opia 36
4.5 Diag ama de clases que de i an de Con olGan , elabo ación p opia 38
4.6 Di isión del con ol Diag amaGan en los paneles independien es que lo con o man,
elabo ación p opia 39
4.7 Esquema de las di e en es p opiedades que modi ican el aspec o ísico del diag ama de
Gan ep esen ado, elabo ación p opia 40
4.8 Esquema de la elabo ación de los g á icos del diag ama pa a la modi icación de la p o-
g amación de un abajo median e el e en o d ag and d op,elabo ación p opia 45
5.1 Esquema de como pod ía emplea se un único bi map y un Pic u eBox pa a elabo a el
con ol Diag amaGan 50
Índice de Códigos
A.1 Código empleado pa a inicializa el p og ama 53
A.2 Código p oducido po el diseñado de Visual S udio pa a inicializa la clase en ana p incipal 53
A.3 Código empleado pa a los E en Handle s de los con oles de la aplicación (excluyedo a
los he edados de Con olGan ), así como la inicialización de la en ana p incipal 62
A.4 Código empleado pa a elabo a la pa e p incipal de la clase T abajo 65
A.5 Código empleado pa a elabo a odo lo elacionado con ope aciones de la clase T abajo 70
A.6 Código empleado pa a elabo a la pa e p incipal de la clase Maquina 76
A.7 Código empleado pa a elabo a odo lo elacionado con ho a ios de la clase Maquina 78
A.8 Código empleado pa a elabo a la clase Ope a io 81
A.9 Código que de ine las in e aces que han de implemen a las clases T abajo, Maquina y
Ope a io 83
A.10 Código empleado pa a lee el iche o de en ada 84
A.11 Código empleado pa a elabo a el iche o de salida 90
A.12 Código empleado pa a elabo a la clase abs ac a Con olGan 94
A.13 Código empleado pa a elabo a la pa e p incipal del con ol he edado Diag amaGan 95
A.14 Código empleado pa a elabo a los E en Handle s del con ol he edado Diag amaGan 106
A.15 Código empleado pa a elabo a los elemen os g á icos del con ol he edado Diag amaGan 114
A.16 Código empleado pa a elabo a la clase abs ac a he edada Lis BoxGan y sus es con-
oles he edados, Lsi BoxT abajo, Lis BoxMaquina y Lis BoxOpe a io 120
A.17 Código empleado pa a elabo a la clase abs ac a he edada LabelGan y sus es con-
oles he edados, LabelGan Elemen os y LabelGan Gene al 124
135
Bibliog a ía
[Dios e al., 2015]
Dios, M., Molina-Pa ien e, J. M., Fe nandez-Viagas, V., And ade-Pineda, J. L.,
and F aminan, J. M. (2015). A decision suppo sys em o ope a ing oom scheduling. Compu e s
& Indus ial Enginee ing, 88:430–443.
[Domschke e al., 1997]
Domschke, W., Scholl, A., and Voß, S. (1997). P oduk ionsplanung,
olume 2.
[F aminan e al., 2014]
F aminan, J. M., Leis en, R., and Ga cía, R. R. (2014). Manu ac u ing
scheduling sys ems. Sp inge .
[Molina-Pa ien e e al., 2015a]
Molina-Pa ien e, J. M., Fe nandez-Viagas, V., and F aminan, J. M.
(2015a). In eg a ed ope a ing oom planning and scheduling p oblem wi h assis an su geon
dependen su ge y du a ions. Compu e s & Indus ial Enginee ing, 82:8–20.
[Molina-Pa ien e e al., 2015b]
Molina-Pa ien e, J. M., Hans, E. W., F aminan, J. M., and Gomez-
Cia, T. (2015b). New heu is ics o planning ope a ing ooms. Compu e s & Indus ial Enginee-
ing, 90:429–443.
[Pinedo, 2012] Pinedo, M. (2012). Scheduling, olume 29. Sp inge .
137