mapstorage.cc
author ladanyi
Wed, 02 Jan 2008 21:03:09 +0000
changeset 201 879e47e5b731
parent 199 128195bbab73
permissions -rw-r--r--
Merge branches/akos to trunk.
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
ladanyi@201
    10
 * provided that this copyright notice appears in all cop	ies. 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@201
    19
#include "i18n.h"
alpar@128
    20
#include <limits>
alpar@128
    21
#include <cmath>
ladanyi@201
    22
#include <iostream>
ladanyi@201
    23
#include <fstream>
ladanyi@201
    24
#include <string>
ladanyi@201
    25
#include <algorithm>
ladanyi@63
    26
#include <gtkmm.h>
ladanyi@201
    27
#include "file_import_dialog.h"
hegyi@194
    28
#include <mapstorage.h>
hegyi@194
    29
#include <gui_writer.h>
hegyi@194
    30
#include <gui_reader.h>
hegyi@194
    31
#include <lemon/graph_to_eps.h>
deba@77
    32
hegyi@191
    33
const int i_d=20;
hegyi@177
    34
const double a_d=0.05;
hegyi@177
    35
const double p_d=40000;
hegyi@177
    36
ladanyi@201
    37
MapStorage::MapStorage() :
ladanyi@201
    38
  gui_sect_save_dest(LGF_FILE),
ladanyi@201
    39
  node_coords_save_dest(SpecMapSaveOpts::GUI_SECT),
ladanyi@201
    40
  arrow_coords_save_dest(SpecMapSaveOpts::GUI_SECT),
ladanyi@201
    41
  modified(false),
ladanyi@201
    42
  file_name(""),
ladanyi@201
    43
  max_node_label(0),
ladanyi@201
    44
  max_edge_label(0),
ladanyi@201
    45
  node_coords_one_map_name("coord"),
ladanyi@201
    46
  node_coords_two_maps_1_name("coord_x"),
ladanyi@201
    47
  node_coords_two_maps_2_name("coord_y"),
ladanyi@201
    48
  arrow_coords_one_map_name("arrow"),
ladanyi@201
    49
  arrow_coords_two_maps_1_name("arrow_x"),
ladanyi@201
    50
  arrow_coords_two_maps_2_name("arrow_y"),
ladanyi@201
    51
  iterations(i_d),
ladanyi@201
    52
  attraction(a_d),
ladanyi@201
    53
  propulsation(p_d),
ladanyi@201
    54
  node_coords_x(graph),
ladanyi@201
    55
  node_coords_y(graph),
ladanyi@201
    56
  arrow_coords_x(graph),
ladanyi@201
    57
  arrow_coords_y(graph),
ladanyi@201
    58
  node_label(graph),
ladanyi@201
    59
  edge_label(graph),
ladanyi@201
    60
  background_set(false)
ladanyi@6
    61
{
ladanyi@201
    62
  node_coords.setXMap(node_coords_x);
ladanyi@201
    63
  node_coords.setYMap(node_coords_y);
ladanyi@201
    64
  arrow_coords.setXMap(arrow_coords_x);
ladanyi@201
    65
  arrow_coords.setYMap(arrow_coords_y);
hegyi@94
    66
hegyi@94
    67
  active_nodemaps.resize(NODE_PROPERTY_NUM);
hegyi@94
    68
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@94
    69
    {
hegyi@94
    70
      active_nodemaps[i]="";
hegyi@94
    71
    }
hegyi@94
    72
hegyi@94
    73
  active_edgemaps.resize(EDGE_PROPERTY_NUM);
hegyi@94
    74
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@94
    75
    {
hegyi@94
    76
      active_edgemaps[i]="";
hegyi@94
    77
    }
ladanyi@53
    78
}
ladanyi@53
    79
ladanyi@53
    80
MapStorage::~MapStorage()
ladanyi@53
    81
{
ladanyi@201
    82
  clear();
ladanyi@53
    83
}
ladanyi@6
    84
ladanyi@201
    85
void MapStorage::createNodeMap(const std::string& name, MapValue::Type type,
ladanyi@201
    86
    MapValue def_val)
ladanyi@6
    87
{
ladanyi@201
    88
  NodeMapStore::const_iterator it = nodemaps.find(name);
ladanyi@201
    89
  if (it != nodemaps.end())
ladanyi@201
    90
    throw Error("Node map " + name + " already exists.");
hegyi@108
    91
ladanyi@201
    92
  switch (type)
ladanyi@201
    93
  {
ladanyi@201
    94
    case MapValue::NUMERIC:
ladanyi@201
    95
      nodemaps[name] = new NumericNodeMapData(graph, def_val);
ladanyi@201
    96
      break;
ladanyi@201
    97
    case MapValue::STRING:
ladanyi@201
    98
      nodemaps[name] = new StringNodeMapData(graph, def_val);
ladanyi@201
    99
      break;
ladanyi@201
   100
  }
ladanyi@201
   101
ladanyi@201
   102
  nodemaps[name]->default_value = def_val;
ladanyi@201
   103
ladanyi@201
   104
  signal_node_map.emit(name, type);
ladanyi@201
   105
}
ladanyi@201
   106
ladanyi@201
   107
void MapStorage::createEdgeMap(const std::string& name, MapValue::Type type,
ladanyi@201
   108
    MapValue def_val)
ladanyi@201
   109
{
ladanyi@201
   110
  EdgeMapStore::const_iterator it = edgemaps.find(name);
ladanyi@201
   111
  if (it != edgemaps.end())
ladanyi@201
   112
    throw Error("Edge map " + name + " already exists.");
ladanyi@201
   113
ladanyi@201
   114
  switch (type)
ladanyi@201
   115
  {
ladanyi@201
   116
    case MapValue::NUMERIC:
ladanyi@201
   117
      edgemaps[name] = new NumericEdgeMapData(graph, def_val);
ladanyi@201
   118
      break;
ladanyi@201
   119
    case MapValue::STRING:
ladanyi@201
   120
      edgemaps[name] = new StringEdgeMapData(graph, def_val);
ladanyi@201
   121
      break;
ladanyi@201
   122
  }
ladanyi@201
   123
ladanyi@201
   124
  edgemaps[name]->default_value = def_val;
ladanyi@201
   125
ladanyi@201
   126
  signal_edge_map.emit(name, type);
ladanyi@6
   127
}
ladanyi@6
   128
hegyi@94
   129
void MapStorage::changeActiveMap(bool itisedge, int prop, std::string mapname)
hegyi@94
   130
{
hegyi@94
   131
  if(itisedge)
hegyi@94
   132
    {
hegyi@94
   133
      active_edgemaps[prop]=mapname;
hegyi@94
   134
    }
hegyi@94
   135
  else
hegyi@94
   136
    {
hegyi@94
   137
      active_nodemaps[prop]=mapname;
hegyi@94
   138
    }
hegyi@94
   139
  signal_prop.emit(itisedge, prop);
hegyi@94
   140
}
hegyi@94
   141
hegyi@172
   142
void MapStorage::broadcastActiveMaps()
hegyi@172
   143
{
hegyi@172
   144
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@172
   145
    {
hegyi@172
   146
      signal_map_win.emit(false, i, active_nodemaps[i]);
hegyi@172
   147
    }
hegyi@172
   148
  
hegyi@172
   149
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@172
   150
    {
hegyi@172
   151
      signal_map_win.emit(true, i, active_edgemaps[i]);
hegyi@172
   152
    }
hegyi@172
   153
}
hegyi@172
   154
hegyi@94
   155
std::string MapStorage::getActiveEdgeMap(int prop)
hegyi@94
   156
{
hegyi@94
   157
  return active_edgemaps[prop];
hegyi@94
   158
}
hegyi@94
   159
hegyi@94
   160
std::string MapStorage::getActiveNodeMap(int prop)
hegyi@94
   161
{
hegyi@94
   162
  return active_nodemaps[prop];
hegyi@94
   163
}
hegyi@94
   164
ladanyi@201
   165
std::vector<std::string> MapStorage::getEdgeMapList(MapType type)
hegyi@94
   166
{
ladanyi@201
   167
  if (type == ALL)
ladanyi@201
   168
  {
ladanyi@201
   169
    std::vector<std::string> ret;
ladanyi@201
   170
    for (EdgeMapStore::const_iterator it = edgemaps.begin();
ladanyi@201
   171
        it != edgemaps.end(); ++it)
hegyi@94
   172
    {
ladanyi@201
   173
      ret.push_back(it->first);
hegyi@94
   174
    }
ladanyi@201
   175
    return ret;
ladanyi@201
   176
  }
ladanyi@201
   177
  else
ladanyi@201
   178
  {
ladanyi@201
   179
    std::vector<std::string> ret;
ladanyi@201
   180
    for (EdgeMapStore::const_iterator it = edgemaps.begin();
ladanyi@201
   181
        it != edgemaps.end(); ++it)
ladanyi@201
   182
    {
ladanyi@201
   183
      EdgeMapData* data = getEdgeMapData(it->first);
ladanyi@201
   184
      MapValue::Type t = data->type();
ladanyi@201
   185
      if ((t == MapValue::NUMERIC && (type & NUM)) ||
ladanyi@201
   186
          (t == MapValue::STRING && (type & STR)))
ladanyi@201
   187
      {
ladanyi@201
   188
        ret.push_back(it->first);
ladanyi@201
   189
      }
ladanyi@201
   190
    }
ladanyi@201
   191
    return ret;
ladanyi@201
   192
  }
hegyi@94
   193
}
hegyi@94
   194
ladanyi@201
   195
std::vector<std::string> MapStorage::getNodeMapList(MapType type)
hegyi@94
   196
{
ladanyi@201
   197
  if (type == ALL)
ladanyi@201
   198
  {
ladanyi@201
   199
    std::vector<std::string> ret;
ladanyi@201
   200
    for (NodeMapStore::const_iterator it = nodemaps.begin();
ladanyi@201
   201
        it != nodemaps.end(); ++it)
hegyi@94
   202
    {
ladanyi@201
   203
      ret.push_back(it->first);
hegyi@94
   204
    }
ladanyi@201
   205
    return ret;
ladanyi@201
   206
  }
ladanyi@201
   207
  else
ladanyi@201
   208
  {
ladanyi@201
   209
    std::vector<std::string> ret;
ladanyi@201
   210
    for (NodeMapStore::const_iterator it = nodemaps.begin();
ladanyi@201
   211
        it != nodemaps.end(); ++it)
ladanyi@201
   212
    {
ladanyi@201
   213
      NodeMapData* data = getNodeMapData(it->first);
ladanyi@201
   214
      MapValue::Type t = data->type();
ladanyi@201
   215
      if ((t == MapValue::NUMERIC && (type & NUM)) ||
ladanyi@201
   216
          (t == MapValue::STRING && (type & STR)))
ladanyi@201
   217
      {
ladanyi@201
   218
        ret.push_back(it->first);
ladanyi@201
   219
      }
ladanyi@201
   220
    }
ladanyi@201
   221
    return ret;
ladanyi@201
   222
  }
hegyi@94
   223
}
hegyi@94
   224
