graph_displayer_canvas-edge.cc
author ladanyi
Wed, 02 Jan 2008 21:03:09 +0000
changeset 201 879e47e5b731
parent 194 6b2b718420eb
permissions -rwxr-xr-x
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
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
hegyi@194
    19
#include <graph_displayer_canvas.h>
hegyi@194
    20
#include <mapstorage.h>
hegyi@194
    21
#include <nbtab.h>
alpar@59
    22
#include <cmath>
hegyi@27
    23
hegyi@167
    24
const int minimum_edge_width=0;
hegyi@27
    25
hegyi@81
    26
int GraphDisplayerCanvas::resetEdgeWidth (Edge edge)
hegyi@81
    27
{
ladanyi@201
    28
  MapStorage& ms = *mytab.mapstorage;
hegyi@81
    29
  double min, max;
hegyi@81
    30
hegyi@81
    31
  min=edge_property_defaults[E_WIDTH];
hegyi@81
    32
  max=edge_property_defaults[E_WIDTH];
ladanyi@201
    33
  Graph::EdgeMap<double> actual_map(ms.graph,edge_property_defaults[E_WIDTH]);
ladanyi@201
    34
hegyi@81
    35
  if(edge==INVALID)
ladanyi@201
    36
  {
ladanyi@201
    37
    for (EdgeIt i(ms.graph); i!=INVALID; ++i)
hegyi@81
    38
    {
ladanyi@201
    39
      double v=fabs(actual_map[i]);
ladanyi@201
    40
      int w;
ladanyi@201
    41
      if(min==max)
ladanyi@201
    42
      {
ladanyi@201
    43
        w=(int)(edge_property_defaults[E_WIDTH]);
ladanyi@201
    44
      }
ladanyi@201
    45
      else
ladanyi@201
    46
      {
ladanyi@201
    47
        w=(int)(MIN_EDGE_WIDTH+(v-min)/(max-min)*(MAX_EDGE_WIDTH-MIN_EDGE_WIDTH));
ladanyi@201
    48
      }
ladanyi@201
    49
      if(zoomtrack)
ladanyi@201
    50
      {
ladanyi@201
    51
        double actual_ppu=get_pixels_per_unit();
ladanyi@201
    52
        w=(int)(w/actual_ppu*fixed_zoom_factor);
ladanyi@201
    53
      }
ladanyi@201
    54
      edgesmap[i]->setLineWidth(w);
hegyi@81
    55
    }
ladanyi@201
    56
  }
hegyi@81
    57
  else
ladanyi@201
    58
  {
ladanyi@201
    59
    int w=(int)actual_map[edge];
ladanyi@201
    60
    if(w>=0)
hegyi@81
    61
    {
ladanyi@201
    62
      edgesmap[edge]->setLineWidth(w);
hegyi@81
    63
    }
ladanyi@201
    64
  }
hegyi@81
    65
  return 0;
hegyi@81
    66
}
hegyi@81
    67
hegyi@81
    68
alpar@62
    69
int GraphDisplayerCanvas::changeEdgeWidth (std::string mapname, Edge edge)
hegyi@27
    70
{
ladanyi@201
    71
  MapStorage& ms = *mytab.mapstorage;
hegyi@48
    72
  double min, max;
hegyi@48
    73
ladanyi@201
    74
  {
ladanyi@201
    75
    EdgeIt e(ms.graph);
ladanyi@201
    76
    min = max = ms.get(mapname, e);
ladanyi@201
    77
    for (; e != INVALID; ++e)
ladanyi@201
    78
    {
ladanyi@201
    79
      if (static_cast<double>(ms.get(mapname, e)) > max)
ladanyi@201
    80
        max = ms.get(mapname, e);
ladanyi@201
    81
      if (static_cast<double>(ms.get(mapname, e)) < min)
ladanyi@201
    82
        min = ms.get(mapname, e);
ladanyi@201
    83
    }
ladanyi@201
    84
  }
hegyi@31
    85
hegyi@28
    86
  if(edge==INVALID)
ladanyi@201
    87
  {
ladanyi@201
    88
    for (EdgeIt i(ms.graph); i!=INVALID; ++i)
hegyi@27
    89
    {
ladanyi@201
    90
      double v=ms.get(mapname, i);
ladanyi@201
    91
      int w;
ladanyi@201
    92
      if(autoscale)
ladanyi@201
    93
      {
ladanyi@201
    94
        if(min==max)
ladanyi@201
    95
        {
ladanyi@201
    96
          w=(int)(edge_property_defaults[E_WIDTH]);
ladanyi@201
    97
        }
ladanyi@201
    98
        else
ladanyi@201
    99
        {
ladanyi@201
   100
          w=(int)(minimum_edge_width+(v-min)/(max-min)*(edge_width-minimum_edge_width));
ladanyi@201
   101
        }
ladanyi@201
   102
      }
ladanyi@201
   103
      else
ladanyi@201
   104
      {
ladanyi@201
   105
        w=(int)(v*edge_width);
ladanyi@201
   106
      }
ladanyi@201
   107
      if(w<0)
ladanyi@201
   108
      {
ladanyi@201
   109
        edgesmap[i]->hide();
ladanyi@201
   110
      }
ladanyi@201
   111
      else
ladanyi@201
   112
      {
ladanyi@201
   113
        edgesmap[i]->show();
ladanyi@201
   114
        if(w<minimum_edge_width)
ladanyi@201
   115
        {
ladanyi@201
   116
          w=minimum_edge_width;
ladanyi@201
   117
        }
ladanyi@201
   118
        if(zoomtrack)
ladanyi@201
   119
        {
ladanyi@201
   120
          double actual_ppu=get_pixels_per_unit();
ladanyi@201
   121
          w=(int)(w/actual_ppu*fixed_zoom_factor);
ladanyi@201
   122
        }
ladanyi@201
   123
        edgesmap[i]->setLineWidth(w);
ladanyi@201
   124
      }
hegyi@28
   125
    }
ladanyi@201
   126
  }
hegyi@28
   127
  else
ladanyi@201
   128
  {
ladanyi@201
   129
    int w=(int)ms.get(mapname, edge);
ladanyi@201
   130
    if(w>=0)
hegyi@28
   131
    {
ladanyi@201
   132
      edgesmap[edge]->setLineWidth(w);
hegyi@27
   133
    }
ladanyi@201
   134
  }
hegyi@27
   135
  return 0;
hegyi@27
   136
};
hegyi@27
   137
