gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Improvements related to graphToEps()
0 3 0
default
3 files changed with 98 insertions and 160 deletions:
↑ Collapse diff ↑
Ignore white space 24 line context
... ...
@@ -9,200 +9,199 @@
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
/// \ingroup demos
20 20
/// \file
21
/// \brief Demo of the graph grawing function \ref graphToEps()
21
/// \brief Demo of the graph drawing function \ref graphToEps()
22 22
///
23 23
/// This demo program shows examples how to  use the function \ref
24 24
/// graphToEps(). It takes no input but simply creates  six
25 25
/// <tt>.eps</tt> files demonstrating the capability of \ref
26
/// graphToEps(), and showing how to draw directed/graphs,
26
/// graphToEps(), and showing how to draw directed graphs,
27 27
/// how to handle parallel egdes, how to change the properties (like
28 28
/// color, shape, size, title etc.) of nodes and arcs individually
29 29
/// using appropriate \ref maps-page "graph maps".
30 30
///
31 31
/// \include graph_to_eps_demo.cc
32 32

	
33
#include <lemon/math.h>
34

	
35
#include<lemon/graph_to_eps.h>
36 33
#include<lemon/list_graph.h>
37 34
#include<lemon/graph_utils.h>
35
#include<lemon/graph_to_eps.h>
36
#include<lemon/math.h>
38 37

	
39 38
using namespace std;
40 39
using namespace lemon;
41 40

	
42 41
int main()
43 42
{
44 43
  Palette palette;
45 44
  Palette paletteW(true);
46 45

	
46
  // Create a small digraph
47 47
  ListDigraph g;
48 48
  typedef ListDigraph::Node Node;
49 49
  typedef ListDigraph::NodeIt NodeIt;
50 50
  typedef ListDigraph::Arc Arc;
51 51
  typedef dim2::Point<int> Point;
52 52
  
53 53
  Node n1=g.addNode();
54 54
  Node n2=g.addNode();
55 55
  Node n3=g.addNode();
56 56
  Node n4=g.addNode();
57 57
  Node n5=g.addNode();
58 58

	
59 59
  ListDigraph::NodeMap<Point> coords(g);
60 60
  ListDigraph::NodeMap<double> sizes(g);
61 61
  ListDigraph::NodeMap<int> colors(g);
62 62
  ListDigraph::NodeMap<int> shapes(g);
63
  ListDigraph::ArcMap<int> ecolors(g);
63
  ListDigraph::ArcMap<int> acolors(g);
64 64
  ListDigraph::ArcMap<int> widths(g);
65 65
  
66 66
  coords[n1]=Point(50,50);  sizes[n1]=1; colors[n1]=1; shapes[n1]=0;
67 67
  coords[n2]=Point(50,70);  sizes[n2]=2; colors[n2]=2; shapes[n2]=2;
68 68
  coords[n3]=Point(70,70);  sizes[n3]=1; colors[n3]=3; shapes[n3]=0;
69 69
  coords[n4]=Point(70,50);  sizes[n4]=2; colors[n4]=4; shapes[n4]=1;
70 70
  coords[n5]=Point(85,60);  sizes[n5]=3; colors[n5]=5; shapes[n5]=2;
71 71
  
72
  Arc e;
72
  Arc a;
73 73

	
74
  e=g.addArc(n1,n2); ecolors[e]=0; widths[e]=1;
75
  e=g.addArc(n2,n3); ecolors[e]=0; widths[e]=1;
76
  e=g.addArc(n3,n5); ecolors[e]=0; widths[e]=3;
77
  e=g.addArc(n5,n4); ecolors[e]=0; widths[e]=1;
78
  e=g.addArc(n4,n1); ecolors[e]=0; widths[e]=1;
79
  e=g.addArc(n2,n4); ecolors[e]=1; widths[e]=2;
80
  e=g.addArc(n3,n4); ecolors[e]=2; widths[e]=1;
74
  a=g.addArc(n1,n2); acolors[a]=0; widths[a]=1;
75
  a=g.addArc(n2,n3); acolors[a]=0; widths[a]=1;
76
  a=g.addArc(n3,n5); acolors[a]=0; widths[a]=3;
77
  a=g.addArc(n5,n4); acolors[a]=0; widths[a]=1;
78
  a=g.addArc(n4,n1); acolors[a]=0; widths[a]=1;
79
  a=g.addArc(n2,n4); acolors[a]=1; widths[a]=2;
80
  a=g.addArc(n3,n4); acolors[a]=2; widths[a]=1;
81 81
  
82 82
  IdMap<ListDigraph,Node> id(g);
83 83

	
84
  cout << "Create 'graph_to_eps_demo_out_pure.eps'" << endl;
85
  graphToEps(g,"graph_to_eps_demo_out_pure.eps").
86
    //scale(10).
84
  // Create five .eps files showing the digraph with different options
85
  cout << "Create 'graph_to_eps_demo_out_1_pure.eps'" << endl;
86
  graphToEps(g,"graph_to_eps_demo_out_1_pure.eps").
87 87
    coords(coords).
88 88
    title("Sample .eps figure").
89
    copyright("(C) 2003-2007 LEMON Project").
89
    copyright("(C) 2003-2008 LEMON Project").
90 90
    run();
91 91

	
92
  cout << "Create 'graph_to_eps_demo_out.eps'" << endl;
93
  graphToEps(g,"graph_to_eps_demo_out.eps").
94
    //scale(10).
92
  cout << "Create 'graph_to_eps_demo_out_2.eps'" << endl;
93
  graphToEps(g,"graph_to_eps_demo_out_2.eps").
95 94
    coords(coords).
96 95
    title("Sample .eps figure").
97
    copyright("(C) 2003-2007 LEMON Project").
96
    copyright("(C) 2003-2008 LEMON Project").
98 97
    absoluteNodeSizes().absoluteArcWidths().
99 98
    nodeScale(2).nodeSizes(sizes).
100 99
    nodeShapes(shapes).
101 100
    nodeColors(composeMap(palette,colors)).
102
    arcColors(composeMap(palette,ecolors)).
101
    arcColors(composeMap(palette,acolors)).
103 102
    arcWidthScale(.4).arcWidths(widths).
104 103
    nodeTexts(id).nodeTextSize(3).
105 104
    run();
106 105

	
107

	
108
  cout << "Create 'graph_to_eps_demo_out_arr.eps'" << endl;
109
  graphToEps(g,"graph_to_eps_demo_out_arr.eps").
110
    //scale(10).
106
  cout << "Create 'graph_to_eps_demo_out_3_arr.eps'" << endl;
107
  graphToEps(g,"graph_to_eps_demo_out_3_arr.eps").
111 108
    title("Sample .eps figure (with arrowheads)").
112
    copyright("(C) 2003-2007 LEMON Project").
109
    copyright("(C) 2003-2008 LEMON Project").
113 110
    absoluteNodeSizes().absoluteArcWidths().
114 111
    nodeColors(composeMap(palette,colors)).
115 112
    coords(coords).
116 113
    nodeScale(2).nodeSizes(sizes).
117 114
    nodeShapes(shapes).
118
    arcColors(composeMap(palette,ecolors)).
115
    arcColors(composeMap(palette,acolors)).
119 116
    arcWidthScale(.4).arcWidths(widths).
120 117
    nodeTexts(id).nodeTextSize(3).
121
    drawArrows().arrowWidth(1).arrowLength(1).
118
    drawArrows().arrowWidth(2).arrowLength(2).
122 119
    run();
123 120

	
124
  e=g.addArc(n1,n4); ecolors[e]=2; widths[e]=1;
125
  e=g.addArc(n4,n1); ecolors[e]=1; widths[e]=2;
121
  a=g.addArc(n1,n4); acolors[a]=2; widths[a]=1;
122
  a=g.addArc(n4,n1); acolors[a]=1; widths[a]=2;
126 123

	
127
  e=g.addArc(n1,n2); ecolors[e]=1; widths[e]=1;
128
  e=g.addArc(n1,n2); ecolors[e]=2; widths[e]=1;
129
  e=g.addArc(n1,n2); ecolors[e]=3; widths[e]=1;
130
  e=g.addArc(n1,n2); ecolors[e]=4; widths[e]=1;
131
  e=g.addArc(n1,n2); ecolors[e]=5; widths[e]=1;
132
  e=g.addArc(n1,n2); ecolors[e]=6; widths[e]=1;
133
  e=g.addArc(n1,n2); ecolors[e]=7; widths[e]=1;
124
  a=g.addArc(n1,n2); acolors[a]=1; widths[a]=1;
125
  a=g.addArc(n1,n2); acolors[a]=2; widths[a]=1;
126
  a=g.addArc(n1,n2); acolors[a]=3; widths[a]=1;
127
  a=g.addArc(n1,n2); acolors[a]=4; widths[a]=1;
128
  a=g.addArc(n1,n2); acolors[a]=5; widths[a]=1;
129
  a=g.addArc(n1,n2); acolors[a]=6; widths[a]=1;
130
  a=g.addArc(n1,n2); acolors[a]=7; widths[a]=1;
134 131

	
135 132
  cout << "Create 'graph_to_eps_demo_out_par.eps'" << endl;
136 133
  graphToEps(g,"graph_to_eps_demo_out_par.eps").
137 134
    //scale(10).
138 135
    title("Sample .eps figure (parallel arcs)").
139
    copyright("(C) 2003-2007 LEMON Project").
136
    copyright("(C) 2003-2008 LEMON Project").
140 137
    absoluteNodeSizes().absoluteArcWidths().
141 138
    nodeShapes(shapes).
142 139
    coords(coords).
143 140
    nodeScale(2).nodeSizes(sizes).
144 141
    nodeColors(composeMap(palette,colors)).
145
    arcColors(composeMap(palette,ecolors)).
142
    arcColors(composeMap(palette,acolors)).
146 143
    arcWidthScale(.4).arcWidths(widths).
147 144
    nodeTexts(id).nodeTextSize(3).
148 145
    enableParallel().parArcDist(1.5).
149 146
    run();
150
  
151
  cout << "Create 'graph_to_eps_demo_out_par_arr.eps'" << endl;
152
  graphToEps(g,"graph_to_eps_demo_out_par_arr.eps").
153
    //scale(10).
147

	
148
  cout << "Create 'graph_to_eps_demo_out_4_par_arr.eps'" << endl;
149
  graphToEps(g,"graph_to_eps_demo_out_4_par_arr.eps").
154 150
    title("Sample .eps figure (parallel arcs and arrowheads)").
155
    copyright("(C) 2003-2007 LEMON Project").
151
    copyright("(C) 2003-2008 LEMON Project").
156 152
    absoluteNodeSizes().absoluteArcWidths().
157 153
    nodeScale(2).nodeSizes(sizes).
158 154
    coords(coords).
159 155
    nodeShapes(shapes).
160 156
    nodeColors(composeMap(palette,colors)).
161
    arcColors(composeMap(palette,ecolors)).
157
    arcColors(composeMap(palette,acolors)).
162 158
    arcWidthScale(.3).arcWidths(widths).
163 159
    nodeTexts(id).nodeTextSize(3).
164 160
    enableParallel().parArcDist(1).
165 161
    drawArrows().arrowWidth(1).arrowLength(1).
166 162
    run();
167 163

	
168
  cout << "Create 'graph_to_eps_demo_out_a4.eps'" << endl;
169
  graphToEps(g,"graph_to_eps_demo_out_a4.eps").scaleToA4().
164
  cout << "Create 'graph_to_eps_demo_out_5_par_arr_a4.eps'" << endl;
165
  graphToEps(g,"graph_to_eps_demo_out_5_par_arr_a4.eps").
170 166
    title("Sample .eps figure (fits to A4)").
171
    copyright("(C) 2003-2007 LEMON Project").
167
    copyright("(C) 2003-2008 LEMON Project").
168
    scaleToA4().
172 169
    absoluteNodeSizes().absoluteArcWidths().
173 170
    nodeScale(2).nodeSizes(sizes).
174 171
    coords(coords).
175 172
    nodeShapes(shapes).
176 173
    nodeColors(composeMap(palette,colors)).
177
    arcColors(composeMap(palette,ecolors)).
174
    arcColors(composeMap(palette,acolors)).
178 175
    arcWidthScale(.3).arcWidths(widths).
179 176
    nodeTexts(id).nodeTextSize(3).
180 177
    enableParallel().parArcDist(1).
181 178
    drawArrows().arrowWidth(1).arrowLength(1).
182 179
    run();
183 180

	
181
  // Create an .eps file showing the colors of a default Palette
184 182
  ListDigraph h;
185 183
  ListDigraph::NodeMap<int> hcolors(h);
186 184
  ListDigraph::NodeMap<Point> hcoords(h);
187 185
  
188 186
  int cols=int(sqrt(double(palette.size())));
189 187
  for(int i=0;i<int(paletteW.size());i++) {
190 188
    Node n=h.addNode();
191
    hcoords[n]=Point(i%cols,i/cols);
189
    hcoords[n]=Point(1+i%cols,1+i/cols);
192 190
    hcolors[n]=i;
193 191
  }
194 192
  
195
  cout << "Create 'graph_to_eps_demo_out_colors.eps'" << endl;
196
  graphToEps(h,"graph_to_eps_demo_out_colors.eps").
197
    //scale(60).
193
  cout << "Create 'graph_to_eps_demo_out_6_colors.eps'" << endl;
194
  graphToEps(h,"graph_to_eps_demo_out_6_colors.eps").
195
    scale(60).
198 196
    title("Sample .eps figure (Palette demo)").
199
    copyright("(C) 2003-2007 LEMON Project").
197
    copyright("(C) 2003-2008 LEMON Project").
200 198
    coords(hcoords).
201 199
    absoluteNodeSizes().absoluteArcWidths().
202 200
    nodeScale(.45).
203 201
    distantColorNodeTexts().
204
    //    distantBWNodeTexts().
205 202
    nodeTexts(hcolors).nodeTextSize(.6).
206 203
    nodeColors(composeMap(paletteW,hcolors)).
207 204
    run();
205
    
206
  return 0;
208 207
}
Ignore white space 6 line context
... ...
@@ -99,29 +99,29 @@
99 99
  ///their number. The integer range is cyclically mapped to the