hegyi@177
   225
sigc::signal<void, bool, int> MapStorage::signal_prop_ch()
hegyi@94
   226
{
hegyi@94
   227
  return signal_prop;
hegyi@94
   228
}
hegyi@94
   229
ladanyi@201
   230
int MapStorage::readFromFile(const std::string &filename)
ladanyi@6
   231
{
ladanyi@201
   232
  using std::vector;
ladanyi@201
   233
  using std::map;
ladanyi@201
   234
  using std::string;
ladanyi@201
   235
ladanyi@201
   236
  // check whether the .conf file exists
ladanyi@201
   237
  bool gui_data_in_conf = g_file_test((filename + ".conf").c_str(),
ladanyi@201
   238
      (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR));
ladanyi@201
   239
ladanyi@201
   240
  // check whether the .lgf file contains a gui section
ladanyi@201
   241
  bool gui_data_in_lgf = false;
ladanyi@201
   242
  {
ladanyi@201
   243
    std::ifstream ifs(filename.c_str());
ladanyi@201
   244
    std::string line;
ladanyi@201
   245
    while (getline(ifs, line))
hegyi@46
   246
    {
ladanyi@201
   247
      int pos = line.find("@gui");
ladanyi@201
   248
      if (pos != std::string::npos)
ladanyi@201
   249
      {
ladanyi@201
   250
        bool only_whitespace_before = true;
ladanyi@201
   251
        for (int i = 0; i < pos; ++i)
ladanyi@201
   252
        {
ladanyi@201
   253
          if (!std::isspace(line[i]))
ladanyi@201
   254
          {
ladanyi@201
   255
            only_whitespace_before = false;
ladanyi@201
   256
            break;
ladanyi@201
   257
          }
ladanyi@201
   258
        }
ladanyi@201
   259
        if (only_whitespace_before) gui_data_in_lgf = true;
ladanyi@201
   260
      }
ladanyi@6
   261
    }
ladanyi@6
   262
  }
ladanyi@6
   263
ladanyi@201
   264
  bool gui_data_found = gui_data_in_lgf || gui_data_in_conf;
ladanyi@201
   265
ladanyi@201
   266
  // ask for user input if both exist
ladanyi@201
   267
  bool use_gui_data_in_lgf = false;
ladanyi@201
   268
  if (gui_data_in_conf && gui_data_in_lgf)
ladanyi@6
   269
  {
ladanyi@201
   270
    Gtk::MessageDialog mdialog(_("<b>Found both ") + filename +
ladanyi@201
   271
        _(".conf and a gui section in ") + filename + _(".</b>"), true,
ladanyi@201
   272
        Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE);
ladanyi@201
   273
	  mdialog.add_button(_("Use the ._conf file"), 1);
ladanyi@201
   274
	  mdialog.add_button(_("Use the _gui section"), 2);
ladanyi@201
   275
    switch (mdialog.run())
ladanyi@6
   276
    {
ladanyi@201
   277
      case 1:
ladanyi@201
   278
        use_gui_data_in_lgf = false;
ladanyi@201
   279
        break;
ladanyi@201
   280
      case 2:
ladanyi@201
   281
        use_gui_data_in_lgf = true;
ladanyi@201
   282
        break;
ladanyi@201
   283
      case Gtk::RESPONSE_NONE:
ladanyi@201
   284
        return 1;
ladanyi@6
   285
    }
ladanyi@6
   286
  }
ladanyi@201
   287
  else
ladanyi@201
   288
  {
ladanyi@201
   289
    use_gui_data_in_lgf = gui_data_in_lgf;
ladanyi@201
   290
  }
ladanyi@6
   291
ladanyi@201
   292
  if (gui_data_found)
ladanyi@201
   293
  {
ladanyi@201
   294
    GUISectData gui_data;
ladanyi@201
   295
    if (use_gui_data_in_lgf)
hegyi@58
   296
    {
ladanyi@201
   297
      // read the gui section from the .lgf file
ladanyi@201
   298
      try
ladanyi@201
   299
      {
ladanyi@201
   300
        LemonReader lreader(filename);
ladanyi@201
   301
        GuiReader gui_reader(lreader, this, gui_data);
ladanyi@201
   302
        lreader.run();
ladanyi@201
   303
        gui_sect_save_dest = LGF_FILE;
ladanyi@201
   304
      }
ladanyi@201
   305
      catch (Exception& error)
ladanyi@201
   306
      {
ladanyi@201
   307
        clear();
ladanyi@201
   308
        return 1;
ladanyi@201
   309
      }
hegyi@58
   310
    }
ladanyi@201
   311
    else
hegyi@58
   312
    {
ladanyi@201
   313
      // read the gui section from the .conf file
ladanyi@201
   314
      try
ladanyi@201
   315
      {
ladanyi@201
   316
        LemonReader lreader(filename + ".conf");
ladanyi@201
   317
        GuiReader gui_reader(lreader, this, gui_data);
ladanyi@201
   318
        lreader.run();
ladanyi@201
   319
        gui_sect_save_dest = CONF_FILE;
ladanyi@201
   320
      }
ladanyi@201
   321
      catch (Exception& error)
ladanyi@201
   322
      {
ladanyi@201
   323
        clear();
ladanyi@201
   324
        return 1;
ladanyi@201
   325
      }
hegyi@58
   326
    }
ladanyi@201
   327
ladanyi@201
   328
    // read the graph and maps form the .lgf file
ladanyi@201
   329
    try
ladanyi@6
   330
    {
ladanyi@201
   331
      std::string node_coord_xmap_name, node_coord_ymap_name;
ladanyi@201
   332
      std::string arrow_coord_xmap_name, arrow_coord_ymap_name;
ladanyi@201
   333
ladanyi@201
   334
      if (gui_data.node_coords_save_dest ==
ladanyi@201
   335
          MapStorage::SpecMapSaveOpts::NESET_SECT)
ladanyi@201
   336
      {
ladanyi@201
   337
        switch (gui_data.node_coords_save_map_num)
ladanyi@201
   338
        {
ladanyi@201
   339
          case SpecMapSaveOpts::ONE_MAP:
ladanyi@201
   340
            node_coord_xmap_name = gui_data.node_coords_one_map_name + ":x";
ladanyi@201
   341
            node_coord_ymap_name = gui_data.node_coords_one_map_name + ":y";
ladanyi@201
   342
            node_coords_one_map_name = gui_data.node_coords_one_map_name;
ladanyi@201
   343
            break;
ladanyi@201
   344
          case SpecMapSaveOpts::TWO_MAPS:
ladanyi@201
   345
            node_coord_xmap_name = gui_data.node_coords_two_maps_1_name;
ladanyi@201
   346
            node_coord_ymap_name = gui_data.node_coords_two_maps_2_name;
ladanyi@201
   347
            node_coords_two_maps_1_name = gui_data.node_coords_two_maps_1_name;
ladanyi@201
   348
            node_coords_two_maps_2_name = gui_data.node_coords_two_maps_2_name;
ladanyi@201
   349
            break;
ladanyi@201
   350
        }
ladanyi@201
   351
        node_coords_save_dest = gui_data.node_coords_save_dest;
ladanyi@201
   352
        node_coords_save_map_num = gui_data.node_coords_save_map_num;
ladanyi@201
   353
      }
ladanyi@201
   354
ladanyi@201
   355
      if (gui_data.arrow_coords_save_dest ==
ladanyi@201
   356
          MapStorage::SpecMapSaveOpts::NESET_SECT)
ladanyi@201
   357
      {
ladanyi@201
   358
        switch (gui_data.arrow_coords_save_map_num)
ladanyi@201
   359
        {
ladanyi@201
   360
          case SpecMapSaveOpts::ONE_MAP:
ladanyi@201
   361
            arrow_coord_xmap_name = gui_data.arrow_coords_one_map_name + ":x";
ladanyi@201
   362
            arrow_coord_ymap_name = gui_data.arrow_coords_one_map_name + ":y";
ladanyi@201
   363
            arrow_coords_one_map_name = gui_data.arrow_coords_one_map_name;
ladanyi@201
   364
            break;
ladanyi@201
   365
          case SpecMapSaveOpts::TWO_MAPS:
ladanyi@201
   366
            arrow_coord_xmap_name = gui_data.arrow_coords_two_maps_1_name;
ladanyi@201
   367
            arrow_coord_ymap_name = gui_data.arrow_coords_two_maps_2_name;
ladanyi@201
   368
            arrow_coords_two_maps_1_name =
ladanyi@201
   369
              gui_data.arrow_coords_two_maps_1_name;
ladanyi@201
   370
            arrow_coords_two_maps_2_name =
ladanyi@201
   371
              gui_data.arrow_coords_two_maps_2_name;
ladanyi@201
   372
            break;
ladanyi@201
   373
        }
ladanyi@201
   374
        arrow_coords_save_dest = gui_data.arrow_coords_save_dest;
ladanyi@201
   375
        arrow_coords_save_map_num = gui_data.arrow_coords_save_map_num;
ladanyi@201
   376
      }
ladanyi@201
   377
      readLGF(filename, true,
ladanyi@201
   378
          gui_data.main_node_map_names, gui_data.main_edge_map_names,
ladanyi@201
   379
          gui_data.node_map_types, gui_data.edge_map_types,
ladanyi@201
   380
          node_coord_xmap_name, node_coord_ymap_name,
ladanyi@201
   381
          arrow_coord_xmap_name, arrow_coord_ymap_name);
ladanyi@6
   382
    }
ladanyi@201
   383
    catch (Exception& error)
hegyi@58
   384
    {
ladanyi@101
   385
      clear();
ladanyi@101
   386
      return 1;
ladanyi@101
   387
    }
ladanyi@101
   388
ladanyi@201
   389
    // add the maps from the gui section
ladanyi@201
   390
    for (vector<string>::const_iterator
ladanyi@201
   391
        it = gui_data.gui_node_map_names.begin();
ladanyi@201
   392
        it != gui_data.gui_node_map_names.end(); ++it)
ladanyi@101
   393
    {
ladanyi@201
   394
      string map_name = *it;
ladanyi@201
   395
      switch (gui_data.node_map_types[map_name])
ladanyi@201
   396
      {
ladanyi@201
   397
        case MapValue::NUMERIC:
ladanyi@201
   398
          {
ladanyi@201
   399
            createNodeMap(map_name, MapValue::NUMERIC, double());
ladanyi@201
   400
            NumericNodeMap& dmap = getNumericNodeMap(map_name);
ladanyi@201
   401
            map<int, double>& smap = *gui_data.numeric_node_maps[map_name];
ladanyi@201
   402
            for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
   403
            {
ladanyi@201
   404
              dmap[n] = smap[node_label[n]];
ladanyi@201
   405
            }
ladanyi@201
   406
            break;
ladanyi@201
   407
          }
ladanyi@201
   408
        case MapValue::STRING:
ladanyi@201
   409
          {
ladanyi@201
   410
            createNodeMap(map_name, MapValue::STRING, string());
ladanyi@201
   411
            StringNodeMap& dmap = getStringNodeMap(map_name);
ladanyi@201
   412
            map<int, string>& smap = *gui_data.string_node_maps[map_name];
ladanyi@201
   413
            for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
   414
            {
ladanyi@201
   415
              dmap[n] = smap[node_label[n]];
ladanyi@201
   416
            }
ladanyi@201
   417
            break;
ladanyi@201
   418
          }
ladanyi@201
   419
      }
ladanyi@201
   420
      getNodeMapData(map_name)->save_dest = GUI_SECT;
ladanyi@201
   421
    }
ladanyi@201
   422
    for (vector<string>::const_iterator
ladanyi@201
   423
        it = gui_data.gui_edge_map_names.begin();
ladanyi@201
   424
        it != gui_data.gui_edge_map_names.end(); ++it)
ladanyi@201
   425
    {
ladanyi@201
   426
      string map_name = *it;
ladanyi@201
   427
      switch (gui_data.edge_map_types[map_name])
ladanyi@201
   428
      {
ladanyi@201
   429
        case MapValue::NUMERIC:
ladanyi@201
   430
          {
ladanyi@201
   431
            createEdgeMap(map_name, MapValue::NUMERIC, double());
ladanyi@201
   432
            NumericEdgeMap& dmap = getNumericEdgeMap(map_name);
ladanyi@201
   433
            map<int, double>& smap = *gui_data.numeric_edge_maps[map_name];
ladanyi@201
   434
            for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@201
   435
            {
ladanyi@201
   436
              dmap[e] = smap[edge_label[e]];
ladanyi@201
   437
            }
ladanyi@201
   438
            break;
ladanyi@201
   439
          }
ladanyi@201
   440
        case MapValue::STRING:
ladanyi@201
   441
          {
ladanyi@201
   442
            createEdgeMap(map_name, MapValue::STRING, string());
ladanyi@201
   443
            StringEdgeMap& dmap = getStringEdgeMap(map_name);
ladanyi@201
   444
            map<int, string>& smap = *gui_data.string_edge_maps[map_name];
ladanyi@201
   445
            for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@201
   446
            {
ladanyi@201
   447
              dmap[e] = smap[edge_label[e]];
ladanyi@201
   448
            }
ladanyi@201
   449
            break;
ladanyi@201
   450
          }
ladanyi@201
   451
      }
ladanyi@201
   452
      getEdgeMapData(map_name)->save_dest = GUI_SECT;
ladanyi@101
   453
    }
ladanyi@101
   454
ladanyi@201
   455
    // restore the node coordinate maps
ladanyi@201
   456
    if (gui_data.node_coords_save_dest ==
ladanyi@201
   457
        MapStorage::SpecMapSaveOpts::GUI_SECT)
ladanyi@201
   458
    {
ladanyi@201
   459
      for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
   460
      {
ladanyi@201
   461
        node_coords.set(n, gui_data.node_coord_map[node_label[n]]);
ladanyi@201
   462
      }
ladanyi@201
   463
      node_coords_save_dest = gui_data.node_coords_save_dest;
ladanyi@201
   464
    }
ladanyi@201
   465
    // restore the arrow coordinate maps
ladanyi@201
   466
    if (gui_data.arrow_coords_save_dest ==
ladanyi@201
   467
        MapStorage::SpecMapSaveOpts::GUI_SECT)
ladanyi@201
   468
    {
ladanyi@201
   469
      for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@201
   470
      {
ladanyi@201
   471
        arrow_coords.set(e, gui_data.arrow_coord_map[edge_label[e]]);
ladanyi@201
   472
      }
ladanyi@201
   473
      arrow_coords_save_dest = gui_data.arrow_coords_save_dest;
ladanyi@201
   474
    }
ladanyi@201
   475
  }
ladanyi@201
   476
  else
ladanyi@201
   477
  {
ladanyi@201
   478
    // there is no gui section neither in the .lgf file nor in the .conf file
ladanyi@201
   479
    {
ladanyi@201
   480
      LemonReader lreader(filename);
ladanyi@201
   481
      ContentReader content(lreader);
ladanyi@201
   482
      try
ladanyi@201
   483
      {
ladanyi@201
   484
        lreader.run();
ladanyi@201
   485
      }
ladanyi@201
   486
      catch (Exception& error)
ladanyi@201
   487
      {
ladanyi@201
   488
        Gtk::MessageDialog mdialog(error.what());
ladanyi@201
   489
        mdialog.run();
ladanyi@201
   490
        clear();
ladanyi@201
   491
        return 1;
ladanyi@201
   492
      }
ladanyi@53
   493
ladanyi@201
   494
      if (content.nodeSetNum() < 1)
ladanyi@53
   495
      {
ladanyi@201
   496
        Gtk::MessageDialog mdialog("No nodeset found in file.");
ladanyi@201
   497
        mdialog.run();
ladanyi@201
   498
        clear();
ladanyi@201
   499
        return 1;
ladanyi@53
   500
      }
ladanyi@201
   501
ladanyi@201
   502
      if (content.edgeSetNum() < 1)
ladanyi@53
   503
      {
ladanyi@201
   504
        Gtk::MessageDialog mdialog("No edgeset found in file.");
ladanyi@201
   505
        mdialog.run();
ladanyi@201
   506
        clear();
ladanyi@201
   507
        return 1;
ladanyi@53
   508
      }
ladanyi@201
   509
ladanyi@201
   510
      std::vector<std::string> nodeMapNames = content.nodeSetMaps(0);
ladanyi@201
   511
      std::vector<std::string> edgeMapNames = content.edgeSetMaps(0);
ladanyi@201
   512
      
ladanyi@201
   513
      bool read_edge_label = true;
ladanyi@201
   514
      if (std::find(edgeMapNames.begin(), edgeMapNames.end(), "label") ==
ladanyi@201
   515
          edgeMapNames.end())
ladanyi@53
   516
      {
ladanyi@201
   517
        read_edge_label = false;
ladanyi@201
   518
      }
ladanyi@201
   519
ladanyi@201
   520
      nodeMapNames.erase(
ladanyi@201
   521
          std::remove(nodeMapNames.begin(), nodeMapNames.end(), "label"),
ladanyi@201
   522
          nodeMapNames.end());
ladanyi@201
   523
ladanyi@201
   524
      edgeMapNames.erase(
ladanyi@201
   525
          std::remove(edgeMapNames.begin(), edgeMapNames.end(), "label"),
ladanyi@201
   526
          edgeMapNames.end());
ladanyi@201
   527
ladanyi@201
   528
      FileImportDialog::ImportData data(nodeMapNames, edgeMapNames);
ladanyi@201
   529
      FileImportDialog fidialog(&data);
ladanyi@201
   530
      int response = fidialog.run();
ladanyi@201
   531
      if (response == Gtk::RESPONSE_OK)
ladanyi@201
   532
      {
ladanyi@201
   533
        try
ladanyi@201
   534
        {
ladanyi@201
   535
          std::string node_coord_xmap_name, node_coord_ymap_name;
ladanyi@201
   536
          std::string arrow_coord_xmap_name, arrow_coord_ymap_name;
ladanyi@201
   537
          bool gen_node_coords = false;
ladanyi@201
   538
          bool gen_arrow_coords = false;
ladanyi@201
   539
ladanyi@201
   540
          switch (data.node_coord_load_from)
ladanyi@201
   541
          {
ladanyi@201
   542
            case FileImportDialog::ImportData::ONE_MAP:
ladanyi@201
   543
              node_coord_xmap_name = data.node_coord_one_map_name + ":x";
ladanyi@201
   544
              node_coord_ymap_name = data.node_coord_one_map_name + ":y";
ladanyi@201
   545
              node_coords_one_map_name = data.node_coord_one_map_name;
ladanyi@201
   546
ladanyi@201
   547
              node_coords_save_dest = SpecMapSaveOpts::NESET_SECT;
ladanyi@201
   548
              node_coords_save_map_num = SpecMapSaveOpts::ONE_MAP;
ladanyi@201
   549
              break;
ladanyi@201
   550
            case FileImportDialog::ImportData::TWO_MAPS:
ladanyi@201
   551
              node_coord_xmap_name = data.node_coord_two_maps_1_name;
ladanyi@201
   552
              node_coord_ymap_name = data.node_coord_two_maps_2_name;
ladanyi@201
   553
              node_coords_two_maps_1_name = data.node_coord_two_maps_1_name;
ladanyi@201
   554
              node_coords_two_maps_2_name = data.node_coord_two_maps_2_name;
ladanyi@201
   555
ladanyi@201
   556
              node_coords_save_dest = SpecMapSaveOpts::NESET_SECT;
ladanyi@201
   557
              node_coords_save_map_num = SpecMapSaveOpts::TWO_MAPS;
ladanyi@201
   558
              break;
ladanyi@201
   559
            case FileImportDialog::ImportData::DONT_READ:
ladanyi@201
   560
              node_coord_xmap_name = "";
ladanyi@201
   561
              node_coord_ymap_name = "";
ladanyi@201
   562
ladanyi@201
   563
              node_coords_save_dest = SpecMapSaveOpts::GUI_SECT;
ladanyi@201
   564
              gen_node_coords = true;
ladanyi@201
   565
              break;
ladanyi@201
   566
          }
ladanyi@201
   567
ladanyi@201
   568
          switch (data.arrow_coord_load_from)
ladanyi@201
   569
          {
ladanyi@201
   570
            case FileImportDialog::ImportData::ONE_MAP:
ladanyi@201
   571
              arrow_coord_xmap_name = data.arrow_coord_one_map_name + ":x";
ladanyi@201
   572
              arrow_coord_ymap_name = data.arrow_coord_one_map_name + ":y";
ladanyi@201
   573
              arrow_coords_one_map_name = data.arrow_coord_one_map_name;
ladanyi@201
   574
ladanyi@201
   575
              arrow_coords_save_dest = SpecMapSaveOpts::NESET_SECT;
ladanyi@201
   576
              arrow_coords_save_map_num = SpecMapSaveOpts::ONE_MAP;
ladanyi@201
   577
              break;
ladanyi@201
   578
            case FileImportDialog::ImportData::TWO_MAPS:
ladanyi@201
   579
              arrow_coord_xmap_name = data.arrow_coord_two_maps_1_name;
ladanyi@201
   580
              arrow_coord_ymap_name = data.arrow_coord_two_maps_2_name;
ladanyi@201
   581
              arrow_coords_two_maps_1_name = data.arrow_coord_two_maps_1_name;
ladanyi@201
   582
              arrow_coords_two_maps_2_name = data.arrow_coord_two_maps_2_name;
ladanyi@201
   583
ladanyi@201
   584
              arrow_coords_save_dest = SpecMapSaveOpts::NESET_SECT;
ladanyi@201
   585
              arrow_coords_save_map_num = SpecMapSaveOpts::TWO_MAPS;
ladanyi@201
   586
              break;
ladanyi@201
   587
            case FileImportDialog::ImportData::DONT_READ:
ladanyi@201
   588
              arrow_coord_xmap_name = "";
ladanyi@201
   589
              arrow_coord_ymap_name = "";
ladanyi@201
   590
ladanyi@201
   591
              arrow_coords_save_dest = SpecMapSaveOpts::GUI_SECT;
ladanyi@201
   592
              gen_arrow_coords = true;
ladanyi@201
   593
              break;
ladanyi@201
   594
          }
ladanyi@201
   595
ladanyi@201
   596
          // read edge and node maps
ladanyi@201
   597
          std::vector<std::string> node_map_names;
ladanyi@201
   598
          std::vector<std::string> edge_map_names;
ladanyi@201
   599
          std::map<std::string, MapValue::Type> node_map_types;
ladanyi@201
   600
          std::map<std::string, MapValue::Type> edge_map_types;
ladanyi@201
   601
          for (std::vector<std::string>::const_iterator it =
ladanyi@201
   602
              data.numeric_node_map_names.begin();
ladanyi@201
   603
              it != data.numeric_node_map_names.end(); ++it)
ladanyi@201
   604
          {
ladanyi@201
   605
            node_map_names.push_back(*it);
ladanyi@201
   606
            node_map_types[*it] = MapValue::NUMERIC;
ladanyi@201
   607
          }
ladanyi@201
   608
          for (std::vector<std::string>::const_iterator it =
ladanyi@201
   609
              data.string_node_map_names.begin();
ladanyi@201
   610
              it != data.string_node_map_names.end(); ++it)
ladanyi@201
   611
          {
ladanyi@201
   612
            node_map_names.push_back(*it);
ladanyi@201
   613
            node_map_types[*it] = MapValue::STRING;
ladanyi@201
   614
          }
ladanyi@201
   615
          for (std::vector<std::string>::const_iterator it =
ladanyi@201
   616
              data.numeric_edge_map_names.begin();
ladanyi@201
   617
              it != data.numeric_edge_map_names.end(); ++it)
ladanyi@201
   618
          {
ladanyi@201
   619
            edge_map_names.push_back(*it);
ladanyi@201
   620
            edge_map_types[*it] = MapValue::NUMERIC;
ladanyi@201
   621
          }
ladanyi@201
   622
          for (std::vector<std::string>::const_iterator it =
ladanyi@201
   623
              data.string_edge_map_names.begin();
ladanyi@201
   624
              it != data.string_edge_map_names.end(); ++it)
ladanyi@201
   625
          {
ladanyi@201
   626
            edge_map_names.push_back(*it);
ladanyi@201
   627
            edge_map_types[*it] = MapValue::STRING;
ladanyi@201
   628
          }
ladanyi@201
   629
ladanyi@201
   630
          readLGF(filename, read_edge_label,
ladanyi@201
   631
              node_map_names, edge_map_names,
ladanyi@201
   632
              node_map_types, edge_map_types,
ladanyi@201
   633
              node_coord_xmap_name, node_coord_ymap_name,
ladanyi@201
   634
              arrow_coord_xmap_name, arrow_coord_ymap_name);
ladanyi@201
   635
ladanyi@201
   636
          // generate edge labels
ladanyi@201
   637
          if (!read_edge_label)
ladanyi@201
   638
          {
ladanyi@201
   639
            int l = 0;
ladanyi@201
   640
            for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@201
   641
            {
ladanyi@201
   642
              edge_label[e] = l++;
ladanyi@201
   643
            }
ladanyi@201
   644
          }
ladanyi@201
   645
ladanyi@201
   646
          if (gen_node_coords)
ladanyi@201
   647
          {
ladanyi@201
   648
            // generate node coordinates
ladanyi@201
   649
            int node_num = 0;
ladanyi@201
   650
            for (NodeIt n(graph); n != INVALID; ++n) { node_num++; }
ladanyi@201
   651
            const double pi = 3.142;
ladanyi@201
   652
            double step = 2 * pi / (double) node_num;
ladanyi@201
   653
            int i = 0;
ladanyi@201
   654
            for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
   655
            {
ladanyi@201
   656
              setNodeCoords(n,
ladanyi@201
   657
                  XY(250.0 * std::cos(i * step),
ladanyi@201
   658
                    250.0 * std::sin(i * step)));
ladanyi@201
   659
              i++;
ladanyi@201
   660
            }
ladanyi@201
   661
          }
ladanyi@201
   662
          if (gen_arrow_coords)
ladanyi@201
   663
          {
ladanyi@201
   664
            // generate arrow coordinates
ladanyi@201
   665
            for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@201
   666
            {
ladanyi@201
   667
              if (graph.source(e) == graph.target(e))
ladanyi@201
   668
              {
ladanyi@201
   669
                setArrowCoords(e,
ladanyi@201
   670
                    getNodeCoords(graph.source(e)) + XY(0.0, 80.0));
ladanyi@201
   671
              }
ladanyi@201
   672
              else
ladanyi@201
   673
              {
ladanyi@201
   674
                setArrowCoords(e,
ladanyi@201
   675
                    (getNodeCoords(graph.source(e)) +
ladanyi@201
   676
                     getNodeCoords(graph.target(e))) / 2.0);
ladanyi@201
   677
              }
ladanyi@201
   678
            }
ladanyi@201
   679
          }
ladanyi@201
   680
        }
ladanyi@201
   681
        catch (Exception& error)
ladanyi@201
   682
        {
ladanyi@201
   683
          clear();
ladanyi@201
   684
          return 1;
ladanyi@201
   685
        }
ladanyi@53
   686
      }
ladanyi@53
   687
      else
ladanyi@53
   688
      {
ladanyi@201
   689
        clear();
ladanyi@201
   690
        return 1;
ladanyi@151
   691
      }
ladanyi@98
   692
    }
ladanyi@98
   693
  }
ladanyi@98
   694
ladanyi@201
   695
  // set max_node_label
ladanyi@63
   696
  {
ladanyi@201
   697
    max_node_label = std::numeric_limits<int>::min();
ladanyi@201
   698
    for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@63
   699
    {
ladanyi@201
   700
      if (node_label[n] > max_node_label)
ladanyi@64
   701
      {
ladanyi@201
   702
        max_node_label = node_label[n];
ladanyi@64
   703
      }
ladanyi@64
   704
    }
ladanyi@63
   705
  }
ladanyi@201
   706
  // set max_edge_label
ladanyi@63
   707
  {
ladanyi@201
   708
    max_edge_label = std::numeric_limits<int>::min();
ladanyi@201
   709
    for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@63
   710
    {
ladanyi@201
   711
      if (edge_label[e] > max_edge_label)
ladanyi@64
   712
      {
ladanyi@201
   713
        max_edge_label = edge_label[e];
ladanyi@64
   714
      }
ladanyi@64
   715
    }
ladanyi@63
   716
  }
ladanyi@63
   717
ladanyi@63
   718
  return 0;
ladanyi@53
   719
}
ladanyi@53
   720
