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