100 100
  ///provided set of colors.
101 101
  ///
102 102
  ///This is a true \ref concepts::ReferenceMap "reference map", so
103 103
  ///you can also change the actual colors.
104 104

	
105 105
  class Palette : public MapBase<int,Color>
106 106
  {
107 107
    std::vector<Color> colors;
108 108
  public:
109 109
    ///Constructor
110 110

	
111
    ///Constructor 
112
    ///\param have_white indicates whether white is amongst the
111
    ///Constructor.
112
    ///\param have_white Indicates whether white is among the
113 113
    ///provided initial colors (\c true) or not (\c false). If it is true,
114 114
    ///white will be assigned to \c 0.
115
    ///\param num the number of the allocated colors. If it is \c -1,
115
    ///\param num The number of the allocated colors. If it is \c -1,
116 116
    ///the default color configuration is set up (26 color plus optionaly the
117 117
    ///white).  If \c num is less then 26/27 then the default color
118 118
    ///list is cut. Otherwise the color list is filled repeatedly with
119 119
    ///the default color list.  (The colors can be changed later on.)
120 120
    Palette(bool have_white=false,int num=-1)
121 121
    {
122 122
      if (num==0) return;
123 123
      do {
124 124
        if(have_white) colors.push_back(Color(1,1,1));
125 125

	
126 126
        colors.push_back(Color(0,0,0));
127 127
        colors.push_back(Color(1,0,0));
... ...
@@ -144,49 +144,48 @@
144 144
        colors.push_back(Color(.5,.5,1));
145 145
        colors.push_back(Color(1,1,.5));
146 146
        colors.push_back(Color(1,.5,1));
147 147
        colors.push_back(Color(.5,1,1));
148 148
      
149 149
        colors.push_back(Color(1,.5,0));
150 150
        colors.push_back(Color(.5,1,0));
151 151
        colors.push_back(Color(1,0,.5));
152 152
        colors.push_back(Color(0,1,.5));
153 153
        colors.push_back(Color(0,.5,1));
154 154
        colors.push_back(Color(.5,0,1));
155 155
      } while(int(colors.size())<num);
156
      //    colors.push_back(Color(1,1,1));
157 156
      if(num>=0) colors.resize(num);
158 157
    }
159 158
    ///\e
160 159
    Color &operator[](int i)
161 160
    {
162 161
      return colors[i%colors.size()];
163 162
    }
164 163
    ///\e
165 164
    const Color &operator[](int i) const
166 165
    {
167 166
      return colors[i%colors.size()];
168 167
    }
169 168
    ///\e
170 169
    void set(int i,const Color &c)
171 170
    {
172 171
      colors[i%colors.size()]=c;
173 172
    }
174
    ///Add a new color to the end of the color list.
173
    ///Adds a new color to the end of the color list.
175 174
    void add(const Color &c) 
176 175
    {
177 176
      colors.push_back(c);
178 177
    }
179 178

	
180
    ///Sets the number of the exiting colors.
179
    ///Sets the number of the existing colors.
181 180
    void resize(int s) { colors.resize(s);}
182 181
    ///Returns the number of the existing colors.
183 182
    int size() const { return int(colors.size());}
184 183
  };