ladanyi@53
   721
void MapStorage::writeToFile(const std::string &filename)
ladanyi@53
   722
{
ladanyi@201
   723
  // relabel nodes and edges
ladanyi@201
   724
  int i = 0;
ladanyi@201
   725
  for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
   726
  {
ladanyi@201
   727
    node_label[n] = i++;
ladanyi@201
   728
  }
ladanyi@201
   729
  max_node_label = i-1;
ladanyi@201
   730
  i = 0;
ladanyi@201
   731
  for (EdgeIt e(graph); e != INVALID; ++e)
ladanyi@201
   732
  {
ladanyi@201
   733
    edge_label[e] = i++;
ladanyi@201
   734
  }
ladanyi@201
   735
  max_edge_label = i-1;
ladanyi@53
   736
ladanyi@201
   737
  // write .lgf file
ladanyi@53
   738
  {
ladanyi@201
   739
    GraphWriter<Graph> gwriter(filename, graph);
ladanyi@201
   740
ladanyi@201
   741
    gwriter.writeNodeMap("label", node_label);
ladanyi@201
   742
    gwriter.writeEdgeMap("label", edge_label);
ladanyi@201
   743
ladanyi@201
   744
    // write node maps
ladanyi@201
   745
    for (NodeMapStore::const_iterator it = nodemaps.begin();
ladanyi@201
   746
        it != nodemaps.end(); ++it)
ladanyi@98
   747
    {
ladanyi@201
   748
      if (it->second->save_dest == NESET_SECT)
ladanyi@201
   749
      {
ladanyi@201
   750
        switch (it->second->type())
ladanyi@201
   751
        {
ladanyi@201
   752
          case MapValue::NUMERIC:
ladanyi@201
   753
            gwriter.writeNodeMap(it->first, getNumericNodeMap(it->first));
ladanyi@201
   754
            break;
ladanyi@201
   755
          case MapValue::STRING:
ladanyi@201
   756
            gwriter.writeNodeMap(it->first, getStringNodeMap(it->first));
ladanyi@201
   757
            break;
ladanyi@201
   758
        }
ladanyi@201
   759
      }
ladanyi@201
   760
    }
ladanyi@201
   761
ladanyi@201
   762
    // write edge maps
ladanyi@201
   763
    for (EdgeMapStore::const_iterator it = edgemaps.begin();
ladanyi@201
   764
        it != edgemaps.end(); ++it)
ladanyi@201
   765
    {
ladanyi@201
   766
      if (it->second->save_dest == NESET_SECT)
ladanyi@201
   767
      {
ladanyi@201
   768
        switch (it->second->type())
ladanyi@201
   769
        {
ladanyi@201
   770
          case MapValue::NUMERIC:
ladanyi@201
   771
            gwriter.writeEdgeMap(it->first, getNumericEdgeMap(it->first));
ladanyi@201
   772
            break;
ladanyi@201
   773
          case MapValue::STRING:
ladanyi@201
   774
            gwriter.writeEdgeMap(it->first, getStringEdgeMap(it->first));
ladanyi@201
   775
            break;
ladanyi@201
   776
        }
ladanyi@201
   777
      }
ladanyi@201
   778
    }
ladanyi@201
   779
ladanyi@201
   780
    // write node coordinates
ladanyi@201
   781
    switch (getNodeCoordsSaveDest())
ladanyi@201
   782
    {
ladanyi@201
   783
      case MapStorage::SpecMapSaveOpts::GUI_SECT:
ladanyi@201
   784
        break;
ladanyi@201
   785
      case MapStorage::SpecMapSaveOpts::NESET_SECT:
ladanyi@201
   786
        switch (getNodeCoordsSaveMapNum())
ladanyi@201
   787
        {
ladanyi@201
   788
          case MapStorage::SpecMapSaveOpts::ONE_MAP:
ladanyi@201
   789
            gwriter.writeNodeMap(node_coords_one_map_name + ":x",
ladanyi@201
   790
                node_coords_x);
ladanyi@201
   791
            gwriter.writeNodeMap(node_coords_one_map_name + ":y",
ladanyi@201
   792
                node_coords_y);
ladanyi@201
   793
            break;
ladanyi@201
   794
          case MapStorage::SpecMapSaveOpts::TWO_MAPS:
ladanyi@201
   795
            gwriter.writeNodeMap(node_coords_two_maps_1_name,
ladanyi@201
   796
                node_coords_x);
ladanyi@201
   797
            gwriter.writeNodeMap(node_coords_two_maps_2_name,
ladanyi@201
   798
                node_coords_y);
ladanyi@201
   799
            break;
ladanyi@201
   800
        }
ladanyi@201
   801
        break;
ladanyi@201
   802
    }
ladanyi@201
   803
ladanyi@201
   804
    // write arrow coordinates
ladanyi@201
   805
    switch (getArrowCoordsSaveDest())
ladanyi@201
   806
    {
ladanyi@201
   807
      case MapStorage::SpecMapSaveOpts::GUI_SECT:
ladanyi@201
   808
        break;
ladanyi@201
   809
      case MapStorage::SpecMapSaveOpts::NESET_SECT:
ladanyi@201
   810
        switch (getArrowCoordsSaveMapNum())
ladanyi@201
   811
        {
ladanyi@201
   812
          case MapStorage::SpecMapSaveOpts::ONE_MAP:
ladanyi@201
   813
            gwriter.writeEdgeMap(arrow_coords_one_map_name + ":x",
ladanyi@201
   814
                arrow_coords_x);
ladanyi@201
   815
            gwriter.writeEdgeMap(arrow_coords_one_map_name + ":y",
ladanyi@201
   816
                arrow_coords_y);
ladanyi@201
   817
            break;
ladanyi@201
   818
          case MapStorage::SpecMapSaveOpts::TWO_MAPS:
ladanyi@201
   819
            gwriter.writeEdgeMap(arrow_coords_two_maps_1_name,
ladanyi@201
   820
                arrow_coords_x);
ladanyi@201
   821
            gwriter.writeEdgeMap(arrow_coords_two_maps_2_name,
ladanyi@201
   822
                arrow_coords_y);
ladanyi@201
   823
            break;
ladanyi@201
   824
        }
ladanyi@201
   825
        break;
ladanyi@201
   826
    }
ladanyi@201
   827
ladanyi@201
   828
    if (gui_sect_save_dest == LGF_FILE)
ladanyi@201
   829
    {
ladanyi@201
   830
      GuiWriter gui_writer(gwriter, this);
ladanyi@201
   831
      gwriter.run();
ladanyi@201
   832
    }
ladanyi@201
   833
    else
ladanyi@201
   834
    {
ladanyi@201
   835
      gwriter.run();
ladanyi@98
   836
    }
ladanyi@53
   837
  }
ladanyi@98
   838
ladanyi@201
   839
  // write .conf file
ladanyi@201
   840
  if (gui_sect_save_dest == CONF_FILE)
ladanyi@201
   841
  {
ladanyi@201
   842
    LemonWriter lwriter(filename + ".conf");
ladanyi@201
   843
    GuiWriter gui_writer(lwriter, this);
ladanyi@201
   844
    lwriter.run();
ladanyi@201
   845
  }
ladanyi@53
   846
}
ladanyi@53
   847
