2010-05-31 71 views
1

我使用的是ruby-graphviz寶石,我試圖繪製二叉樹。我想使用record shape,這樣每個節點都可以有左,中,右場,因此,如果有兩個邊離開一個節點,則可以區分左邊和右邊。紅寶石GraphViz二叉樹記錄

我試圖通過連接字段名稱來指定字段,如下所示:@node1.name + ":left"但這並不奏效。指定該字段的正確方法是什麼?

require 'rubygems' 
require 'graphviz' 

@graph = GraphViz.new(:G, :type => :digraph) 

@node1 = @graph.add_node("1", 
    "shape" => "record", 
    "label" => "<left>|<f1> 1|<right>") 

@node2 = @graph.add_node("2", 
    "shape" => "record", 
    "label" => "<left>|<f1> 2|<right>") 

@graph.add_edge(@node1.name + ":left", @node2) 

# generate a random filename 
filename = "/tmp/#{(0...8).map{65.+(rand(25)).chr}.join}.png" 
@graph.output(:png => filename) 
exec "open #{filename}" 

回答

1

以下是我最後做它:

@graph.add_edge(@node1, @node2, :tailport => "left") 
1
的GraphViz的文檔中

,你可以看到一個節點ID不能以數字開頭。所以,如果你改變你的代碼,並替換這兩個節點的名稱(1和2)通過任何其他ID由字母或下劃線開始,它的工作原理:

require 'rubygems' 
require 'graphviz' 

@graph = GraphViz.new(:G, :type => :digraph) 

@node1 = @graph.add_node("A1", 
    "shape" => "record", 
    "label" => "<left>|<f1> 1|<right>") 

@node2 = @graph.add_node("A2", 
    "shape" => "record", 
    "label" => "<left>|<f1> 2|<right>") 

@graph.add_edge(@node1.name + ":left", @node2) 

# generate a random filename 
filename = "/tmp/#{(0...8).map{65.+(rand(25)).chr}.join}.png" 
@graph.output(:png => filename) 
exec "open #{filename}" 

也許我需要更換的GraphViz ::節點#名由GraphViz的::節點#ID

格雷格

+2

Oups!我錯了...如果ID只有一個數字(匹配[ - ]?(。[0-9] + | [0-9] +(。[0-9] * )?))我只是在lib中進行了更正!這是一個錯誤! – greg 2010-05-31 11:58:09