mapstorage.cc
author hegyi
Mon, 18 Sep 2006 16:02:20 +0000
changeset 148 5adf29662354
parent 134 82e19031c319
child 151 72f1c33f89d4
permissions -rw-r--r--
When moving nodes with midbutton little red arrows keep their position.
     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["label"] = new Graph::NodeMap<double>(graph);
    21   edgemap_storage["label"] = new Graph::EdgeMap<double>(graph);
    22 
    23   nodemap_default["label"] = 1.0;
    24   edgemap_default["label"] = 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 == "label")
   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 == "label")
   269       {
   270         //std::cout << "read id edgemap" << std::endl;
   271         read_edge_id = true;
   272       }
   273       else
   274       {
   275         edgemap_storage[*it] = new Graph::EdgeMap<double>(graph);
   276         //std::cout << "read " << *it << " edgemap" << std::endl;
   277       }
   278       greader.readEdgeMap(*it, *edgemap_storage[*it]);
   279     }
   280     GuiReader gui_reader(greader, this);
   281     greader.run();
   282   } catch (Exception& error) {
   283     Gtk::MessageDialog mdialog(error.what());
   284     mdialog.run();
   285     clear();
   286     return 1;
   287   }
   288 
   289   if (!read_edge_id)
   290   {
   291     edgemap_storage["label"] = new Graph::EdgeMap<double>(graph);
   292     int i = 1;
   293     for (EdgeIt e(graph); e != INVALID; ++e)
   294     {
   295       (*edgemap_storage["label"])[e] = i++;
   296     }
   297   }
   298 
   299   if (!read_x || !read_y)
   300   {
   301     int node_num = 0;
   302     for (NodeIt n(graph); n != INVALID; ++n)
   303     {
   304       node_num++;
   305     }
   306     const double pi = 3.142;
   307     double step = 2 * pi / (double) node_num;
   308     int i = 0;
   309     for (NodeIt n(graph); n != INVALID; ++n)
   310     {
   311       nodemap_storage["coordinates_x"]->set(n, 250.0 * std::cos(i * step));
   312       nodemap_storage["coordinates_y"]->set(n, 250.0 * std::sin(i * step));
   313       i++;
   314     }
   315   }
   316 
   317   if (!arrow_pos_read_ok)
   318   {
   319     arrow_pos_read_ok = false;
   320     for (EdgeIt e(graph); e != INVALID; ++e)
   321     {
   322       arrow_pos.set(e, (coords[graph.source(e)] + coords[graph.target(e)]) / 2.0);
   323     }
   324   }
   325 
   326   // fill in the default values for the maps
   327   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
   328       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   329   {
   330     if ((it->first != "label") &&
   331         (it->first != "coordiantes_x") &&
   332         (it->first != "coordinates_y"))
   333     {
   334       nodemap_default[it->first] = 0.0;
   335     }
   336     else if (it->first == "label")
   337     {
   338       NodeIt n(graph);
   339       double max = (*nodemap_storage["label"])[n];
   340       for (; n != INVALID; ++n)
   341       {
   342         if ((*nodemap_storage["label"])[n] > max)
   343           max = (*nodemap_storage["label"])[n];
   344       }
   345       nodemap_default["label"] = max + 1.0;
   346     }
   347   }
   348   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
   349       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   350   {
   351     if (it->first != "label")
   352     {
   353       edgemap_default[it->first] = 0.0;
   354     }
   355     else
   356     {
   357       double max = std::numeric_limits<double>::min();
   358       for (EdgeIt e(graph); e != INVALID; ++e)
   359       {
   360         if ((*edgemap_storage["label"])[e] > max)
   361           max = (*edgemap_storage["label"])[e];
   362       }
   363       if (max > std::numeric_limits<double>::min())
   364         edgemap_default["label"] = max + 1.0;
   365       else
   366         edgemap_default["label"] = 1.0;
   367     }
   368   }
   369 
   370   // filter loop edges
   371   for (EdgeIt e(graph); e != INVALID; ++e)
   372   {
   373     if (graph.source(e) == graph.target(e))
   374     {
   375       std::cerr << "Removed loop edge " << (*edgemap_storage["label"])[e]
   376         << " (from " << (*nodemap_storage["label"])[graph.source(e)]
   377         << ", to " << (*nodemap_storage["label"])[graph.target(e)] << ")."
   378         << std::endl;
   379 
   380       graph.erase(e);
   381     }
   382   }
   383 
   384   return 0;
   385 }
   386 
   387 void MapStorage::writeToFile(const std::string &filename)
   388 {
   389   GraphWriter<Graph> gwriter(filename, graph);
   390 
   391   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
   392       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   393   {
   394     gwriter.writeNodeMap(it->first, *(it->second));
   395   }
   396   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
   397       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   398   {
   399     if ((it->first != "arrow_pos_x") &&
   400         (it->first != "arrow_pos_y"))
   401     {
   402       gwriter.writeEdgeMap(it->first, *(it->second));
   403     }
   404   }
   405 
   406   GuiWriter gui_writer(gwriter, this);
   407 
   408   gwriter.run();
   409 }
   410 
   411 void MapStorage::clear()
   412 {
   413   for (std::map<std::string, Graph::NodeMap<double>*>::iterator it =
   414       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   415   {
   416     if ((it->first != "coordinates_x") &&
   417         (it->first != "coordinates_y") &&
   418         (it->first != "label"))
   419     {
   420       delete it->second;
   421       nodemap_storage.erase(it);
   422     }
   423   }
   424   for (std::map<std::string, Graph::EdgeMap<double>*>::iterator it =
   425       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   426   {
   427     if ((it->first != "label") &&
   428         (it->first != "arrow_pos_x") &&
   429         (it->first != "arrow_pos_y"))
   430     {
   431       delete it->second;
   432       edgemap_storage.erase(it);
   433     }
   434   }
   435   for (std::map<std::string, double>::iterator it =
   436       nodemap_default.begin(); it != nodemap_default.end(); ++it)
   437   {
   438     if (it->first != "label")
   439       nodemap_default.erase(it);
   440   }
   441   for (std::map<std::string, double>::iterator it =
   442       edgemap_default.begin(); it != edgemap_default.end(); ++it)
   443   {
   444     if (it->first != "label")
   445       edgemap_default.erase(it);
   446   }
   447   graph.clear();
   448   file_name = "";
   449   modified = false;
   450 }
   451 
   452 void MapStorage::ArrowPosReadOK()
   453 {
   454   arrow_pos_read_ok = true;
   455 }
   456 
   457 void MapStorage::mapChanged(bool itisedge, std::string mapname)
   458 {
   459   if(itisedge)
   460     {
   461       for(int i=0;i<EDGE_PROPERTY_NUM;i++)
   462 	{
   463 	  if(active_edgemaps[i]==mapname)
   464 	    {
   465 	      signal_prop.emit(itisedge, i);
   466 	    }
   467 	}
   468     }
   469   else
   470     {
   471       for(int i=0;i<NODE_PROPERTY_NUM;i++)
   472 	{
   473 	  if(active_nodemaps[i]==mapname)
   474 	    {
   475 	      signal_prop.emit(itisedge, i);
   476 	    }
   477 	}
   478     }
   479 }