ladanyi@53
   848
void MapStorage::clear()
ladanyi@53
   849
{
ladanyi@201
   850
  for (NodeMapStore::iterator it = nodemaps.begin(); it != nodemaps.end(); ++it)
ladanyi@53
   851
  {
ladanyi@201
   852
    delete it->second;
ladanyi@201
   853
    nodemaps.erase(it);
ladanyi@53
   854
  }
ladanyi@201
   855
  for (EdgeMapStore::iterator it = edgemaps.begin(); it != edgemaps.end(); ++it)
ladanyi@53
   856
  {
ladanyi@201
   857
    delete it->second;
ladanyi@201
   858
    edgemaps.erase(it);
ladanyi@63
   859
  }
ladanyi@53
   860
  graph.clear();
ladanyi@53
   861
  file_name = "";
ladanyi@53
   862
  modified = false;
ladanyi@201
   863
  max_node_label = 0;
ladanyi@201
   864
  max_edge_label = 0;
ladanyi@201
   865
  background_set = false;
hegyi@172
   866
ladanyi@201
   867
  gui_sect_save_dest = LGF_FILE;
ladanyi@201
   868
  node_coords_save_dest = SpecMapSaveOpts::GUI_SECT;
ladanyi@201
   869
  arrow_coords_save_dest = SpecMapSaveOpts::GUI_SECT;
ladanyi@201
   870
  node_coords_one_map_name = "coord";
ladanyi@201
   871
  node_coords_two_maps_1_name = "coord_x";
ladanyi@201
   872
  node_coords_two_maps_2_name = "coord_y";
ladanyi@201
   873
  arrow_coords_one_map_name = "arrow";
ladanyi@201
   874
  arrow_coords_two_maps_1_name = "arrow_x";
ladanyi@201
   875
  arrow_coords_two_maps_2_name = "arrow_y";
ladanyi@201
   876
hegyi@172
   877
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@172
   878
    {
hegyi@172
   879
      changeActiveMap(false, i, "");
hegyi@172
   880
      signal_map_win.emit(false, i, "");
hegyi@172
   881
    }
hegyi@172
   882
  
hegyi@172
   883
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@172
   884
    {
hegyi@172
   885
      changeActiveMap(true, i, "");
hegyi@172
   886
      signal_map_win.emit(true, i, "");
hegyi@172
   887
    }
hegyi@177
   888
hegyi@177
   889
  attraction=a_d;
hegyi@177
   890
  propulsation=p_d;
hegyi@177
   891
  iterations=i_d;
hegyi@177
   892
hegyi@177
   893
  signal_design_win.emit(attraction, propulsation, iterations);
ladanyi@53
   894
}
ladanyi@98
   895
