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 tooltip=None):
00054 """
00055 creates a node item for this factory, adds it to the graph.
00056 Node name can vary from label but must always be same for the same node label
00057 """
00058 if nodename is None or nodename == '':
00059 raise ValueError('Empty Node name')
00060 if nodelabel is None:
00061 nodelabel = nodename
00062
00063 kwargs = {}
00064 if tooltip is not None:
00065 kwargs['tooltip'] = tooltip
00066 if color is not None:
00067 kwargs['color'] = color
00068
00069 graph.add_node(nodename, label=str(nodelabel), shape=shape, url=url, **kwargs)
00070
00071 def add_subgraph_to_graph(self,
00072 graph,
00073 subgraphlabel,
00074 rank='same',
00075 simplify=True,
00076 rankdir='TB',
00077 ranksep=0.2,
00078 compound=True,
00079 color=None,
00080 shape='box',
00081 style='bold'):
00082 """
00083 creates a cluster subgraph item for this factory, adds it to the graph.
00084 cluster name can vary from label but must always be same for the same node label.
00085 Most layouters require cluster names to start with cluster.
00086 """
00087 if subgraphlabel is None or subgraphlabel == '':
00088 raise ValueError('Empty subgraph label')
00089
00090 sg = graph.add_subgraph(name="cluster_%s" % subgraphlabel, ranksep=ranksep, rankdir=rankdir, rank=rank, compound=compound, label=str(subgraphlabel), style=style, color=color)
00091
00092 return sg
00093
00094 def add_edge_to_graph(self, graph, nodename1, nodename2, label=None, url=None, simplify=True, style=None):
00095 kwargs = {'url': url}
00096 if label is not None:
00097 kwargs['label'] = label
00098 if style is not None:
00099 kwargs['style'] = style
00100 graph.add_edge(nodename1, nodename2, **kwargs)
00101
00102 def create_dot(self, graph):
00103 graph.layout('dot')
00104
00105 return graph.string().replace("\\\n", "")