dijkstrabox.cc
changeset 164 70e3c3646283
child 165 2cd447b0bd3a
equal deleted inserted replaced
-1:000000000000 0:042f87c7c43a
       
     1 #include <dijkstrabox.h>
       
     2 
       
     3 enum {INPUT, OUTPUT, MAP_NUM};
       
     4 
       
     5 DijkstraBox::DijkstraBox(std::vector<std::string> t):AlgoBox()
       
     6 {
       
     7   init(t);
       
     8 }
       
     9     
       
    10 void 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     
       
    86 void 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 
       
   110 void 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 }