gui/mapstorage.cc
author alpar
Tue, 21 Feb 2006 12:37:00 +0000
changeset 1977 8ef02f0c4245
parent 1888 eed01ce27087
child 2063 9535436aaa9f
permissions -rw-r--r--
RefPtr: a reference counted pointer class
     1 #include "mapstorage.h"
     2 #include "gui_writer.h"
     3 #include "gui_reader.h"
     4 #include <limits>
     5 #include <cmath>
     6 #include <gtkmm.h>
     7 
     8 MapStorage::MapStorage() : modified(false), file_name(""), arrow_pos_read_ok(false)
     9 {
    10   nodemap_storage["coordinates_x"] = new Graph::NodeMap<double>(graph);
    11   coords.setXMap(*nodemap_storage["coordinates_x"]);
    12   nodemap_storage["coordinates_y"] = new Graph::NodeMap<double>(graph);
    13   coords.setYMap(*nodemap_storage["coordinates_y"]);
    14 
    15   edgemap_storage["arrow_pos_x"] = new Graph::EdgeMap<double>(graph);
    16   arrow_pos.setXMap(*edgemap_storage["arrow_pos_x"]);
    17   edgemap_storage["arrow_pos_y"] = new Graph::EdgeMap<double>(graph);
    18   arrow_pos.setYMap(*edgemap_storage["arrow_pos_y"]);
    19 
    20   nodemap_storage["id"] = new Graph::NodeMap<double>(graph);
    21   edgemap_storage["id"] = new Graph::EdgeMap<double>(graph);
    22 
    23   nodemap_default["id"] = 1.0;
    24   edgemap_default["id"] = 1.0;
    25 
    26   active_nodemaps.resize(NODE_PROPERTY_NUM);
    27   for(int i=0;i<NODE_PROPERTY_NUM;i++)
    28     {
    29       active_nodemaps[i]="";
    30     }
    31 
    32   active_edgemaps.resize(EDGE_PROPERTY_NUM);
    33   for(int i=0;i<EDGE_PROPERTY_NUM;i++)
    34     {
    35       active_edgemaps[i]="";
    36     }
    37 }
    38 
    39 MapStorage::~MapStorage()
    40 {
    41   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
    42       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
    43   {
    44     delete it->second;
    45   }
    46   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
    47       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
    48   {
    49     delete it->second;
    50   }
    51 }
    52 
    53 int MapStorage::addNodeMap(const std::string & name, Graph::NodeMap<double> *nodemap, double default_value)
    54 {
    55   std::cout << default_value << std::endl;
    56   if( nodemap_storage.find(name) == nodemap_storage.end() )
    57     {
    58       nodemap_storage[name]=nodemap;
    59       // set the maps default value
    60       nodemap_default[name] = default_value;
    61 
    62       //announce changement in maps
    63       signal_node_map.emit(name);
    64       return 0;
    65     }
    66   return 1;
    67 }
    68 
    69 void MapStorage::changeActiveMap(bool itisedge, int prop, std::string mapname)
    70 {
    71   if(itisedge)
    72     {
    73       active_edgemaps[prop]=mapname;
    74     }
    75   else
    76     {
    77       active_nodemaps[prop]=mapname;
    78     }
    79   signal_prop.emit(itisedge, prop);
    80 }
    81 
    82 std::string MapStorage::getActiveEdgeMap(int prop)
    83 {
    84   return active_edgemaps[prop];
    85 }
    86 
    87 std::string MapStorage::getActiveNodeMap(int prop)
    88 {
    89   return active_nodemaps[prop];
    90 }
    91 
    92 std::vector<std::string> MapStorage::getEdgeMapList()
    93 {
    94   std::vector<std::string> eml;
    95   eml.resize(edgemap_storage.size());
    96   int i=0;
    97   std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=beginOfEdgeMaps();
    98   for(;emsi!=endOfEdgeMaps();emsi++)
    99     {
   100       eml[i]=(emsi->first);
   101       i++;
   102     }
   103   return eml;
   104 }
   105 
   106 std::vector<std::string> MapStorage::getNodeMapList()
   107 {
   108   std::vector<std::string> nml;
   109   nml.resize(nodemap_storage.size());
   110   int i=0;
   111   std::map< std::string,Graph::NodeMap<double> * >::iterator nmsi=beginOfNodeMaps();
   112   for(;nmsi!=endOfNodeMaps();nmsi++)
   113     {
   114       nml[i]=(nmsi->first);
   115       i++;
   116     }
   117   return nml;
   118 }
   119 
   120 MapStorage::Signal_Prop MapStorage::signal_prop_ch()
   121 {
   122   return signal_prop;
   123 }
   124 
   125 int MapStorage::addEdgeMap(const std::string & name, Graph::EdgeMap<double> *edgemap, double default_value)
   126 {
   127   if( edgemap_storage.find(name) == edgemap_storage.end() )
   128     {
   129       edgemap_storage[name]=edgemap;
   130       // set the maps default value
   131       edgemap_default[name] = default_value;
   132 
   133       //announce changement in maps
   134       signal_edge_map.emit(name);
   135       return 0;
   136     }
   137   return 1;
   138 }
   139 
   140 double MapStorage::maxOfNodeMap(const std::string & name)
   141 {
   142   double max=0;
   143   for (NodeIt j(graph); j!=INVALID; ++j)
   144   {
   145     if( (*nodemap_storage[name])[j]>max )
   146     {
   147       max=(*nodemap_storage[name])[j];
   148     }
   149   }
   150   return max;
   151 }
   152 
   153 double MapStorage::maxOfEdgeMap(const std::string & name)
   154 {
   155   double max=0;
   156   for (EdgeIt j(graph); j!=INVALID; ++j)
   157   {
   158     if( (*edgemap_storage[name])[j]>max )
   159     {
   160       max=(*edgemap_storage[name])[j];
   161     }
   162   }
   163   return max;
   164 }
   165 
   166 double MapStorage::minOfNodeMap(const std::string & name)
   167 {
   168   NodeIt j(graph);
   169   double min;
   170   if(j!=INVALID)
   171     {
   172       min=(*nodemap_storage[name])[j];
   173     }
   174   else
   175     {
   176       min=0;
   177     }
   178   for (; j!=INVALID; ++j)
   179   {
   180     if( (*nodemap_storage[name])[j]<min )
   181     {
   182       min=(*nodemap_storage[name])[j];
   183     }
   184   }
   185   return min;
   186 }
   187 
   188 double MapStorage::minOfEdgeMap(const std::string & name)
   189 {
   190   EdgeIt j(graph);
   191   double min;
   192   if(j!=INVALID)
   193     {
   194       min=(*edgemap_storage[name])[j];
   195     }
   196   else
   197     {
   198       min=0;
   199     }
   200   for (EdgeIt j(graph); j!=INVALID; ++j)
   201   {
   202     if( (*edgemap_storage[name])[j]<min )
   203     {
   204       min=(*edgemap_storage[name])[j];
   205     }
   206   }
   207   return min;
   208 }
   209 
   210 int MapStorage::readFromFile(const std::string &filename)
   211 {
   212   bool read_x = false;
   213   bool read_y = false;
   214   bool read_edge_id = false;
   215 
   216   try {
   217     LemonReader lreader(filename);
   218     ContentReader content(lreader);
   219     lreader.run();
   220 
   221     if (content.nodeSetNum() < 1)
   222     {
   223       Gtk::MessageDialog mdialog("No nodeset found in file.");
   224       mdialog.run();
   225       clear();
   226       return 1;
   227     }
   228 
   229     if (content.edgeSetNum() < 1)
   230     {
   231       Gtk::MessageDialog mdialog("No edgeset found in file.");
   232       mdialog.run();
   233       clear();
   234       return 1;
   235     }
   236 
   237     const std::vector<std::string>& nodeMapNames = content.nodeSetMaps(0);
   238     const std::vector<std::string>& edgeMapNames = content.edgeSetMaps(0);
   239 
   240     GraphReader<Graph> greader(filename, graph);
   241     for (std::vector<std::string>::const_iterator it = nodeMapNames.begin();
   242         it != nodeMapNames.end(); ++it)
   243     {
   244       if (*it == "coordinates_x")
   245       {
   246         read_x = true;
   247         //std::cout << "read X nodemap" << std::endl;
   248       }
   249       else if (*it == "coordinates_y")
   250       {
   251         read_y = true;
   252         //std::cout << "read Y nodemap" << std::endl;
   253       }
   254       else if (*it == "id")
   255       {
   256         //std::cout << "read id nodemap" << std::endl;
   257       }
   258       else
   259       {
   260         nodemap_storage[*it] = new Graph::NodeMap<double>(graph);
   261         //std::cout << "read " << *it << " nodemap" << std::endl;
   262       }
   263       greader.readNodeMap(*it, *nodemap_storage[*it]);
   264     }
   265     for (std::vector<std::string>::const_iterator it = edgeMapNames.begin();
   266         it != edgeMapNames.end(); ++it)
   267     {
   268       if (*it == "id")
   269       {
   270         //std::cout << "read id edgemap" << std::endl;
   271       }
   272       else
   273       {
   274         edgemap_storage[*it] = new Graph::EdgeMap<double>(graph);
   275         //std::cout << "read " << *it << " edgemap" << std::endl;
   276       }
   277       greader.readEdgeMap(*it, *edgemap_storage[*it]);
   278     }
   279     GuiReader gui_reader(greader, this);
   280     greader.run();
   281   } catch (Exception& error) {
   282     Gtk::MessageDialog mdialog(error.what());
   283     mdialog.run();
   284     clear();
   285     return 1;
   286   }
   287 
   288   if (!read_edge_id)
   289   {
   290     edgemap_storage["id"] = new Graph::EdgeMap<double>(graph);
   291     int i = 1;
   292     for (EdgeIt e(graph); e != INVALID; ++e)
   293     {
   294       (*edgemap_storage["id"])[e] = i++;
   295     }
   296   }
   297 
   298   if (!read_x || !read_y)
   299   {
   300     int node_num = 0;
   301     for (NodeIt n(graph); n != INVALID; ++n)
   302     {
   303       node_num++;
   304     }
   305     const double pi = 3.142;
   306     double step = 2 * pi / (double) node_num;
   307     int i = 0;
   308     for (NodeIt n(graph); n != INVALID; ++n)
   309     {
   310       nodemap_storage["coordinates_x"]->set(n, 250.0 * std::cos(i * step));
   311       nodemap_storage["coordinates_y"]->set(n, 250.0 * std::sin(i * step));
   312       i++;
   313     }
   314   }
   315 
   316   if (!arrow_pos_read_ok)
   317   {
   318     arrow_pos_read_ok = false;
   319     for (EdgeIt e(graph); e != INVALID; ++e)
   320     {
   321       arrow_pos.set(e, (coords[graph.source(e)] + coords[graph.target(e)]) / 2.0);
   322     }
   323   }
   324 
   325   // fill in the default values for the maps
   326   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
   327       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   328   {
   329     if ((it->first != "id") &&
   330         (it->first != "coordiantes_x") &&
   331         (it->first != "coordinates_y"))
   332     {
   333       nodemap_default[it->first] = 0.0;
   334     }
   335     else if (it->first == "id")
   336     {
   337       NodeIt n(graph);
   338       double max = (*nodemap_storage["id"])[n];
   339       for (; n != INVALID; ++n)
   340       {
   341         if ((*nodemap_storage["id"])[n] > max)
   342           max = (*nodemap_storage["id"])[n];
   343       }
   344       nodemap_default["id"] = max + 1.0;
   345     }
   346   }
   347   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
   348       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   349   {
   350     if (it->first != "id")
   351     {
   352       edgemap_default[it->first] = 0.0;
   353     }
   354     else
   355     {
   356       double max = std::numeric_limits<double>::min();
   357       for (EdgeIt e(graph); e != INVALID; ++e)
   358       {
   359         if ((*edgemap_storage["id"])[e] > max)
   360           max = (*edgemap_storage["id"])[e];
   361       }
   362       if (max > std::numeric_limits<double>::min())
   363         edgemap_default["id"] = max + 1.0;
   364       else
   365         edgemap_default["id"] = 1.0;
   366     }
   367   }
   368 
   369   return 0;
   370 }
   371 
   372 void MapStorage::writeToFile(const std::string &filename)
   373 {
   374   GraphWriter<Graph> gwriter(filename, graph);
   375 
   376   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
   377       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   378   {
   379     gwriter.writeNodeMap(it->first, *(it->second));
   380   }
   381   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
   382       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   383   {
   384     if ((it->first != "arrow_pos_x") &&
   385         (it->first != "arrow_pos_y"))
   386     {
   387       gwriter.writeEdgeMap(it->first, *(it->second));
   388     }
   389   }
   390 
   391   GuiWriter gui_writer(gwriter, this);
   392 
   393   gwriter.run();
   394 }
   395 
   396 void MapStorage::clear()
   397 {
   398   for (std::map<std::string, Graph::NodeMap<double>*>::iterator it =
   399       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   400   {
   401     if ((it->first != "coordinates_x") &&
   402         (it->first != "coordinates_y") &&
   403         (it->first != "id"))
   404     {
   405       delete it->second;
   406       nodemap_storage.erase(it);
   407     }
   408   }
   409   for (std::map<std::string, Graph::EdgeMap<double>*>::iterator it =
   410       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   411   {
   412     if ((it->first != "id") &&
   413         (it->first != "arrow_pos_x") &&
   414         (it->first != "arrow_pos_y"))
   415     {
   416       delete it->second;
   417       edgemap_storage.erase(it);
   418     }
   419   }
   420   for (std::map<std::string, double>::iterator it =
   421       nodemap_default.begin(); it != nodemap_default.end(); ++it)
   422   {
   423     if (it->first != "id")
   424       nodemap_default.erase(it);
   425   }
   426   for (std::map<std::string, double>::iterator it =
   427       edgemap_default.begin(); it != edgemap_default.end(); ++it)
   428   {
   429     if (it->first != "id")
   430       edgemap_default.erase(it);
   431   }
   432   graph.clear();
   433   file_name = "";
   434   modified = false;
   435 }
   436 
   437 void MapStorage::ArrowPosReadOK()
   438 {
   439   arrow_pos_read_ok = true;
   440 }
   441 
   442 void MapStorage::mapChanged(bool itisedge, std::string mapname)
   443 {
   444   if(itisedge)
   445     {
   446       for(int i=0;i<EDGE_PROPERTY_NUM;i++)
   447 	{
   448 	  if(active_edgemaps[i]==mapname)
   449 	    {
   450 	      signal_prop.emit(itisedge, i);
   451 	    }
   452 	}
   453     }
   454   else
   455     {
   456       for(int i=0;i<NODE_PROPERTY_NUM;i++)
   457 	{
   458 	  if(active_nodemaps[i]==mapname)
   459 	    {
   460 	      signal_prop.emit(itisedge, i);
   461 	    }
   462 	}
   463     }
   464 }