mapstorage.cc
author hegyi
Wed, 28 Feb 2007 18:20:28 +0000
changeset 194 6b2b718420eb
parent 191 af2ed974ab68
child 195 125c56c1efda
permissions -rw-r--r--
Header reorganising
alpar@174
     1
/* -*- C++ -*-
alpar@174
     2
 *
alpar@174
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@174
     4
 *
alpar@174
     5
 * Copyright (C) 2003-2006
alpar@174
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@174
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@174
     8
 *
alpar@174
     9
 * Permission to use, modify and distribute this software is granted
alpar@174
    10
 * provided that this copyright notice appears in all copies. For
alpar@174
    11
 * precise terms see the accompanying LICENSE file.
alpar@174
    12
 *
alpar@174
    13
 * This software is provided "AS IS" with no warranty of any kind,
alpar@174
    14
 * express or implied, and with no claim as to its suitability for any
alpar@174
    15
 * purpose.
alpar@174
    16
 *
alpar@174
    17
 */
alpar@174
    18
alpar@128
    19
#include <limits>
alpar@128
    20
#include <cmath>
ladanyi@63
    21
#include <gtkmm.h>
hegyi@194
    22
hegyi@194
    23
#include <mapstorage.h>
hegyi@194
    24
#include <graph_displayer_canvas.h> //kivenni
hegyi@194
    25
#include <nbtab.h> //kivenni
hegyi@194
    26
#include <gui_writer.h>
hegyi@194
    27
#include <gui_reader.h>
hegyi@194
    28
#include <lemon/graph_to_eps.h>
deba@77
    29
hegyi@191
    30
const int i_d=20;
hegyi@177
    31
const double a_d=0.05;
hegyi@177
    32
const double p_d=40000;
hegyi@177
    33
ladanyi@184
    34
MapStorage::MapStorage(NoteBookTab& tab) : mytab(tab), modified(false), file_name(""), arrow_pos_read_ok(false), iterations(i_d), attraction(a_d), propulsation(p_d), background_set(false)
ladanyi@6
    35
{
ladanyi@53
    36
  nodemap_storage["coordinates_x"] = new Graph::NodeMap<double>(graph);
ladanyi@53
    37
  coords.setXMap(*nodemap_storage["coordinates_x"]);
ladanyi@53
    38
  nodemap_storage["coordinates_y"] = new Graph::NodeMap<double>(graph);
ladanyi@53
    39
  coords.setYMap(*nodemap_storage["coordinates_y"]);
ladanyi@53
    40
ladanyi@98
    41
  edgemap_storage["arrow_pos_x"] = new Graph::EdgeMap<double>(graph);
ladanyi@98
    42
  arrow_pos.setXMap(*edgemap_storage["arrow_pos_x"]);
ladanyi@98
    43
  edgemap_storage["arrow_pos_y"] = new Graph::EdgeMap<double>(graph);
ladanyi@98
    44
  arrow_pos.setYMap(*edgemap_storage["arrow_pos_y"]);
ladanyi@98
    45
ladanyi@134
    46
  nodemap_storage["label"] = new Graph::NodeMap<double>(graph);
ladanyi@134
    47
  edgemap_storage["label"] = new Graph::EdgeMap<double>(graph);
ladanyi@64
    48
ladanyi@134
    49
  nodemap_default["label"] = 1.0;
ladanyi@134
    50
  edgemap_default["label"] = 1.0;
hegyi@94
    51
hegyi@94
    52
  active_nodemaps.resize(NODE_PROPERTY_NUM);
hegyi@94
    53
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@94
    54
    {
hegyi@94
    55
      active_nodemaps[i]="";
hegyi@94
    56
    }
hegyi@94
    57
hegyi@94
    58
  active_edgemaps.resize(EDGE_PROPERTY_NUM);
hegyi@94
    59
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@94
    60
    {
hegyi@94
    61
      active_edgemaps[i]="";
hegyi@94
    62
    }
ladanyi@53
    63
}
ladanyi@53
    64
ladanyi@53
    65
MapStorage::~MapStorage()
ladanyi@53
    66
{
ladanyi@53
    67
  for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
ladanyi@53
    68
      nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
ladanyi@53
    69
  {
ladanyi@53
    70
    delete it->second;
ladanyi@53
    71
  }
ladanyi@53
    72
  for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
ladanyi@53
    73
      edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
ladanyi@53
    74
  {
ladanyi@53
    75
    delete it->second;
ladanyi@53
    76
  }
ladanyi@53
    77
}
ladanyi@6
    78
