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 p->set_max_flow(flujo);
82 conduct_lst.push_back(p);
86 void Simulator::add_exclusa(const std::string &name, bool open)
88 Exclusa *p = new Exclusa(name);
91 exclusa_lst.push_back(p);
95 void Simulator::add_tank(const std::string &name, float capacity, float initial, RGB color)
97 Tank *p = new Tank(name);
98 p->set_capacity(capacity);
99 p->set_max_flow(initial);
100 p->set_litros(initial);
102 tank_lst.push_back(p);
106 void Simulator::add_drainage(const std::string &name)
108 Drainage *p = new Drainage(name);
109 drainage_lst.push_back(p);
113 bool Simulator::connect(const std::string &name1, const std::string &name2, int flag)
119 if ((o1 == NULL) || (o2 == NULL)) {
120 // NO SE PUDO CONECTAR!, FALTAN ITEMS!!
125 if (flag == IConector::OUT) {
126 b = o1->connect(o2, IConector::OUT);
127 b = b && o2->connect(o1, IConector::IN);
129 b = o1->connect(o2, IConector::IN);
130 b = b && o2->connect(o1, IConector::OUT);
136 void Simulator::simulate()
139 std::list<Pump *>::iterator i1;
140 for(i1=pump_lst.begin(); i1!=pump_lst.end(); i1++)
144 std::list<PlantItem *>::iterator i2;
145 for(i2=items.begin(); i2!=items.end(); i2++)
151 IConector *Simulator::find(const std::string &name)
153 // Busco el item, aca no me importa de que tipo es!
154 std::list<PlantItem *>::iterator i;
155 for(i=items.begin(); i!=items.end(); i++)
156 if ((*i)->get_name() == name)
161 bool Simulator::pump_deactivate(const std::string &name)
163 // Busco el elemento, usando RTTI :-(
164 Pump *pump = dynamic_cast<Pump *>(find(name));
167 // Ups!, "name" no era un Pump!!!
174 void Simulator::loadBomba(xmlNodePtr nodo)
176 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
177 int orientacion=0, x, y;
181 nodo = nodo->children;
182 while (nodo != NULL) {
183 if (nodo->type == XML_ELEMENT_NODE) {
184 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
185 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
186 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
187 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
188 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
189 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
190 } else if (xmlStrcmp(nodo->name, BAD_CAST"entrega") == 0) {
191 flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
192 } else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) {
200 add_pump(name, flujo, color);
203 void Simulator::loadConduct(xmlNodePtr nodo)
205 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
206 int orientacion=0, x, y;
209 nodo = nodo->children;
210 while (nodo != NULL) {
211 if (nodo->type == XML_ELEMENT_NODE) {
212 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
213 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
214 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
215 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
216 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
217 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
218 } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
219 flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
227 // listo, ya recolecte todos los datos, ahora creo el objeto!
228 add_conduct(name, flujo);
231 void Simulator::loadExclusa(xmlNodePtr nodo)
233 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
234 int orientacion=0, x, y;
237 nodo = nodo->children;
238 while (nodo != NULL) {
239 if (nodo->type == XML_ELEMENT_NODE) {
240 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
241 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
242 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
243 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
244 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
245 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
246 } else if (xmlStrcmp(nodo->name, BAD_CAST"estado") == 0) {
247 open = (char *)XML_GET_CONTENT(nodo->children);
253 // listo, ya recolecte todos los datos, ahora creo el objeto!
254 add_exclusa(name, open == "1");
257 void Simulator::loadTank(xmlNodePtr nodo)
259 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
260 int orientacion=0, x, y;
261 float capacidad, inicial;
264 nodo = nodo->children;
265 while (nodo != NULL) {
266 if (nodo->type == XML_ELEMENT_NODE) {
267 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
268 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
269 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
270 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
271 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
272 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
273 } else if (xmlStrcmp(nodo->name, BAD_CAST"capacidad") == 0) {
274 capacidad = atoi( (char *)XML_GET_CONTENT(nodo->children) );
275 } else if (xmlStrcmp(nodo->name, BAD_CAST"inicial") == 0) {
276 inicial = atof( (char *)XML_GET_CONTENT(nodo->children) );
282 // listo, ya recolecte todos los datos, ahora creo el objeto!
283 add_tank(name, capacidad, inicial, color);
286 void Simulator::loadUnion(xmlNodePtr nodo)
288 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
289 int orientacion=0, x, y;
293 nodo = nodo->children;
294 while (nodo != NULL) {
295 if (nodo->type == XML_ELEMENT_NODE) {
296 if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
297 orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
298 } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
299 x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
300 } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
301 y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
302 } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
303 flow = atof( (char *)XML_GET_CONTENT(nodo->children) );
304 } else if (xmlStrcmp(nodo->name, BAD_CAST"tipo") == 0) {
305 type = (char *)XML_GET_CONTENT(nodo->children);
311 // listo, ya recolecte todos los datos, ahora creo el objeto!
313 add_union(name, flow);
315 add_splitter(name, flow);
318 void Simulator::loadDrain(xmlNodePtr nodo)
320 std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
325 void Simulator::do_connections(xmlNodePtr nodo)
327 // Intengo conectar los elementos :)
328 IConector *current_item, *to_connect;
329 xmlNodePtr props; // propiedades del item actual
330 xmlNodePtr conector1, conector2;
332 while (nodo != NULL) {
333 if (nodo->type != XML_ELEMENT_NODE) {
337 // obtengo el items actual por su nombre
338 current_item = find((char *)xmlGetProp(nodo, BAD_CAST"nombre"));
339 props = nodo->children;
340 conector2 = conector1 = NULL;
341 while (props != NULL) {
342 if (nodo->type == XML_ELEMENT_NODE) {
343 if (xmlStrcmp(props->name, BAD_CAST"conector") == 0) {
344 xmlNodePtr temp = props->children;
345 while ((temp != NULL) && (conector1 == NULL))
346 if (temp->type == XML_ELEMENT_NODE) {
353 while ((temp != NULL) && (conector2 == NULL))
354 if (temp->type == XML_ELEMENT_NODE) {
365 // Bien, conector1 y 2 deberian estar apuntando a <entrada> y/o <salida>
366 if (conector1 != NULL) {
367 // si, aca hay un conector!, veamos cual es
368 if (xmlStrcmp(conector1->name, BAD_CAST"entrada") == 0) {
369 // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
370 to_connect = find((char *)XML_GET_CONTENT(conector1->children));
372 current_item->connect(to_connect, IConector::IN);
373 } else if (xmlStrcmp(conector1->name, BAD_CAST"salida") == 0) {
374 // Era a salida, es casi lo mismo que arriba
375 to_connect = find((char *)XML_GET_CONTENT(conector1->children));
376 current_item->connect(to_connect, IConector::OUT);
379 if (conector2 != NULL) {
380 // si, aca hay un conector!, veamos cual es
381 if (xmlStrcmp(conector2->name, BAD_CAST"entrada") == 0) {
382 // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
383 to_connect = find((char *)XML_GET_CONTENT(conector2->children));
385 current_item->connect(to_connect, IConector::IN);
386 } else if (xmlStrcmp(conector2->name, BAD_CAST"salida") == 0) {
387 // Era a salida, es casi lo mismo que arriba
388 to_connect = find((char *)XML_GET_CONTENT(conector2->children));
389 current_item->connect(to_connect, IConector::OUT);
394 // Fin de las conexiones
397 std::string Simulator::get_state_as_xml()
399 std::stringstream out;
402 out << "<?xml version=\"1.0\" ?>" << std::endl;
404 out << "<plantstatus frame=\"" << frame << "\">" << std::endl;
406 std::list<PlantItem *>::iterator i2;
407 for(i2=items.begin(); i2!=items.end(); i2++)
408 (*i2)->get_state_as_xml(out);
410 out << "</plantstatus>";