0

プログラムの依存スキームをドットのダイグラフとして構築しようとしています。したがって、次のコードを使用しました。

digraph LINK { 
    rankdir=LR; 
    ranksep=0.65;
    nodesep=0.40;
    splines=false; 
    overlap=false;
    concentrate=false; 
    node[shape=box]; 
    subgraph clusterAPP {
            label="Application"; 
            style=dashed; 
            nodeA[label="d = func(...);"]; 

    }; 
    subgraph clusterFB{
            color=red;
            label="Wrapper"; 
            style=dashed; 
            rank=same; 
            wrapper[label="wrapper"]; 
            real[label="pointer to\nreal func"]; 
            wrapper -> real [constraint=false,label="dlopen\ndlsym"]; 
    }
    subgraph clusterBACKEND {
            label="Backend"
            style=dashed; 
            func[label="float func(...)"]; 
    };
    nodeA -> wrapper; 
    real -> func[weight=10];  
    func->real[color=blue]; 
}

これにより、ここに画像の説明を入力

問題は次のとおりです。

  • realとの間の辺がfunc重なっています。それらを簡単に認識できるように分離するにはどうすればよいですか。
  • wrapperからのエッジrealが間違った方向に向いているのはなぜですか?
4

1 に答える 1

1

あなたの最初の質問への答えは、Stackoverflowの他の場所ですでに与えられています。要するに、ポートの位置を使用するか、悪名高いマラペットが言及したトリックを使用して、同じ方向に余分なエッジを追加し、その制約を削除して、エッジの方向を逆にして、後ろ向きのエッジを非表示にします。

またはコードに入れるには:

real -> func [weight=10]                    // Remains unaltered  
real -> func [constraint=false, dir=back]   // Remove the constraint and reverse the edge
func -> real [style=invis]                  // Hide the edge pointing pack

もう一方のエッジが間違った方向を向いている理由については、これはに関するバグに関係してconstraintおり、バージョン で修正する必要があります2.27。古いバージョンで作業している可能性があります。(多くの *NIX パッケージ マネージャーはまだデフォルトで 2.26.X を持っているので、私はそうです)。

これを修正するには、Graphviz を新しいバージョンに手動で更新するか、(既に新しいバージョンを持っているか、更新できない/更新したくない場合)dir=backそのノード属性に追加する必要があります。

すべてをまとめると、結果は次のようになります。

ここに画像の説明を入力

次の DOT コードを使用します。

digraph LINK { 
    rankdir=LR; 
    ranksep=0.65;
    nodesep=0.40;
    splines=false; 
    overlap=false;
    concentrate=false; 
    node[shape=box]; 
    subgraph clusterAPP {
            label="Application"; 
            style=dashed; 
            nodeA[label="d = func(...);"]; 

    }; 
    subgraph clusterFB{
            color=red;
            label="Wrapper"; 
            style=dashed; 
            rank=same; 
            wrapper[label="wrapper"]; 
            real[label="pointer to\nreal func"]; 
    }
    subgraph clusterBACKEND {
            label="Backend"
            style=dashed; 
            func[label="float func(...)"]; 
    };

    nodeA -> wrapper; 
    wrapper -> real [constraint=false, dir=back, label="dlopen\ndlsym"];  // Added reverse direction
    real -> func [weight=10]                    // Remains unaltered  
    real -> func [constraint=false, dir=back]   // Remove the constraint and reverse the edge
    func -> real [style=invis]                  // Hide the edge pointing pack

}
于 2013-10-25T14:34:30.657 に答える