COIN-OR::LEMON - Graph Library

source: glemon-0.x/dijkstrabox.cc @ 163:443bc769b344

Last change on this file since 163:443bc769b344 was 163:443bc769b344, checked in by Hegyi Péter, 15 years ago

Dijkstra in GUI - and the body...

File size: 3.2 KB
Line 
1#include <dijkstrabox.h>
2
3enum {INPUT, OUTPUT, MAP_NUM};
4
5DijkstraBox::DijkstraBox(std::vector<std::string> t):AlgoBox()
6{
7  init(t);
8}
9   
10void DijkstraBox::run()
11{
12  if(
13     tabcbt.get_active_text()!="" &&
14     (edgemapcbts[INPUT])->get_active_text()!="" &&
15     (edgemapcbts[OUTPUT])->get_active_text()!="" &&
16     source.get_active_text()!="" &&
17     target.get_active_text()!=""
18     )
19    {
20      const Graph &g=mapstorage->graph;
21
22      Graph::EdgeMap<double> * inputmap=
23        (mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
24      Graph::EdgeMap<double> * outputmap=
25        (mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
26
27      Node from, to;
28      int assigned=0;
29      std::ostringstream o;
30
31      //zero out output map
32      for (EdgeIt i(g); i!=INVALID; ++i)
33        {
34          (*outputmap)[i]=0;
35        }
36
37      for (NodeIt i(g); (i!=INVALID) && (assigned<2); ++i)
38        {
39          std::ostringstream text;
40          text << (*((mapstorage->nodemap_storage)["label"]))[i];
41          if(!(text.str().compare(source.get_active_text())))
42            {
43              from=i;
44              assigned++;
45            }
46          if(!(text.str().compare(target.get_active_text())))
47            {
48              to=i;
49              assigned++;
50            }
51        }
52      if(!(from==to))
53        {
54          Dijkstra<Graph, Graph::EdgeMap<double> > dijkstra(g, *inputmap);
55          dijkstra.run(from, to);
56
57          if(dijkstra.reached(to))
58            {
59              Node n=to;
60              int length=0;
61              while (n!=INVALID && n!=from)
62                {
63                  Edge e=dijkstra.predEdge(n);
64                  (*outputmap)[e]=1;
65                  n=dijkstra.predNode(n);
66                  length++;
67                }
68              o << "Result: " << length << " long path, with cost " << dijkstra.dist(to);
69            }
70          else
71            {
72              o << "Result: failed to find shortest path between ";
73              o << source.get_active_text() << " and " << target.get_active_text();
74            }
75          resultlabel.set_text(o.str());
76
77          mapstorage->mapChanged(true, (edgemapcbts[OUTPUT])->get_active_text());
78        }
79      //   mapstorage->changeActiveMap(true, E_COLOR,
80      //                              (edgemapcbts[OUTPUT])->get_active_text());
81      //   mapstorage->changeActiveMap(true, E_TEXT,
82      //                              (edgemapcbts[INPUT])->get_active_text());
83    }
84}
85   
86void DijkstraBox::build_box()
87{
88  //if active tab is changed, labels of graph nodes had to be loaded into comboboxes
89  //this can be done after the maps are loaded into ComboBoxes
90  signal_upon_maplist_updated().connect(sigc::mem_fun(*this, &DijkstraBox::maplists_updated));
91
92  addMapSelector("Cost map: ", true);
93  addMapSelector("Edges of path here: ", true);
94
95  Gtk::Label * source_label=new Gtk::Label("Source: ");
96  Gtk::Label * target_label=new Gtk::Label("Target: ");
97
98  table.attach(*source_label, 0,1,0,1);
99  table.attach(*target_label, 0,1,1,2);
100  table.attach(source, 1,2,0,1);
101  table.attach(target, 1,2,1,2);
102
103
104  pack_start(table);
105
106  resultlabel.set_text("Result: algorithm is not run yet.");
107  pack_start(resultlabel);
108}
109
110void DijkstraBox::maplists_updated()
111{
112  if(tabcbt.get_active_text()!="")
113    {
114      source.clear();
115      target.clear();
116      const Graph &g=mapstorage->graph;
117      for (NodeIt i(g); i!=INVALID; ++i)
118        {
119          std::ostringstream text;
120          text << (*((mapstorage->nodemap_storage)["label"]))[i];
121          source.prepend_text(text.str());
122          target.prepend_text(text.str());
123        }
124    }
125}
Note: See TracBrowser for help on using the repository browser.