Allow node to cluster edges

pull/407/head^2
Bruno Meneguello 5 years ago
parent dc330102d5
commit 496a69cb4f

@ -115,7 +115,9 @@ class Diagram:
self.dot = Digraph(self.name, filename=self.filename) self.dot = Digraph(self.name, filename=self.filename)
self._nodes = {} self._nodes = {}
self._edges = {}
self.dot.attr(compound="true")
# Set attributes. # Set attributes.
for k, v in self._default_graph_attrs.items(): for k, v in self._default_graph_attrs.items():
self.dot.graph_attr[k] = v self.dot.graph_attr[k] = v
@ -155,6 +157,17 @@ class Diagram:
for nodeid, node in self._nodes.items(): for nodeid, node in self._nodes.items():
self.dot.node(nodeid, label=node['label'], **node['attrs']) self.dot.node(nodeid, label=node['label'], **node['attrs'])
for nodes, edge in self._edges.items():
node1, node2 = nodes
nodeid1, nodeid2 = node1.nodeid, node2.nodeid
if hasattr(node1, '_nodes') and node1._nodes:
edge._attrs['ltail'] = nodeid1
nodeid1 = next(iter(node1._nodes.keys()))
if hasattr(node2, '_nodes') and node2._nodes:
edge._attrs['lhead'] = nodeid2
nodeid2 = next(iter(node2._nodes.keys()))
self.dot.edge(nodeid1, nodeid2, **edge.attrs)
self.render() self.render()
# Remove the graphviz file leaving only the image. # Remove the graphviz file leaving only the image.
os.remove(self.filename) os.remove(self.filename)
@ -193,7 +206,7 @@ class Diagram:
def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None: def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None:
"""Connect the two Nodes.""" """Connect the two Nodes."""
self.dot.edge(node.nodeid, node2.nodeid, **edge.attrs) self._edges[(node, node2)] = edge
def subgraph(self, dot: Digraph) -> None: def subgraph(self, dot: Digraph) -> None:
"""Create a subgraph for clustering""" """Create a subgraph for clustering"""
@ -387,16 +400,16 @@ class Node:
self._diagram.node(self._id, self.label, **self._attrs) self._diagram.node(self._id, self.label, **self._attrs)
def __enter__(self): def __enter__(self):
setcluster(self)
self.name = "cluster_" + self.label
self.dot = Digraph(self.name)
self._nodes = {}
if self._cluster: if self._cluster:
self._cluster.remove_node(self._id) self._cluster.remove_node(self._id)
else: else:
self._diagram.remove_node(self._id) self._diagram.remove_node(self._id)
setcluster(self)
self._id = "cluster_" + self.label
self.dot = Digraph(self._id)
self._nodes = {}
# Set attributes. # Set attributes.
for k, v in self._default_graph_attrs.items(): for k, v in self._default_graph_attrs.items():
self.dot.graph_attr[k] = v self.dot.graph_attr[k] = v
@ -421,7 +434,7 @@ class Node:
def __exit__(self, exc_type, exc_value, traceback): def __exit__(self, exc_type, exc_value, traceback):
for nodeid, node in self._nodes.items(): for nodeid, node in self._nodes.items():
self.dot.node(nodeid, label=node['label'], **node['attrs']) self.dot.node(nodeid, label=node['label'], **node['attrs'])
if self._cluster: if self._cluster:
self._cluster.subgraph(self.dot) self._cluster.subgraph(self.dot)
else: else:

Loading…
Cancel
Save