hegyi@111
   896
void MapStorage::mapChanged(bool itisedge, std::string mapname)
hegyi@111
   897
{
hegyi@111
   898
  if(itisedge)
ladanyi@201
   899
  {
ladanyi@201
   900
    for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@111
   901
    {
ladanyi@201
   902
      if(active_edgemaps[i]==mapname)
ladanyi@201
   903
      {
ladanyi@201
   904
        signal_prop.emit(itisedge, i);
ladanyi@201
   905
      }
hegyi@111
   906
    }
ladanyi@201
   907
  }
hegyi@111
   908
  else
ladanyi@201
   909
  {
ladanyi@201
   910
    for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@111
   911
    {
ladanyi@201
   912
      if(active_nodemaps[i]==mapname)
ladanyi@201
   913
      {
ladanyi@201
   914
        signal_prop.emit(itisedge, i);
ladanyi@201
   915
      }
hegyi@111
   916
    }
ladanyi@201
   917
  }
hegyi@111
   918
}
hegyi@177
   919
hegyi@177
   920
void MapStorage::get_design_data(double & attraction_p, double & propulsation_p, int & iterations_p)
hegyi@177
   921
{
hegyi@177
   922
  attraction_p=attraction;
hegyi@177
   923
  propulsation_p=propulsation;
hegyi@177
   924
  iterations_p=iterations;
hegyi@177
   925
}
hegyi@177
   926
hegyi@177
   927
void MapStorage::set_attraction(double attraction_p)
hegyi@177
   928
{
hegyi@177
   929
  attraction=attraction_p;
hegyi@177
   930
}
hegyi@177
   931
hegyi@177
   932
void MapStorage::set_propulsation(double propulsation_p)
hegyi@177
   933
{
hegyi@177
   934
  propulsation=propulsation_p;
hegyi@177
   935
}
hegyi@177
   936
hegyi@177
   937
void MapStorage::set_iteration(int iterations_p)
hegyi@177
   938
{
hegyi@177
   939
  iterations=iterations_p;
hegyi@177
   940
}
hegyi@177
   941
hegyi@177
   942
void MapStorage::redesign_data_changed()
hegyi@177
   943
{
hegyi@177
   944
  signal_design_win.emit(attraction, propulsation, iterations);
hegyi@177
   945
}
ladanyi@184
   946
ladanyi@201
   947
XY MapStorage::getNodeCoords(Node n) const
ladanyi@201
   948
{
ladanyi@201
   949
  return node_coords[n];
ladanyi@201
   950
}
ladanyi@201
   951
ladanyi@201
   952
void MapStorage::setNodeCoords(Node n, XY c)
ladanyi@201
   953
{
ladanyi@201
   954
  node_coords.set(n, c);
ladanyi@201
   955
}
ladanyi@201
   956
ladanyi@201
   957
XY MapStorage::getArrowCoords(Edge e) const
ladanyi@201
   958
{
ladanyi@201
   959
  return arrow_coords[e];
ladanyi@201
   960
}
ladanyi@201
   961
ladanyi@201
   962
void MapStorage::setArrowCoords(Edge e, XY c)
ladanyi@201
   963
{
ladanyi@201
   964
  arrow_coords.set(e, c);
ladanyi@201
   965
}
ladanyi@201
   966
ladanyi@201
   967
MapValue MapStorage::get(const std::string& name, Node node) const
ladanyi@201
   968
{
ladanyi@201
   969
  NodeMapData* data = getNodeMapData(name);
ladanyi@201
   970
  return data->get(node);
ladanyi@201
   971
}
ladanyi@201
   972
ladanyi@201
   973
void MapStorage::set(const std::string& name, Node node, MapValue val)
ladanyi@201
   974
{
ladanyi@201
   975
  NodeMapData* data = getNodeMapData(name);
ladanyi@201
   976
  data->set(node, val);
ladanyi@201
   977
}
ladanyi@201
   978
ladanyi@201
   979
MapValue MapStorage::get(const std::string& name, Edge edge) const
ladanyi@201
   980
{
ladanyi@201
   981
  EdgeMapData* data = getEdgeMapData(name);
ladanyi@201
   982
  return data->get(edge);
ladanyi@201
   983
}
ladanyi@201
   984
ladanyi@201
   985
void MapStorage::set(const std::string& name, Edge edge, MapValue val)
ladanyi@201
   986
{
ladanyi@201
   987
  EdgeMapData* data = getEdgeMapData(name);
ladanyi@201
   988
  data->set(edge, val);
ladanyi@201
   989
}
ladanyi@201
   990