hegyi@118
    79
int MapStorage::addNodeMap(const std::string & name, Graph::NodeMap<double> *nodemap, double default_value)
ladanyi@6
    80
{
hegyi@46
    81
  if( nodemap_storage.find(name) == nodemap_storage.end() )
hegyi@46
    82
    {
hegyi@46
    83
      nodemap_storage[name]=nodemap;
ladanyi@63
    84
      // set the maps default value
ladanyi@63
    85
      nodemap_default[name] = default_value;
hegyi@108
    86
hegyi@108
    87
      //announce changement in maps
hegyi@108
    88
      signal_node_map.emit(name);
hegyi@46
    89
      return 0;
hegyi@46
    90
    }
hegyi@46
    91
  return 1;
ladanyi@6
    92
}
ladanyi@6
    93
hegyi@94
    94
void MapStorage::changeActiveMap(bool itisedge, int prop, std::string mapname)
hegyi@94
    95
{
hegyi@94
    96
  if(itisedge)
hegyi@94
    97
    {
hegyi@94
    98
      active_edgemaps[prop]=mapname;
hegyi@94
    99
    }
hegyi@94
   100
  else
hegyi@94
   101
    {
hegyi@94
   102
      active_nodemaps[prop]=mapname;
hegyi@94
   103
    }
hegyi@94
   104
  signal_prop.emit(itisedge, prop);
hegyi@94
   105
}
hegyi@94
   106
hegyi@172
   107
void MapStorage::broadcastActiveMaps()
hegyi@172
   108
{
hegyi@172
   109
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@172
   110
    {
hegyi@172
   111
      signal_map_win.emit(false, i, active_nodemaps[i]);
hegyi@172
   112
    }
hegyi@172
   113
  
hegyi@172
   114
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@172
   115
    {
hegyi@172
   116
      signal_map_win.emit(true, i, active_edgemaps[i]);
hegyi@172
   117
    }
hegyi@172
   118
}
hegyi@172
   119
hegyi@172
   120
hegyi@94
   121
std::string MapStorage::getActiveEdgeMap(int prop)
hegyi@94
   122
{
hegyi@94
   123
  return active_edgemaps[prop];
hegyi@94
   124
}
hegyi@94
   125
hegyi@94
   126
std::string MapStorage::getActiveNodeMap(int prop)
hegyi@94
   127
{
hegyi@94
   128
  return active_nodemaps[prop];
hegyi@94
   129
}
hegyi@94
   130
hegyi@94
   131
std::vector<std::string> MapStorage::getEdgeMapList()
hegyi@94
   132
{
hegyi@94
   133
  std::vector<std::string> eml;
hegyi@94
   134
  eml.resize(edgemap_storage.size());
hegyi@94
   135
  int i=0;
hegyi@94
   136
  std::map< std::string,Graph::EdgeMap<double> * >::iterator emsi=beginOfEdgeMaps();
hegyi@94
   137
  for(;emsi!=endOfEdgeMaps();emsi++)
hegyi@94
   138
    {
hegyi@94
   139
      eml[i]=(emsi->first);
hegyi@94
   140
      i++;
hegyi@94
   141
    }
hegyi@94
   142
  return eml;
hegyi@94
   143
}
hegyi@94
   144
hegyi@94
   145
std::vector<std::string> MapStorage::getNodeMapList()
hegyi@94
   146
{
hegyi@94
   147
  std::vector<std::string> nml;
hegyi@94
   148
  nml.resize(nodemap_storage.size());
hegyi@94
   149
  int i=0;
hegyi@94
   150
  std::map< std::string,Graph::NodeMap<double> * >::iterator nmsi=beginOfNodeMaps();
hegyi@94
   151
  for(;nmsi!=endOfNodeMaps();nmsi++)
hegyi@94
   152
    {
hegyi@94
   153
      nml[i]=(nmsi->first);
hegyi@94
   154
      i++;
hegyi@94
   155
    }
hegyi@94
   156
  return nml;
hegyi@94
   157
}
hegyi@94
   158
hegyi@177
   159
sigc::signal<void, bool, int> MapStorage::signal_prop_ch()
hegyi@94
   160
{
hegyi@94
   161
  return signal_prop;
hegyi@94
   162
}
hegyi@94
   163
hegyi@118
   164
