def compare_child_node_order(self, parent, node1, node2): def compare(x, y): x = x.duplicate() y = y.duplicate() while x.node1 == y.node1 and x.node1.group is not None: x.node1 = x.node1.group y.node1 = y.node1.group # cmp x.node1.order and y.node1.order if x.node1.order < y.node1.order: return -1 elif x.node1.order == y.node1.order: return 0 else: return 1 edges = (DiagramEdge.find(parent, node1) + DiagramEdge.find(parent, node2)) edges.sort(key=cmp_to_key(compare)) if len(edges) == 0: return 0 elif edges[0].node2 == node2: return 1 else: return -1
def run(self): for i, group in enumerate(self._groups): base = self.diagram.duplicate() base.level = group.level - 1 # bind edges on base diagram (outer the group) edges = (DiagramEdge.find(None, group) + DiagramEdge.find(group, None)) base.edges = self._filter_edges(edges, self.diagram, group.level) # bind edges on target group (inner the group) subgroups = group.traverse_groups() edges = sum([g.edges for g in subgroups], group.edges) group.edges = [] for e in self._filter_edges(edges, group, group.level): if isinstance(e.node1, NodeGroup) and e.node1 == e.node2: pass else: group.edges.append(e) # clear subgroups in the group for g in group.nodes: if isinstance(g, NodeGroup): g.nodes = [] g.edges = [] g.separated = True # pick up nodes to base diagram nodes1 = [e.node1 for e in DiagramEdge.find(None, group)] nodes1.sort(key=lambda x: x.order) nodes2 = [e.node2 for e in DiagramEdge.find(group, None)] nodes2.sort(key=lambda x: x.order) nodes = nodes1 + [group] + nodes2 for i, n in enumerate(nodes): n.order = i if n not in base.nodes: base.nodes.append(n) n.group = base if isinstance(group, Diagram): base = group DiagramLayoutManager(base).run() base.fixiate(True) EdgeLayoutManager(base).run() yield base
def get_parent_node_ypos(self, parent, child): heights = [] for e in DiagramEdge.find(parent, child): y = parent.xy.y node = e.node1 while node != parent: y += node.xy.y node = node.group heights.append(y) if heights: return min(heights) else: return None
def bind_edges(self, group): for node in group.nodes: if isinstance(node, DiagramNode): group.edges += DiagramEdge.find(node) else: self.bind_edges(node)