ladanyi@201
   991
const std::string& MapStorage::getFileName() const
ladanyi@201
   992
{
ladanyi@201
   993
  return file_name;
ladanyi@201
   994
}
ladanyi@201
   995
ladanyi@201
   996
void MapStorage::setFileName(const std::string& fn)
ladanyi@201
   997
{
ladanyi@201
   998
  file_name = fn;
ladanyi@201
   999
}
ladanyi@201
  1000
ladanyi@201
  1001
bool MapStorage::getModified() const
ladanyi@201
  1002
{
ladanyi@201
  1003
  return modified;
ladanyi@201
  1004
}
ladanyi@201
  1005
ladanyi@201
  1006
void MapStorage::setModified(bool m)
ladanyi@201
  1007
{
ladanyi@201
  1008
  modified = m;
ladanyi@201
  1009
}
ladanyi@201
  1010
ladanyi@201
  1011
Node MapStorage::addNode(XY coords)
ladanyi@201
  1012
{
ladanyi@201
  1013
  Node node = graph.addNode();
ladanyi@201
  1014
ladanyi@201
  1015
  setNodeCoords(node, coords);
ladanyi@201
  1016
ladanyi@201
  1017
  max_node_label++;
ladanyi@201
  1018
ladanyi@201
  1019
  node_label[node] = max_node_label;
ladanyi@201
  1020
ladanyi@201
  1021
  std::vector<std::string> node_maps = getNodeMapList();
ladanyi@201
  1022
  for (std::vector<std::string>::const_iterator it = node_maps.begin();
ladanyi@201
  1023
      it != node_maps.end(); ++it)
ladanyi@201
  1024
  {
ladanyi@201
  1025
    NodeMapData* data = getNodeMapData(*it);
ladanyi@201
  1026
    set(*it, node, data->default_value);
ladanyi@201
  1027
  }
ladanyi@201
  1028
ladanyi@201
  1029
  return node;
ladanyi@201
  1030
}
ladanyi@201
  1031
ladanyi@201
  1032
Edge MapStorage::addEdge(Node from, Node to)
ladanyi@201
  1033
{
ladanyi@201
  1034
  Edge edge = graph.addEdge(from, to);
ladanyi@201
  1035
ladanyi@201
  1036
  if (from == to)
ladanyi@201
  1037
  {
ladanyi@201
  1038
    setArrowCoords(edge, getNodeCoords(from) + XY(0.0, 80.0));
ladanyi@201
  1039
  }
ladanyi@201
  1040
  else
ladanyi@201
  1041
  {
ladanyi@201
  1042
    setArrowCoords(edge, (getNodeCoords(from) + getNodeCoords(to)) / 2.0);
ladanyi@201
  1043
  }
ladanyi@201
  1044
ladanyi@201
  1045
  max_edge_label++;
ladanyi@201
  1046
ladanyi@201
  1047
  edge_label[edge] = max_edge_label;
ladanyi@201
  1048
ladanyi@201
  1049
  std::vector<std::string> edge_maps = getEdgeMapList();
ladanyi@201
  1050
  for (std::vector<std::string>::const_iterator it = edge_maps.begin();
ladanyi@201
  1051
      it != edge_maps.end(); ++it)
ladanyi@201
  1052
  {
ladanyi@201
  1053
    EdgeMapData* data = getEdgeMapData(*it);
ladanyi@201
  1054
    set(*it, edge, data->default_value);
ladanyi@201
  1055
  }
ladanyi@201
  1056
  return edge;
ladanyi@201
  1057
}
ladanyi@201
  1058
ladanyi@201
  1059
MapStorage::NumericNodeMap& MapStorage::getNumericNodeMap(const std::string& name)
ladanyi@201
  1060
{
ladanyi@201
  1061
  NodeMapData* data = getNodeMapData(name);
ladanyi@201
  1062
  if (data->type() != MapValue::NUMERIC)
ladanyi@201
  1063
    throw Error("Numeric node map " + name + " does not exists.");
ladanyi@201
  1064
  return static_cast<NumericNodeMapData*>(data)->map;
ladanyi@201
  1065
}
ladanyi@201
  1066
ladanyi@201
  1067
MapStorage::StringNodeMap& MapStorage::getStringNodeMap(const std::string& name)
ladanyi@201
  1068
{
ladanyi@201
  1069
  NodeMapData* data = getNodeMapData(name);
ladanyi@201
  1070
  if (data->type() != MapValue::STRING)
ladanyi@201
  1071
    throw Error("String node map " + name + " does not exists.");
ladanyi@201
  1072
  return static_cast<StringNodeMapData*>(data)->map;
ladanyi@201
  1073
}
ladanyi@201
  1074
ladanyi@201
  1075
MapStorage::NumericEdgeMap& MapStorage::getNumericEdgeMap(const std::string& name)
ladanyi@201
  1076
{
ladanyi@201
  1077
  EdgeMapData* data = getEdgeMapData(name);
ladanyi@201
  1078
  if (data->type() != MapValue::NUMERIC)
ladanyi@201
  1079
    throw Error("Numeric edge map " + name + " does not exists.");
ladanyi@201
  1080
  return static_cast<NumericEdgeMapData*>(data)->map;
ladanyi@201
  1081
}
ladanyi@201
  1082
ladanyi@201
  1083
MapStorage::StringEdgeMap& MapStorage::getStringEdgeMap(const std::string& name)
ladanyi@201
  1084
{
ladanyi@201
  1085
  EdgeMapData* data = getEdgeMapData(name);
ladanyi@201
  1086
  if (data->type() != MapValue::STRING)
ladanyi@201
  1087
    throw Error("String edge map " + name + " does not exists.");
ladanyi@201
  1088
  return static_cast<StringEdgeMapData*>(data)->map;
ladanyi@201
  1089
}
ladanyi@201
  1090
ladanyi@201
  1091
MapValueEdgeMap MapStorage::getEdgeMap(const std::string& name)
ladanyi@201
  1092
{
ladanyi@201
  1093
  return MapValueEdgeMap(name, this);
ladanyi@201
  1094
}
ladanyi@201
  1095
ladanyi@201
  1096
MapValueNodeMap MapStorage::getNodeMap(const std::string& name)
ladanyi@201
  1097
{
ladanyi@201
  1098
  return MapValueNodeMap(name, this);
ladanyi@201
  1099
}
ladanyi@201
  1100
ladanyi@201
  1101
int MapStorage::getLabel(Node n) const
ladanyi@201
  1102
{
ladanyi@201
  1103
  return node_label[n];
ladanyi@201
  1104
}
ladanyi@201
  1105
ladanyi@201
  1106
int MapStorage::getLabel(Edge e) const
ladanyi@201
  1107
{
ladanyi@201
  1108
  return edge_label[e];
ladanyi@201
  1109
}
ladanyi@201
  1110
ladanyi@201
  1111
MapStorage::GuiSectSaveDest MapStorage::getGUIDataSaveLocation()
ladanyi@201
  1112
{
ladanyi@201
  1113
  return gui_sect_save_dest;
ladanyi@201
  1114
}
ladanyi@201
  1115
ladanyi@201
  1116
void MapStorage::setGUIDataSaveLocation(MapStorage::GuiSectSaveDest dest)
ladanyi@201
  1117
{
ladanyi@201
  1118
  gui_sect_save_dest = dest;
ladanyi@201
  1119
}
ladanyi@201
  1120
ladanyi@201
  1121
MapStorage::MapSaveDest MapStorage::getNodeMapSaveDest(std::string name) const
ladanyi@201
  1122
{
ladanyi@201
  1123
  NodeMapData *data = getNodeMapData(name);
ladanyi@201
  1124
  return data->save_dest;
ladanyi@201
  1125
}
ladanyi@201
  1126
ladanyi@201
  1127
MapStorage::MapSaveDest MapStorage::getEdgeMapSaveDest(std::string name) const
ladanyi@201
  1128
{
ladanyi@201
  1129
  EdgeMapData *data = getEdgeMapData(name);
ladanyi@201
  1130
  return data->save_dest;
ladanyi@201
  1131
}
ladanyi@201
  1132
ladanyi@201
  1133
void MapStorage::setNodeMapSaveDest(std::string name, MapStorage::MapSaveDest dest)
ladanyi@201
  1134
{
ladanyi@201
  1135
  NodeMapData *data = getNodeMapData(name);
ladanyi@201
  1136
  data->save_dest = dest;
ladanyi@201
  1137
}
ladanyi@201
  1138
ladanyi@201
  1139
void MapStorage::setEdgeMapSaveDest(std::string name, MapStorage::MapSaveDest dest)
ladanyi@201
  1140
{
ladanyi@201
  1141
  EdgeMapData *data = getEdgeMapData(name);
ladanyi@201
  1142
  data->save_dest = dest;
ladanyi@201
  1143
}
ladanyi@201
  1144
ladanyi@201
  1145
MapStorage::EdgeMapData* MapStorage::getEdgeMapData(std::string name) const
ladanyi@201
  1146
{
ladanyi@201
  1147
  EdgeMapStore::const_iterator it = edgemaps.find(name);
ladanyi@201
  1148
  if (it != edgemaps.end())
ladanyi@201
  1149
    return it->second;
ladanyi@201
  1150
  else
ladanyi@201
  1151
    throw Error("Edge map " + name + " does not exists.");
ladanyi@201
  1152
}
ladanyi@201
  1153
ladanyi@201
  1154
MapStorage::NodeMapData* MapStorage::getNodeMapData(std::string name) const
ladanyi@201
  1155
{
ladanyi@201
  1156
  NodeMapStore::const_iterator it = nodemaps.find(name);
ladanyi@201
  1157
  if (it != nodemaps.end())
ladanyi@201
  1158
    return it->second;
ladanyi@201
  1159
  else
ladanyi@201
  1160
    throw Error("Node map " + name + " does not exists.");
ladanyi@201
  1161
}
ladanyi@201
  1162
ladanyi@201
  1163
MapValue::Type MapStorage::getNodeMapElementType(std::string name) const
ladanyi@201
  1164
{
ladanyi@201
  1165
  NodeMapData *data = getNodeMapData(name);
ladanyi@201
  1166
  return data->type();
ladanyi@201
  1167
}
ladanyi@201
  1168
ladanyi@201
  1169
MapValue::Type MapStorage::getEdgeMapElementType(std::string name) const
ladanyi@201
  1170
{
ladanyi@201
  1171
  EdgeMapData *data = getEdgeMapData(name);
ladanyi@201
  1172
  return data->type();
ladanyi@201
  1173
}
ladanyi@201
  1174
ladanyi@201
  1175
const MapStorage::NodeLabelMap& MapStorage::getNodeLabelMap()
ladanyi@201
  1176
{
ladanyi@201
  1177
  return node_label;
ladanyi@201
  1178
}
ladanyi@201
  1179