185 184

	
186 185
  ///Returns a visibly distinct \ref Color
187 186

	
188 187
  ///Returns a \ref Color which is as different from the given parameter
189 188
  ///as it is possible.
190 189
  inline Color distantColor(const Color &c) 
191 190
  {
192 191
    return Color(c.red()<.5?1:0,c.green()<.5?1:0,c.blue()<.5?1:0);
Ignore white space 6 line context
... ...
@@ -54,25 +54,25 @@
54 54
    public:
55 55
      typedef typename MT::Key Key;
56 56
      typedef typename MT::Value Value;
57 57
      const MT &map;
58 58
      int yscale;
59 59
      _NegY(const MT &m,bool b) : map(m), yscale(1-b*2) {}
60 60
      Value operator[](Key n) { return Value(map[n].x,map[n].y*yscale);}
61 61
    };
62 62
  }
63 63
  
64 64
///Default traits class of \ref GraphToEps
65 65

	
66
///Default traits class of \ref GraphToEps
66
///Default traits class of \ref GraphToEps.
67 67
///
68 68
///\c G is the type of the underlying graph.
69 69
template<class G>
70 70
struct DefaultGraphToEpsTraits
71 71
{
72 72
  typedef G Graph;
73 73
  typedef typename Graph::Node Node;
74 74
  typedef typename Graph::NodeIt NodeIt;
75 75
  typedef typename Graph::Arc Arc;
76 76
  typedef typename Graph::ArcIt ArcIt;
77 77
  typedef typename Graph::InArcIt InArcIt;
78 78
  typedef typename Graph::OutArcIt OutArcIt;
... ...
@@ -131,30 +131,29 @@
131 131
  bool _autoNodeScale;
132 132
  bool _autoArcWidthScale;
133 133

	
134 134
  bool _absoluteNodeSizes;
135 135
  bool _absoluteArcWidths;
136 136

	
137 137
  bool _negY;
138 138

	
139 139
  bool _preScale;
140 140
  ///Constructor
141 141

	
142 142
  ///Constructor
143
  ///\param _g is a reference to the graph to be printed
144
  ///\param _os is a reference to the output stream.
145
  ///\param _os is a reference to the output stream.
143
  ///\param _g  Reference to the graph to be printed.
144
  ///\param _os Reference to the output stream.
145
  ///\param _os Reference to the output stream. By default it is <tt>std::cout</tt>.
146 146
  ///\param _pros If it is \c true, then the \c ostream referenced by \c _os
147 147
  ///will be explicitly deallocated by the destructor.
148
  ///By default it is <tt>std::cout</tt>
149 148
  DefaultGraphToEpsTraits(const G &_g,std::ostream& _os=std::cout,
150 149
			  bool _pros=false) :
151 150
    g(_g), os(_os),
152 151
    _coords(dim2::Point<double>(1,1)), _nodeSizes(1), _nodeShapes(0),
153 152
    _nodeColors(WHITE), _arcColors(BLACK),
154 153
    _arcWidths(1.0), _arcWidthScale(0.003),
155 154
    _nodeScale(.01), _xBorder(10), _yBorder(10), _scale(1.0),
156 155
    _nodeBorderQuotient(.1),
157 156
    _drawArrows(false), _arrowLength(1), _arrowWidth(0.3),
158 157
    _showNodes(true), _showArcs(true),
159 158
    _enableParallel(false), _parArcDist(1),
160 159
    _showNodeText(false), _nodeTexts(false), _nodeTextSize(1),
... ...
@@ -164,25 +163,27 @@
164 163
    _nodeTextColorType(SAME_COL), _nodeTextColors(BLACK),
165 164
    _autoNodeScale(false),
166 165
    _autoArcWidthScale(false),
167 166
    _absoluteNodeSizes(false),
168 167
    _absoluteArcWidths(false),
169 168
    _negY(false),
170 169
    _preScale(true)
171 170
  {}
172 171
};
173 172

	
174 173
///Auxiliary class to implement the named parameters of \ref graphToEps()
175 174

	
176
///Auxiliary class to implement the named parameters of \ref graphToEps()
175
///Auxiliary class to implement the named parameters of \ref graphToEps().
176
///
177
///For detailed examples see the \ref graph_to_eps_demo.cc demo file.
177 178
template<class T> class GraphToEps : public T 
178 179
{
179 180
  // Can't believe it is required by the C++ standard
180 181
  using T::g;
181 182
  using T::os;
182 183

	
183 184
  using T::_coords;
184 185
  using T::_nodeSizes;
185 186
  using T::_nodeShapes;
186 187
  using T::_nodeColors;
187 188
  using T::_arcColors;
188 189
  using T::_arcWidths;
... ...
@@ -249,25 +250,25 @@
249 250
  typedef typename Graph::OutArcIt OutArcIt;
250 251

	
251 252
  static const int INTERPOL_PREC;
252 253
  static const double A4HEIGHT;
253 254
  static const double A4WIDTH;
254 255
  static const double A4BORDER;
255 256

	
256 257
  bool dontPrint;
257 258

	
258 259
public:
259 260
  ///Node shapes
260 261

	
261
  ///Node shapes
262
  ///Node shapes.
262 263
  ///
263 264
  enum NodeShapes { 
264 265
    /// = 0
265 266
    ///\image html nodeshape_0.png
266 267
    ///\image latex nodeshape_0.eps "CIRCLE shape (0)" width=2cm
267 268
    CIRCLE=0, 
268 269
    /// = 1
269 270
    ///\image html nodeshape_1.png
270 271
    ///\image latex nodeshape_1.eps "SQUARE shape (1)" width=2cm
271 272
    ///
272 273
    SQUARE=1, 
273 274
    /// = 2
... ...
@@ -326,37 +327,37 @@
326 327
  
327 328
public:
328 329
  GraphToEps(const T &t) : T(t), dontPrint(false) {};
329 330
  
330 331
  template<class X> struct CoordsTraits : public T {
331 332
  typedef X CoordsMapType;
332 333
    const X &_coords;
333 334
    CoordsTraits(const T &t,const X &x) : T(t), _coords(x) {}
334 335
  };
335 336
  ///Sets the map of the node coordinates
336 337

	
337 338
  ///Sets the map of the node coordinates.
338
  ///\param x must be a node map with dim2::Point<double> or
339
  ///\param x must be a node map with \ref dim2::Point "dim2::Point<double>" or
339 340
  ///\ref dim2::Point "dim2::Point<int>" values. 
340 341
  template<class X> GraphToEps<CoordsTraits<X> > coords(const X &x) {
341 342
    dontPrint=true;
342 343
    return GraphToEps<CoordsTraits<X> >(CoordsTraits<X>(*this,x));
343 344
  }
344 345
  template<class X> struct NodeSizesTraits : public T {
345 346
    const X &_nodeSizes;
346 347
    NodeSizesTraits(const T &t,const X &x) : T(t), _nodeSizes(x) {}
347 348
  };
348 349
  ///Sets the map of the node sizes
349 350

	
350
  ///Sets the map of the node sizes
351
  ///Sets the map of the node sizes.
351 352
  ///\param x must be a node map with \c double (or convertible) values. 
352 353
  template<class X> GraphToEps<NodeSizesTraits<X> > nodeSizes(const X &x)
353 354
  {
354 355
    dontPrint=true;
355 356
    return GraphToEps<NodeSizesTraits<X> >(NodeSizesTraits<X>(*this,x));
356 357
  }
357 358
  template<class X> struct NodeShapesTraits : public T {
358 359
    const X &_nodeShapes;
359 360
    NodeShapesTraits(const T &t,const X &x) : T(t), _nodeShapes(x) {}
360 361
  };
361 362
  ///Sets the map of the node shapes
362 363

	
... ...
@@ -367,159 +368,156 @@
367 368
  ///\sa NodeShapes
368 369
  template<class X> GraphToEps<NodeShapesTraits<X> > nodeShapes(const X &x)
369 370
  {
370 371
    dontPrint=true;
371 372
    return GraphToEps<NodeShapesTraits<X> >(NodeShapesTraits<X>(*this,x));
372 373
  }
373 374
  template<class X> struct NodeTextsTraits : public T {
374 375
    const X &_nodeTexts;
375 376
    NodeTextsTraits(const T &t,const X &x) : T(t), _nodeTexts(x) {}
376 377
  };
377 378
  ///Sets the text printed on the nodes
378 379

	
379
  ///Sets the text printed on the nodes
380
  ///Sets the text printed on the nodes.
380 381
  ///\param x must be a node map with type that can be pushed to a standard
381
  ///ostream. 
382
  ///\c ostream. 
382 383
  template<class X> GraphToEps<NodeTextsTraits<X> > nodeTexts(const X &x)
383 384
  {
384 385
    dontPrint=true;
385 386
    _showNodeText=true;
386 387
    return GraphToEps<NodeTextsTraits<X> >(NodeTextsTraits<X>(*this,x));
387 388
  }
388 389
  template<class X> struct NodePsTextsTraits : public T {
389 390
    const X &_nodePsTexts;
390 391
    NodePsTextsTraits(const T &t,const X &x) : T(t), _nodePsTexts(x) {}
391 392
  };
392 393
  ///Inserts a PostScript block to the nodes
393 394

	
394 395
  ///With this command it is possible to insert a verbatim PostScript
395 396
  ///block to the nodes.
396
  ///The PS current point will be moved to the centre of the node before
397
  ///The PS current point will be moved to the center of the node before
397 398
  ///the PostScript block inserted.
398 399
  ///
399 400
  ///Before and after the block a newline character is inserted so you
400 401
  ///don't have to bother with the separators.
401 402
  ///
402 403
  ///\param x must be a node map with type that can be pushed to a standard
403
  ///ostream.
404
  ///\c ostream.
404 405
  ///
405 406
  ///\sa nodePsTextsPreamble()
406 407
  template<class X> GraphToEps<NodePsTextsTraits<X> > nodePsTexts(const X &x)
407 408
  {
408 409
    dontPrint=true;
409 410
    _showNodePsText=true;
410 411
    return GraphToEps<NodePsTextsTraits<X> >(NodePsTextsTraits<X>(*this,x));
411 412
  }
412 413
  template<class X> struct ArcWidthsTraits : public T {
413 414
    const X &_arcWidths;
414 415
    ArcWidthsTraits(const T &t,const X &x) : T(t), _arcWidths(x) {}
415 416
  };
416 417
  ///Sets the map of the arc widths
417 418

	
418
  ///Sets the map of the arc widths
419
  ///Sets the map of the arc widths.
419 420
  ///\param x must be an arc map with \c double (or convertible) values. 
420 421
  template<class X> GraphToEps<ArcWidthsTraits<X> > arcWidths(const X &x)
421 422
  {
422 423
    dontPrint=true;
423 424
    return GraphToEps<ArcWidthsTraits<X> >(ArcWidthsTraits<X>(*this,x));
424 425
  }
425 426

	
426 427
  template<class X> struct NodeColorsTraits : public T {
427 428
    const X &_nodeColors;
428 429
    NodeColorsTraits(const T &t,const X &x) : T(t), _nodeColors(x) {}
429 430
  };
430 431
  ///Sets the map of the node colors
431 432

	
432
  ///Sets the map of the node colors
433
  ///Sets the map of the node colors.
433 434
  ///\param x must be a node map with \ref Color values.
434 435
  ///
435 436
  ///\sa Palette
436 437
  template<class X> GraphToEps<NodeColorsTraits<X> >
437 438
  nodeColors(const X &x)
438 439
  {
439 440
    dontPrint=true;
440 441
    return GraphToEps<NodeColorsTraits<X> >(NodeColorsTraits<X>(*this,x));
441 442
  }
442 443
  template<class X> struct NodeTextColorsTraits : public T {
443 444
    const X &_nodeTextColors;
444 445
    NodeTextColorsTraits(const T &t,const X &x) : T(t), _nodeTextColors(x) {}
445 446
  };
446 447
  ///Sets the map of the node text colors
447 448

	
448
  ///Sets the map of the node text colors
449
  ///Sets the map of the node text colors.
449 450
  ///\param x must be a node map with \ref Color values. 
450 451
  ///
451 452
  ///\sa Palette
452 453
  template<class X> GraphToEps<NodeTextColorsTraits<X> >
453 454
  nodeTextColors(const X &x)
454 455
  {
455 456
    dontPrint=true;
456 457
    _nodeTextColorType=CUST_COL;
457 458
    return GraphToEps<NodeTextColorsTraits<X> >
458 459
      (NodeTextColorsTraits<X>(*this,x));
459 460
  }
460 461
  template<class X> struct ArcColorsTraits : public T {
461 462
    const X &_arcColors;
462 463
    ArcColorsTraits(const T &t,const X &x) : T(t), _arcColors(x) {}
463 464
  };
464 465
  ///Sets the map of the arc colors
465 466

	
466
  ///Sets the map of the arc colors
467
  ///Sets the map of the arc colors.
467 468
  ///\param x must be an arc map with \ref Color values. 
468 469
  ///
469 470
  ///\sa Palette
470 471
  template<class X> GraphToEps<ArcColorsTraits<X> >
471 472
  arcColors(const X &x)
472 473
  {
473 474
    dontPrint=true;
474 475
    return GraphToEps<ArcColorsTraits<X> >(ArcColorsTraits<X>(*this,x));
475 476
  }
476 477
  ///Sets a global scale factor for node sizes
477 478

	
478 479
  ///Sets a global scale factor for node sizes.
479 480
  /// 
480 481
  /// If nodeSizes() is not given, this function simply sets the node
481 482
  /// sizes to \c d.  If nodeSizes() is given, but
482 483
  /// autoNodeScale() is not, then the node size given by
483 484
  /// nodeSizes() will be multiplied by the value \c d.
484 485
  /// If both nodeSizes() and autoNodeScale() are used, then the
485 486
  /// node sizes will be scaled in such a way that the greatest size will be
486 487
  /// equal to \c d.
487 488
  /// \sa nodeSizes()
488 489
  /// \sa autoNodeScale()
489 490
  GraphToEps<T> &nodeScale(double d=.01) {_nodeScale=d;return *this;}
490
  ///Turns on/off the automatic node width scaling.
491
  ///Turns on/off the automatic node size scaling.
491 492

	
492
  ///Turns on/off the automatic node width scaling.
493
  ///Turns on/off the automatic node size scaling.
493 494
  ///
494 495
  ///\sa nodeScale()
495 496
  ///
496 497
  GraphToEps<T> &autoNodeScale(bool b=true) {
497 498
    _autoNodeScale=b;return *this;
498 499
  }
499 500

	
500
  ///Turns on/off the absolutematic node width scaling.
501
  ///Turns on/off the absolutematic node size scaling.
501 502

	
502
  ///Turns on/off the absolutematic node width scaling.
503
  ///Turns on/off the absolutematic node size scaling.
503 504
  ///
504 505
  ///\sa nodeScale()
505 506
  ///
506 507
  GraphToEps<T> &absoluteNodeSizes(bool b=true) {
507 508
    _absoluteNodeSizes=b;return *this;
508 509
  }
509 510

	
510 511
  ///Negates the Y coordinates.
511

	
512
  ///Negates the Y coordinates.
513
  ///
514 512
  GraphToEps<T> &negateY(bool b=true) {
515 513
    _negY=b;return *this;
516 514
  }
517 515

	
518 516
  ///Turn on/off pre-scaling
519 517

	
520 518
  ///By default graphToEps() rescales the whole image in order to avoid
521 519
  ///very big or very small bounding boxes.
522 520
  ///
523 521
  ///This (p)rescaling can be turned off with this function.
524 522
  ///
525 523
  GraphToEps<T> &preScale(bool b=true) {
... ...
@@ -548,127 +546,88 @@
548 546
    _autoArcWidthScale=b;return *this;
549 547
  }
550 548
  ///Turns on/off the absolutematic arc width scaling.
551 549

	
552 550
  ///Turns on/off the absolutematic arc width scaling.
553 551
  ///
554 552
  ///\sa arcWidthScale()
555 553
  ///
556 554
  GraphToEps<T> &absoluteArcWidths(bool b=true) {
557 555
    _absoluteArcWidths=b;return *this;
558 556
  }
559 557
  ///Sets a global scale factor for the whole picture
560

	
561
  ///Sets a global scale factor for the whole picture
562
  ///
563

	
564 558
  GraphToEps<T> &scale(double d) {_scale=d;return *this;}
565 559
  ///Sets the width of the border around the picture
566

	
567
  ///Sets the width of the border around the picture
568
  ///
569 560
  GraphToEps<T> &border(double b=10) {_xBorder=_yBorder=b;return *this;}
570 561
  ///Sets the width of the border around the picture
571

	
572
  ///Sets the width of the border around the picture
573
  ///
574 562
  GraphToEps<T> &border(double x, double y) {
575 563
    _xBorder=x;_yBorder=y;return *this;
576 564
  }
577 565
  ///Sets whether to draw arrows
578

	
579
  ///Sets whether to draw arrows
580
  ///
581 566
  GraphToEps<T> &drawArrows(bool b=true) {_drawArrows=b;return *this;}
582 567
  ///Sets the length of the arrowheads
583

	
584
  ///Sets the length of the arrowheads
585
  ///
586 568
  GraphToEps<T> &arrowLength(double d=1.0) {_arrowLength*=d;return *this;}
587 569
  ///Sets the width of the arrowheads
588

	
589
  ///Sets the width of the arrowheads
590
  ///
591 570
  GraphToEps<T> &arrowWidth(double d=.3) {_arrowWidth*=d;return *this;}
592 571
  
593 572
  ///Scales the drawing to fit to A4 page
594

	
595
  ///Scales the drawing to fit to A4 page
596
  ///
597 573
  GraphToEps<T> &scaleToA4() {_scaleToA4=true;return *this;}
598 574
  
599 575
  ///Enables parallel arcs
600

	
601
  ///Enables parallel arcs
602 576
  GraphToEps<T> &enableParallel(bool b=true) {_enableParallel=b;return *this;}
603 577
  
604
  ///Sets the distance 
605
  
606
  ///Sets the distance 
607
  ///
578
  ///Sets the distance between parallel arcs
608 579
  GraphToEps<T> &parArcDist(double d) {_parArcDist*=d;return *this;}
609 580
  
610 581
  ///Hides the arcs
611
  
612
  ///Hides the arcs
613
  ///
614 582
  GraphToEps<T> &hideArcs(bool b=true) {_showArcs=!b;return *this;}
615 583
  ///Hides the nodes
616
  
617
  ///Hides the nodes
618
  ///
619 584
  GraphToEps<T> &hideNodes(bool b=true) {_showNodes=!b;return *this;}
620 585
  
621 586
  ///Sets the size of the node texts
622
  
623
  ///Sets the size of the node texts
624
  ///
625 587
  GraphToEps<T> &nodeTextSize(double d) {_nodeTextSize=d;return *this;}
626 588

	
627 589
  ///Sets the color of the node texts to be different from the node color
628 590

	
629 591
  ///Sets the color of the node texts to be as different from the node color
630
  ///as it is possible
631
  ///
592
  ///as it is possible.
632 593
  GraphToEps<T> &distantColorNodeTexts()
633 594
  {_nodeTextColorType=DIST_COL;return *this;}
634 595
  ///Sets the color of the node texts to be black or white and always visible.
635 596

	
636 597
  ///Sets the color of the node texts to be black or white according to
637
  ///which is more 
638
  ///different from the node color
639
  ///
598
  ///which is more different from the node color.
640 599
  GraphToEps<T> &distantBWNodeTexts()
641 600
  {_nodeTextColorType=DIST_BW;return *this;}
642 601

	
643 602
  ///Gives a preamble block for node Postscript block.
644 603
  
645 604
  ///Gives a preamble block for node Postscript block.
646 605
  ///
647 606
  ///\sa nodePsTexts()
648 607
  GraphToEps<T> & nodePsTextsPreamble(const char *str) {
649 608
    _nodePsTextsPreamble=str ;return *this;
650 609
  }
651
  ///Sets whether the the graph is undirected
610
  ///Sets whether the graph is undirected
652 611

	
653
  ///Sets whether the the graph is undirected.
612
  ///Sets whether the graph is undirected.
654 613
  ///
655 614
  ///This setting is the default for undirected graphs.
656 615
  ///
657 616
  ///\sa directed()
658 617
   GraphToEps<T> &undirected(bool b=true) {_undirected=b;return *this;}
659 618

	
660
  ///Sets whether the the graph is directed
619
  ///Sets whether the graph is directed
661 620

	
662
  ///Sets whether the the graph is directed.
621
  ///Sets whether the graph is directed.
663 622
  ///Use it to show the edges as a pair of directed ones.
664 623
  ///
665 624
  ///This setting is the default for digraphs.
666 625
  ///
667 626
  ///\sa undirected()
668 627
  GraphToEps<T> &directed(bool b=true) {_undirected=!b;return *this;}
669 628
  
670 629
  ///Sets the title.
671 630

	
672 631
  ///Sets the title of the generated image,
673 632
  ///namely it inserts a <tt>%%Title:</tt> DSC field to the header of
674 633
  ///the EPS file.
... ...
@@ -707,25 +666,24 @@
707 666
  ///it draws the graph.
708 667
  void run() {
709 668
    //\todo better 'epsilon' would be nice here.
710 669
    const double EPSILON=1e-9;
711 670
    if(dontPrint) return;
712 671
    
713 672
    _graph_to_eps_bits::_NegY<typename T::CoordsMapType>
714 673
      mycoords(_coords,_negY);
715 674

	
716 675
    os << "%!PS-Adobe-2.0 EPSF-2.0\n";
717 676
    if(_title.size()>0) os << "%%Title: " << _title << '\n';
718 677
     if(_copyright.size()>0) os << "%%Copyright: " << _copyright << '\n';
719
//        << "%%Copyright: XXXX\n"
720 678
    os << "%%Creator: LEMON, graphToEps()\n";
721 679

	
722 680
    {    
723 681
#ifndef WIN32 
724 682
      timeval tv;
725 683
      gettimeofday(&tv, 0);
726 684

	
727 685
      char cbuf[26];
728 686
      ctime_r(&tv.tv_sec,cbuf);
729 687
      os << "%%CreationDate: " << cbuf;
730 688
#else
731 689
      SYSTEMTIME time;
... ...
@@ -739,35 +697,35 @@
739 697
	  GetDateFormat(LOCALE_USER_DEFAULT, 0, &time, 
740 698
				"yyyy", buf3, 5)) {
741 699
	os << "%%CreationDate: " << buf1 << ' ' 
742 700
	   << buf2 << ' ' << buf3 << std::endl;
743 701
      }	  
744 702
#endif
745 703
    }
746 704

	
747 705
    if (_autoArcWidthScale) {
748 706
      double max_w=0;
749 707
      for(ArcIt e(g);e!=INVALID;++e)
750 708
	max_w=std::max(double(_arcWidths[e]),max_w);
751
      ///\todo better 'epsilon' would be nice here.
709
      //\todo better 'epsilon' would be nice here.
752 710
      if(max_w>EPSILON) {
753 711
	_arcWidthScale/=max_w;
754 712
      }
755 713
    }
756 714

	
757 715
    if (_autoNodeScale) {
758 716
      double max_s=0;
759 717
      for(NodeIt n(g);n!=INVALID;++n)
760 718
	max_s=std::max(double(_nodeSizes[n]),max_s);
761
      ///\todo better 'epsilon' would be nice here.
719
      //\todo better 'epsilon' would be nice here.
762 720
      if(max_s>EPSILON) {
763 721
	_nodeScale/=max_s;
764 722
      }
765 723
    }
766 724

	
767 725
    double diag_len = 1;
768 726
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
769 727
      dim2::BoundingBox<double> bb;
770 728
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
771 729
      if (bb.empty()) {
772 730
	bb = dim2::BoundingBox<double>(dim2::Point<double>(0,0));
773 731
      }
... ...
@@ -1105,108 +1063,90 @@
1105 1063
    os << "grestore\nshowpage\n";
1106 1064

	
1107 1065
    //CleanUp:
1108 1066
    if(_pleaseRemoveOsStream) {delete &os;}
1109 1067
  }
1110 1068

	
1111 1069
  ///\name Aliases
1112 1070
  ///These are just some aliases to other parameter setting functions.
1113 1071

	
1114 1072
  ///@{
1115 1073

	
1116 1074
  ///An alias for arcWidths()
1117

	
1118
  ///An alias for arcWidths()
1119
  ///
1120 1075
  template<class X> GraphToEps<ArcWidthsTraits<X> > edgeWidths(const X &x)
1121 1076
  {
1122 1077
    return arcWidths(x);
1123 1078
  }
1124 1079

	
1125 1080
  ///An alias for arcColors()
1126

	
1127
  ///An alias for arcColors()
1128
  ///
1129 1081
  template<class X> GraphToEps<ArcColorsTraits<X> >
1130 1082
  edgeColors(const X &x)
1131 1083
  {
1132 1084
    return arcColors(x);
1133 1085
  }
1134 1086

	
1135 1087
  ///An alias for arcWidthScale()
1136

	
1137
  ///An alias for arcWidthScale()
1138
  ///
1139 1088
  GraphToEps<T> &edgeWidthScale(double d) {return arcWidthScale(d);}
1140 1089

	
1141 1090
  ///An alias for autoArcWidthScale()
1142

	
1143
  ///An alias for autoArcWidthScale()
1144
  ///
1145 1091
  GraphToEps<T> &autoEdgeWidthScale(bool b=true)
1146 1092
  {
1147 1093
    return autoArcWidthScale(b);
1148 1094
  }
1149 1095
  
1150 1096
  ///An alias for absoluteArcWidths()
1151

	
1152
  ///An alias for absoluteArcWidths()
1153
  ///
1154 1097
  GraphToEps<T> &absoluteEdgeWidths(bool b=true)
1155 1098
  {
1156 1099
    return absoluteArcWidths(b);
1157 1100
  }
1158 1101
  
1159 1102
  ///An alias for parArcDist()
1160

	
1161
  ///An alias for parArcDist()
1162
  ///
1163 1103
  GraphToEps<T> &parEdgeDist(double d) {return parArcDist(d);}
1164 1104
  
1165 1105
  ///An alias for hideArcs()
1166
  
1167
  ///An alias for hideArcs()
1168
  ///
1169 1106
  GraphToEps<T> &hideEdges(bool b=true) {return hideArcs(b);}
1170 1107

	
1171 1108
  ///@}
1172 1109
};
1173 1110

	
1174 1111
template<class T>
1175 1112
const int GraphToEps<T>::INTERPOL_PREC = 20;
1176 1113
template<class T>
1177 1114
const double GraphToEps<T>::A4HEIGHT = 841.8897637795276;
1178 1115
template<class T>
1179 1116
const double GraphToEps<T>::A4WIDTH  = 595.275590551181;
1180 1117
template<class T>
1181 1118
const double GraphToEps<T>::A4BORDER = 15;
1182 1119

	
1183 1120

	
1184 1121
///Generates an EPS file from a graph
1185 1122

	
1186 1123
///\ingroup eps_io
1187 1124
///Generates an EPS file from a graph.
1188
///\param g is a reference to the graph to be printed
1189
///\param os is a reference to the output stream.
1190
///By default it is <tt>std::cout</tt>
1125
///\param g Reference to the graph to be printed.
1126
///\param os Reference to the output stream.
1127
///By default it is <tt>std::cout</tt>.
1191 1128
///
1192 1129
///This function also has a lot of
1193 1130
///\ref named-templ-func-param "named parameters",
1194 1131
///they are declared as the members of class \ref GraphToEps. The following
1195 1132
///example shows how to use these parameters.
1196 1133
///\code
1197 1134
/// graphToEps(g,os).scale(10).coords(coords)
1198 1135
///              .nodeScale(2).nodeSizes(sizes)
1199 1136
///              .arcWidthScale(.4).run();
1200 1137
///\endcode
1138
///
1139
///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.
1140
///
1201 1141
///\warning Don't forget to put the \ref GraphToEps::run() "run()"
1202 1142
///to the end of the parameter list.
1203 1143
///\sa GraphToEps
1204 1144
///\sa graphToEps(G &g, const char *file_name)
1205 1145
template<class G>
1206 1146
GraphToEps<DefaultGraphToEpsTraits<G> > 
1207 1147
graphToEps(G &g, std::ostream& os=std::cout)
1208 1148
{
1209 1149
  return 
1210 1150
    GraphToEps<DefaultGraphToEpsTraits<G> >(DefaultGraphToEpsTraits<G>(g,os));
1211 1151
}
1212 1152
 
0 comments (0 inline)