mirror of
https://github.com/boostorg/graph.git
synced 2026-01-21 17:02:23 +00:00
326 lines
9.7 KiB
HTML
326 lines
9.7 KiB
HTML
<HTML>
|
|
|
|
<!--
|
|
-- Copyright (c) Lie-Quan Lee and Jeremy Siek 2000, 2001
|
|
--
|
|
-- Permission to use, copy, modify, distribute and sell this software
|
|
-- and its documentation for any purpose is hereby granted without fee,
|
|
-- provided that the above copyright notice appears in all copies and
|
|
-- that both that copyright notice and this permission notice appear
|
|
-- in supporting documentation. Silicon Graphics makes no
|
|
-- representations about the suitability of this software for any
|
|
-- purpose. It is provided "as is" without express or implied warranty.
|
|
-->
|
|
<Head>
|
|
<Title>Boost Graph Library: write graphviz</Title>
|
|
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
|
ALINK="#ff0000">
|
|
<IMG SRC="../../../c++boost.gif"
|
|
ALT="C++ Boost" width="277" height="86">
|
|
|
|
<BR Clear>
|
|
|
|
<H1><A NAME="sec:write-graphviz">
|
|
<TT>write_graphviz</TT>
|
|
</H1>
|
|
|
|
|
|
<pre>
|
|
(1)
|
|
template < typename VertexListGraph >
|
|
void
|
|
write_graphviz(std::ostream& out, const VertexListGraph& g);
|
|
|
|
(2)
|
|
template < typename VertexListGraph, typename VertexPropertyWriter >
|
|
void
|
|
write_graphviz(std::ostream& out, const VertexListGraph& g,
|
|
VertexPropertyWriter vpw);
|
|
|
|
(3)
|
|
template < typename VertexListGraph, typename VertexPropertyWriter,
|
|
typename EdgePropertyWriter >
|
|
void
|
|
write_graphviz(std::ostream& out, const VertexListGraph& g,
|
|
VertexPropertyWriter vpw, EdgePropertyWriter epw);
|
|
|
|
(4)
|
|
template < typename VertexListGraph, typename VertexPropertyWriter,
|
|
typename EdgePropertyWriter, typename GraphPropertyWriter >
|
|
void
|
|
write_graphviz(std::ostream& out, const VertexListGraph& g,
|
|
VertexPropertyWriter vpw, EdgePropertyWriter epw,
|
|
GraphPropertyWriter gpw);
|
|
|
|
</pre>
|
|
|
|
<p>
|
|
This is to write a BGL graph object into a output stream in graphviz
|
|
dot format so that users can make use of <a href="http://www.research.att.com/sw/tools/graphviz/">AT&T graphviz</a> to draw a
|
|
picture with nice layout.
|
|
<p>
|
|
The first version with two parameters will write graph into an
|
|
<tt>std::ostream</tt> where vertex is represented by numerical vertex
|
|
IDs. If users have either interior or exterior properties for each vertex
|
|
in the graph, the second version above provides a way to print those
|
|
properties into the gaphviz format file. For example, if each vertex
|
|
in the graph has its label through property map object <tt>name</tt>,
|
|
users can use the second version:
|
|
<pre>
|
|
write_graph(out, g, make_label_writer(name));
|
|
</pre>
|
|
The utility function <tt>make_label_writer</tt> returns a predefined
|
|
<a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> for vertex label. Similarly, the third
|
|
version and fourth version require edge <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a>, edge
|
|
<a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> and graph <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a>,
|
|
respectively.
|
|
|
|
<h3><A NAME="concept:PropertyWriter">
|
|
<tt>PropertyWriter</tt>
|
|
</h3>
|
|
|
|
PropertyWriter is used in the <tt>write_graphviz</tt> function to
|
|
print properties of vertex, edge or graph. There are two types of
|
|
PropertyWriter. One is for a vertex or edge. The other is for a graph.
|
|
Thus, users could easily extend the <tt>write_graphviz</tt> function
|
|
by creating their own <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> only.
|
|
<p>
|
|
A <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> for vertices or edges is a functor which is
|
|
to print a series of "name=value" separated with spaces or a comma or
|
|
a semicolon in square bracket into an <tt>std::ostream</tt>. The
|
|
following functor is the example of PropertyWriter for vertices or
|
|
edges. It is used to print the label of each vertex or edge.
|
|
<pre>
|
|
template < class Name >
|
|
class label_writer {
|
|
public:
|
|
label_writer(Name _name) : name(_name) {}
|
|
template <class VertexOrEdge>
|
|
void operator()(std::ostream& out, const VertexOrEdge& v) const {
|
|
out << "[label=\"" << name[v] << "\"]";
|
|
}
|
|
private:
|
|
Name name;
|
|
};
|
|
</pre>
|
|
<p>
|
|
A <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> for graph is a functor which is to print a
|
|
series graph properties into an <tt>std::ostream</tt>. The following
|
|
code excerpt is an example of a PropertyWriter for a graph.
|
|
<pre>
|
|
struct sample_graph_writer {
|
|
void operator()(std::ostream& out) const {
|
|
out << "graph [bgcolor=lightgrey]" << std::endl;
|
|
out << "node [shape=circle color=white]" << std::endl;
|
|
out << "edge [style=dashed]" << std::endl;
|
|
}
|
|
};
|
|
}
|
|
</pre>
|
|
|
|
<h3>Parameters</h3>
|
|
|
|
For version 1:<p>
|
|
|
|
OUT: <tt>std::ostream& out</tt>
|
|
<blockquote>
|
|
A standard <tt>std::ostream</tt> object.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexListGraph& g</tt>
|
|
<blockquote>
|
|
A directed or undirected graph. The graph's type must be a model of
|
|
<a href="./VertexListGraph.html">VertexListGraph</a>.
|
|
</blockquote>
|
|
|
|
For version 2:<p>
|
|
OUT: <tt>std::ostream& out</tt>
|
|
<blockquote>
|
|
A standard <tt>std::ostream</tt> object.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexListGraph& g</tt>
|
|
<blockquote>
|
|
A directed or undirected graph. The graph's type must be a model of
|
|
<a href="./VertexListGraph.html">VertexListGraph</a>.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexPropertyWriter vpw</tt>
|
|
<blockquote>
|
|
A functor that models <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> concept to print
|
|
properties of a vertex.
|
|
</blockquote>
|
|
|
|
|
|
For version 3:<p>
|
|
|
|
OUT: <tt>std::ostream& out</tt>
|
|
<blockquote>
|
|
A standard <tt>std::ostream</tt> object.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexListGraph& g</tt>
|
|
<blockquote>
|
|
A directed or undirected graph. The graph's type must be a model of
|
|
<a href="./VertexListGraph.html">VertexListGraph</a>.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexPropertyWriter vpw</tt>
|
|
<blockquote>
|
|
A functor that models <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> concept to print
|
|
properties of a vertex.
|
|
</blockquote>
|
|
|
|
IN: <tt>EdgePropertyWriter epw</tt>
|
|
<blockquote>
|
|
A functor that models <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> concept to print
|
|
properties of an edge.
|
|
</blockquote>
|
|
|
|
|
|
For version 4:<p>
|
|
|
|
OUT: <tt>std::ostream& out</tt>
|
|
<blockquote>
|
|
A standard <tt>std::ostream</tt> object.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexListGraph& g</tt>
|
|
<blockquote>
|
|
A directed or undirected graph. The graph's type must be a model of
|
|
<a href="./VertexListGraph.html">VertexListGraph</a>.
|
|
</blockquote>
|
|
|
|
IN: <tt>VertexPropertyWriter vpw</tt>
|
|
<blockquote>
|
|
A functor that models <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> concept to print
|
|
properties of a vertex.
|
|
</blockquote>
|
|
|
|
IN: <tt>EdgePropertyWriter epw</tt>
|
|
<blockquote>
|
|
A functor that models <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> concept to print
|
|
properties of an edge.
|
|
</blockquote>
|
|
|
|
IN: <tt>GeaphPropertyWriter epw</tt>
|
|
<blockquote>
|
|
A functor that models <a href="./write-graphviz.html#concept:PropertyWriter">PropertyWriter</a> concept to print
|
|
properties of a graph.
|
|
</blockquote>
|
|
|
|
<H3>
|
|
Example
|
|
</H3>
|
|
|
|
This example demonstrates using BGL-graphviz interface to write
|
|
a BGL graph into a graphviz format file.
|
|
|
|
<pre>
|
|
enum files_e { dax_h, yow_h, boz_h, zow_h, foo_cpp,
|
|
foo_o, bar_cpp, bar_o, libfoobar_a,
|
|
zig_cpp, zig_o, zag_cpp, zag_o,
|
|
libzigzag_a, killerapp, N };
|
|
const char* name[] = { "dax.h", "yow.h", "boz.h", "zow.h", "foo.cpp",
|
|
"foo.o", "bar.cpp", "bar.o", "libfoobar.a",
|
|
"zig.cpp", "zig.o", "zag.cpp", "zag.o",
|
|
"libzigzag.a", "killerapp" };
|
|
|
|
int main(int,char*[])
|
|
{
|
|
|
|
typedef pair<int,int> Edge;
|
|
Edge used_by[] = {
|
|
Edge(dax_h, foo_cpp), Edge(dax_h, bar_cpp), Edge(dax_h, yow_h),
|
|
Edge(yow_h, bar_cpp), Edge(yow_h, zag_cpp),
|
|
Edge(boz_h, bar_cpp), Edge(boz_h, zig_cpp), Edge(boz_h, zag_cpp),
|
|
Edge(zow_h, foo_cpp),
|
|
Edge(foo_cpp, foo_o),
|
|
Edge(foo_o, libfoobar_a),
|
|
Edge(bar_cpp, bar_o),
|
|
Edge(bar_o, libfoobar_a),
|
|
Edge(libfoobar_a, libzigzag_a),
|
|
Edge(zig_cpp, zig_o),
|
|
Edge(zig_o, libzigzag_a),
|
|
Edge(zag_cpp, zag_o),
|
|
Edge(zag_o, libzigzag_a),
|
|
Edge(libzigzag_a, killerapp)
|
|
};
|
|
const int nedges = sizeof(used_by)/sizeof(Edge);
|
|
int weights[nedges];
|
|
fill(weights, weights + nedges, 1);
|
|
|
|
typedef adjacency_list< vecS, vecS, directedS,
|
|
property< vertex_color_t, default_color_type >,
|
|
property< edge_weight_t, int >
|
|
> Graph;
|
|
Graph g(N, used_by, used_by + nedges, weights);
|
|
|
|
write_graphviz(std::cout, g, make_label_writer(name));
|
|
}
|
|
</pre>
|
|
|
|
The output will be:
|
|
<pre>
|
|
digraph G {
|
|
0 -> 4;
|
|
0 -> 6;
|
|
0 -> 1;
|
|
0 [label="dax.h"];
|
|
1 -> 6;
|
|
1 -> 11;
|
|
1 [label="yow.h"];
|
|
2 -> 6;
|
|
2 -> 9;
|
|
2 -> 11;
|
|
2 [label="boz.h"];
|
|
3 -> 4;
|
|
3 [label="zow.h"];
|
|
4 -> 5;
|
|
4 [label="foo.cpp"];
|
|
5 -> 8;
|
|
5 [label="foo.o"];
|
|
6 -> 7;
|
|
6 [label="bar.cpp"];
|
|
7 -> 8;
|
|
7 [label="bar.o"];
|
|
8 -> 13;
|
|
8 [label="libfoobar.a"];
|
|
9 -> 10;
|
|
9 [label="zig.cpp"];
|
|
10 -> 13;
|
|
10 [label="zig.o"];
|
|
11 -> 12;
|
|
11 [label="zag.cpp"];
|
|
12 -> 13;
|
|
12 [label="zag.o"];
|
|
13 -> 14;
|
|
13 [label="libzigzag.a"];
|
|
14;
|
|
14 [label="killerapp"];
|
|
edge[style="dotted"];
|
|
6 -> 0;
|
|
}
|
|
</pre>
|
|
|
|
|
|
<h3>See Also</h3>
|
|
|
|
<a href="./read-graphviz.html"><tt>read_graphviz</tt></a>
|
|
|
|
<h3>Notes</h3>
|
|
Note that you can use Graphviz dot file write facilities
|
|
without the library <tt>libbglviz.a</tt>.
|
|
|
|
<br>
|
|
<HR>
|
|
<TABLE>
|
|
<TR valign=top>
|
|
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
|
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
|
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
|
</TD></TR></TABLE>
|
|
|
|
</BODY>
|
|
</HTML>
|