alpar@62
   138
int GraphDisplayerCanvas::changeEdgeColor (std::string mapname, Edge edge)
hegyi@27
   139
{  
ladanyi@201
   140
  MapStorage& ms = *mytab.mapstorage;
hegyi@27
   141
hegyi@27
   142
  //function maps the range of the maximum and
hegyi@27
   143
  //the minimum of the nodemap to the range of
hegyi@27
   144
  //green in RGB
hegyi@81
   145
hegyi@81
   146
  double max, min;
hegyi@81
   147
ladanyi@201
   148
  {
ladanyi@201
   149
    EdgeIt e(ms.graph);
ladanyi@201
   150
    min = max = ms.get(mapname, e);
ladanyi@201
   151
    for (; e != INVALID; ++e)
ladanyi@201
   152
    {
ladanyi@201
   153
      if (static_cast<double>(ms.get(mapname, e)) > max)
ladanyi@201
   154
        max = ms.get(mapname, e);
ladanyi@201
   155
      if (static_cast<double>(ms.get(mapname, e)) < min)
ladanyi@201
   156
        min = ms.get(mapname, e);
ladanyi@201
   157
    }
ladanyi@201
   158
  }
hegyi@81
   159
hegyi@81
   160
  if(edge==INVALID)
hegyi@31
   161
    {
ladanyi@201
   162
      for (EdgeIt i(ms.graph); i!=INVALID; ++i)
hegyi@81
   163
	{
ladanyi@201
   164
	  double w=ms.get(mapname, i);
hegyi@81
   165
hegyi@81
   166
	  Gdk::Color color;
hegyi@81
   167
	  if(max!=min)
hegyi@81
   168
	    {
hegyi@179
   169
	      color=rainbowColorCounter(min, max, w);
hegyi@81
   170
	    }
hegyi@81
   171
	  else
hegyi@81
   172
	    {
hegyi@179
   173
	      color.set_rgb_p (0, 1, 0);
hegyi@81
   174
	    }
ladanyi@147
   175
	  edgesmap[i]->setFillColor(color);
hegyi@81
   176
	}
hegyi@31
   177
    }
hegyi@31
   178
  else
hegyi@31
   179
    {
hegyi@81
   180
      Gdk::Color color;
hegyi@81
   181
ladanyi@201
   182
      double w=ms.get(mapname, edge);
hegyi@81
   183
hegyi@81
   184
      if(max!=min)
hegyi@81
   185
	{
hegyi@179
   186
	  color=rainbowColorCounter(min, max, w);
hegyi@81
   187
	}
hegyi@81
   188
      else
hegyi@81
   189
	{
hegyi@179
   190
	  color.set_rgb_p (0, 1, 0);
hegyi@81
   191
	}
hegyi@81
   192
ladanyi@147
   193
      edgesmap[edge]->setFillColor(color);
hegyi@31
   194
    }
hegyi@81
   195
  return 0;
hegyi@81
   196
};
hegyi@81
   197
hegyi@81
   198