ladanyi@201
  1180
const MapStorage::EdgeLabelMap& MapStorage::getEdgeLabelMap()
ladanyi@201
  1181
{
ladanyi@201
  1182
  return edge_label;
ladanyi@201
  1183
}
ladanyi@201
  1184
ladanyi@201
  1185
const Graph& MapStorage::getGraph()
ladanyi@201
  1186
{
ladanyi@201
  1187
  return graph;
ladanyi@201
  1188
}
ladanyi@201
  1189
ladanyi@201
  1190
bool MapStorage::nodeMapExists(std::string name)
ladanyi@201
  1191
{
ladanyi@201
  1192
  NodeMapStore::const_iterator it = nodemaps.find(name);
ladanyi@201
  1193
  if (it == nodemaps.end())
ladanyi@201
  1194
    return false;
ladanyi@201
  1195
  else
ladanyi@201
  1196
    return true;
ladanyi@201
  1197
}
ladanyi@201
  1198
ladanyi@201
  1199
bool MapStorage::edgeMapExists(std::string name)
ladanyi@201
  1200
{
ladanyi@201
  1201
  EdgeMapStore::const_iterator it = edgemaps.find(name);
ladanyi@201
  1202
  if (it == edgemaps.end())
ladanyi@201
  1203
    return false;
ladanyi@201
  1204
  else
ladanyi@201
  1205
    return true;
ladanyi@201
  1206
}
ladanyi@201
  1207
ladanyi@201
  1208
std::vector<std::string> MapStorage::getEdgeMaps(MapType type)
ladanyi@201
  1209
{
ladanyi@201
  1210
  std::vector<std::string> maps;
ladanyi@201
  1211
  for (EdgeMapStore::const_iterator it = edgemaps.begin(); it != edgemaps.end(); ++it)
ladanyi@201
  1212
  {
ladanyi@201
  1213
    if (it->second->type() & type)
ladanyi@201
  1214
    {
ladanyi@201
  1215
      maps.push_back(it->first);
ladanyi@201
  1216
    }
ladanyi@201
  1217
  }
ladanyi@201
  1218
  return maps;
ladanyi@201
  1219
}
ladanyi@201
  1220
ladanyi@201
  1221
std::vector<std::string> MapStorage::getNodeMaps(MapType type)
ladanyi@201
  1222
{
ladanyi@201
  1223
  std::vector<std::string> maps;
ladanyi@201
  1224
  for (NodeMapStore::const_iterator it = nodemaps.begin(); it != nodemaps.end(); ++it)
ladanyi@201
  1225
  {
ladanyi@201
  1226
    if (it->second->type() & type)
ladanyi@201
  1227
    {
ladanyi@201
  1228
      maps.push_back(it->first);
ladanyi@201
  1229
    }
ladanyi@201
  1230
  }
ladanyi@201
  1231
  return maps;
ladanyi@201
  1232
}
ladanyi@201
  1233
ladanyi@201
  1234
MapStorage::NodeCoordMap& MapStorage::getNodeCoordMap()
ladanyi@201
  1235
{
ladanyi@201
  1236
  return node_coords;
ladanyi@201
  1237
}
ladanyi@201
  1238
ladanyi@201
  1239
MapStorage::ArrowCoordMap& MapStorage::getArrowCoordMap()
ladanyi@201
  1240
{
ladanyi@201
  1241
  return arrow_coords;
ladanyi@201
  1242
}
ladanyi@201
  1243
ladanyi@201
  1244
MapStorage::SpecMapSaveOpts::Dest MapStorage::getNodeCoordsSaveDest()
ladanyi@201
  1245
{
ladanyi@201
  1246
  return node_coords_save_dest;
ladanyi@201
  1247
}
ladanyi@201
  1248
ladanyi@201
  1249
MapStorage::SpecMapSaveOpts::Dest MapStorage::getArrowCoordsSaveDest()
ladanyi@201
  1250
{
ladanyi@201
  1251
  return arrow_coords_save_dest;
ladanyi@201
  1252
}
ladanyi@201
  1253
ladanyi@201
  1254
void MapStorage::setNodeCoordsSaveDest(MapStorage::SpecMapSaveOpts::Dest dest)
ladanyi@201
  1255
{
ladanyi@201
  1256
  node_coords_save_dest = dest;
ladanyi@201
  1257
}
ladanyi@201
  1258
ladanyi@201
  1259
void MapStorage::setArrowCoordsSaveDest(MapStorage::SpecMapSaveOpts::Dest dest)
ladanyi@201
  1260
{
ladanyi@201
  1261
  arrow_coords_save_dest = dest;
ladanyi@201
  1262
}
ladanyi@201
  1263
ladanyi@201
  1264
MapStorage::SpecMapSaveOpts::MapNum MapStorage::getNodeCoordsSaveMapNum()
ladanyi@201
  1265
{
ladanyi@201
  1266
  return node_coords_save_map_num;
ladanyi@201
  1267
}
ladanyi@201
  1268
ladanyi@201
  1269
MapStorage::SpecMapSaveOpts::MapNum MapStorage::getArrowCoordsSaveMapNum()
ladanyi@201
  1270
{
ladanyi@201
  1271
  return arrow_coords_save_map_num;
ladanyi@201
  1272
}
ladanyi@201
  1273
ladanyi@201
  1274
void MapStorage::setNodeCoordsSaveMapNum(MapStorage::SpecMapSaveOpts::MapNum num)
ladanyi@201
  1275
{
ladanyi@201
  1276
  node_coords_save_map_num = num;
ladanyi@201
  1277
}
ladanyi@201
  1278
ladanyi@201
  1279
void MapStorage::setArrowCoordsSaveMapNum(MapStorage::SpecMapSaveOpts::MapNum num)
ladanyi@201
  1280
{
ladanyi@201
  1281
  arrow_coords_save_map_num = num;
ladanyi@201
  1282
}
ladanyi@201
  1283
ladanyi@201
  1284
const std::string& MapStorage::getNodeCoordsOneMapName()
ladanyi@201
  1285
{
ladanyi@201
  1286
  return node_coords_one_map_name;
ladanyi@201
  1287
}
ladanyi@201
  1288
const std::string& MapStorage::getNodeCoordsTwoMaps1Name()
ladanyi@201
  1289
{
ladanyi@201
  1290
  return node_coords_two_maps_1_name;
ladanyi@201
  1291
}
ladanyi@201
  1292
const std::string& MapStorage::getNodeCoordsTwoMaps2Name()
ladanyi@201
  1293
{
ladanyi@201
  1294
  return node_coords_two_maps_2_name;
ladanyi@201
  1295
}
ladanyi@201
  1296
ladanyi@201
  1297
void MapStorage::setNodeCoordsOneMapName(const std::string& name)
ladanyi@201
  1298
{
ladanyi@201
  1299
  node_coords_one_map_name = name;
ladanyi@201
  1300
}
ladanyi@201
  1301
void MapStorage::setNodeCoordsTwoMaps1Name(const std::string& name)
ladanyi@201
  1302
{
ladanyi@201
  1303
  node_coords_two_maps_1_name = name;
ladanyi@201
  1304
}
ladanyi@201
  1305
void MapStorage::setNodeCoordsTwoMaps2Name(const std::string& name)
ladanyi@201
  1306
{
ladanyi@201
  1307
  node_coords_two_maps_2_name = name;
ladanyi@201
  1308
}
ladanyi@201
  1309
ladanyi@201
  1310
const std::string& MapStorage::getArrowCoordsOneMapName()
ladanyi@201
  1311
{
ladanyi@201
  1312
  return arrow_coords_one_map_name;
ladanyi@201
  1313
}
ladanyi@201
  1314
const std::string& MapStorage::getArrowCoordsTwoMaps1Name()
ladanyi@201
  1315
{
ladanyi@201
  1316
  return arrow_coords_two_maps_1_name;
ladanyi@201
  1317
}
ladanyi@201
  1318
const std::string& MapStorage::getArrowCoordsTwoMaps2Name()
ladanyi@201
  1319
{
ladanyi@201
  1320
  return arrow_coords_two_maps_2_name;
ladanyi@201
  1321
}
ladanyi@201
  1322
ladanyi@201
  1323
void MapStorage::setArrowCoordsOneMapName(const std::string& name)
ladanyi@201
  1324
{
ladanyi@201
  1325
  arrow_coords_one_map_name = name;
ladanyi@201
  1326
}
ladanyi@201
  1327
void MapStorage::setArrowCoordsTwoMaps1Name(const std::string& name)
ladanyi@201
  1328
{
ladanyi@201
  1329
  arrow_coords_two_maps_1_name = name;
ladanyi@201
  1330
}
ladanyi@201
  1331
void MapStorage::setArrowCoordsTwoMaps2Name(const std::string& name)
ladanyi@201
  1332
{
ladanyi@201
  1333
  arrow_coords_two_maps_2_name = name;
ladanyi@201
  1334
}
ladanyi@201
  1335
ladanyi@201
  1336
void MapStorage::readLGF(
ladanyi@201
  1337
    const std::string& filename,
ladanyi@201
  1338
    bool read_edge_label,
ladanyi@201
  1339
    const std::vector<std::string>& node_map_names,
ladanyi@201
  1340
    const std::vector<std::string>& edge_map_names,
ladanyi@201
  1341
    const std::map<std::string, MapValue::Type>& node_map_types,
ladanyi@201
  1342
    const std::map<std::string, MapValue::Type>& edge_map_types,
ladanyi@201
  1343
    const std::string& node_coord_xmap_name,
ladanyi@201
  1344
    const std::string& node_coord_ymap_name,
ladanyi@201
  1345
    const std::string& arrow_coord_xmap_name,
ladanyi@201
  1346
    const std::string& arrow_coord_ymap_name)
