mxHierarchicalLayout игнорирует isVertexMovable

В JGraphX ​​большинство алгоритмов компоновки не перемещают вершины, которые не являются подвижными. К сожалению, mxHierarchicalLayout игнорирует, является ли вершина подвижной или нет. Я обнаружил, что этот макет alogrithm вообще не использует isVertexMovable. Где я должен добавить проверку, если вершина подвижна или нет.

Позиции, которые я пробовал, создавали бесконечный цикл или не имели никакого эффекта.

[Редактировать]

public void execute(Object parent, List<Object> roots)
{
    super.execute(parent);
    mxIGraphModel model = graph.getModel();
    // If the roots are set and the parent is set, only
    // use the roots that are some dependent of the that
    // parent.
    // If just the root are set, use them as-is
    // If just the parent is set use it's immediate
    // children as the initial set

    if (roots == null && parent == null)
    {
        // TODO indicate the problem
        return;
    }

    if (roots != null && parent != null)
    {
        for (Object root : roots)
        {
            if (!model.isAncestor(parent, root))
            {
                roots.remove(root);
            }
        }
    }

    this.roots = roots;

    model.beginUpdate();
    try
    {
        run(parent);

        if (isResizeParent() && !graph.isCellCollapsed(parent))
        {
            graph.updateGroupBounds(new Object[] { parent }, getParentBorder(), isMoveParent());
        }
    }
    finally
    {
        model.endUpdate();
    }
}



/**
 * The API method used to exercise the layout upon the graph description
 * and produce a separate description of the vertex position and edge
 * routing changes made.
 */
public void run(Object parent)
{
    // Separate out unconnected hierarchies
    List<Set<Object>> hierarchyVertices = new ArrayList<Set<Object>>();
    Set<Object> allVertexSet = new LinkedHashSet<Object>();

    if (this.roots == null && parent != null)
    {
        Set<Object> filledVertexSet = filterDescendants(parent);

        this.roots = new ArrayList<Object>();

        while (!filledVertexSet.isEmpty())
        {
            List<Object> candidateRoots = findRoots(parent, filledVertexSet);

            for (Object root : candidateRoots)
            {
                Set<Object> vertexSet = new LinkedHashSet<Object>();

                for (Object o : vertexSet)
                {
                    vertexSet.remove(o);
                }
                hierarchyVertices.add(vertexSet);

                traverse(root, true, null, allVertexSet, vertexSet, hierarchyVertices, filledVertexSet);

            }

            this.roots.addAll(candidateRoots);
        }
    }
    else
    {
        // Find vertex set as directed traversal from roots
        for (int i = 0; i < roots.size(); i++)
        {
            Set<Object> vertexSet = new LinkedHashSet<Object>();

            for (Object o : vertexSet)
            {
                vertexSet.remove(o);
            }


            hierarchyVertices.add(vertexSet);

            traverse(roots.get(i), true, null, allVertexSet, vertexSet, hierarchyVertices, null);
        }
    }

    // Iterate through the result removing parents who have children in this layout

    // Perform a layout for each separate hierarchy
    // Track initial coordinate x-positioning
    double initialX = 0;
    Iterator<Set<Object>> iter = hierarchyVertices.iterator();

    while (iter.hasNext())
    {
        Set<Object> vertexSet = iter.next();

        this.model = new mxGraphHierarchyModel(this, vertexSet.toArray(), roots, parent);

        cycleStage(parent);
        layeringStage();
        crossingStage(parent);
        initialX = placementStage(initialX, parent);
    }
}

1 ответ

Решение

В иерархическом макете в JGraphX ​​(и я его автор) очень трудно учитывать вершины, которые нельзя перемещать в макете. Если эти вершины зафиксированы в положении, которое не позволяет легко распределить ранг, используемые алгоритмы просто не будут работать.

Можно игнорировать вершины в макете, но это совсем другое дело по сравнению с тем, чтобы не делать их подвижными.

Таким образом, короткий ответ заключается в том, что невозможно принять во внимание подвижный флаг в этом макете с используемыми алгоритмами. Если есть конкретный случай для этой функциональности, который не принесет пользы общему читателю, я предлагаю поднять проблему на трекере проблем проекта github, а не расширенное обсуждение здесь

Другие вопросы по тегам