Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
 def bind_edges(self, group):
     for node in group.nodes:
         if isinstance(node, DiagramNode):
             group.edges += DiagramEdge.find(node)
         else:
             self.bind_edges(node)