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]; 
}

这导致在此处输入图像描述

现在的问题是:

  • 之间的边缘realfunc重叠。我怎样才能将它们分开以使其易于识别。
  • 为什么从边缘wrapperreal错误的方向?
4

1 回答 1

1

您的第一个问题的答案已经在 Stackoverflow的其他地方给出,归结为您可以使用端口位置或使用臭名昭著的marapet提到的技巧在同一方向添加额外的边缘,删除它的约束和反转边缘的方向并隐藏指向后面的边缘。

或者把它放在代码中:

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,应该在 version 中修复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 回答