graphviz.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 463 行 · 第 1/2 页

HPP
463
字号
  template <typename Graph>  attributes_writer    <typename property_map<Graph, vertex_attribute_t>::const_type>  make_vertex_attributes_writer(const Graph& g)  {    typedef typename property_map<Graph, vertex_attribute_t>::const_type      VertexAttributeMap;    return attributes_writer<VertexAttributeMap>(get(vertex_attribute, g));  }  template <typename Graph, typename VertexPropertiesWriter,            typename EdgePropertiesWriter, typename GraphPropertiesWriter>  inline void write_graphviz(std::ostream& out, const Graph& g,                             VertexPropertiesWriter vpw,                             EdgePropertiesWriter epw,                             GraphPropertiesWriter gpw)  {    typedef typename property_map<Graph, vertex_index_t>::const_type vimap_t;    vimap_t vertex_index = get(vertex_index_t(), g);    typedef typename graph_traits<Graph>::directed_category cat_type;    typedef graphviz_io_traits<cat_type> Traits;    std::string name = "G";    out << Traits::name() << " " << name << " {" << std::endl;    gpw(out); //print graph properties    typename graph_traits<Graph>::vertex_iterator i, end;    for(tie(i,end) = vertices(g); i != end; ++i) {      out << get(vertex_index, *i);      vpw(out, *i); //print vertex attributes      out << ";" << std::endl;    }    typename graph_traits<Graph>::edge_iterator ei, edge_end;    for(tie(ei, edge_end) = edges(g); ei != edge_end; ++ei) {      out << get(vertex_index, source(*ei, g)) << Traits::delimiter() << get(vertex_index, target(*ei, g)) << " ";      epw(out, *ei); //print edge attributes      out << ";" << std::endl;    }    out << "}" << std::endl;  }#if !defined(BOOST_MSVC) || BOOST_MSVC > 1300  // ambiguous overload problem with VC++  template <typename Graph>  inline void  write_graphviz(std::ostream& out, const Graph& g) {    default_writer dw;    default_writer gw;    write_graphviz(out, g, dw, dw, gw);  }#endif  template <typename Graph, typename VertexWriter>  inline void  write_graphviz(std::ostream& out, const Graph& g, VertexWriter vw) {    default_writer dw;    default_writer gw;    write_graphviz(out, g, vw, dw, gw);  }  template <typename Graph, typename VertexWriter, typename EdgeWriter>  inline void  write_graphviz(std::ostream& out, const Graph& g,                 VertexWriter vw, EdgeWriter ew) {    default_writer gw;    write_graphviz(out, g, vw, ew, gw);  }  namespace detail {    template <class Graph_, class RandomAccessIterator>    void write_graphviz_subgraph (std::ostream& out,                                  const subgraph<Graph_>& g,                                  RandomAccessIterator vertex_marker,                                  RandomAccessIterator edge_marker)    {      typedef subgraph<Graph_> Graph;      typedef typename graph_traits<Graph>::vertex_descriptor Vertex;      typedef typename graph_traits<Graph>::directed_category cat_type;      typedef graphviz_io_traits<cat_type> Traits;      typedef typename graph_property<Graph, graph_name_t>::type NameType;      const NameType& g_name = get_property(g, graph_name);      if ( g.is_root() )        out << Traits::name() ;      else        out << "subgraph";      out << " " << g_name << " {" << std::endl;      typename Graph::const_children_iterator i_child, j_child;      //print graph/node/edge attributes#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300      typedef typename graph_property<Graph, graph_graph_attribute_t>::type        GAttrMap;      typedef typename graph_property<Graph, graph_vertex_attribute_t>::type        NAttrMap;      typedef typename graph_property<Graph, graph_edge_attribute_t>::type        EAttrMap;      GAttrMap gam = get_property(g, graph_graph_attribute);      NAttrMap nam = get_property(g, graph_vertex_attribute);      EAttrMap eam = get_property(g, graph_edge_attribute);      graph_attributes_writer<GAttrMap, NAttrMap, EAttrMap> writer(gam, nam, eam);      writer(out);#else      make_graph_attributes_writer(g)(out);#endif      //print subgraph      for ( tie(i_child,j_child) = g.children();            i_child != j_child; ++i_child )        write_graphviz_subgraph(out, *i_child, vertex_marker, edge_marker);      // Print out vertices and edges not in the subgraphs.      typename graph_traits<Graph>::vertex_iterator i, end;      typename graph_traits<Graph>::edge_iterator ei, edge_end;      typename property_map<Graph, vertex_index_t>::const_type        indexmap = get(vertex_index, g.root());      for(tie(i,end) = vertices(g); i != end; ++i) {        Vertex v = g.local_to_global(*i);        int pos = get(indexmap, v);        if ( vertex_marker[pos] ) {          vertex_marker[pos] = false;          out << pos;#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300          typedef typename property_map<Graph, vertex_attribute_t>::const_type            VertexAttributeMap;          attributes_writer<VertexAttributeMap> vawriter(get(vertex_attribute,                                                             g.root()));          vawriter(out, v);#else          make_vertex_attributes_writer(g.root())(out, v);#endif          out << ";" << std::endl;        }      }      for (tie(ei, edge_end) = edges(g); ei != edge_end; ++ei) {        Vertex u = g.local_to_global(source(*ei,g)),          v = g.local_to_global(target(*ei, g));        int pos = get(get(edge_index, g.root()), g.local_to_global(*ei));        if ( edge_marker[pos] ) {          edge_marker[pos] = false;          out << get(indexmap, u) << " " << Traits::delimiter()              << " " << get(indexmap, v);#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300          typedef typename property_map<Graph, edge_attribute_t>::const_type            EdgeAttributeMap;          attributes_writer<EdgeAttributeMap> eawriter(get(edge_attribute, g));          eawriter(out, *ei);#else          make_edge_attributes_writer(g)(out, *ei); //print edge properties#endif          out << ";" << std::endl;        }      }      out << "}" << std::endl;    }  } // namespace detail  // requires graph_name graph property  template <typename Graph>  void write_graphviz(std::ostream& out, const subgraph<Graph>& g) {    std::vector<bool> edge_marker(num_edges(g), true);    std::vector<bool> vertex_marker(num_vertices(g), true);    detail::write_graphviz_subgraph(out, g,                                    vertex_marker.begin(),                                    edge_marker.begin());  }  template <typename Graph>  void write_graphviz(const std::string& filename, const subgraph<Graph>& g) {    std::ofstream out(filename.c_str());    std::vector<bool> edge_marker(num_edges(g), true);    std::vector<bool> vertex_marker(num_vertices(g), true);    detail::write_graphviz_subgraph(out, g,                                    vertex_marker.begin(),                                    edge_marker.begin());  }  typedef std::map<std::string, std::string> GraphvizAttrList;  typedef property<vertex_attribute_t, GraphvizAttrList>          GraphvizVertexProperty;  typedef property<edge_attribute_t, GraphvizAttrList,                   property<edge_index_t, int> >          GraphvizEdgeProperty;  typedef property<graph_graph_attribute_t, GraphvizAttrList,                   property<graph_vertex_attribute_t, GraphvizAttrList,                   property<graph_edge_attribute_t, GraphvizAttrList,                   property<graph_name_t, std::string> > > >          GraphvizGraphProperty;  typedef subgraph<adjacency_list<vecS,                   vecS, directedS,                   GraphvizVertexProperty,                   GraphvizEdgeProperty,                   GraphvizGraphProperty> >          GraphvizDigraph;  typedef subgraph<adjacency_list<vecS,                   vecS, undirectedS,                   GraphvizVertexProperty,                   GraphvizEdgeProperty,                   GraphvizGraphProperty> >          GraphvizGraph;  // These four require linking the BGL-Graphviz library: libbgl-viz.a  // from the /src directory.  extern void read_graphviz(const std::string& file, GraphvizDigraph& g);  extern void read_graphviz(FILE* file, GraphvizDigraph& g);  extern void read_graphviz(const std::string& file, GraphvizGraph& g);  extern void read_graphviz(FILE* file, GraphvizGraph& g);} // namespace boost#endif // BOOST_GRAPHVIZ_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?