mapstorage.cc
author ladanyi
Tue, 23 Aug 2005 07:36:09 +0000
branchgui
changeset 63 59768817442a
parent 62 80eefca04b1e
child 64 7a32d528857f
permissions -rw-r--r--
- id maps are not editable
- handle exceptions thrown by the file reader
- texts are always above the edges
- store a default value for all maps, so that edges and nodes created after
adding a new map receive the default value too
- create node on button release, not on click (fixes a few oddities)
     1 #include "mapstorage.h"
     2 #include <gtkmm.h>
     3 #include <cmath>
     4 
     5 MapStorage::MapStorage() : modified(false), file_name("")
     6 {
     7   nodemap_storage["coordinates_x"] = new Graph::NodeMap<double>(graph);
     8   coords.setXMap(*nodemap_storage["coordinates_x"]);
     9   nodemap_storage["coordinates_y"] = new Graph::NodeMap<double>(graph);
    10   coords.setYMap(*nodemap_storage["coordinates_y"]);
    11 
    12   nodemap_storage["id"] = new Graph::NodeMap<double>(graph);
    13   edgemap_storage["id"] = new Graph::EdgeMap<double>(graph);
    14 }
    15 
    16 MapStorage::~MapStorage()
    17 {
    18   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
    19       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
    20   {
    21     delete it->second;
    22   }
    23   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
    24       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
    25   {
    26     delete it->second;
    27   }
    28 }
    29 
    30 int MapStorage::addNodeMap(const std::string & name, Graph::NodeMap<double> *nodemap, double default_value = 0.0)
    31 {
    32   if( nodemap_storage.find(name) == nodemap_storage.end() )
    33     {
    34       nodemap_storage[name]=nodemap;
    35       // set the maps default value
    36       nodemap_default[name] = default_value;
    37       return 0;
    38     }
    39   return 1;
    40 }
    41 
    42 int MapStorage::addEdgeMap(const std::string & name, Graph::EdgeMap<double> *edgemap, double default_value = 0.0)
    43 {
    44   if( edgemap_storage.find(name) == edgemap_storage.end() )
    45     {
    46       edgemap_storage[name]=edgemap;
    47       // set the maps default value
    48       edgemap_default[name] = default_value;
    49       return 0;
    50     }
    51   return 1;
    52 }
    53 
    54 double MapStorage::maxOfNodeMap(const std::string & name)
    55 {
    56   double max=0;
    57   for (NodeIt j(graph); j!=INVALID; ++j)
    58   {
    59     if( (*nodemap_storage[name])[j]>max )
    60     {
    61       max=(*nodemap_storage[name])[j];
    62     }
    63   }
    64   return max;
    65 }
    66 
    67 double MapStorage::maxOfEdgeMap(const std::string & name)
    68 {
    69   double max=0;
    70   for (EdgeIt j(graph); j!=INVALID; ++j)
    71   {
    72     if( (*edgemap_storage[name])[j]>max )
    73     {
    74       max=(*edgemap_storage[name])[j];
    75     }
    76   }
    77   return max;
    78 }
    79 
    80 double MapStorage::minOfNodeMap(const std::string & name)
    81 {
    82   NodeIt j(graph);
    83   double min;
    84   if(j!=INVALID)
    85     {
    86       min=(*nodemap_storage[name])[j];
    87     }
    88   else
    89     {
    90       min=0;
    91     }
    92   for (; j!=INVALID; ++j)
    93   {
    94     if( (*nodemap_storage[name])[j]<min )
    95     {
    96       min=(*nodemap_storage[name])[j];
    97     }
    98   }
    99   return min;
   100 }
   101 
   102 double MapStorage::minOfEdgeMap(const std::string & name)
   103 {
   104   EdgeIt j(graph);
   105   double min;
   106   if(j!=INVALID)
   107     {
   108       min=(*edgemap_storage[name])[j];
   109     }
   110   else
   111     {
   112       min=0;
   113     }
   114   for (EdgeIt j(graph); j!=INVALID; ++j)
   115   {
   116     if( (*edgemap_storage[name])[j]<min )
   117     {
   118       min=(*edgemap_storage[name])[j];
   119     }
   120   }
   121   return min;
   122 }
   123 
   124 int MapStorage::readFromFile(const std::string &filename)
   125 {
   126   bool read_x = false;
   127   bool read_y = false;
   128 
   129   try {
   130     LemonReader lreader(filename);
   131     ContentReader content(lreader);
   132     lreader.run();
   133 
   134     const std::vector<std::string>& nodeMapNames = content.nodeSetMaps(0);
   135     const std::vector<std::string>& edgeMapNames = content.edgeSetMaps(0);
   136 
   137     GraphReader<Graph> greader(filename, graph);
   138     for (std::vector<std::string>::const_iterator it = nodeMapNames.begin();
   139         it != nodeMapNames.end(); ++it)
   140     {
   141       if (*it == "coordinates_x")
   142       {
   143         read_x = true;
   144         //std::cout << "read X nodemap" << std::endl;
   145       }
   146       else if (*it == "coordinates_y")
   147       {
   148         read_y = true;
   149         //std::cout << "read Y nodemap" << std::endl;
   150       }
   151       else if (*it == "id")
   152       {
   153         //std::cout << "read id nodemap" << std::endl;
   154       }
   155       else
   156       {
   157         nodemap_storage[*it] = new Graph::NodeMap<double>(graph);
   158         //std::cout << "read " << *it << " nodemap" << std::endl;
   159       }
   160       greader.readNodeMap(*it, *nodemap_storage[*it]);
   161     }
   162     for (std::vector<std::string>::const_iterator it = edgeMapNames.begin();
   163         it != edgeMapNames.end(); ++it)
   164     {
   165       if (*it == "id")
   166       {
   167         //std::cout << "read id edgemap" << std::endl;
   168       }
   169       else
   170       {
   171         edgemap_storage[*it] = new Graph::EdgeMap<double>(graph);
   172         //std::cout << "read " << *it << " edgemap" << std::endl;
   173       }
   174       greader.readEdgeMap(*it, *edgemap_storage[*it]);
   175     }
   176     greader.run();
   177   } catch (DataFormatError& error) {
   178     Gtk::MessageDialog mdialog("Read Error");
   179     mdialog.set_message(error.what());
   180     mdialog.run();
   181     clear();
   182     return 1;
   183   }
   184 
   185   if (!read_x || !read_y)
   186   {
   187     int node_num = 0;
   188     for (NodeIt n(graph); n != INVALID; ++n)
   189     {
   190       node_num++;
   191     }
   192     const double pi = 3.142;
   193     double step = 2 * pi / (double) node_num;
   194     int i = 0;
   195     for (NodeIt n(graph); n != INVALID; ++n)
   196     {
   197       nodemap_storage["coordinates_x"]->set(n, 250.0 * cos(i * step));
   198       nodemap_storage["coordinates_y"]->set(n, 250.0 * sin(i * step));
   199       i++;
   200     }
   201   }
   202 
   203   // fill in the default values for the maps
   204   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
   205       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   206   {
   207     if ((it->first != "id") &&
   208         (it->first != "coordiantes_x") &&
   209         (it->first != "coordinates_y"))
   210     {
   211       nodemap_default[it->first] = 0.0;
   212     }
   213   }
   214   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
   215       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   216   {
   217     if (it->first != "id")
   218     {
   219       edgemap_default[it->first] = 0.0;
   220     }
   221   }
   222 
   223   return 0;
   224 }
   225 
   226 void MapStorage::writeToFile(const std::string &filename)
   227 {
   228   GraphWriter<Graph> gwriter(filename, graph);
   229 
   230   for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
   231       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   232   {
   233     gwriter.writeNodeMap(it->first, *(it->second));
   234     //std::cout << "wrote " << it->first << " nodemap" << std::endl;
   235   }
   236   for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
   237       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   238   {
   239     gwriter.writeEdgeMap(it->first, *(it->second));
   240     //std::cout << "wrote " << it->first << " edgemap" << std::endl;
   241   }
   242   gwriter.run();
   243 }
   244 
   245 void MapStorage::clear()
   246 {
   247   for (std::map<std::string, Graph::NodeMap<double>*>::iterator it =
   248       nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
   249   {
   250     if ((it->first != "coordinates_x") &&
   251         (it->first != "coordinates_y") &&
   252         (it->first != "id"))
   253     {
   254       delete it->second;
   255       nodemap_storage.erase(it);
   256     }
   257   }
   258   for (std::map<std::string, Graph::EdgeMap<double>*>::iterator it =
   259       edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
   260   {
   261     if (it->first != "id")
   262     {
   263       delete it->second;
   264       edgemap_storage.erase(it);
   265     }
   266   }
   267   for (std::map<std::string, double>::iterator it =
   268       nodemap_default.begin(); it != nodemap_default.end(); ++it)
   269   {
   270     nodemap_default.erase(it);
   271   }
   272   for (std::map<std::string, double>::iterator it =
   273       edgemap_default.begin(); it != edgemap_default.end(); ++it)
   274   {
   275     edgemap_default.erase(it);
   276   }
   277   graph.clear();
   278   file_name = "";
   279   modified = false;
   280 }