Allow for empty "Node as Cluster" to render as Node

pull/407/head^2
Bruno Meneguello 5 years ago
parent 0115211b34
commit fc9ac5bfae

@ -116,9 +116,10 @@ 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._edges = {}
self._subgraphs = []
self.dot.attr(compound="true")
# Set attributes. # Set attributes.
self.dot.attr(compound="true")
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
self.dot.graph_attr["label"] = self.name self.dot.graph_attr["label"] = self.name
@ -157,6 +158,9 @@ 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 dot in self._subgraphs:
self.dot.subgraph(dot)
for nodes, edge in self._edges.items(): for nodes, edge in self._edges.items():
node1, node2 = nodes node1, node2 = nodes
nodeid1, nodeid2 = node1.nodeid, node2.nodeid nodeid1, nodeid2 = node1.nodeid, node2.nodeid
@ -210,7 +214,7 @@ class Diagram:
def subgraph(self, dot: Digraph) -> None: def subgraph(self, dot: Digraph) -> None:
"""Create a subgraph for clustering""" """Create a subgraph for clustering"""
self.dot.subgraph(dot) self._subgraphs.append(dot)
def render(self) -> None: def render(self) -> None:
self.dot.render(format=self.outformat, view=self.show, quiet=True) self.dot.render(format=self.outformat, view=self.show, quiet=True)
@ -261,6 +265,7 @@ class Cluster:
self.dot = Digraph(self.name) self.dot = Digraph(self.name)
self._nodes = {} self._nodes = {}
self._subgraphs = []
# Set attributes. # Set attributes.
for k, v in self._default_graph_attrs.items(): for k, v in self._default_graph_attrs.items():
@ -302,6 +307,9 @@ class Cluster:
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 dot in self._subgraphs:
self.dot.subgraph(dot)
if self._parent: if self._parent:
self._parent.subgraph(self.dot) self._parent.subgraph(self.dot)
else: else:
@ -323,7 +331,7 @@ class Cluster:
del self._nodes[nodeid] del self._nodes[nodeid]
def subgraph(self, dot: Digraph) -> None: def subgraph(self, dot: Digraph) -> None:
self.dot.subgraph(dot) self._subgraphs.append(dot)
class Node: class Node:
@ -400,15 +408,10 @@ 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):
if self._cluster:
self._cluster.remove_node(self._id)
else:
self._diagram.remove_node(self._id)
setcluster(self) setcluster(self)
self._id = "cluster_" + self._id self.dot = Digraph()
self.dot = Digraph(self._id)
self._nodes = {} self._nodes = {}
self._subgraphs = []
# Set attributes. # Set attributes.
for k, v in self._default_graph_attrs.items(): for k, v in self._default_graph_attrs.items():
@ -432,9 +435,23 @@ class Node:
return self return self
def __exit__(self, exc_type, exc_value, traceback): def __exit__(self, exc_type, exc_value, traceback):
if not (self._nodes or self._subgraphs):
return
if self._cluster:
self._cluster.remove_node(self._id)
else:
self._diagram.remove_node(self._id)
self._id = "cluster_" + self._id
self.dot.name = self._id
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 dot in self._subgraphs:
self.dot.subgraph(dot)
if self._cluster: if self._cluster:
self._cluster.subgraph(self.dot) self._cluster.subgraph(self.dot)
else: else:
@ -456,7 +473,7 @@ class Node:
del self._nodes[nodeid] del self._nodes[nodeid]
def subgraph(self, dot: Digraph) -> None: def subgraph(self, dot: Digraph) -> None:
self.dot.subgraph(dot) self._subgraphs.append(dot)
def __repr__(self): def __repr__(self):
_name = self.__class__.__name__ _name = self.__class__.__name__

Loading…
Cancel
Save