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