00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 import pygraphviz
00034
00035
00036
00037 class PygraphvizFactory():
00038
00039 def __init__(self):
00040 pass
00041
00042 def get_graph(self, graph_type='digraph', rank='same', simplify=True, rankdir='TB', ranksep=0.2, compound=True):
00043 graph = pygraphviz.AGraph(directed=(graph_type == 'digraph'), ranksep=ranksep, rankdir=rankdir, rank=rank, compound=True, simplify=simplify)
00044 return graph
00045
00046 def add_node_to_graph(self,
00047 graph,
00048 nodename,
00049 nodelabel=None,
00050 shape='box',
00051 color=None,
00052 url=None):
00053 """
00054 creates a node item for this factory, adds it to the graph.
00055 Node name can vary from label but must always be same for the same node label
00056 """
00057 if nodename is None or nodename == '':
00058 raise ValueError('Empty Node name')
00059 if nodelabel is None:
00060 nodelabel = nodename
00061 if color is not None:
00062 graph.add_node(nodename, label=str(nodelabel), shape=shape, url=url, color=color)
00063 else:
00064 graph.add_node(nodename, label=str(nodelabel), shape=shape, url=url)
00065
00066 def add_subgraph_to_graph(self,
00067 graph,
00068 subgraphlabel,
00069 rank='same',
00070 simplify=True,
00071 rankdir='TB',
00072 ranksep=0.2,
00073 compound=True,
00074 color=None,
00075 shape='box',
00076 style='bold'):
00077 """
00078 creates a cluster subgraph item for this factory, adds it to the graph.
00079 cluster name can vary from label but must always be same for the same node label.
00080 Most layouters require cluster names to start with cluster.
00081 """
00082 if subgraphlabel is None or subgraphlabel == '':
00083 raise ValueError('Empty subgraph label')
00084
00085 sg = graph.add_subgraph(name="cluster_%s" % subgraphlabel, ranksep=ranksep, rankdir=rankdir, rank=rank, compound=compound, label=str(subgraphlabel), style=style, color=color)
00086
00087 return sg
00088
00089 def add_edge_to_graph(self, graph, nodename1, nodename2, label=None, url=None, simplify=True, style=None):
00090 kwargs = {'url': url}
00091 if label is not None:
00092 kwargs['label'] = label
00093 if style is not None:
00094 kwargs['style'] = style
00095 graph.add_edge(nodename1, nodename2, **kwargs)
00096
00097 def create_dot(self, graph):
00098 graph.layout('dot')
00099
00100 return graph.string().replace("\\\n", "")