# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1215259968 -7200
# Node ID 769a76ee7c48f0a6183eabafda1dd5e2ff3844c6
# Parent 1e6af6f0843c373a0579fc699ac4a83bb4f5948a
Improvements related to graphToEps()
diff -r 1e6af6f0843c -r 769a76ee7c48 demo/graph_to_eps_demo.cc
a
|
b
|
|
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; |
… |
… |
|
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; |
… |
… |
|
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; |
… |
… |
|
71 | 71 | |
72 | 72 | Arc e; |
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 | e=g.addArc(n1,n2); acolors[e]=0; widths[e]=1; |
| 75 | e=g.addArc(n2,n3); acolors[e]=0; widths[e]=1; |
| 76 | e=g.addArc(n3,n5); acolors[e]=0; widths[e]=3; |
| 77 | e=g.addArc(n5,n4); acolors[e]=0; widths[e]=1; |
| 78 | e=g.addArc(n4,n1); acolors[e]=0; widths[e]=1; |
| 79 | e=g.addArc(n2,n4); acolors[e]=1; widths[e]=2; |
| 80 | e=g.addArc(n3,n4); acolors[e]=2; widths[e]=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 | e=g.addArc(n1,n4); acolors[e]=2; widths[e]=1; |
| 122 | e=g.addArc(n4,n1); acolors[e]=1; widths[e]=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 | e=g.addArc(n1,n2); acolors[e]=1; widths[e]=1; |
| 125 | e=g.addArc(n1,n2); acolors[e]=2; widths[e]=1; |
| 126 | e=g.addArc(n1,n2); acolors[e]=3; widths[e]=1; |
| 127 | e=g.addArc(n1,n2); acolors[e]=4; widths[e]=1; |
| 128 | e=g.addArc(n1,n2); acolors[e]=5; widths[e]=1; |
| 129 | e=g.addArc(n1,n2); acolors[e]=6; widths[e]=1; |
| 130 | e=g.addArc(n1,n2); acolors[e]=7; widths[e]=1; |
134 | 131 | |
135 | | cout << "Create 'graph_to_eps_demo_out_par.eps'" << endl; |
136 | | graphToEps(g,"graph_to_eps_demo_out_par.eps"). |
137 | | //scale(10). |
138 | | title("Sample .eps figure (parallel arcs)"). |
139 | | copyright("(C) 2003-2007 LEMON Project"). |
140 | | absoluteNodeSizes().absoluteArcWidths(). |
141 | | nodeShapes(shapes). |
142 | | coords(coords). |
143 | | nodeScale(2).nodeSizes(sizes). |
144 | | nodeColors(composeMap(palette,colors)). |
145 | | arcColors(composeMap(palette,ecolors)). |
146 | | arcWidthScale(.4).arcWidths(widths). |
147 | | nodeTexts(id).nodeTextSize(3). |
148 | | enableParallel().parArcDist(1.5). |
149 | | 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). |
| 132 | cout << "Create 'graph_to_eps_demo_out_4_par_arr.eps'" << endl; |
| 133 | graphToEps(g,"graph_to_eps_demo_out_4_par_arr.eps"). |
154 | 134 | title("Sample .eps figure (parallel arcs and arrowheads)"). |
155 | | copyright("(C) 2003-2007 LEMON Project"). |
| 135 | copyright("(C) 2003-2008 LEMON Project"). |
156 | 136 | absoluteNodeSizes().absoluteArcWidths(). |
157 | 137 | nodeScale(2).nodeSizes(sizes). |
158 | 138 | coords(coords). |
159 | 139 | nodeShapes(shapes). |
160 | 140 | nodeColors(composeMap(palette,colors)). |
161 | | arcColors(composeMap(palette,ecolors)). |
| 141 | arcColors(composeMap(palette,acolors)). |
162 | 142 | arcWidthScale(.3).arcWidths(widths). |
163 | 143 | nodeTexts(id).nodeTextSize(3). |
164 | 144 | enableParallel().parArcDist(1). |
165 | 145 | drawArrows().arrowWidth(1).arrowLength(1). |
166 | 146 | run(); |
167 | 147 | |
168 | | cout << "Create 'graph_to_eps_demo_out_a4.eps'" << endl; |
169 | | graphToEps(g,"graph_to_eps_demo_out_a4.eps").scaleToA4(). |
| 148 | cout << "Create 'graph_to_eps_demo_out_5_par_arr_a4.eps'" << endl; |
| 149 | graphToEps(g,"graph_to_eps_demo_out_5_par_arr_a4.eps"). |
170 | 150 | title("Sample .eps figure (fits to A4)"). |
171 | | copyright("(C) 2003-2007 LEMON Project"). |
| 151 | copyright("(C) 2003-2008 LEMON Project"). |
| 152 | scaleToA4(). |
172 | 153 | absoluteNodeSizes().absoluteArcWidths(). |
173 | 154 | nodeScale(2).nodeSizes(sizes). |
174 | 155 | coords(coords). |
175 | 156 | nodeShapes(shapes). |
176 | 157 | nodeColors(composeMap(palette,colors)). |
177 | | arcColors(composeMap(palette,ecolors)). |
| 158 | arcColors(composeMap(palette,acolors)). |
178 | 159 | arcWidthScale(.3).arcWidths(widths). |
179 | 160 | nodeTexts(id).nodeTextSize(3). |
180 | 161 | enableParallel().parArcDist(1). |
181 | 162 | drawArrows().arrowWidth(1).arrowLength(1). |
182 | 163 | run(); |
183 | 164 | |
| 165 | // Create an .eps file showing the colors of a default Palette |
184 | 166 | ListDigraph h; |
185 | 167 | ListDigraph::NodeMap<int> hcolors(h); |
186 | 168 | ListDigraph::NodeMap<Point> hcoords(h); |
… |
… |
|
188 | 170 | int cols=int(sqrt(double(palette.size()))); |
189 | 171 | for(int i=0;i<int(paletteW.size());i++) { |
190 | 172 | Node n=h.addNode(); |
191 | | hcoords[n]=Point(i%cols,i/cols); |
| 173 | hcoords[n]=Point(1+i%cols,1+i/cols); |
192 | 174 | hcolors[n]=i; |
193 | 175 | } |
194 | 176 | |
195 | | cout << "Create 'graph_to_eps_demo_out_colors.eps'" << endl; |
196 | | graphToEps(h,"graph_to_eps_demo_out_colors.eps"). |
197 | | //scale(60). |
| 177 | cout << "Create 'graph_to_eps_demo_out_6_colors.eps'" << endl; |
| 178 | graphToEps(h,"graph_to_eps_demo_out_6_colors.eps"). |
| 179 | scale(60). |
198 | 180 | title("Sample .eps figure (Palette demo)"). |
199 | | copyright("(C) 2003-2007 LEMON Project"). |
| 181 | copyright("(C) 2003-2008 LEMON Project"). |
200 | 182 | coords(hcoords). |
201 | 183 | absoluteNodeSizes().absoluteArcWidths(). |
202 | 184 | nodeScale(.45). |
203 | 185 | distantColorNodeTexts(). |
204 | | // distantBWNodeTexts(). |
205 | 186 | nodeTexts(hcolors).nodeTextSize(.6). |
206 | 187 | nodeColors(composeMap(paletteW,hcolors)). |
207 | 188 | run(); |
| 189 | |
| 190 | return 0; |
208 | 191 | } |
diff -r 1e6af6f0843c -r 769a76ee7c48 lemon/color.h
a
|
b
|
|
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 |
… |
… |
|
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 |
… |
… |
|
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());} |
diff -r 1e6af6f0843c -r 769a76ee7c48 lemon/graph_to_eps.h
a
|
b
|
|
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> |
… |
… |
|
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), |
… |
… |
|
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 |
… |
… |
|
258 | 259 | public: |
259 | 260 | ///Node shapes |
260 | 261 | |
261 | | ///Node shapes |
| 262 | ///Node shapes. |
262 | 263 | /// |
263 | 264 | enum NodeShapes { |
264 | 265 | /// = 0 |
… |
… |
|
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; |
… |
… |
|
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 | { |
… |
… |
|
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; |
… |
… |
|
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) |
… |
… |
|
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 | { |
… |
… |
|
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 |
… |
… |
|
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 |
… |
… |
|
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 |
… |
… |
|
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 | /// |
… |
… |
|
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 | /// |
… |
… |
|
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 | } |
… |
… |
|
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 | |
… |
… |
|
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. |
… |
… |
|
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 | { |
… |
… |
|
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 | } |
… |
… |
|
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 | } |
… |
… |
|
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 | { |
… |
… |
|
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 | ///@} |
… |
… |
|
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", |
… |
… |
|
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 |