Увеличить графическую библиотеку, исправить размер узла - PullRequest
1 голос
/ 25 февраля 2020

Я строю граф с помощью библиотеки графов Boost и Graphviz. В моем коде у меня есть класс, который экспортирует график в формат .dot. Я настраиваю свойства графа следующими строками:

dynamic_properties dp;

dp.property("rankdir", boost::make_constant_property<Graph*>(std::string("TB")));
dp.property("node_id", get(&VertexP::tag, m_graph));
dp.property("label", get(&VertexP::tag, m_graph));
dp.property("shape", get(&VertexP::shape, m_graph));
dp.property("style", get(&VertexP::style, m_graph));
dp.property("pos", get(&VertexP::pos, m_graph));
dp.property("label", get(&ArrowP::symbol, m_graph));
dp.property("color", get(&ArrowP::color, m_graph));
dp.property("style", get(&ArrowP::style, m_graph));
write_graphviz_dp(ss, m_graph, dp);

Я пытаюсь использовать ключевое слово fixedsize для graphviz и ключевые слова width и height, чтобы зафиксировать размер моего узла (они имеют разные размеры в зависимости от количества текста в метке).

Я бы хотел настроить его из метода dp.property. Цель состоит в том, чтобы добавить следующую строку в мой документ .dot:

node [ fixedsize = true, width = 1.1, height = 1.1]

Я пробовал следующее, но оно не работает:

dp.property("fixedsize", boost::make_constant_property<VertexP*>(std::string("true")));
dp.property("width", boost::make_constant_property<VertexP*>(std::string("1")));
dp.property("height", boost::make_constant_property<VertexP*>(std::string("1")));

Знаете ли вы, как Я могу установить атрибут fixedsize для моей вершины в файле точек из dp.property.

1 Ответ

0 голосов
/ 26 февраля 2020

На картах свойств key_type (boost::property_traits<PMap>::key_type) сообщает библиотеке, к какому типу объекта принадлежит свойство:

  • graph_traits<G>::vertex_descriptor присоединяет атрибут к объектам типа узла (вершины)
  • graph_traits<G>::edge_descriptor прикрепляет атрибуты к ребрам
  • G* прикрепляет атрибуты на уровне графа

Поэтому вам нужно использовать vertex_descriptor вместо VertexP* для этих карт:

dp.property("fixedsize", boost::make_constant_property<Graph::vertex_descriptor>(+"true"));
dp.property("width",     boost::make_constant_property<Graph::vertex_descriptor>(1));
dp.property("height",    boost::make_constant_property<Graph::vertex_descriptor>(1));

Обратите внимание, что используются потоковые операции по умолчанию, поэтому нет необходимости специально конвертировать в std::string

Обратите внимание, что что атрибуты записываются во временные потоки, поэтому std::boolalpha не учитывается. Также обратите внимание, что использование строкового литерала приведет к созданию экземпляра карты свойств с char const(&)[5], поэтому используется +"true" (с уменьшением до char const*).

Full Demo

Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>

struct VertexP {
    std::string tag, shape, style, pos;
};

struct ArrowP {
    std::string symbol, color, style;
};

using Graph = boost::adjacency_list<
    boost::vecS, boost::vecS, boost::directedS,
    VertexP, ArrowP>;

int main() {
    Graph g;

    boost::dynamic_properties dp;
    dp.property("rankdir", boost::make_constant_property<Graph*>(+"TB"));
    dp.property("node_id", get(&VertexP::tag,   g));
    dp.property("label",   get(&VertexP::tag,   g));
    dp.property("shape",   get(&VertexP::shape, g));
    dp.property("style",   get(&VertexP::style, g));
    dp.property("pos",     get(&VertexP::pos,   g));
    dp.property("label",   get(&ArrowP::symbol, g));
    dp.property("color",   get(&ArrowP::color,  g));
    dp.property("style",   get(&ArrowP::style,  g));

    dp.property("fixedsize", boost::make_constant_property<Graph::vertex_descriptor>(+"true"));
    dp.property("width",     boost::make_constant_property<Graph::vertex_descriptor>(1));
    dp.property("height",    boost::make_constant_property<Graph::vertex_descriptor>(1));

    add_edge(
            add_vertex({"foo", "diamond", "dotted", "0,1"}, g),
            add_vertex({"bar", "circle", "dashed", "1,1"}, g),
            {"foo-bar", "blue", "dashed"},
            g);

    write_graphviz_dp(std::cout, g, dp);
}

Печать

digraph G {
rankdir=TB;
bar [fixedsize=true, height=1, label=bar, pos="1,1", shape=circle, style=dashed, width=1];
foo [fixedsize=true, height=1, label=foo, pos="0,1", shape=diamond, style=dotted, width=1];
foo->bar  [color=blue, label="foo-bar", style=dashed];
}
...