int MapStorage::addEdgeMap(const std::string & name, Graph::EdgeMap<double> *edgemap, double default_value)
ladanyi@6
   165
{
hegyi@46
   166
  if( edgemap_storage.find(name) == edgemap_storage.end() )
hegyi@46
   167
    {
hegyi@46
   168
      edgemap_storage[name]=edgemap;
ladanyi@63
   169
      // set the maps default value
ladanyi@63
   170
      edgemap_default[name] = default_value;
hegyi@108
   171
hegyi@108
   172
      //announce changement in maps
hegyi@108
   173
      signal_edge_map.emit(name);
hegyi@46
   174
      return 0;
hegyi@46
   175
    }
hegyi@46
   176
  return 1;
ladanyi@6
   177
}
ladanyi@6
   178
ladanyi@6
   179
double MapStorage::maxOfNodeMap(const std::string & name)
ladanyi@6
   180
{
ladanyi@6
   181
  double max=0;
ladanyi@53
   182
  for (NodeIt j(graph); j!=INVALID; ++j)
ladanyi@6
   183
  {
ladanyi@6
   184
    if( (*nodemap_storage[name])[j]>max )
ladanyi@6
   185
    {
ladanyi@6
   186
      max=(*nodemap_storage[name])[j];
ladanyi@6
   187
    }
ladanyi@6
   188
  }
ladanyi@6
   189
  return max;
ladanyi@6
   190
}
ladanyi@6
   191
ladanyi@6
   192
double MapStorage::maxOfEdgeMap(const std::string & name)
ladanyi@6
   193
{
ladanyi@6
   194
  double max=0;
ladanyi@53
   195
  for (EdgeIt j(graph); j!=INVALID; ++j)
ladanyi@6
   196
  {
ladanyi@6
   197
    if( (*edgemap_storage[name])[j]>max )
ladanyi@6
   198
    {
ladanyi@6
   199
      max=(*edgemap_storage[name])[j];
ladanyi@6
   200
    }
ladanyi@6
   201
  }
ladanyi@6
   202
  return max;
ladanyi@6
   203
}
ladanyi@6
   204
ladanyi@6
   205
double MapStorage::minOfNodeMap(const std::string & name)
ladanyi@6
   206
{
ladanyi@53
   207
  NodeIt j(graph);
hegyi@58
   208
  double min;
hegyi@58
   209
  if(j!=INVALID)
hegyi@58
   210
    {
hegyi@58
   211
      min=(*nodemap_storage[name])[j];
hegyi@58
   212
    }
hegyi@58
   213
  else
hegyi@58
   214
    {
hegyi@58
   215
      min=0;
hegyi@58
   216
    }
ladanyi@6
   217
  for (; j!=INVALID; ++j)
ladanyi@6
   218
  {
ladanyi@6
   219
    if( (*nodemap_storage[name])[j]<min )
ladanyi@6
   220
    {
ladanyi@6
   221
      min=(*nodemap_storage[name])[j];
ladanyi@6
   222
    }
ladanyi@6
   223
  }
ladanyi@6
   224
  return min;
ladanyi@6
   225
}
ladanyi@6
   226
ladanyi@6
   227
double MapStorage::minOfEdgeMap(const std::string & name)
ladanyi@6
   228
{
ladanyi@53
   229
  EdgeIt j(graph);
hegyi@58
   230
  double min;
hegyi@58
   231
  if(j!=INVALID)
hegyi@58
   232
    {
hegyi@58
   233
      min=(*edgemap_storage[name])[j];
hegyi@58
   234
    }
hegyi@58
   235
  else
hegyi@58
   236
    {
hegyi@58
   237
      min=0;
hegyi@58
   238
    }
ladanyi@53
   239
  for (EdgeIt j(graph); j!=INVALID; ++j)
ladanyi@6
   240
  {
ladanyi@6
   241
    if( (*edgemap_storage[name])[j]<min )
ladanyi@6
   242
    {
ladanyi@6
   243
      min=(*edgemap_storage[name])[j];
ladanyi@6
   244
    }
ladanyi@6
   245
  }
ladanyi@6
   246
  return min;
ladanyi@6
   247
}
ladanyi@6
   248
ladanyi@63
   249
