JUNG - получить положение вершины и сохранить с помощью Graphml - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь изменить макет с CircleLayout на StaticLayout, сохраняя позиции вершины, чтобы сделать это, используя следующий код:

    StaticLayout<VertexType, EdgeType> sLayout = new StaticLayout<VertexType, EdgeType>(graph,
                new Transformer<VertexType, Point2D>() {
                    public Point2D transform(VertexType vertex) {
                        vertex.setX(layout.getX(vertex));
                        vertex.setY(layout.getY(vertex));
                        System.out.println(vertex.toString());
                        System.out.println(vertex.getX());
                        System.out.println(vertex.getY());
                        Point2D p = new Point2D.Double(vertex.getX(), vertex.getY());
                        return p;
                    }
                }, dimension);
        currentVV.setGraphLayout(sLayout);

Где currentVV - VisualizationViewer, а макет - этоCircleLayout.setX (double) и setY (double) являются методами из моей вершины Custon, по умолчанию вершина инициализируется с x = 0.0 и y = 0.0.На этом этапе я использовал println, чтобы проверить, все ли вершины правильно расположены, и это работает.Следующим шагом является сохранение графика с использованием GraphmlWritter:

    GraphMLWriter<VertexType, EdgeType> graphWriter = new GraphMLWriter<VertexType, EdgeType>();
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
        graphWriter.addEdgeData("label", null, "0", new Transformer<EdgeType, String>() {
            @Override
            public String transform(EdgeType v) {
                return v.toString();
            }
        });
        graphWriter.addVertexData("x", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(v.getX());
            }
        });
        graphWriter.addVertexData("y", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(v.getY());
            }
        });
        graphWriter.save(graph, out);

Проблема заключается в том, что, хотя большинство вершин успешно сохраняются, некоторые вершины сохраняются со значениями по умолчанию для X и Y(0.0), и я понятия не имею, почему.Если я пытаюсь сохранить график непосредственно из CircleLayout, получая значения X и Y из макета с помощью:

    GraphMLWriter<VertexType, EdgeType> graphWriter = new GraphMLWriter<VertexType, EdgeType>();
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
        graphWriter.addEdgeData("label", null, "0", new Transformer<EdgeType, String>() {
            @Override
            public String transform(EdgeType v) {
                return v.toString();
            }
        });
        graphWriter.addVertexData("x", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(layout.getX(v));
            }
        });
        graphWriter.addVertexData("y", null, "0", new Transformer<VertexType, String>() {
            public String transform(VertexType v) {
                return Double.toString(layout.getY(v));
            }
        });

Хотя это решение помогает, я бы предпочел сохранить значения X и Y в вершине какэто будет использоваться для будущих реализаций.Кто-нибудь знает, где мне не хватает информации о позиции?Благодаря.

1 Ответ

0 голосов
/ 30 мая 2018

Я не сразу уверен, где ошибка в вашем коде.

Первый вопрос: почему вы пытаетесь преобразовать CircleLayout в StaticLayout?Что это вас покупает?

Предполагая, что это действительно то, что вам нужно сделать, вам вообще не нужно его сериализовывать;Вы можете инициализировать любой подкласс AbstractLayout позициями любого другого экземпляра Layout, потому что Layout есть (среди прочего Function<V, Point2D>, что означает, что вы можете передать его в экземпляр AbstractLayout как "инициализатор"". Так, например:

CircleLayout<V, E> circleLayout = ...
...
StaticLayout<V, E> staticLayout = new StaticLayout(graph, circleLayout);
...