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