ladanyi@201
  1347
{
ladanyi@201
  1348
  using std::vector;
ladanyi@201
  1349
  using std::map;
ladanyi@201
  1350
  using std::string;
ladanyi@201
  1351
ladanyi@201
  1352
  GraphReader<Graph> greader(filename, graph);
ladanyi@201
  1353
ladanyi@201
  1354
  // read the label maps
ladanyi@201
  1355
  greader.readNodeMap("label", node_label);
ladanyi@201
  1356
  if (read_edge_label)
ladanyi@201
  1357
    greader.readEdgeMap("label", edge_label);
ladanyi@201
  1358
ladanyi@201
  1359
  // read the node maps
ladanyi@201
  1360
  for (vector<string>::const_iterator
ladanyi@201
  1361
      it = node_map_names.begin();
ladanyi@201
  1362
      it != node_map_names.end(); ++it)
ladanyi@201
  1363
  {
ladanyi@201
  1364
    switch (node_map_types.find(*it)->second)
ladanyi@201
  1365
    {
ladanyi@201
  1366
      case MapValue::NUMERIC:
ladanyi@201
  1367
        {
ladanyi@201
  1368
          createNodeMap(*it, MapValue::NUMERIC, double());
ladanyi@201
  1369
          greader.readNodeMap(*it, getNumericNodeMap(*it));
ladanyi@201
  1370
          break;
ladanyi@201
  1371
        }
ladanyi@201
  1372
      case MapValue::STRING:
ladanyi@201
  1373
        {
ladanyi@201
  1374
          createNodeMap(*it, MapValue::STRING, string());
ladanyi@201
  1375
          greader.readNodeMap(*it, getStringNodeMap(*it));
ladanyi@201
  1376
          break;
ladanyi@201
  1377
        }
ladanyi@201
  1378
    }
ladanyi@201
  1379
    getNodeMapData(*it)->save_dest = NESET_SECT;
ladanyi@201
  1380
  }
ladanyi@201
  1381
ladanyi@201
  1382
  // read the edge maps
ladanyi@201
  1383
  for (vector<string>::const_iterator
ladanyi@201
  1384
      it = edge_map_names.begin();
ladanyi@201
  1385
      it != edge_map_names.end(); ++it)
ladanyi@201
  1386
  {
ladanyi@201
  1387
    switch (edge_map_types.find(*it)->second)
ladanyi@201
  1388
    {
ladanyi@201
  1389
      case MapValue::NUMERIC:
ladanyi@201
  1390
        {
ladanyi@201
  1391
          createEdgeMap(*it, MapValue::NUMERIC, double());
ladanyi@201
  1392
          greader.readEdgeMap(*it, getNumericEdgeMap(*it));
ladanyi@201
  1393
          break;
ladanyi@201
  1394
        }
ladanyi@201
  1395
      case MapValue::STRING:
ladanyi@201
  1396
        {
ladanyi@201
  1397
          createEdgeMap(*it, MapValue::STRING, string());
ladanyi@201
  1398
          greader.readEdgeMap(*it, getStringEdgeMap(*it));
ladanyi@201
  1399
          break;
ladanyi@201
  1400
        }
ladanyi@201
  1401
    }
ladanyi@201
  1402
    getEdgeMapData(*it)->save_dest = NESET_SECT;
ladanyi@201
  1403
  }
ladanyi@201
  1404
ladanyi@201
  1405
  // read the node coordinate maps
ladanyi@201
  1406
  if (node_coord_xmap_name != "")
ladanyi@201
  1407
    greader.readNodeMap(node_coord_xmap_name, node_coords_x);
ladanyi@201
  1408
  if (node_coord_ymap_name != "")
ladanyi@201
  1409
    greader.readNodeMap(node_coord_ymap_name, node_coords_y);
ladanyi@201
  1410
ladanyi@201
  1411
  // read the arrow coordinate maps
ladanyi@201
  1412
  if (arrow_coord_xmap_name != "")
ladanyi@201
  1413
    greader.readEdgeMap(arrow_coord_xmap_name, arrow_coords_x);
ladanyi@201
  1414
  if (arrow_coord_ymap_name != "")
ladanyi@201
  1415
    greader.readEdgeMap(arrow_coord_ymap_name, arrow_coords_y);
ladanyi@201
  1416
ladanyi@201
  1417
  greader.run();
ladanyi@201
  1418
}
ladanyi@201
  1419
ladanyi@184
  1420
void MapStorage::setBackground(const std::string& file_name)
ladanyi@184
  1421
{
ladanyi@184
  1422
  if (file_name == background_file_name) return;
ladanyi@184
  1423
  if (file_name == "")
ladanyi@184
  1424
  {
ladanyi@184
  1425
    background_file_name = "";
ladanyi@184
  1426
    background_set = false;
ladanyi@184
  1427
  }
ladanyi@184
  1428
  else
ladanyi@184
  1429
  {
ladanyi@184
  1430
    background_file_name = file_name;
ladanyi@184
  1431
    background_set = true;
ladanyi@184
  1432
  }
hegyi@195
  1433
  signal_background.emit();
ladanyi@184
  1434
}
ladanyi@184
  1435
ladanyi@184
  1436
const std::string& MapStorage::getBackgroundFilename()
ladanyi@184
  1437
{
ladanyi@184
  1438
  return background_file_name;
ladanyi@184
  1439
}
ladanyi@184
  1440
ladanyi@184
  1441
bool MapStorage::isBackgroundSet()
ladanyi@184
  1442
{
ladanyi@184
  1443
  return background_set;
ladanyi@184
  1444
}
ladanyi@184
  1445
ladanyi@184
  1446
double MapStorage::getBackgroundScaling()
ladanyi@184
  1447
{
ladanyi@184
  1448
  return background_scaling;
ladanyi@184
  1449
}
ladanyi@184
  1450
ladanyi@184
  1451
void MapStorage::setBackgroundScaling(double scaling)
ladanyi@184
  1452
{
ladanyi@184
  1453
  background_scaling = scaling;
ladanyi@184
  1454
}
hegyi@191
  1455
hegyi@198
  1456
void MapStorage::exportGraphToEPS(std::vector<bool> options, std::string filename, std::string shapemap)
hegyi@191
  1457
{
hegyi@198
  1458
  Graph::NodeMap<int> _shapes(graph, 0);
hegyi@191
  1459
  Graph::NodeMap<int> _nodeColors(graph, 0);
hegyi@191
  1460
  Graph::EdgeMap<int> _edgeColors(graph, 0);
hegyi@191
  1461
  Graph::NodeMap<double> _nodeSizes(graph, 6.0);
hegyi@191
  1462
  Graph::EdgeMap<double> _edgeWidths(graph, 1.0);
hegyi@191
  1463
  bool _drawArrows=options[ARROWS];
hegyi@191
  1464
  bool _enableParallel=options[PAR];
hegyi@191
  1465
hegyi@191
  1466
  std::string emptyString="";
hegyi@191
  1467
  Graph::NodeMap<std::string> _nodeTextMap(graph,emptyString);
hegyi@191
  1468
hegyi@191
  1469
  //_nodeTextMap=(Graph::NodeMap<void> *)&emptyStringMap;
hegyi@191
  1470
hegyi@191
  1471
  if(options[N_MAPS])
hegyi@191
  1472
    {
hegyi@191
  1473
      if(active_nodemaps[N_RADIUS]!="")
hegyi@191
  1474
	{
ladanyi@201
  1475
	  _nodeSizes=getNumericNodeMap(active_nodemaps[N_RADIUS]);
hegyi@191
  1476
	}
hegyi@191
  1477
      if(active_nodemaps[N_COLOR]!="")
hegyi@191
  1478
	{
hegyi@191
  1479
	  for(NodeIt ni(graph);ni!=INVALID;++ni)
hegyi@191
  1480
	    {
ladanyi@201
  1481
	      _nodeColors[ni]=(int)get(active_nodemaps[N_COLOR], ni);
hegyi@191
  1482
	    }
hegyi@191
  1483
	}
hegyi@191
  1484
      if(active_nodemaps[N_TEXT]!="")
hegyi@191
  1485
	{
hegyi@191
  1486
	  for(NodeIt ni(graph);ni!=INVALID;++ni)
hegyi@191
  1487
	    {
hegyi@191
  1488
	      std::ostringstream o;
ladanyi@201
  1489
	      o << get(active_nodemaps[N_TEXT], ni);
hegyi@191
  1490
	      _nodeTextMap[ni]=o.str();	      
hegyi@191
  1491
	    }
hegyi@191
  1492
	}
hegyi@191
  1493
    }
hegyi@191
  1494
  if(options[E_MAPS])
hegyi@191
  1495
    {
hegyi@191
  1496
      if(active_edgemaps[E_WIDTH]!="")
hegyi@191
  1497
	{
ladanyi@201
  1498
	  _edgeWidths=getNumericEdgeMap(active_edgemaps[E_WIDTH]);
hegyi@191
  1499
	}
hegyi@191
  1500
      if(active_edgemaps[E_COLOR]!="")
hegyi@191
  1501
	{
hegyi@191
  1502
	  for(EdgeIt ei(graph);ei!=INVALID;++ei)
hegyi@191
  1503
	    {
ladanyi@201
  1504
	      _edgeColors[ei]=(int)get(active_edgemaps[E_COLOR], ei);
hegyi@191
  1505
	    }
hegyi@191
  1506
	}
hegyi@191
  1507
    }
hegyi@199
  1508
  if(shapemap!="Default values")
hegyi@198
  1509
    {
ladanyi@201
  1510
      double min = std::numeric_limits<double>::max();
ladanyi@201
  1511
      double max = std::numeric_limits<double>::min();
ladanyi@201
  1512
      for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
  1513
      {
ladanyi@201
  1514
        double v = static_cast<double>(get(shapemap, n));
ladanyi@201
  1515
        if (v < min) min = v;
ladanyi@201
  1516
        if (v > max) max = v;
ladanyi@201
  1517
      }
ladanyi@201
  1518
      if((min>=0)&&(max<=4))
hegyi@198
  1519
	{
ladanyi@201
  1520
          NumericNodeMap& map = static_cast<NumericNodeMapData*>(getNodeMapData(shapemap))->map;
ladanyi@201
  1521
          for (NodeIt n(graph); n != INVALID; ++n)
ladanyi@201
  1522
          {
ladanyi@201
  1523
            _shapes[n] = static_cast<int>(map[n]);
ladanyi@201
  1524
          }
hegyi@198
  1525
	}
hegyi@198
  1526
    }
hegyi@191
  1527
hegyi@191
  1528
  Palette palette;
hegyi@191
  1529
  Palette paletteW(true);
hegyi@191
  1530
hegyi@191
  1531
  graphToEps(graph,filename).
hegyi@191
  1532
    title("Sample .eps figure (fits to A4)").
hegyi@191
  1533
    copyright("(C) 2006 LEMON Project").
hegyi@191
  1534
    absoluteNodeSizes().absoluteEdgeWidths().
hegyi@191
  1535
    nodeScale(2).nodeSizes(_nodeSizes).
ladanyi@201
  1536
    coords(node_coords).
hegyi@198
  1537
    nodeShapes(_shapes).
hegyi@191
  1538
    nodeColors(composeMap(paletteW,_nodeColors)).
hegyi@191
  1539
    edgeColors(composeMap(palette,_edgeColors)).
hegyi@191
  1540
    edgeWidthScale(0.3).edgeWidths(_edgeWidths).
hegyi@191
  1541
    nodeTexts(_nodeTextMap).nodeTextSize(7).
hegyi@198
  1542
    enableParallel(_enableParallel).parEdgeDist(5).
hegyi@191
  1543
    drawArrows(_drawArrows).arrowWidth(7).arrowLength(7).
hegyi@191
  1544
    run();
hegyi@191
  1545
hegyi@191
  1546
}