]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Model/src/simulador.cpp
* Se agrega un Tanque al ejemplo, y ANDA!!!!
[z.facultad/75.42/plaqui.git] / Model / src / simulador.cpp
1
2 #include "simulador.h"
3
4 using namespace PlaQui::Model;
5
6 Simulador::Simulador()
7 {
8 }
9
10 Simulador::~Simulador()
11 {
12         // FIXME REMOVER TODOOOOOO
13 }
14
15 void Simulador::add_pump(const std::string &name)
16 {
17         Pump *p = new Pump(name);
18         // FIXME no va!!
19         p->set_max_flow(5);
20         pump_lst.push_back(p);
21         items.push_back(p);
22 }
23
24 void Simulador::add_union(const std::string &name)
25 {
26         Union *u = new Union(name);
27         // FIXME no va!!
28         u->set_max_flow(5);
29         union_lst.push_back(u);
30         items.push_back(u);
31 }
32
33 void Simulador::add_splitter(const std::string &name)
34 {
35         Splitter *p = new Splitter(name);
36         // FIXME no va!!
37         p->set_max_flow(5);
38         split_lst.push_back(p);
39         items.push_back(p);
40 }
41
42 void Simulador::add_conduct(const std::string &name)
43 {
44         Conduct *p = new Conduct(name);
45         // FIXME no va!!
46         p->set_max_flow(5);
47         conduct_lst.push_back(p);
48         items.push_back(p);
49 }
50
51 void Simulador::add_exclusa(const std::string &name)
52 {
53         Exclusa *p = new Exclusa(name);
54         // FIXME no va!!
55         exclusa_lst.push_back(p);
56         items.push_back(p);
57 }
58
59 void Simulador::add_tank(const std::string &name)
60 {
61         Tank *p = new Tank(name);
62         p->set_capacity(100);
63         p->set_max_flow(10);
64         p->set_litros(50);
65         tank_lst.push_back(p);
66         items.push_back(p);
67 }
68
69 void Simulador::add_drainage(const std::string &name)
70 {
71         Drainage *p = new Drainage(name);
72         // FIXME no va!!
73         drainage_lst.push_back(p);
74         items.push_back(p);
75 }
76
77 bool Simulador::connect(const std::string &name1, const std::string &name2, int flag)
78 {
79         IConector *o1, *o2;
80         o1 = find(name1);
81         o2 = find(name2);
82
83         if ((o1 == NULL) || (o2 == NULL)) {
84                 // NO SE PUDO CONECTAR!, FALTAN ITEMS!!
85                 return false;
86         }
87
88         bool b;
89         if (flag == IConector::OUT) {
90                 b = o1->connect(o2, IConector::OUT);
91                 b = b && o2->connect(o1, IConector::IN);
92         } else {
93                 b = o1->connect(o2, IConector::IN);
94                 b = b && o2->connect(o1, IConector::OUT);
95         }
96         
97         return b;
98 }
99
100 void Simulador::simulate()
101 {
102         // Actualizo
103         std::list<Pump *>::iterator i1;
104         for(i1=pump_lst.begin(); i1!=pump_lst.end(); i1++)
105                 (*i1)->update();
106
107         // Simulo!
108         std::list<PlantItem *>::iterator i2;
109         for(i2=items.begin(); i2!=items.end(); i2++)
110                 (*i2)->simulate();
111 }
112
113 IConector *Simulador::find(const std::string &name)
114 {
115         // Busco el item, aca no me importa de que tipo es!
116         std::list<PlantItem *>::iterator i;
117         for(i=items.begin(); i!=items.end(); i++)
118                 if ((*i)->get_name() == name)
119                         return *i;
120         return NULL;
121 }
122
123 bool Simulador::pump_deactivate(const std::string &name)
124 {
125         // Busco el elemento, usando RTTI :-(
126         Pump *pump = dynamic_cast<Pump *>(find(name));
127
128         if (!pump) {
129                 // Ups!, "name" no era un Pump!!!
130                 return false;
131         }
132         pump->deactivate();
133         return true;
134 }
135