4 using namespace PlaQui::Model;
6 Simulator::Simulator(const std::string &filename)
9 /* Parseo de ejemplo de un XML desde archivo */
11 document = xmlParseFile(filename.c_str());
12 if (document == NULL) {
16 /* bien, el archivo se parseo bien! */
17 xmlNodePtr nodo, items;
18 nodo = document->children;
20 if (strcmp((char *)nodo->name, "planta") == 0) {
21 items = nodo->children;
22 while (items != NULL) {
23 if (items->type == XML_ELEMENT_NODE) {
24 if (xmlStrcmp(items->name, BAD_CAST"bomba")==0) {
26 } else if ((xmlStrcmp(items->name, BAD_CAST"tubo")==0)||(xmlStrcmp(items->name, BAD_CAST"codo")==0)) {
28 } else if (xmlStrcmp(items->name, BAD_CAST"exclusa")==0) {
30 } else if (xmlStrcmp(items->name, BAD_CAST"tanque")==0) {
32 } else if (xmlStrcmp(items->name, BAD_CAST"empalme")==0) {
34 } else if (xmlStrcmp(items->name, BAD_CAST"drenaje")==0) {
40 // Bien, la planta esta cargada, conectemos todo!!
41 do_connections(nodo->children);
45 Simulator::~Simulator()
47 // FIXME REMOVER TODOOOOOO
50 void Simulator::add_pump(const std::string &name, float max_flow, RGB color)
52 Pump *p = new Pump(name);
54 p->set_max_flow(max_flow);
56 pump_lst.push_back(p);
60 void Simulator::add_union(const std::string &name, float max_flow)
62 Union *u = new Union(name);
64 u->set_max_flow(max_flow);
65 union_lst.push_back(u);
69 void Simulator::add_splitter(const std::string &name, float max_flow)
71 Splitter *p = new Splitter(name);
72 p->set_max_flow(max_flow);
73 split_lst.push_back(p);
77 void Simulator::add_conduct(const std::string &name, float flujo)
79 Conduct *p = new Conduct(name);
81 std::cout << flujo << std::endl;
82 p->set_max_flow(flujo);
83 conduct_lst.push_back(p);
87 void Simulator::add_exclusa(const std::string &name, bool open)
89 Exclusa *p = new Exclusa(name);
92 exclusa_lst.push_back(p);
96 void Simulator::add_tank(const std::string &name, float capacity, float initial, RGB color)
98 Tank *p = new Tank(name);
99 p->set_capacity(capacity);
100 p->set_max_flow(initial);
101 p->set_litros(initial);
103 tank_lst.push_back(p);
107 void Simulator::add_drainage(const std::string &name)
109 Drainage *p = new Drainage(name);
110 drainage_lst.push_back(p);
114 bool Simulator::connect(const std::string &name1, const std::string &name2, int flag)
120 if ((o1 == NULL) || (o2 == NULL)) {
121 // NO SE PUDO CONECTAR!, FALTAN ITEMS!!
126 if (flag == IConector::OUT) {
127 b = o1->connect(o2, IConector::OUT);
128 b = b && o2->connect(o1, IConector::IN);
130 b = o1->connect(o2, IConector::IN);
131 b = b && o2->connect(o1, IConector::OUT);
137 void Simulator::simulate()
140 std::list<Pump *>::iterator i1;
141 for(i1=pump_lst.begin(); i1!=pump_lst.end(); i1++)
145 std::list<PlantItem *>::iterator i2;
146 for(i2=items.begin(); i2!=items.end(); i2++)
152 IConector *Simulator::find(const std::string &name)
154 // Busco el item, aca no me importa de que tipo es!
155 std::list<PlantItem *>::iterator i;
156 for(i=items.begin(); i!=items.end(); i++)
157 if ((*i)->get_name() == name)
162 bool Simulator::set_open(const std::string &name, bool open)
164 // Busco el elemento, usando RTTI :-(
165 IConector *tmp = find(name);
168 if ((p = dynamic_cast<Pump*>(tmp))) {
174 } else if ((e = dynamic_cast<Exclusa*>(tmp))) {
185 void Simulator::loadBomba(xmlNodePtr nodo)
187 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
188 int orientacion=0, x, y;
192 nodo = nodo->children;
193 while (nodo != NULL) {
194 if (nodo->type == XML_ELEMENT_NODE) {
195 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
196 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
197 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
198 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
199 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
200 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
201 } else if (xmlStrcmp(nodo->name, BAD_CAST"entrega") == 0) {
202 flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
203 } else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) {
204 color = loadRGB(nodo->children);
210 add_pump(name, flujo, color);
213 void Simulator::loadConduct(xmlNodePtr nodo)
215 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
216 int orientacion=0, x, y;
219 nodo = nodo->children;
220 while (nodo != NULL) {
221 if (nodo->type == XML_ELEMENT_NODE) {
222 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
223 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
224 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
225 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
226 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
227 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
228 } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
229 flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
237 // listo, ya recolecte todos los datos, ahora creo el objeto!
238 add_conduct(name, flujo);
241 void Simulator::loadExclusa(xmlNodePtr nodo)
243 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
244 int orientacion=0, x, y;
247 nodo = nodo->children;
248 while (nodo != NULL) {
249 if (nodo->type == XML_ELEMENT_NODE) {
250 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
251 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
252 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
253 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
254 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
255 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
256 } else if (xmlStrcmp(nodo->name, BAD_CAST"estado") == 0) {
257 open = (char *)XML_GET_CONTENT(nodo->children);
263 // listo, ya recolecte todos los datos, ahora creo el objeto!
264 add_exclusa(name, open == "1");
267 void Simulator::loadTank(xmlNodePtr nodo)
269 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
270 int orientacion=0, x, y;
271 float capacidad, inicial;
274 nodo = nodo->children;
275 while (nodo != NULL) {
276 if (nodo->type == XML_ELEMENT_NODE) {
277 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
278 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
279 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
280 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
281 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
282 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
283 } else if (xmlStrcmp(nodo->name, BAD_CAST"capacidad") == 0) {
284 capacidad = atoi( (char *)XML_GET_CONTENT(nodo->children) );
285 } else if (xmlStrcmp(nodo->name, BAD_CAST"inicial") == 0) {
286 inicial = atof( (char *)XML_GET_CONTENT(nodo->children) );
287 } else if (xmlStrcmp(nodo->name, BAD_CAST"") == 0) {
288 color = loadRGB(nodo->children);
294 // listo, ya recolecte todos los datos, ahora creo el objeto!
295 add_tank(name, capacidad, inicial, color);
298 void Simulator::loadUnion(xmlNodePtr nodo)
300 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
301 int orientacion=0, x, y;
305 nodo = nodo->children;
306 while (nodo != NULL) {
307 if (nodo->type == XML_ELEMENT_NODE) {
308 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
309 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
310 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
311 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
312 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
313 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
314 } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
315 flow = atof( (char *)XML_GET_CONTENT(nodo->children) );
316 } else if (xmlStrcmp(nodo->name, BAD_CAST"tipo") == 0) {
317 type = (char *)XML_GET_CONTENT(nodo->children);
323 // listo, ya recolecte todos los datos, ahora creo el objeto!
325 add_union(name, flow);
327 add_splitter(name, flow);
330 void Simulator::loadDrain(xmlNodePtr nodo)
332 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
337 void Simulator::do_connections(xmlNodePtr nodo)
339 // Intengo conectar los elementos :)
340 IConector *current_item, *to_connect;
341 xmlNodePtr props; // propiedades del item actual
342 xmlNodePtr conector1, conector2, conector3;
344 while (nodo != NULL) {
345 if (nodo->type != XML_ELEMENT_NODE) {
349 // obtengo el items actual por su nombre
350 current_item = find((char *)xmlGetProp(nodo, BAD_CAST"nombre"));
351 props = nodo->children;
352 conector3 = conector2 = conector1 = NULL;
353 while (props != NULL) {
354 if (nodo->type == XML_ELEMENT_NODE) {
355 if (xmlStrcmp(props->name, BAD_CAST"conector") == 0) {
356 xmlNodePtr temp = props->children;
357 while ((temp != NULL) && (conector1 == NULL))
358 if (temp->type == XML_ELEMENT_NODE) {
365 while ((temp != NULL) && (conector2 == NULL))
366 if (temp->type == XML_ELEMENT_NODE) {
373 while ((temp != NULL) && (conector3 == NULL))
374 if (temp->type == XML_ELEMENT_NODE) {
385 // Bien, conector1 y 2 deberian estar apuntando a <entrada> y/o <salida>
386 if (conector1 != NULL) {
387 // si, aca hay un conector!, veamos cual es
388 if (xmlStrcmp(conector1->name, BAD_CAST"entrada") == 0) {
389 // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
390 to_connect = find((char *)XML_GET_CONTENT(conector1->children));
392 current_item->connect(to_connect, IConector::IN);
393 } else if (xmlStrcmp(conector1->name, BAD_CAST"salida") == 0) {
394 // Era a salida, es casi lo mismo que arriba
395 to_connect = find((char *)XML_GET_CONTENT(conector1->children));
396 current_item->connect(to_connect, IConector::OUT);
399 if (conector2 != NULL) {
400 // si, aca hay un conector!, veamos cual es
401 if (xmlStrcmp(conector2->name, BAD_CAST"entrada") == 0) {
402 // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
403 to_connect = find((char *)XML_GET_CONTENT(conector2->children));
405 current_item->connect(to_connect, IConector::IN);
406 } else if (xmlStrcmp(conector2->name, BAD_CAST"salida") == 0) {
407 // Era a salida, es casi lo mismo que arriba
408 to_connect = find((char *)XML_GET_CONTENT(conector2->children));
409 current_item->connect(to_connect, IConector::OUT);
412 if (conector3 != NULL) {
413 // si, aca hay un conector!, veamos cual es
414 if (xmlStrcmp(conector3->name, BAD_CAST"entrada") == 0) {
415 // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
416 to_connect = find((char *)XML_GET_CONTENT(conector3->children));
418 current_item->connect(to_connect, IConector::IN);
419 } else if (xmlStrcmp(conector3->name, BAD_CAST"salida") == 0) {
420 // Era a salida, es casi lo mismo que arriba
421 to_connect = find((char *)XML_GET_CONTENT(conector3->children));
422 current_item->connect(to_connect, IConector::OUT);
427 // Fin de las conexiones
430 std::string Simulator::get_state_as_xml()
432 std::stringstream out;
435 out << "<?xml version=\"1.0\" ?>" << std::endl;
437 out << "<plantstatus frame=\"" << frame << "\">" << std::endl;
439 std::list<PlantItem *>::iterator i2;
440 for(i2=items.begin(); i2!=items.end(); i2++)
441 (*i2)->get_state_as_xml(out);
443 out << "</plantstatus>";
447 RGB Simulator::loadRGB(xmlNodePtr nodo)
450 while (nodo != NULL) {
451 if (nodo->type == XML_ELEMENT_NODE) {
452 if (xmlStrcmp(nodo->name, BAD_CAST"rojo")==0)
453 r = atoi( (char *)XML_GET_CONTENT(nodo->children) );
454 if (xmlStrcmp(nodo->name, BAD_CAST"verde")==0)
455 g = atoi( (char *)XML_GET_CONTENT(nodo->children) );
456 if (xmlStrcmp(nodo->name, BAD_CAST"azul")==0)
457 b = atoi( (char *)XML_GET_CONTENT(nodo->children) );