int MapStorage::readFromFile(const std::string &filename)
ladanyi@53
   250
{
ladanyi@53
   251
  bool read_x = false;
ladanyi@53
   252
  bool read_y = false;
ladanyi@64
   253
  bool read_edge_id = false;
ladanyi@53
   254
ladanyi@53
   255
  try {
ladanyi@53
   256
    LemonReader lreader(filename);
ladanyi@53
   257
    ContentReader content(lreader);
ladanyi@53
   258
    lreader.run();
ladanyi@53
   259
ladanyi@101
   260
    if (content.nodeSetNum() < 1)
ladanyi@101
   261
    {
ladanyi@101
   262
      Gtk::MessageDialog mdialog("No nodeset found in file.");
ladanyi@101
   263
      mdialog.run();
ladanyi@101
   264
      clear();
ladanyi@101
   265
      return 1;
ladanyi@101
   266
    }
ladanyi@101
   267
ladanyi@101
   268
    if (content.edgeSetNum() < 1)
ladanyi@101
   269
    {
ladanyi@101
   270
      Gtk::MessageDialog mdialog("No edgeset found in file.");
ladanyi@101
   271
      mdialog.run();
ladanyi@101
   272
      clear();
ladanyi@101
   273
      return 1;
ladanyi@101
   274
    }
ladanyi@101
   275
ladanyi@53
   276
    const std::vector<std::string>& nodeMapNames = content.nodeSetMaps(0);
ladanyi@53
   277
    const std::vector<std::string>& edgeMapNames = content.edgeSetMaps(0);
ladanyi@53
   278
ladanyi@53
   279
    GraphReader<Graph> greader(filename, graph);
ladanyi@53
   280
    for (std::vector<std::string>::const_iterator it = nodeMapNames.begin();
ladanyi@53
   281
        it != nodeMapNames.end(); ++it)
ladanyi@53
   282
    {
ladanyi@53
   283
      if (*it == "coordinates_x")
ladanyi@53
   284
      {
ladanyi@53
   285
        read_x = true;
ladanyi@53
   286
        //std::cout << "read X nodemap" << std::endl;
ladanyi@53
   287
      }
ladanyi@53
   288
      else if (*it == "coordinates_y")
ladanyi@53
   289
      {
ladanyi@53
   290
        read_y = true;
ladanyi@53
   291
        //std::cout << "read Y nodemap" << std::endl;
ladanyi@53
   292
      }
ladanyi@134
   293
      else if (*it == "label")
ladanyi@53
   294
      {
ladanyi@53
   295
        //std::cout << "read id nodemap" << std::endl;
ladanyi@53
   296
      }
ladanyi@53
   297
      else
ladanyi@53
   298
      {
ladanyi@53
   299
        nodemap_storage[*it] = new Graph::NodeMap<double>(graph);
ladanyi@53
   300
        //std::cout << "read " << *it << " nodemap" << std::endl;
ladanyi@53
   301
      }
ladanyi@53
   302
      greader.readNodeMap(*it, *nodemap_storage[*it]);
ladanyi@53
   303
    }
ladanyi@53
   304
    for (std::vector<std::string>::const_iterator it = edgeMapNames.begin();
ladanyi@53
   305
        it != edgeMapNames.end(); ++it)
ladanyi@53
   306
    {
ladanyi@134
   307
      if (*it == "label")
ladanyi@53
   308
      {
ladanyi@53
   309
        //std::cout << "read id edgemap" << std::endl;
ladanyi@135
   310
        read_edge_id = true;
ladanyi@53
   311
      }
ladanyi@53
   312
      else
ladanyi@53
   313
      {
ladanyi@53
   314
        edgemap_storage[*it] = new Graph::EdgeMap<double>(graph);
ladanyi@53
   315
        //std::cout << "read " << *it << " edgemap" << std::endl;
ladanyi@53
   316
      }
ladanyi@53
   317
      greader.readEdgeMap(*it, *edgemap_storage[*it]);
ladanyi@53
   318
    }
ladanyi@98
   319
    GuiReader gui_reader(greader, this);
ladanyi@53
   320
    greader.run();
ladanyi@101
   321
  } catch (Exception& error) {
ladanyi@79
   322
    Gtk::MessageDialog mdialog(error.what());
ladanyi@53
   323
    mdialog.run();
ladanyi@63
   324
    clear();
ladanyi@63
   325
    return 1;
ladanyi@53
   326
  }
ladanyi@53
   327
ladanyi@64
   328
  if (!read_edge_id)
ladanyi@64
   329
  {
ladanyi@134
   330
    edgemap_storage["label"] = new Graph::EdgeMap<double>(graph);
ladanyi@64
   331
    int i = 1;
ladanyi@64
   332
    for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@64
   333
    {
ladanyi@134
   334
      (*edgemap_storage["label"])[e] = i++;
ladanyi@64
   335
    }
ladanyi@64
   336
  }
ladanyi@64
   337
ladanyi@53
   338
  if (!read_x || !read_y)
ladanyi@53
   339
  {
ladanyi@53
   340
    int node_num = 0;
ladanyi@53
   341
    for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@53
   342
    {
ladanyi@53
   343
      node_num++;
ladanyi@53
   344
    }
ladanyi@53
   345
    const double pi = 3.142;
ladanyi@53
   346
    double step = 2 * pi / (double) node_num;
ladanyi@53
   347
    int i = 0;
ladanyi@53
   348
    for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@53
   349
    {
deba@77
   350
      nodemap_storage["coordinates_x"]->set(n, 250.0 * std::cos(i * step));
deba@77
   351
      nodemap_storage["coordinates_y"]->set(n, 250.0 * std::sin(i * step));
ladanyi@53
   352
      i++;
ladanyi@53
   353
    }
ladanyi@53
   354
  }
ladanyi@63
   355
ladanyi@98
   356
  if (!arrow_pos_read_ok)
ladanyi@98
   357
  {
ladanyi@98
   358
    arrow_pos_read_ok = false;
ladanyi@98
   359
    for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@98
   360
    {
ladanyi@151
   361
      if (graph.source(e) == graph.target(e))
ladanyi@151
   362
      {
ladanyi@151
   363
        arrow_pos.set(e, coords[graph.source(e)] + XY(0.0, 80.0));
ladanyi@151
   364
      }
ladanyi@151
   365
      else
ladanyi@151
   366
      {
ladanyi@151
   367
        arrow_pos.set(e, (coords[graph.source(e)] + coords[graph.target(e)]) / 2.0);
ladanyi@151
   368
      }
ladanyi@98
   369
    }
ladanyi@98
   370
  }
ladanyi@98
   371
ladanyi@63
   372
  // fill in the default values for the maps
ladanyi@63
   373
  for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
ladanyi@63
   374
      nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
ladanyi@63
   375
  {
ladanyi@134
   376
    if ((it->first != "label") &&
ladanyi@63
   377
        (it->first != "coordiantes_x") &&
ladanyi@63
   378
        (it->first != "coordinates_y"))
ladanyi@63
   379
    {
ladanyi@63
   380
      nodemap_default[it->first] = 0.0;
ladanyi@63
   381
    }
ladanyi@134
   382
    else if (it->first == "label")
ladanyi@64
   383
    {
ladanyi@64
   384
      NodeIt n(graph);
ladanyi@134
   385
      double max = (*nodemap_storage["label"])[n];
ladanyi@64
   386
      for (; n != INVALID; ++n)
ladanyi@64
   387
      {
ladanyi@134
   388
        if ((*nodemap_storage["label"])[n] > max)
ladanyi@134
   389
          max = (*nodemap_storage["label"])[n];
ladanyi@64
   390
      }
ladanyi@134
   391
      nodemap_default["label"] = max + 1.0;
ladanyi@64
   392
    }
ladanyi@63
   393
  }
ladanyi@63
   394
  for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
ladanyi@63
   395
      edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
ladanyi@63
   396
  {
ladanyi@134
   397
    if (it->first != "label")
ladanyi@63
   398
    {
ladanyi@63
   399
      edgemap_default[it->first] = 0.0;
ladanyi@63
   400
    }
ladanyi@64
   401
    else
ladanyi@64
   402
    {
ladanyi@67
   403
      double max = std::numeric_limits<double>::min();
ladanyi@67
   404
      for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@64
   405
      {
ladanyi@134
   406
        if ((*edgemap_storage["label"])[e] > max)
ladanyi@134
   407
          max = (*edgemap_storage["label"])[e];
ladanyi@64
   408
      }
ladanyi@67
   409
      if (max > std::numeric_limits<double>::min())
ladanyi@134
   410
        edgemap_default["label"] = max + 1.0;
ladanyi@67
   411
      else
ladanyi@134
   412
        edgemap_default["label"] = 1.0;
ladanyi@64
   413
    }
ladanyi@63
   414
  }
ladanyi@63
   415
ladanyi@63
   416
  return 0;
ladanyi@53
   417
}
ladanyi@53
   418
