2012-01-04 16 views
2

Graphvizをライブラリ(C++)として使用しています。私はノードとそれぞれのエッジの座標を計算するためにGraphvizが必要です。自分自身をレンダリングしています(Graphvizのレンダラーを使用していない)。私のノードは長方形で、幅と高さが定義されています(ピクセル単位)。Graphviz APIに関する質問(ライブラリとしてのGraphviz)

agopenでグラフを作成します。次に、ノードノードと、エッジがのノードとのノードを作成します。次に、私が知る限り、座標を計算するためにgvLayoutを使用する必要があります。

は今、私が知っている必要があります:

  1. gvLayoutを使用する前に、ノードの長方形幅と高さを指定する方法は?

  2. gvLayoutの後、ノードとスプラインのエッジの計算座標を取得するにはどうすればよいですか?

  3. ノード(および対応するエッジ)またはエッジをグラフ(Agraph_t)から削除するには、これをまったく行うことはできますか?

  4. 私はagnodeagedgeでノードやエッジを作成するときに(私はグラフで終わりだとき)、私はクリーンアップのためにそれらを削除/解放する必要はありませんか?または、を閉じて暗黙にを処理しますか?

重要:私は(つまり、テキストなどのパラメータを取得する)、テキストベースのインターフェイスを使用したくない、私は上記のパラメータ(幅およびノー​​ドの高さ、エッジのスプライン、ノードの座標にアクセスしたいです...)を直接データ変数として使用します。

答えて

3

をチェック詳細についてQ2

for (n = agfstnode(g); n; n = agnxtnode(n)) { /* do something with n */ } 

Q3

Agnode_t *n; 
n = agnode(g, "some_specific_node_name_to_find", FALSE); 
agdelnode(n); 

onse:

1)ノードの幅は複数のプロパティによって決まります。 "width"属性は最小幅を指定します。ノード内のラベルまたはイメージの幅。ラベル周辺のマージンの「margin」属性。周辺の数。実際に幅を修正したい場合は、 は "width"属性を目的の値に設定し、 "fixedsize"を1に設定します。上記のように、属性はagset関数で設定します。ノードのagnodeattr関数。または、操作を組み合わせたagsafesetを使用します。

2)nがノードポインタの場合、その位置はND_coord(n)の(x、y)ペアとして格納されます。eがエッジポインタである場合、値ED_spl(e)は、3次Bスプラインを記述する構造体の配列を含む構造体を指し示します。 bz = ED_spl(e) - > list [0]の場合、* bzにはポイント数、ポイント、およびエッジに頭に矢印があるかどうかに関する情報が含まれています。 /またはテール。これらの値の意味は次のようになります。 here

3)グラフgからノードnを削除するには、agdelete(g、n);を使用します。

4)グラフ上でagcloseを呼び出すと、自動的にすべてのノードとエッジが解放されます。 gvLayoutを呼び出した場合は、最初にgvFreeLayoutを呼び出してレイアウトを行うために割り当てられたデータを解放する必要があります。

thisドキュメントが役に立ちました。

1

Q1

agset (void* pointer_to_component, char* name_of_attribute, char* value_of_attribute) 
gsafeset which has the same signature. 

前RESPにもう少し詳細を追加Agraph API tutorial

+0

答えていただきありがとうございます:)しかし... Q1 - agsetとagsafesetはオプションをテキスト値として設定します。私が言及したように、私は別の解決策が必要です。 Q2 -/* n * /で何かしてください。どうすればいいのですか(やり方)は私の質問でした。 Q3 - 対応するノードの1つが削除されると、エッジは自動的に削除されますか? –

1

Q1:あなたが幅を設定し、それを修正する必要があります。

agsafeset(node, "width", "1"); 
agsafeset(node, "fixedsize", "1", ""); 

あなたがそれを固定した後、幅を変更すると、と「幅」設定する前に、「0」と「固定サイズ」を呼び出すようにしてください新しい値

Q2:代わりND_coord(n)を用いて、以下のはあまりにも動作します:

node->u.coord.x 
node->graph->u.bb.UR.y - node->u.coord.y 

の行をベジェする縁をラップするために、例えば見ていますhttp://mupuf.org/blog/article/34/、私はそれに基づいてCGMutablePathRefに変換しました(興味があれば)。

Q3 & Q4エムデンの答えを見てください。