In algorithm window maps can be selected and reated through MapSelector widget.
1 #include <new_map_win.h>
3 bool NewMapWin::closeIfEscapeIsPressed(GdkEventKey* e)
5 if(e->keyval==GDK_Escape)
12 NewMapWin::NewMapWin(const std::string& title, NoteBookTab & mw, bool itisedge, bool edgenode):Gtk::Dialog(title, true, true),mytab(mw),node("Create NodeMap"),edge("Create EdgeMap")
14 set_default_size(200, 50);
16 signal_key_press_event().connect(sigc::mem_fun(*this, &NewMapWin::closeIfEscapeIsPressed));
18 Gtk::VBox * vbox=get_vbox();
21 table=new Gtk::Table(3, 2, false);
24 label->set_text("Name of new map:");
27 (*table).attach(*label,0,1,0,1,Gtk::SHRINK,Gtk::SHRINK,10,3);
28 (*table).attach(name,1,2,0,1,Gtk::SHRINK,Gtk::SHRINK,10,3);
31 label->set_text("Default value in the map:");
32 default_value.set_text("0");
34 (*table).attach(*label,0,1,1,2,Gtk::SHRINK,Gtk::SHRINK,10,3);
35 (*table).attach(default_value,1,2,1,2,Gtk::SHRINK,Gtk::SHRINK,10,3);
37 //node vs. edge map selector
38 Gtk::RadioButton::Group group = node.get_group();
39 edge.set_group(group);
43 (*table).attach(node,0,1,2,3,Gtk::SHRINK,Gtk::SHRINK,10,3);
44 (*table).attach(edge,1,2,2,3,Gtk::SHRINK,Gtk::SHRINK,10,3);
58 vbox->pack_start(*table);
61 add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
67 void NewMapWin::on_response(int response_id)
69 if(response_id==Gtk::RESPONSE_OK)
73 //get and formulate text
74 std::string def_val_str=default_value.get_text();
75 std::string polishform=string2Polishform(def_val_str,edge.get_active());
78 std::string mapname=name.get_text();
80 if(!mapname.empty()&&!polishform.empty())
86 Graph::EdgeMap<double> * emptr=new Graph::EdgeMap<double> (mytab.mapstorage.graph);
88 std::stack<double> polishstack;
90 for(EdgeIt k(mytab.mapstorage.graph); k!=INVALID; ++k)
92 for(int i=0;i<(int)polishform.size();i++)
102 op1=polishstack.top();
104 op2=polishstack.top();
108 //substitute variable
109 std::map< std::string,Graph::EdgeMap<double> * > ems=mytab.mapstorage.edgemap_storage;
110 bool itisvar=(ems.find(ch2var[ polishform[i] ])!=ems.end());
113 polishstack.push( (*(mytab.mapstorage.edgemap_storage[ ch2var[ polishform[i] ] ]))[k]);
117 polishstack.push(atof(ch2var[ polishform[i] ].c_str()));
125 switch(polishform[i])
140 std::cout << "How could we get here?" << std::endl;
143 polishstack.push(res);
146 (*emptr)[k]=polishstack.top();
149 //if addition was not successful addEdgeMap returns one.
150 //cause can be that there is already a map named like the new one
151 if(mytab.mapstorage.addEdgeMap(mapname, emptr, def_val))
156 //add it to the list of the displayable maps
157 //furthermore it is done by signals
158 //mytab.registerNewEdgeMap(mapname);
161 //gdc.changeEdgeText(mapname);
165 else //!edge.get_active()
168 Graph::NodeMap<double> * emptr=new Graph::NodeMap<double> (mytab.mapstorage.graph);
170 std::stack<double> polishstack;
172 for(NodeIt k(mytab.mapstorage.graph); k!=INVALID; ++k)
174 for(int i=0;i<(int)polishform.size();i++)
178 switch(polishform[i])
184 op1=polishstack.top();
186 op2=polishstack.top();
190 std::map< std::string,Graph::NodeMap<double> * > nms=mytab.mapstorage.nodemap_storage;
191 bool itisvar=(nms.find(ch2var[ polishform[i] ])!=nms.end());
194 polishstack.push( (*(mytab.mapstorage.nodemap_storage[ ch2var[ polishform[i] ] ]))[k]);
198 polishstack.push(atof(ch2var[ polishform[i] ].c_str()));
206 switch(polishform[i])
221 std::cout << "How could we get here?" << std::endl;
224 polishstack.push(res);
227 (*emptr)[k]=polishstack.top();
230 //if addition was not successful addNodeMap returns one.
231 //cause can be that there is already a map named like the new one
232 if(mytab.mapstorage.addNodeMap(mapname,emptr, def_val))
237 //add it to the list of the displayable maps
238 //furthermore it is done by signals
239 //mytab.registerNewNodeMap(mapname);
242 //gdc.changeNodeText(mapname);
249 default_value.set_text("0");
259 std::string NewMapWin::string2Polishform(std::string rawcommand, bool itisedge)
261 bool valid_entry=true;
263 std::map<std::string, int> str2i;
267 std::string variable;
271 for(int i=0;(valid_entry&&(i<(int)rawcommand.size()));i++)
273 switch(rawcommand[i])
281 if(!variable.empty())
283 valid_entry=validVariable(variable, itisedge);
284 ch2var[index]=variable;
287 variable.erase(0,variable.size());
289 command+=rawcommand[i];
292 variable+=rawcommand[i];
297 if(!variable.empty()&&valid_entry)
299 valid_entry=validVariable(variable, itisedge);
300 ch2var[index]=variable;
303 variable.erase(0,variable.size());
308 unsigned int pr=10000;
310 unsigned int prev_change=pr;
311 unsigned int prev_br=pr;
313 std::string comm_nobr="";
314 std::vector<unsigned int> p;
318 //6 brackets embedded
319 //100 operation in a row from the same priority
321 for(int i=0;i<(int)command.size();i++)
323 bool put_in_string=true;
369 comm_nobr=comm_nobr+command[i];
373 tree_node * root=weightedString2Tree(comm_nobr, p, 0);
375 std::string polishform=postOrder(root);
382 NewMapWin::tree_node * NewMapWin::weightedString2Tree(std::string to_tree, std::vector<unsigned int> & p, int offset)
384 unsigned int min=p[offset];
386 for(int i=0;i<(int)to_tree.size();i++)
394 tree_node * act_node=new tree_node;
395 act_node->ch=to_tree[minplace];
396 if(to_tree.size()>=3)
398 act_node->left_child=weightedString2Tree(to_tree.substr(0,minplace), p, offset);
399 act_node->right_child=weightedString2Tree(to_tree.substr(minplace+1,to_tree.size()-minplace-1), p, offset+minplace+1);
403 act_node->left_child=NULL;
404 act_node->right_child=NULL;
409 std::string NewMapWin::postOrder(tree_node * subtree)
411 std::string subtree_to_string;
412 if(subtree->left_child)
414 subtree_to_string=postOrder(subtree->left_child);
416 if(subtree->right_child)
418 subtree_to_string=subtree_to_string+postOrder(subtree->right_child);
420 subtree_to_string=subtree_to_string+subtree->ch;
421 return subtree_to_string;
424 bool NewMapWin::validVariable(std::string variable, bool itisedge)
430 cancel=(mytab.mapstorage.edgemap_storage.find(variable)==mytab.mapstorage.edgemap_storage.end());
434 cancel=(mytab.mapstorage.nodemap_storage.find(variable)==mytab.mapstorage.nodemap_storage.end());
441 for(int j=0;(!cancel)&&(j<(int)variable.size());j++)
443 if(((variable[j]<'0')||(variable[j]>'9'))&&(variable[j]!='.'))