2013-11-22 61 views
4

我想一個標籤在我的圖表添加到每個邊緣,如下所示:添加標籤在nodebox圖形的邊緣opnegl

enter image description here

基本上上面的標籤爲每個邊的中心:

enter image description here

我試圖添加標籤時,我添加的邊緣到每個曲線圖中,像這樣(在圖g):

g.add_edge(... label=edge.distance ...) 

經過一番研究,我發現這樣的標籤在Nodebox 1, which only works for Mac下是可能的,從文檔看來似乎沒有合適的替代Nodebox-OpenGL。錯誤我收到:

Traceback (most recent call last): 
    File "C:\foo\bar\baz\Imager.py", line 29, in <module> 
    g.add_edge(edge.fr, edge.to, length=edge.distance, weight=2, stroke=color(1.0, 0.2, 0.0), label="cheese") 
    File "C:\Python27\lib\site-packages\nodebox\graphics\physics.py", line 1254, in add_edge 
    e2 = e2(n1, n2, *args, **kwargs) 
TypeError: __init__() got an unexpected keyword argument 'label' 

您可以重現該問題:

from nodebox.graphics import * 
from nodebox.graphics.physics import Node, Edge, Graph 

# Create a graph with randomly connected nodes. 
# Nodes and edges can be styled with fill, stroke, strokewidth parameters. 
# Each node displays its id as a text label, stored as a Text object in Node.text. 
# To hide the node label, set the text parameter to None. 
g = Graph() 
# Random nodes. 
for i in range(50): 
    g.add_node(id=str(i+1), 
     radius = 5, 
     stroke = color(0), 
      text = color(0)) 
# Random edges. 
for i in range(75): 
    node1 = choice(g.nodes) 
    node2 = choice(g.nodes) 
    g.add_edge(node1, node2, 
     length = 1.0, 
     weight = random(), 
     stroke = color(0), 
     label = "Placeholder") #!!!!!!!!!!!!! ADDING THE label HERE 

# Two handy tricks to prettify the layout: 
# 1) Nodes with a higher weight (i.e. incoming traffic) appear bigger. 
for node in g.nodes: 
    node.radius = node.radius + node.radius*node.weight 
# 2) Nodes with only one connection ("leaf" nodes) have a shorter connection. 
for node in g.nodes: 
    if len(node.edges) == 1: 
     node.edges[0].length *= 0.1 

g.prune(depth=0)   # Remove orphaned nodes with no connections. 
g.distance   = 10 # Overall spacing between nodes. 
g.layout.force  = 0.01 # Strength of the attractive & repulsive force. 
g.layout.repulsion = 15 # Repulsion radius. 

dragged = None 
def draw(canvas): 

    canvas.clear() 
    background(1) 
    translate(250, 250) 

    # With directed=True, edges have an arrowhead indicating the direction of the connection. 
    # With weighted=True, Node.centrality is indicated by a shadow under high-traffic nodes. 
    # With weighted=0.0-1.0, indicates nodes whose centrality > the given threshold. 
    # This requires some extra calculations. 
    g.draw(weighted=0.5, directed=True) 
    g.update(iterations=10) 

    # Make it interactive! 
    # When the mouse is pressed, remember on which node. 
    # Drag this node around when the mouse is moved. 
    dx = canvas.mouse.x - 250 # Undo translate(). 
    dy = canvas.mouse.y - 250 
    global dragged 
    if canvas.mouse.pressed and not dragged: 
     dragged = g.node_at(dx, dy) 
    if not canvas.mouse.pressed: 
     dragged = None 
    if dragged: 
     dragged.x = dx 
     dragged.y = dy 

canvas.size = 500, 500 
canvas.run(draw) 

所以,問題仍然存在,怎麼能一個標籤在Nodebox的OpenGL添加到圖形的邊緣?

+0

CBG @games,將雅心發佈完整回溯? –

+0

@KDawG嘿。已更新,但追蹤不會幫助你。錯誤很明顯。 –

回答

1

正如您在source中看到的,對於add_edge沒有參數label。 (搜索class Edge(object):

我能看到的最好的方法是創建從官方Edge類增加了使用

​​

textpath(string, x=0, y=0, fontname=None, fontsize=None, fontweight=None) 
一個文本( label)導出自己的 MyEdge

中的draw()方法。

編輯 心靈的add_edge方法文檔字符串:

def add_edge(self, id1, id2, *args, **kwargs): 
    """ Appends a new Edge to the graph. 
     An optional base parameter can be used to pass a subclass of Edge: 
     Graph.add_edge("cold", "winter", base=IsPropertyOf) 
    """