def build(cls, tree, separate=False): DiagramNode.clear() DiagramEdge.clear() NodeGroup.clear() diagram = DiagramTreeBuilder().build(tree) DiagramLayoutManager(diagram).run() diagram.fixiate(True) if diagram.orientation == 'portrait': cls.rotate_diagram(diagram) return diagram
def instantiate(self, group, tree, lane=None): for stmt in tree.stmts: if isinstance(stmt, parser.Node): node = DiagramNode.get(stmt.id) node.set_attributes(stmt.attrs) self.belong_to(node, lane) elif isinstance(stmt, parser.Edge): from_nodes = [DiagramNode.get(n) for n in stmt.from_nodes] to_nodes = [DiagramNode.get(n) for n in stmt.to_nodes] for node in from_nodes + to_nodes: self.belong_to(node, lane) for node1 in from_nodes: for node2 in to_nodes: edge = DiagramEdge.get(node1, node2) edge.set_dir(stmt.edge_type) edge.set_attributes(stmt.attrs) elif isinstance(stmt, parser.Lane): _lane = NodeGroup.get(stmt.id) if _lane not in self.diagram.lanes: self.diagram.lanes.append(_lane) self.instantiate(group, stmt, _lane) elif isinstance(stmt, parser.Attr): if lane: lane.set_attribute(stmt) else: self.diagram.set_attribute(stmt) elif isinstance(stmt, parser.Extension): if stmt.type == 'class': name = unquote(stmt.name) Diagram.classes[name] = stmt if stmt.type == 'plugin': self.diagram.set_plugin(stmt.name, stmt.attrs) elif isinstance(stmt, parser.Statements): self.instantiate(group, stmt, lane) group.update_order() return group