|
@@ -36,6 +36,10 @@ def getcluster() -> "Cluster": |
|
|
def setcluster(cluster: "Cluster"): |
|
|
def setcluster(cluster: "Cluster"): |
|
|
__cluster.set(cluster) |
|
|
__cluster.set(cluster) |
|
|
|
|
|
|
|
|
|
|
|
def getIconLabel(iconPath: str = '', iconSize: int = 30, label: str = ''): |
|
|
|
|
|
return '<<table border="0" width="100%"><tr><td fixedsize="true" width="' + str( |
|
|
|
|
|
iconSize) + '" height="' + str( |
|
|
|
|
|
iconSize) + '"><img src="' + iconPath + '" /></td><td>' + label + '</td></tr></table>>' |
|
|
|
|
|
|
|
|
class Diagram: |
|
|
class Diagram: |
|
|
__directions = ("TB", "BT", "LR", "RL") |
|
|
__directions = ("TB", "BT", "LR", "RL") |
|
@@ -197,7 +201,6 @@ class Diagram: |
|
|
else: |
|
|
else: |
|
|
self.dot.render(format=self.outformat, view=self.show, quiet=True) |
|
|
self.dot.render(format=self.outformat, view=self.show, quiet=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Cluster: |
|
|
class Cluster: |
|
|
__directions = ("TB", "BT", "LR", "RL") |
|
|
__directions = ("TB", "BT", "LR", "RL") |
|
|
__bgcolors = ("#E5F5FD", "#EBF3E7", "#ECE8F6", "#FDF7E3") |
|
|
__bgcolors = ("#E5F5FD", "#EBF3E7", "#ECE8F6", "#FDF7E3") |
|
@@ -228,18 +231,27 @@ class Cluster: |
|
|
:param label: Cluster label. |
|
|
:param label: Cluster label. |
|
|
:param direction: Data flow direction. Default is 'left to right'. |
|
|
:param direction: Data flow direction. Default is 'left to right'. |
|
|
:param graph_attr: Provide graph_attr dot config attributes. |
|
|
:param graph_attr: Provide graph_attr dot config attributes. |
|
|
|
|
|
:param providerIconNode: Provide a node to be included as a link |
|
|
|
|
|
:param icon_size: The icon size |
|
|
""" |
|
|
""" |
|
|
if graph_attr is None: |
|
|
if graph_attr is None: |
|
|
graph_attr = {} |
|
|
graph_attr = {} |
|
|
self.label = label |
|
|
self.label = label |
|
|
self.name = "cluster_" + self.label |
|
|
self.name = "cluster_" + self.label |
|
|
|
|
|
self.providerIconNode = providerIconNode |
|
|
|
|
|
self.icon_size = icon_size |
|
|
|
|
|
|
|
|
self.dot = Digraph(self.name) |
|
|
self.dot = Digraph(self.name) |
|
|
|
|
|
|
|
|
# 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 |
|
|
self.dot.graph_attr["label"] = self.label |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if self.providerIconNode: |
|
|
|
|
|
_iconNode = self.providerIconNode() #load the object |
|
|
|
|
|
self.dot.graph_attr["label"] = getIconLabel(_iconNode._load_icon(), self.icon_size, self.label) |
|
|
|
|
|
else: |
|
|
|
|
|
self.dot.graph_attr["label"] = self.label |
|
|
|
|
|
|
|
|
if not self._validate_direction(direction): |
|
|
if not self._validate_direction(direction): |
|
|
raise ValueError(f'"{direction}" is not a valid direction') |
|
|
raise ValueError(f'"{direction}" is not a valid direction') |
|
@@ -273,6 +285,7 @@ class Cluster: |
|
|
def _validate_direction(self, direction: str) -> bool: |
|
|
def _validate_direction(self, direction: str) -> bool: |
|
|
return direction.upper() in self.__directions |
|
|
return direction.upper() in self.__directions |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def node(self, nodeid: str, label: str, **attrs) -> None: |
|
|
def node(self, nodeid: str, label: str, **attrs) -> None: |
|
|
"""Create a new node in the cluster.""" |
|
|
"""Create a new node in the cluster.""" |
|
|
self.dot.node(nodeid, label=label, **attrs) |
|
|
self.dot.node(nodeid, label=label, **attrs) |
|
@@ -292,6 +305,9 @@ class Node: |
|
|
|
|
|
|
|
|
_height = 1.9 |
|
|
_height = 1.9 |
|
|
|
|
|
|
|
|
|
|
|
def __new__(cls, *args, **kwargs): |
|
|
|
|
|
return object.__new__(cls) |
|
|
|
|
|
|
|
|
def __init__(self, label: str = "", *, nodeid: str = None, **attrs: Dict): |
|
|
def __init__(self, label: str = "", *, nodeid: str = None, **attrs: Dict): |
|
|
"""Node represents a system component. |
|
|
"""Node represents a system component. |
|
|
|
|
|
|
|
|