int GraphDisplayerCanvas::resetEdgeColor (Edge edge)
hegyi@81
   199
{  
ladanyi@201
   200
  MapStorage& ms = *mytab.mapstorage;
hegyi@81
   201
hegyi@81
   202
  //function maps the range of the maximum and
hegyi@81
   203
  //the minimum of the nodemap to the range of
hegyi@81
   204
  //green in RGB
ladanyi@201
   205
  Graph::EdgeMap<double> actual_map(ms.graph,edge_property_defaults[E_COLOR]);
hegyi@31
   206
hegyi@31
   207
  double max, min;
hegyi@31
   208
hegyi@81
   209
  max=edge_property_defaults[E_COLOR];
hegyi@81
   210
  min=edge_property_defaults[E_COLOR];
hegyi@31
   211
hegyi@28
   212
  if(edge==INVALID)
ladanyi@201
   213
  {
ladanyi@201
   214
    for (EdgeIt i(ms.graph); i!=INVALID; ++i)
hegyi@28
   215
    {
ladanyi@201
   216
      double w=actual_map[i];
hegyi@31
   217
ladanyi@201
   218
      Gdk::Color color;
ladanyi@201
   219
      if(max!=min)
ladanyi@201
   220
      {
ladanyi@201
   221
        color.set_rgb_p (0, 100*(w-min)/(max-min), 0);
ladanyi@201
   222
      }
ladanyi@201
   223
      else
ladanyi@201
   224
      {
ladanyi@201
   225
        color.set_rgb_p (0, 100, 0);
ladanyi@201
   226
      }
ladanyi@201
   227
      edgesmap[i]->setFillColor(color);
hegyi@28
   228
    }
ladanyi@201
   229
  }
hegyi@28
   230
  else
ladanyi@201
   231
  {
ladanyi@201
   232
    Gdk::Color color;
ladanyi@201
   233
ladanyi@201
   234
    double w=actual_map[edge];
ladanyi@201
   235
ladanyi@201
   236
    if(max!=min)
hegyi@27
   237
    {
ladanyi@201
   238
      color.set_rgb_p (0, 100*(w-min)/(max-min), 0);
ladanyi@201
   239
    }
ladanyi@201
   240
    else
ladanyi@201
   241
    {
ladanyi@201
   242
      color.set_rgb_p (0, 100, 0);
ladanyi@201
   243
    }
hegyi@31
   244
ladanyi@201
   245
    edgesmap[edge]->setFillColor(color);
ladanyi@201
   246
  }
hegyi@27
   247
  return 0;
hegyi@27
   248
};
hegyi@27
   249
alpar@62
   250
int GraphDisplayerCanvas::changeEdgeText (std::string mapname, Edge edge)
hegyi@27
   251
{
ladanyi@201
   252
  MapStorage& ms = *mytab.mapstorage;
ladanyi@201
   253
hegyi@27
   254
  //the number in the map will be written on the edge
hegyi@40
   255
  //EXCEPT when the name of the map is Default, because
hegyi@27
   256
  //in that case empty string will be written, because
hegyi@27
   257
  //that is the deleter map
ladanyi@201
   258
hegyi@28
   259
  if(edge==INVALID)
ladanyi@201
   260
  {
ladanyi@201
   261
    for (EdgeIt i(ms.graph); i!=INVALID; ++i)
hegyi@27
   262
    {
ladanyi@201
   263
      edgemap_to_edit=mapname;
hegyi@28
   264
ladanyi@201
   265
      edgetextmap[i]->property_text().set_value(
ladanyi@201
   266
          static_cast<std::string>(ms.get(mapname, i)));
hegyi@27
   267
    }
hegyi@28
   268
ladanyi@201
   269
  }
ladanyi@201
   270
  else
ladanyi@201
   271
  {
ladanyi@201
   272
    edgetextmap[edge]->property_text().set_value(
ladanyi@201
   273
        static_cast<std::string>(ms.get(mapname, edge)));
ladanyi@201
   274
  }
ladanyi@201
   275
hegyi@27
   276
  return 0;
hegyi@27
   277
};
hegyi@81
   278
hegyi@81
   279
int GraphDisplayerCanvas::resetEdgeText (Edge edge)
hegyi@81
   280
{
ladanyi@201
   281
  MapStorage& ms = *mytab.mapstorage;
ladanyi@201
   282
hegyi@81
   283
  //the number in the map will be written on the edge
hegyi@81
   284
  //EXCEPT when the name of the map is Default, because
hegyi@81
   285
  //in that case empty string will be written, because
hegyi@81
   286
  //that is the deleter map
ladanyi@201
   287
hegyi@81
   288
  if(edge==INVALID)
ladanyi@201
   289
  {
ladanyi@201
   290
    for (EdgeIt i(ms.graph); i!=INVALID; ++i)
hegyi@81
   291
    {
ladanyi@201
   292
      edgemap_to_edit="";
ladanyi@201
   293
      edgetextmap[i]->property_text().set_value("");
hegyi@81
   294
    }
ladanyi@201
   295
  }
hegyi@81
   296
  else
ladanyi@201
   297
  {
ladanyi@201
   298
    edgetextmap[edge]->property_text().set_value("");
ladanyi@201
   299
  }
hegyi@81
   300
hegyi@81
   301
  return 0;
hegyi@81
   302
};