pydotfactory.py
Go to the documentation of this file.
00001 # Software License Agreement (BSD License)
00002 #
00003 # Copyright (c) 2008, Willow Garage, Inc.
00004 # All rights reserved.
00005 #
00006 # Redistribution and use in source and binary forms, with or without
00007 # modification, are permitted provided that the following conditions
00008 # are met:
00009 #
00010 #  * Redistributions of source code must retain the above copyright
00011 #    notice, this list of conditions and the following disclaimer.
00012 #  * Redistributions in binary form must reproduce the above
00013 #    copyright notice, this list of conditions and the following
00014 #    disclaimer in the documentation and/or other materials provided
00015 #    with the distribution.
00016 #  * Neither the name of Willow Garage, Inc. nor the names of its
00017 #    contributors may be used to endorse or promote products derived
00018 #    from this software without specific prior written permission.
00019 #
00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00031 # POSSIBILITY OF SUCH DAMAGE.
00032 
00033 import pydot
00034 import urllib
00035 from distutils.version import LooseVersion
00036 
00037 
00038 # Reference implementation for a dotcode factory
00039 class PydotFactory():
00040 
00041     def __init__(self):
00042         pass
00043 
00044     def escape_label(self, name):
00045         if name in ['graph', 'subgraph', 'node', 'edge']:
00046             ret = "%s_" % name
00047         else:
00048             ret = name
00049         return ret
00050 
00051     def escape_name(self, name):
00052         ret = urllib.quote(name.strip())
00053         ret = ret.replace('/', '_')
00054         ret = ret.replace('%', '_')
00055         ret = ret.replace('-', '_')
00056         return self.escape_label(ret)
00057 
00058     def get_graph(self, graph_type='digraph', rank='same', simplify=True, rankdir='TB', ranksep=0.2, compound=True):
00059         # Lucid version of pydot bugs with certain settings, not sure which version exactly fixes those
00060         if LooseVersion(pydot.__version__) > LooseVersion('1.0.10'):
00061             graph = pydot.Dot('graphname',
00062                               graph_type=graph_type,
00063                               rank=rank,
00064                               rankdir=rankdir,
00065                               simplify=simplify
00066                               )
00067             graph.set_ranksep(ranksep)
00068             graph.set_compound(compound)
00069         else:
00070             graph = pydot.Dot('graphname',
00071                               graph_type=graph_type,
00072                               rank=rank,
00073                               rankdir=rankdir)
00074         return graph
00075 
00076     def add_node_to_graph(self,
00077                           graph,
00078                           nodename,
00079                           nodelabel=None,
00080                           shape='box',
00081                           color=None,
00082                           url=None):
00083         """
00084         creates a node item for this factory, adds it to the graph.
00085         Node name can vary from label but must always be same for the same node label
00086         """
00087         if nodename is None or nodename == '':
00088             raise ValueError('Empty Node label')
00089         if nodelabel is None:
00090             nodelabel = nodename
00091         node = pydot.Node(self.escape_name(nodelabel))
00092         node.set_shape(shape)
00093         node.set_label(self.escape_label(nodelabel))
00094         if url is not None:
00095             node.set_URL(self.escape_name(url))
00096         if color is not None:
00097             node.set_color(color)
00098         graph.add_node(node)
00099 
00100     def add_subgraph_to_graph(self,
00101                               graph,
00102                               subgraphlabel,
00103                               rank='same',
00104                               simplify=True,
00105                               rankdir='TB',
00106                               ranksep=0.2,
00107                               compound=True,
00108                               color=None,
00109                               shape='box',
00110                               style='bold'):
00111         """
00112         creates a cluster subgraph  item for this factory, adds it to the graph.
00113         cluster name can vary from label but must always be same for the same node label.
00114         Most layouters require cluster names to start with cluster.
00115         """
00116         if subgraphlabel is None or subgraphlabel == '':
00117             raise ValueError('Empty subgraph label')
00118         g = pydot.Cluster(self.escape_name(subgraphlabel), rank=rank, rankdir=rankdir, simplify=simplify)
00119         if 'set_style' in g.__dict__:
00120             g.set_style(style)
00121         if 'set_shape' in g.__dict__:
00122             g.set_shape(shape)
00123         if LooseVersion(pydot.__version__) > LooseVersion('1.0.10'):
00124             g.set_compound(compound)
00125             g.set_ranksep(ranksep)
00126         g.set_label(subgraphlabel)
00127         if 'set_color' in g.__dict__:
00128             if color is not None:
00129                 g.set_color(color)
00130         graph.add_subgraph(g)
00131         return g
00132 
00133     def add_edge_to_graph(self, graph, nodename1, nodename2, label=None, url=None, simplify=True, style=None):
00134         if simplify and LooseVersion(pydot.__version__) < LooseVersion('1.0.10'):
00135             if graph.get_edge(self.escape_name(nodename1), self.escape_name(nodename2)) != []:
00136                 return
00137         edge = pydot.Edge(self.escape_name(nodename1), self.escape_name(nodename2))
00138         if label is not None and label != '':
00139             edge.set_label(label)
00140         if url is not None:
00141             edge.set_URL(self.escape_name(url))
00142         if style is not None:
00143             edge.set_style(style)
00144         graph.add_edge(edge)
00145 
00146     def create_dot(self, graph):
00147         dot = graph.create_dot()
00148         # sadly pydot generates line wraps cutting between numbers
00149         return dot.replace("\\\n", "")


qt_dotgraph
Author(s): Thibault Kruse
autogenerated on Fri Jan 3 2014 11:44:08