ladanyi@53
   419
void MapStorage::writeToFile(const std::string &filename)
ladanyi@53
   420
{
ladanyi@53
   421
  GraphWriter<Graph> gwriter(filename, graph);
ladanyi@53
   422
ladanyi@53
   423
  for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
ladanyi@53
   424
      nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
ladanyi@53
   425
  {
ladanyi@53
   426
    gwriter.writeNodeMap(it->first, *(it->second));
ladanyi@53
   427
  }
ladanyi@53
   428
  for (std::map<std::string, Graph::EdgeMap<double>*>::const_iterator it =
ladanyi@53
   429
      edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
ladanyi@53
   430
  {
ladanyi@98
   431
    if ((it->first != "arrow_pos_x") &&
ladanyi@98
   432
        (it->first != "arrow_pos_y"))
ladanyi@98
   433
    {
ladanyi@98
   434
      gwriter.writeEdgeMap(it->first, *(it->second));
ladanyi@98
   435
    }
ladanyi@53
   436
  }
ladanyi@98
   437
ladanyi@98
   438
  GuiWriter gui_writer(gwriter, this);
ladanyi@98
   439
ladanyi@53
   440
  gwriter.run();
ladanyi@53
   441
}
ladanyi@53
   442
ladanyi@53
   443
void MapStorage::clear()
ladanyi@53
   444
{
ladanyi@53
   445
  for (std::map<std::string, Graph::NodeMap<double>*>::iterator it =
ladanyi@53
   446
      nodemap_storage.begin(); it != nodemap_storage.end(); ++it)
ladanyi@53
   447
  {
ladanyi@53
   448
    if ((it->first != "coordinates_x") &&
ladanyi@53
   449
        (it->first != "coordinates_y") &&
ladanyi@134
   450
        (it->first != "label"))
ladanyi@53
   451
    {
ladanyi@53
   452
      delete it->second;
ladanyi@53
   453
      nodemap_storage.erase(it);
ladanyi@53
   454
    }
ladanyi@53
   455
  }
ladanyi@53
   456
  for (std::map<std::string, Graph::EdgeMap<double>*>::iterator it =
ladanyi@53
   457
      edgemap_storage.begin(); it != edgemap_storage.end(); ++it)
ladanyi@53
   458
  {
ladanyi@134
   459
    if ((it->first != "label") &&
ladanyi@98
   460
        (it->first != "arrow_pos_x") &&
ladanyi@98
   461
        (it->first != "arrow_pos_y"))
ladanyi@53
   462
    {
ladanyi@53
   463
      delete it->second;
ladanyi@53
   464
      edgemap_storage.erase(it);
ladanyi@53
   465
    }
ladanyi@53
   466
  }
ladanyi@63
   467
  for (std::map<std::string, double>::iterator it =
ladanyi@63
   468
      nodemap_default.begin(); it != nodemap_default.end(); ++it)
ladanyi@63
   469
  {
ladanyi@134
   470
    if (it->first != "label")
ladanyi@64
   471
      nodemap_default.erase(it);
ladanyi@63
   472
  }
ladanyi@63
   473
  for (std::map<std::string, double>::iterator it =
ladanyi@63
   474
      edgemap_default.begin(); it != edgemap_default.end(); ++it)
ladanyi@63
   475
  {
ladanyi@134
   476
    if (it->first != "label")
ladanyi@64
   477
      edgemap_default.erase(it);
ladanyi@63
   478
  }
ladanyi@53
   479
  graph.clear();
ladanyi@53
   480
  file_name = "";
ladanyi@53
   481
  modified = false;
hegyi@172
   482
hegyi@172
   483
  arrow_pos_read_ok = false;
hegyi@172
   484
  
hegyi@172
   485
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@172
   486
    {
hegyi@172
   487
      changeActiveMap(false, i, "");
hegyi@172
   488
      signal_map_win.emit(false, i, "");
hegyi@172
   489
    }
hegyi@172
   490
  
hegyi@172
   491
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@172
   492
    {
hegyi@172
   493
      changeActiveMap(true, i, "");
hegyi@172
   494
      signal_map_win.emit(true, i, "");
hegyi@172
   495
    }
hegyi@177
   496
hegyi@177
   497
  attraction=a_d;
hegyi@177
   498
  propulsation=p_d;
hegyi@177
   499
  iterations=i_d;
hegyi@177
   500
hegyi@177
   501
  signal_design_win.emit(attraction, propulsation, iterations);
ladanyi@53
   502
}
ladanyi@98
   503
ladanyi@98
   504
void MapStorage::ArrowPosReadOK()
ladanyi@98
   505
{
ladanyi@98
   506
  arrow_pos_read_ok = true;
ladanyi@98
   507
}
hegyi@111
   508
hegyi@111
   509
void MapStorage::mapChanged(bool itisedge, std::string mapname)
hegyi@111
   510
{
hegyi@111
   511
  if(itisedge)
hegyi@111
   512
    {
hegyi@111
   513
      for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@111
   514
	{
hegyi@111
   515
	  if(active_edgemaps[i]==mapname)
hegyi@111
   516
	    {
hegyi@111
   517
	      signal_prop.emit(itisedge, i);
hegyi@111
   518
	    }
hegyi@111
   519
	}
hegyi@111
   520
    }
hegyi@111
   521
  else
hegyi@111
   522
    {
hegyi@111
   523
      for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@111
   524
	{
hegyi@111
   525
	  if(active_nodemaps[i]==mapname)
hegyi@111
   526
	    {
hegyi@111
   527
	      signal_prop.emit(itisedge, i);
hegyi@111
   528
	    }
hegyi@111
   529
	}
hegyi@111
   530
    }
hegyi@111
   531
}
hegyi@177
   532
hegyi@177
   533
void MapStorage::get_design_data(double & attraction_p, double & propulsation_p, int & iterations_p)
hegyi@177
   534
{
hegyi@177
   535
  attraction_p=attraction;
hegyi@177
   536
  propulsation_p=propulsation;
hegyi@177
   537
  iterations_p=iterations;
hegyi@177
   538
}
hegyi@177
   539
hegyi@177
   540
void MapStorage::set_attraction(double attraction_p)
hegyi@177
   541
{
hegyi@177
   542
  attraction=attraction_p;
hegyi@177
   543
}
hegyi@177
   544
hegyi@177
   545
void MapStorage::set_propulsation(double propulsation_p)
hegyi@177
   546
{
hegyi@177
   547
  propulsation=propulsation_p;
hegyi@177
   548
}
hegyi@177
   549
hegyi@177
   550
void MapStorage::set_iteration(int iterations_p)
hegyi@177
   551
{
hegyi@177
   552
  iterations=iterations_p;
hegyi@177
   553
}
hegyi@177
   554
hegyi@177
   555
void MapStorage::redesign_data_changed()
hegyi@177
   556
{
hegyi@177
   557
  signal_design_win.emit(attraction, propulsation, iterations);
hegyi@177
   558
}
ladanyi@184
   559
ladanyi@184
   560
void MapStorage::setBackground(const std::string& file_name)
ladanyi@184
   561
{
ladanyi@184
   562
  if (file_name == background_file_name) return;
ladanyi@184
   563
  if (file_name == "")
ladanyi@184
   564
  {
ladanyi@184
   565
    background_file_name = "";
ladanyi@184
   566
    background_set = false;
ladanyi@184
   567
  }
ladanyi@184
   568
  else
ladanyi@184
   569
  {
ladanyi@184
   570
    background_file_name = file_name;
ladanyi@184
   571
    background_set = true;
ladanyi@184
   572
  }
ladanyi@184
   573
  mytab.gd_canvas->setBackground();
ladanyi@184
   574
}
ladanyi@184
   575
ladanyi@184
   576
const std::string& MapStorage::getBackgroundFilename()
ladanyi@184
   577
{
ladanyi@184
   578
  return background_file_name;
ladanyi@184
   579
}
ladanyi@184
   580
ladanyi@184
   581
bool MapStorage::isBackgroundSet()
ladanyi@184
   582
{
ladanyi@184
   583
  return background_set;
ladanyi@184
   584
}
ladanyi@184
   585
ladanyi@184
   586
double MapStorage::getBackgroundScaling()
ladanyi@184
   587
{
ladanyi@184
   588
  return background_scaling;
ladanyi@184
   589
}
ladanyi@184
   590
ladanyi@184
   591
void MapStorage::setBackgroundScaling(double scaling)
ladanyi@184
   592
{
ladanyi@184
   593
  background_scaling = scaling;
ladanyi@184
   594
}
hegyi@191
   595
hegyi@191
   596
void MapStorage::exportGraphToEPS(std::vector<bool> options, std::string filename)
hegyi@191
   597
{
hegyi@191
   598
  Graph::NodeMap<int> _nodeColors(graph, 0);
hegyi@191
   599
  Graph::EdgeMap<int> _edgeColors(graph, 0);
hegyi@191
   600
  Graph::NodeMap<double> _nodeSizes(graph, 6.0);
hegyi@191
   601
  Graph::EdgeMap<double> _edgeWidths(graph, 1.0);
hegyi@191
   602
  bool _drawArrows=options[ARROWS];
hegyi@191
   603
  bool _enableParallel=options[PAR];
hegyi@191
   604
hegyi@191
   605
  std::string emptyString="";
hegyi@191
   606
  Graph::NodeMap<std::string> _nodeTextMap(graph,emptyString);
hegyi@191
   607
hegyi@191
   608
  //_nodeTextMap=(Graph::NodeMap<void> *)&emptyStringMap;
hegyi@191
   609
hegyi@191
   610
  if(options[N_MAPS])
hegyi@191
   611
    {
hegyi@191
   612
      if(active_nodemaps[N_RADIUS]!="")
hegyi@191
   613
	{
hegyi@191
   614
	  _nodeSizes=*(nodemap_storage[active_nodemaps[N_RADIUS]]);
hegyi@191
   615
	}
hegyi@191
   616
      if(active_nodemaps[N_COLOR]!="")
hegyi@191
   617
	{
hegyi@191
   618
	  for(NodeIt ni(graph);ni!=INVALID;++ni)
hegyi@191
   619
	    {
hegyi@191
   620
	      _nodeColors[ni]=(int)((*(nodemap_storage[active_nodemaps[N_COLOR]]))[ni]);
hegyi@191
   621
	    }
hegyi@191
   622
	}
hegyi@191
   623
      if(active_nodemaps[N_TEXT]!="")
hegyi@191
   624
	{
hegyi@191
   625
	  for(NodeIt ni(graph);ni!=INVALID;++ni)
hegyi@191
   626
	    {
hegyi@191
   627
	      std::ostringstream o;
hegyi@191
   628
	      o << ((*(nodemap_storage[active_nodemaps[N_TEXT]]))[ni]);
hegyi@191
   629
	      _nodeTextMap[ni]=o.str();	      
hegyi@191
   630
	    }
hegyi@191
   631
	}
hegyi@191
   632
    }
hegyi@191
   633
  if(options[E_MAPS])
hegyi@191
   634
    {
hegyi@191
   635
      if(active_edgemaps[E_WIDTH]!="")
hegyi@191
   636
	{
hegyi@191
   637
	  _edgeWidths=*(edgemap_storage[active_edgemaps[E_WIDTH]]);
hegyi@191
   638
	}
hegyi@191
   639
      if(active_edgemaps[E_COLOR]!="")
hegyi@191
   640
	{
hegyi@191
   641
	  for(EdgeIt ei(graph);ei!=INVALID;++ei)
hegyi@191
   642
	    {
hegyi@191
   643
	      _edgeColors[ei]=(int)((*(edgemap_storage[active_edgemaps[E_COLOR]]))[ei]);
hegyi@191
   644
	    }
hegyi@191
   645
	}
hegyi@191
   646
    }
hegyi@191
   647
hegyi@191
   648
  Palette palette;
hegyi@191
   649
  Palette paletteW(true);
hegyi@191
   650
hegyi@191
   651
  graphToEps(graph,filename).
hegyi@191
   652
    title("Sample .eps figure (fits to A4)").
hegyi@191
   653
    copyright("(C) 2006 LEMON Project").
hegyi@191
   654
    absoluteNodeSizes().absoluteEdgeWidths().
hegyi@191
   655
    nodeScale(2).nodeSizes(_nodeSizes).
hegyi@191
   656
    coords(coords).
hegyi@191
   657
    nodeColors(composeMap(paletteW,_nodeColors)).
hegyi@191
   658
    edgeColors(composeMap(palette,_edgeColors)).
hegyi@191
   659
    edgeWidthScale(0.3).edgeWidths(_edgeWidths).
hegyi@191
   660
    nodeTexts(_nodeTextMap).nodeTextSize(7).
hegyi@191
   661
    enableParallel(_enableParallel).parEdgeDist(4).
hegyi@191
   662
    drawArrows(_drawArrows).arrowWidth(7).arrowLength(7).
hegyi@191
   663
    run();
hegyi@191
   664
hegyi@191
   665
}