4

Boostグラフライブラリを使用して、エッジのポート識別子を取得することは可能ですか?

例:を呼び出した後read_graphviz、このグラフの端を反復処理して、それらを出力node_idできます-「A-> B、A->B」を取得します。「A:p0-> B:p1、A:p0-> B:p2」のようなものを印刷するにはどうすればよいですか?

digraph G {
    A [label="A|<p0>p0"];
    B [label="B|<p1>p1|<p2>p2"];

    A:p0 -> B:p1;
    A:p0 -> B:p2;
}

有向グラフGのレンダリング

4

1 に答える 1

4

read_graphviz_new.hppソースから:

struct edge_info {
  node_and_port source;
  node_and_port target;
  properties props;
};

node_and_portこのように見える場所:

struct node_and_port {
  node_name name;
  std::string angle; // Or empty if no angle
  std::vector<std::string> location; // Up to two identifiers
  // ...
}

以下を使用してパーサーを直接呼び出すと、これらの結果が利用可能になると思います(ただし検証はしていません)。

 void parse_graphviz_from_string(const std::string& str, parser_result& result, bool want_directed);

名前空間でboost::read_graphviz_detail。直接dynamic_property_map使用する場合にも利用できる場合があります。read_graphviz内部的にはを参照しread_graphviz_newます。


注:では、 :graphviz.hppに基づいて2つのgraphvizパーサーのいずれかが選択されます。#ifdef

#ifdef BOOST_GRAPH_USE_SPIRIT_PARSER
  return read_graphviz_spirit(data.begin(), data.end(), graph, dp, node_id);
#else // Non-Spirit parser
  return read_graphviz_new(data,graph,dp,node_id);
#endif

私がこれを正しく読んでいるなら、非精神パーサーはあなたが望むものです。スピリットベースのものは、ポートを無視しているように見えます。

とにかく、これはブーストv。1.44のソースをざっと見ただけに基づいています。私にとって、関心のあるコードはに住んでい/usr/include/boost/graph/detail/read_graphviz_new.hppます。私はこれをテストしていませんが、すべての配管がそこにあるようです。

于 2011-03-06T05:36:59.037 に答える