Search in sources :

Example 6 with Node

use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.

the class VerticalCoordinateAssigner method horizontalAlignmentLeftBottommost.

/**
 * alignment by left median neighbors, resolving conflicts in a bottommost
 * fashion.
 */
private void horizontalAlignmentLeftBottommost() {
    for (int i = 0; i < m_layers.size(); i++) {
        int r = m_layers.size();
        for (int k = m_layers.get(i).size() - 1; k >= 0; k--) {
            Node vk = m_layers.get(i).get(k);
            ArrayList<Node> neighbors = getNeighbors(vk, true);
            if (!neighbors.isEmpty()) {
                int d = neighbors.size();
                int m1 = (int) Math.floor((d + 1) / 2.0) - 1;
                int m2 = (int) Math.ceil((d + 1) / 2.0) - 1;
                for (int m = m2; m >= m1; m--) {
                    if (m_align.get(vk) == vk) {
                        Node um = neighbors.get(m);
                        if (!m_marked.get(um.getEdge(vk)) && r > m_pos.get(um)) {
                            m_align.put(um, vk);
                            m_root.put(vk, m_root.get(um));
                            m_align.put(vk, m_root.get(vk));
                            r = m_pos.get(um);
                        }
                    }
                }
            }
        }
    }
}
Also used : Node(org.knime.workbench.ui.layout.Graph.Node)

Example 7 with Node

use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.

the class VerticalCoordinateAssigner method run.

/**
 * runs vertical coordinate assignment as described in the article.
 */
public void run() {
    // preprocessing
    markConflicts();
    // run alignment and compaction 4 times, once for each directional
    // choice
    initNodeMaps();
    horizontalAlignmentLeftTopmost();
    verticalCompaction();
    storeCoordinates(m_yLT);
    initNodeMaps();
    horizontalAlignmentLeftBottommost();
    verticalCompaction();
    storeCoordinates(m_yLB);
    initNodeMaps();
    horizontalAlignmentRightTopmost();
    verticalCompaction();
    storeCoordinates(m_yRT);
    initNodeMaps();
    horizontalAlignmentRightBottommost();
    verticalCompaction();
    storeCoordinates(m_yRB);
    initNodeMaps();
    // balance between 4 alignments
    balance();
    // set final coordinates
    for (Node n : m_g.nodes()) {
        m_g.setY(n, m_y.get(n));
    }
}
Also used : Node(org.knime.workbench.ui.layout.Graph.Node)

Example 8 with Node

use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.

the class VerticalCoordinateAssigner method markConflicts.

/*
     * Functions needed for first phase
     */
/**
 * mark conflicting edges.
 */
private void markConflicts() {
    if (m_layers.size() < 4) {
        // no conflicts possible since there cannot be any inner segments
        return;
    }
    // next-to-last and last layer
    for (int i = 1; i < m_layers.size() - 2; i++) {
        int k0 = 0;
        int l = 0;
        for (int l1 = 0; l1 < m_layers.get(i + 1).size(); l1++) {
            Node vl1 = m_layers.get(i + 1).get(l1);
            Edge innerSegment = getInnerSegmentIncidentTo(vl1);
            if (l1 == m_layers.get(i + 1).size() - 1 || innerSegment != null) {
                int k1 = m_layers.get(i).size() - 1;
                if (innerSegment != null) {
                    k1 = m_layers.get(i).indexOf(innerSegment.opposite(vl1));
                }
                while (l <= l1) {
                    Node vl = m_layers.get(i + 1).get(l);
                    for (Edge e : m_g.inEdges(vl)) {
                        Node vk = e.opposite(vl);
                        int k = m_layers.get(i).indexOf(vk);
                        if (k < k0 || k > k1) {
                            m_marked.put(e, true);
                        }
                    }
                    l++;
                }
                k0 = k1;
            }
        }
    }
}
Also used : Node(org.knime.workbench.ui.layout.Graph.Node) Edge(org.knime.workbench.ui.layout.Graph.Edge)

Example 9 with Node

use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.

the class VerticalCoordinateAssigner method horizontalAlignmentRightBottommost.

/**
 * alignment by right median neighbors, resolving conflicts in a bottommost
 * fashion.
 */
private void horizontalAlignmentRightBottommost() {
    for (int i = m_layers.size() - 1; i >= 0; i--) {
        int r = m_layers.size();
        for (int k = m_layers.get(i).size() - 1; k >= 0; k--) {
            Node vk = m_layers.get(i).get(k);
            ArrayList<Node> neighbors = getNeighbors(vk, false);
            if (!neighbors.isEmpty()) {
                int d = neighbors.size();
                int m1 = (int) Math.floor((d + 1) / 2.0) - 1;
                int m2 = (int) Math.ceil((d + 1) / 2.0) - 1;
                for (int m = m2; m >= m1; m--) {
                    if (m_align.get(vk) == vk) {
                        Node um = neighbors.get(m);
                        if (!m_marked.get(um.getEdge(vk)) && r > m_pos.get(um)) {
                            m_align.put(um, vk);
                            m_root.put(vk, m_root.get(um));
                            m_align.put(vk, m_root.get(vk));
                            r = m_pos.get(um);
                        }
                    }
                }
            }
        }
    }
}
Also used : Node(org.knime.workbench.ui.layout.Graph.Node)

Example 10 with Node

use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.

the class VerticalCoordinateAssigner method horizontalAlignmentRightTopmost.

/**
 * alignment by right median neighbors, resolving conflicts in a topmost
 * fashion.
 */
private void horizontalAlignmentRightTopmost() {
    for (int i = m_layers.size() - 1; i >= 0; i--) {
        int r = -1;
        for (int k = 0; k < m_layers.get(i).size(); k++) {
            Node vk = m_layers.get(i).get(k);
            ArrayList<Node> neighbors = getNeighbors(vk, false);
            if (!neighbors.isEmpty()) {
                int d = neighbors.size();
                int m1 = (int) Math.floor((d + 1) / 2.0) - 1;
                int m2 = (int) Math.ceil((d + 1) / 2.0) - 1;
                for (int m = m1; m <= m2; m++) {
                    if (m_align.get(vk) == vk) {
                        Node um = neighbors.get(m);
                        if (!m_marked.get(um.getEdge(vk)) && r < m_pos.get(um)) {
                            m_align.put(um, vk);
                            m_root.put(vk, m_root.get(um));
                            m_align.put(vk, m_root.get(vk));
                            r = m_pos.get(um);
                        }
                    }
                }
            }
        }
    }
}
Also used : Node(org.knime.workbench.ui.layout.Graph.Node)

Aggregations

Node (org.knime.workbench.ui.layout.Graph.Node)21 Edge (org.knime.workbench.ui.layout.Graph.Edge)5 ArrayList (java.util.ArrayList)4 Graph (org.knime.workbench.ui.layout.Graph)3 HashMap (java.util.HashMap)2 Point2D (java.awt.geom.Point2D)1 Point (org.eclipse.draw2d.geometry.Point)1 ConnectionID (org.knime.core.node.workflow.ConnectionID)1 ConnectionUIInformation (org.knime.core.node.workflow.ConnectionUIInformation)1 NodeID (org.knime.core.node.workflow.NodeID)1 NodeUIInformation (org.knime.core.node.workflow.NodeUIInformation)1 ConnectionContainerUI (org.knime.core.ui.node.workflow.ConnectionContainerUI)1 NodeContainerUI (org.knime.core.ui.node.workflow.NodeContainerUI)1 SimpleLayeredLayouter (org.knime.workbench.ui.layout.layeredlayout.SimpleLayeredLayouter)1