def draw(self, path: str, format: str = "raw") -> None: node_aggr = {} for node in self._nodes: level = node.get_level() label = node.get_label() identifier = node.get_id() if node_aggr.get(level) is None: node_aggr[level] = {} if level != 0: gv_cluster = GVCluster(identifier) gv_cluster.set("label", label) node_aggr[level][identifier] = gv_cluster else: gv_node = GVNode(identifier) gv_node.set("label", label) node_aggr[level][identifier] = gv_node gv_dot = GVDot() gv_dot.set("ranksep", "1.0 equally") if self._lable is not None: gv_dot.set("label", self._lable) for node in self._nodes: level = node.get_level() parent = node.get_parent() parent_level = node.get_parent_level() identifier = node.get_id() if level != 0: if parent is not None: node_aggr[parent_level][parent].add_subgraph(node_aggr[level][identifier]) else: gv_dot.add_subgraph(node_aggr[level][identifier]) else: if parent is not None: node_aggr[parent_level][parent].add_node(node_aggr[level][identifier]) else: gv_dot.add_node(node_aggr[level][identifier]) for edge in self._edges: label = edge.get_label() gv_edge = GVEdge(edge.get_src(), edge.get_dst()) if label is not None: gv_edge.set("label", edge.get_label()) gv_dot.add_edge(gv_edge) gv_dot.write(path, format=format)
def add_node_rek(node): """Recurses through the workflow graph and adds nodes and edges. Repeated nodes are ignored (cycle detection). :type node: core.tree.Node """ name = node.getName() if name in known_nodes: return known_nodes[name] dot_node = Node(name=name) g.add_node(dot_node) known_nodes[name] = dot_node logg.debug("created node %s", name) try: true_next_id = node.getTrueId() except: true_next_id = None if true_next_id: true_next = workflow.getStep(true_next_id) true_dot_next = add_node_rek(true_next) true_label = node.getTrueLabel() or " " g.add_edge(true_edge(dot_node, true_dot_next, label=true_label)) logg.debug("created True edge: %s -> %s", name, true_next_id) try: false_next_id = node.getFalseId() except: false_next_id = None if false_next_id: false_next = workflow.getStep(false_next_id) false_dot_next = add_node_rek(false_next) false_label = node.getFalseLabel() or " " g.add_edge( false_edge(dot_node, false_dot_next, label=false_label)) logg.debug("created False edge: %s -> %s", name, false_next_id) if not (true_next_id or false_next_id): # end node with no connections dot_node.set("color", "#04B45F") return dot_node
def add_node_rek(node): """Recurses through the workflow graph and adds nodes and edges. Repeated nodes are ignored (cycle detection). :type node: core.tree.Node """ name = node.getName() if name in known_nodes: return known_nodes[name] dot_node = Node(name=name) g.add_node(dot_node) known_nodes[name] = dot_node logg.debug("created node %s", name) try: true_next_id = node.getTrueId() except: true_next_id = None if true_next_id: true_next = workflow.getStep(true_next_id) true_dot_next = add_node_rek(true_next) true_label = node.getTrueLabel() or " " g.add_edge(true_edge(dot_node, true_dot_next, label=true_label)) logg.debug("created True edge: %s -> %s", name, true_next_id) try: false_next_id = node.getFalseId() except: false_next_id = None if false_next_id: false_next = workflow.getStep(false_next_id) false_dot_next = add_node_rek(false_next) false_label = node.getFalseLabel() or " " g.add_edge(false_edge(dot_node, false_dot_next, label=false_label)) logg.debug("created False edge: %s -> %s", name, false_next_id) if not (true_next_id or false_next_id): # end node with no connections dot_node.set("color", "#04B45F") return dot_node
# node2 = Node("b") # node3 = Node("c"); # edge1 = Edge(node1, node2) # edge2 = Edge(node2, node3) # edge3 = Edge(node1, node3) # graph.add_edge(edge1) # graph.add_edge(edge2) # graph.add_edge(edge3) # graph.write_png("primer1_graph.png") graph = Dot(graph_type = "digraph", rankdir = "BT") graph.set_node_defaults(style = "filled", fillcolor = "grey") node1 = Node("Nastavnik", color = "green") node2 = Node("Student", color = "blue") node1.set("shape", "record") graph.add_node(node1) graph.add_node(node2) edge1 = Edge(node1, node2, label = "Predaje", color = "red") graph.add_edge(edge1) graph.write_png("primer2_graph.png") #Zadatak graph = Dot(graph_type = "digraph", rankdir = "BT") graph.set_node_defaults(shape = "record") teacher = Node("Teacher", label = "{Nastavnik|+ime:String \n+prezime:String|\n}") course = Node("Course", label = "{Kurs|\n|\n}") student = Node("Student", label = "{Student|\n|\n}") lesson = Node("Lesson", label = "{Predavanja|\n|\n}") tutorial = Node("Tutorial", label = "{Konsultacije|\n |\n}") assessment = Node("Assessment", label = "{Ocenjivanje|\n|\n}")