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