boost::write_graphviz - 如何横向生成图形

4
我将尝试生成一张显示水平图表的.dot文件,使用Boost Graph库。创建图表时,我的代码如下:
struct VertexP {
    std::string tag;
};

struct EdgeP {
    std::string symbol;
};

struct GraphP{
    std::string orientation;
};

typedef boost::adjacency_list<boost::vecS,
        boost::vecS, boost::directedS,
        VertexP, EdgeP, GraphP> Graph;

GraphP property;
property.orientation = "LR";
Graph graph(property);
// Then fill the graph

我正在使用以下代码来生成.dot文件:

Graph g = creator.AutomatonToGraph(&automaton);
ofstream dot_file("automaton.dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("label", get(&EdgeP::symbol, g));

write_graphviz_dp(dot_file, g, dp);

这段代码可以完美地将节点和边缘标签写入.dot文件,但我的问题是我想将rankdir=LR图形属性添加到输出文件中。我尝试过:

Graph g = creator.AutomatonToGraph(&automaton);
ofstream dot_file("automaton.dot");
dynamic_properties dp;
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("label", get(&EdgeP::symbol, g));
dp.property("rankdir", get(&GraphP::orientation, g));

write_graphviz_dp(dot_file, g, dp);

但是我遇到了一大堆错误,从这个开始:
/src/lab2.cc:48:55:   required from here
/usr/include/boost/graph/detail/adjacency_list.hpp:2585:29: error: forming reference to void
         typedef value_type& reference;
                             ^~~~~~~~~

我对使用BGL非常陌生,我哪里做错了吗?

1个回答

1

阅读dynamic_graph_properties_writer的实现后,我发现你可能只需要这样做:

    dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("LR")));

对于动态检索,您可以使用函数属性映射:(将set/get请求映射到C++类/结构更改):

#include <boost/property_map/function_property_map.hpp>

    dp.property("rankdir", boost::make_function_property_map<Graph*>([](Graph const* g) { return g->m_property->orientation; }));

演示

查看 在Wandbox上实时运行

#include <boost/graph/adj_list_serialize.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/property_map/function_property_map.hpp>
#include <fstream>
using namespace boost;

struct VertexP { std::string tag; };
struct EdgeP { std::string symbol; };
struct GraphP { std::string orientation; };

typedef adjacency_list<vecS, vecS, directedS, VertexP, EdgeP, GraphP> Graph;

int main() {
    Graph g(GraphP{"LR"});
    // Then fill the graph
    add_edge(
        add_vertex(VertexP{ "tag1" }, g),
        add_vertex(VertexP{ "tag2" }, g),
        EdgeP{ "symbol" }, g
    );

    {
        std::ofstream dot_file("automaton.dot");
        dynamic_properties dp;
        dp.property("node_id", get(&VertexP::tag, g));
        dp.property("label", get(&VertexP::tag, g));
        dp.property("label", get(&EdgeP::symbol, g));
        dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("LR")));
        dp.property("dummy", boost::make_function_property_map<Graph*>([](Graph const* g) { return g->m_property->orientation; }));

        write_graphviz_dp(dot_file, g, dp);
    }
}

Which writes

digraph G {
dummy=LR;
rankdir=LR;
tag2 [label=tag2];
tag1 [label=tag1];
tag1->tag2  [label=symbol];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接