提交 2b2721f7 编写于 作者: M Mathieu Bastian

Update ExportPlugin code to the new GraphAPI

上级 509d6baf
...@@ -16,10 +16,6 @@ ...@@ -16,10 +16,6 @@
<name>ExportPlugin</name> <name>ExportPlugin</name>
<dependencies> <dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>data-attributes-api</artifactId>
</dependency>
<dependency> <dependency>
<groupId>${project.groupId}</groupId> <groupId>${project.groupId}</groupId>
<artifactId>dynamic-api</artifactId> <artifactId>dynamic-api</artifactId>
......
...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderCSV implements GraphFileExporterBuilder { public class ExporterBuilderCSV implements GraphFileExporterBuilder {
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterCSV(); return new ExporterCSV();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
FileType ft = new FileType(".csv", NbBundle.getMessage(ExporterBuilderCSV.class, "fileType_CSV_Name")); FileType ft = new FileType(".csv", NbBundle.getMessage(ExporterBuilderCSV.class, "fileType_CSV_Name"));
return new FileType[]{ft}; return new FileType[]{ft};
} }
@Override
public String getName() { public String getName() {
return "CSV"; return "CSV";
} }
......
...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderGDF implements GraphFileExporterBuilder { public class ExporterBuilderGDF implements GraphFileExporterBuilder {
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterGDF(); return new ExporterGDF();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
FileType ft = new FileType(".gdf", NbBundle.getMessage(ExporterBuilderGDF.class, "fileType_GDF_Name")); FileType ft = new FileType(".gdf", NbBundle.getMessage(ExporterBuilderGDF.class, "fileType_GDF_Name"));
return new FileType[]{ft}; return new FileType[]{ft};
} }
@Override
public String getName() { public String getName() {
return "GDF"; return "GDF";
} }
......
...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderGEXF implements GraphFileExporterBuilder { public class ExporterBuilderGEXF implements GraphFileExporterBuilder {
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterGEXF(); return new ExporterGEXF();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
FileType ft = new FileType(".gexf", NbBundle.getMessage(ExporterBuilderGEXF.class, "fileType_GEXF_Name")); FileType ft = new FileType(".gexf", NbBundle.getMessage(ExporterBuilderGEXF.class, "fileType_GEXF_Name"));
return new FileType[]{ft}; return new FileType[]{ft};
} }
@Override
public String getName() { public String getName() {
return "GEXF"; return "GEXF";
} }
......
...@@ -53,14 +53,17 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -53,14 +53,17 @@ import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderGML implements GraphFileExporterBuilder { public class ExporterBuilderGML implements GraphFileExporterBuilder {
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterGML(); return new ExporterGML();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
return new FileType[]{new FileType(".gml", "GML files")}; return new FileType[]{new FileType(".gml", "GML files")};
} }
@Override
public String getName() { public String getName() {
return "GML exporter"; return "GML exporter";
} }
......
...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderGraphML implements GraphFileExporterBuilder { public class ExporterBuilderGraphML implements GraphFileExporterBuilder {
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterGraphML(); return new ExporterGraphML();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
FileType ft = new FileType(".graphml", NbBundle.getMessage(ExporterBuilderGraphML.class, "fileType_GraphML_Name")); FileType ft = new FileType(".graphml", NbBundle.getMessage(ExporterBuilderGraphML.class, "fileType_GraphML_Name"));
return new FileType[]{ft}; return new FileType[]{ft};
} }
@Override
public String getName() { public String getName() {
return "GraphML"; return "GraphML";
} }
......
...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -54,15 +54,18 @@ import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderPajek implements GraphFileExporterBuilder { public class ExporterBuilderPajek implements GraphFileExporterBuilder {
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterPajek(); return new ExporterPajek();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
FileType ft = new FileType(".net", NbBundle.getMessage(ExporterBuilderCSV.class, "fileType_Pajek_Name")); FileType ft = new FileType(".net", NbBundle.getMessage(ExporterBuilderCSV.class, "fileType_Pajek_Name"));
return new FileType[]{ft}; return new FileType[]{ft};
} }
@Override
public String getName() { public String getName() {
return "Pajek"; return "Pajek";
} }
......
...@@ -53,14 +53,17 @@ import org.openide.util.lookup.ServiceProvider; ...@@ -53,14 +53,17 @@ import org.openide.util.lookup.ServiceProvider;
*/ */
@ServiceProvider(service = GraphFileExporterBuilder.class) @ServiceProvider(service = GraphFileExporterBuilder.class)
public class ExporterBuilderVNA implements GraphFileExporterBuilder{ public class ExporterBuilderVNA implements GraphFileExporterBuilder{
@Override
public GraphExporter buildExporter() { public GraphExporter buildExporter() {
return new ExporterVNA(); return new ExporterVNA();
} }
@Override
public FileType[] getFileTypes() { public FileType[] getFileTypes() {
return new FileType[]{new FileType(".vna", NbBundle.getMessage(ExporterBuilderVNA.class, "fileType_VNA_Name"))}; return new FileType[]{new FileType(".vna", NbBundle.getMessage(ExporterBuilderVNA.class, "fileType_VNA_Name"))};
} }
@Override
public String getName() { public String getName() {
return "vna"; return "vna";
} }
......
/* /*
Copyright 2008-2010 Gephi Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org Website : http://www.gephi.org
This file is part of Gephi. This file is part of Gephi.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
Copyright 2011 Gephi Consortium. All rights reserved. Copyright 2011 Gephi Consortium. All rights reserved.
The contents of this file are subject to the terms of either the GNU The contents of this file are subject to the terms of either the GNU
General Public License Version 3 only ("GPL") or the Common General Public License Version 3 only ("GPL") or the Common
Development and Distribution License("CDDL") (collectively, the Development and Distribution License("CDDL") (collectively, the
"License"). You may not use this file except in compliance with the "License"). You may not use this file except in compliance with the
License. You can obtain a copy of the License at License. You can obtain a copy of the License at
http://gephi.org/about/legal/license-notice/ http://gephi.org/about/legal/license-notice/
or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the
specific language governing permissions and limitations under the specific language governing permissions and limitations under the
License. When distributing the software, include this License Header License. When distributing the software, include this License Header
Notice in each file and include the License files at Notice in each file and include the License files at
/cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the
License Header, with the fields enclosed by brackets [] replaced by License Header, with the fields enclosed by brackets [] replaced by
your own identifying information: your own identifying information:
"Portions Copyrighted [year] [name of copyright owner]" "Portions Copyrighted [year] [name of copyright owner]"
If you wish your version of this file to be governed by only the CDDL If you wish your version of this file to be governed by only the CDDL
or only the GPL Version 3, indicate your decision by adding or only the GPL Version 3, indicate your decision by adding
"[Contributor] elects to include this software in this distribution "[Contributor] elects to include this software in this distribution
under the [CDDL or GPL Version 3] license." If you do not indicate a under the [CDDL or GPL Version 3] license." If you do not indicate a
single choice of license, a recipient has the option to distribute single choice of license, a recipient has the option to distribute
your version of this file under either the CDDL, the GPL Version 3 or your version of this file under either the CDDL, the GPL Version 3 or
to extend the choice of license to its licensees as provided above. to extend the choice of license to its licensees as provided above.
However, if you add GPL Version 3 code and therefore, elected the GPL However, if you add GPL Version 3 code and therefore, elected the GPL
Version 3 license, then the option applies only if the new code is Version 3 license, then the option applies only if the new code is
made subject to such option by the copyright holder. made subject to such option by the copyright holder.
Contributor(s): Contributor(s):
Portions Copyrighted 2011 Gephi Consortium. Portions Copyrighted 2011 Gephi Consortium.
*/ */
package org.gephi.io.exporter.plugin; package org.gephi.io.exporter.plugin;
...@@ -45,19 +45,12 @@ import java.io.IOException; ...@@ -45,19 +45,12 @@ import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.gephi.graph.api.DirectedGraph;
import org.gephi.graph.api.Edge; import org.gephi.graph.api.Edge;
import org.gephi.graph.api.Graph; import org.gephi.graph.api.Graph;
import org.gephi.graph.api.GraphModel; import org.gephi.graph.api.GraphModel;
import org.gephi.graph.api.HierarchicalDirectedGraph;
import org.gephi.graph.api.HierarchicalGraph;
import org.gephi.graph.api.HierarchicalMixedGraph;
import org.gephi.graph.api.HierarchicalUndirectedGraph;
import org.gephi.graph.api.MixedGraph;
import org.gephi.graph.api.Node; import org.gephi.graph.api.Node;
import org.gephi.graph.api.UndirectedGraph;
import org.gephi.io.exporter.spi.GraphExporter;
import org.gephi.io.exporter.spi.CharacterExporter; import org.gephi.io.exporter.spi.CharacterExporter;
import org.gephi.io.exporter.spi.GraphExporter;
import org.gephi.project.api.Workspace; import org.gephi.project.api.Workspace;
import org.gephi.utils.longtask.spi.LongTask; import org.gephi.utils.longtask.spi.LongTask;
import org.gephi.utils.progress.Progress; import org.gephi.utils.progress.Progress;
...@@ -83,6 +76,7 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -83,6 +76,7 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
private boolean cancel = false; private boolean cancel = false;
private ProgressTicket progressTicket; private ProgressTicket progressTicket;
@Override
public boolean execute() { public boolean execute() {
GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class); GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class);
Graph graph = null; Graph graph = null;
...@@ -128,7 +122,7 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -128,7 +122,7 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
} }
} }
for (Edge e : ((HierarchicalGraph) graph).getMetaEdges(n)) { for (Edge e : graph.getEdges(n)) {
if (!e.isDirected() || (e.isDirected() && n == e.getSource())) { if (!e.isDirected() || (e.isDirected() && n == e.getSource())) {
Node m = graph.getOpposite(n, e); Node m = graph.getOpposite(n, e);
neighbours.add(m); neighbours.add(m);
...@@ -143,57 +137,19 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -143,57 +137,19 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
writer.append(EOL); writer.append(EOL);
} }
} else { } else {
if (graph instanceof DirectedGraph) { Node[] nodes = graph.getNodes().toArray();
DirectedGraph directedGraph = (DirectedGraph) graph; for (Node n : nodes) {
Node[] nodes = graph.getNodes().toArray(); if (cancel) {
for (Node n : nodes) { break;
if (cancel) {
break;
}
writeMatrixNode(n, true);
for (int j = 0; j < nodes.length; j++) {
Node m = nodes[j];
Edge e = directedGraph.getEdge(n, m);
e = e == null ? ((HierarchicalDirectedGraph) directedGraph).getMetaEdge(n, m) : e;
writeEdge(e, j < nodes.length - 1);
}
Progress.progress(progressTicket);
writer.append(EOL);
}
} else if (graph instanceof UndirectedGraph) {
UndirectedGraph undirectedGraph = (UndirectedGraph) graph;
Node[] nodes = graph.getNodes().toArray();
for (Node n : nodes) {
if (cancel) {
break;
}
writeMatrixNode(n, true);
for (int j = 0; j < nodes.length; j++) {
Node m = nodes[j];
Edge e = undirectedGraph.getEdge(n, m);
e = e == null ? ((HierarchicalUndirectedGraph) undirectedGraph).getMetaEdge(n, m) : e;
writeEdge(e, j < nodes.length - 1);
}
Progress.progress(progressTicket);
writer.append(EOL);
} }
} else { writeMatrixNode(n, true);
MixedGraph mixedGraph = (MixedGraph) graph; for (int j = 0; j < nodes.length; j++) {
Node[] nodes = graph.getNodes().toArray(); Node m = nodes[j];
for (Node n : graph.getNodes()) { Edge e = graph.getEdge(n, m);
if (cancel) { writeEdge(e, j < nodes.length - 1);
break;
}
writeMatrixNode(n, true);
for (int j = 0; j < nodes.length; j++) {
Node m = nodes[j];
Edge e = mixedGraph.getEdge(n, m);
e = e == null ? ((HierarchicalMixedGraph) mixedGraph).getMetaEdge(n, m) : e;
writeEdge(e, j < nodes.length - 1);
}
Progress.progress(progressTicket);
writer.append(EOL);
} }
Progress.progress(progressTicket);
writer.append(EOL);
} }
} }
...@@ -205,9 +161,9 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -205,9 +161,9 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
private void writeEdge(Edge edge, boolean writeSeparator) throws IOException { private void writeEdge(Edge edge, boolean writeSeparator) throws IOException {
if (edge != null) { if (edge != null) {
if (edgeWeight) { if (edgeWeight) {
writer.append(Float.toString(edge.getWeight())); writer.append(Double.toString(edge.getWeight()));
} else { } else {
writer.append(Float.toString(1f)); writer.append(Double.toString(1.0));
} }
if (writeSeparator) { if (writeSeparator) {
writer.append(SEPARATOR); writer.append(SEPARATOR);
...@@ -225,11 +181,8 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -225,11 +181,8 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
private void writeMatrixNode(Node node, boolean writeSeparator) throws IOException { private void writeMatrixNode(Node node, boolean writeSeparator) throws IOException {
if (header) { if (header) {
String label = node.getNodeData().getLabel(); Object label = node.getId();
if (label == null) { writer.append(label.toString());
label = node.getNodeData().getId();
}
writer.append(label);
if (writeSeparator) { if (writeSeparator) {
writer.append(SEPARATOR); writer.append(SEPARATOR);
} }
...@@ -237,21 +190,20 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -237,21 +190,20 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
} }
private void writeListNode(Node node, boolean writeSeparator) throws IOException { private void writeListNode(Node node, boolean writeSeparator) throws IOException {
String label = node.getNodeData().getLabel(); Object label = node.getId();
if (label == null) { writer.append(label.toString());
label = node.getNodeData().getId();
}
writer.append(label);
if (writeSeparator) { if (writeSeparator) {
writer.append(SEPARATOR); writer.append(SEPARATOR);
} }
} }
@Override
public boolean cancel() { public boolean cancel() {
cancel = true; cancel = true;
return true; return true;
} }
@Override
public void setProgressTicket(ProgressTicket progressTicket) { public void setProgressTicket(ProgressTicket progressTicket) {
this.progressTicket = progressTicket; this.progressTicket = progressTicket;
} }
...@@ -288,22 +240,27 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask { ...@@ -288,22 +240,27 @@ public class ExporterCSV implements GraphExporter, CharacterExporter, LongTask {
this.list = list; this.list = list;
} }
@Override
public boolean isExportVisible() { public boolean isExportVisible() {
return exportVisible; return exportVisible;
} }
@Override
public void setExportVisible(boolean exportVisible) { public void setExportVisible(boolean exportVisible) {
this.exportVisible = exportVisible; this.exportVisible = exportVisible;
} }
@Override
public void setWriter(Writer writer) { public void setWriter(Writer writer) {
this.writer = writer; this.writer = writer;
} }
@Override
public Workspace getWorkspace() { public Workspace getWorkspace() {
return workspace; return workspace;
} }
@Override
public void setWorkspace(Workspace workspace) { public void setWorkspace(Workspace workspace) {
this.workspace = workspace; this.workspace = workspace;
} }
......
...@@ -47,15 +47,14 @@ import java.util.HashMap; ...@@ -47,15 +47,14 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.gephi.data.attributes.api.AttributeModel; import org.gephi.attribute.api.AttributeModel;
import org.gephi.data.attributes.type.TimeInterval;
import org.gephi.dynamic.api.DynamicModel;
import org.gephi.graph.api.*; import org.gephi.graph.api.*;
import org.gephi.io.exporter.spi.CharacterExporter; import org.gephi.io.exporter.spi.CharacterExporter;
import org.gephi.io.exporter.spi.GraphExporter; import org.gephi.io.exporter.spi.GraphExporter;
import org.gephi.project.api.Workspace; import org.gephi.project.api.Workspace;
import org.gephi.utils.longtask.spi.LongTask; import org.gephi.utils.longtask.spi.LongTask;
import org.gephi.utils.progress.ProgressTicket; import org.gephi.utils.progress.ProgressTicket;
import org.openide.util.Lookup;
public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
...@@ -68,9 +67,8 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -68,9 +67,8 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
ProgressTicket progressTicket; ProgressTicket progressTicket;
private boolean useMatrixFormat = false; private boolean useMatrixFormat = false;
private boolean useListFormat = true; private boolean useListFormat = true;
private boolean exportDynamicWeight = true;
private boolean makeSymmetricMatrix = false; private boolean makeSymmetricMatrix = false;
private double getLow;//time interval, used for getting edge weight in dynamic graphs
private double getHigh;
public boolean isMakeSymmetricMatrix() { public boolean isMakeSymmetricMatrix() {
return makeSymmetricMatrix; return makeSymmetricMatrix;
...@@ -109,8 +107,9 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -109,8 +107,9 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
@Override @Override
public boolean execute() { public boolean execute() {
progressTicket.start(); progressTicket.start();
attributeModel = workspace.getLookup().lookup(AttributeModel.class); GraphController graphController = Lookup.getDefault().lookup(GraphController.class);
graphModel = workspace.getLookup().lookup(GraphModel.class); attributeModel = graphController.getAttributeModel(workspace);
graphModel = graphController.getGraphModel(workspace);
Graph graph = null; Graph graph = null;
if (exportVisible) { if (exportVisible) {
graph = graphModel.getGraphVisible(); graph = graphModel.getGraphVisible();
...@@ -127,20 +126,10 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -127,20 +126,10 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
if (cancel) { if (cancel) {
break; break;
} }
useLabels &= (nodeIterable.iterator().next().getNodeData().getLabel() != null); useLabels &= (nodeIterable.iterator().next().getLabel() != null);
} }
System.err.println("use labels " + useLabels); System.err.println("use labels " + useLabels);
//find borders of the interval for edge.getWeight(low, high). If it's a static graph, then (-inf, inf)
DynamicModel dynamicModel = workspace.getLookup().lookup(DynamicModel.class);
TimeInterval visibleInterval = dynamicModel != null && exportVisible ? dynamicModel.getVisibleInterval() : new TimeInterval();
getLow = Double.NEGATIVE_INFINITY;
getHigh = Double.POSITIVE_INFINITY;
if (visibleInterval != null) {
getLow = visibleInterval.getLow();
getHigh = visibleInterval.getHigh();
}
if (!cancel) { if (!cancel) {
try { try {
if (useListFormat) { if (useListFormat) {
...@@ -174,22 +163,22 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -174,22 +163,22 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
private void saveAsEdgeList1(boolean useLabels, Graph graph) throws IOException { private void saveAsEdgeList1(boolean useLabels, Graph graph) throws IOException {
HashMap<Integer, String> idToLabel = new HashMap<Integer, String>();//systemId to changed label HashMap<Object, String> idToLabel = new HashMap<Object, String>();//systemId to changed label
HashSet<String> labelUsed = new HashSet<String>(); HashSet<String> labelUsed = new HashSet<String>();
//edgelist format forbids equal nodes //edgelist format forbids equal nodes
if (useLabels) { if (useLabels) {
for (Node node : graph.getNodes()) { for (Node node : graph.getNodes()) {
if (labelUsed.contains(node.getNodeData().getLabel())) { if (labelUsed.contains(node.getLabel())) {
for (int i = 0;; i++) { for (int i = 0;; i++) {
if (!labelUsed.contains(node.getNodeData().getLabel() + "_" + i)) { if (!labelUsed.contains(node.getLabel() + "_" + i)) {
idToLabel.put(node.getId(), node.getNodeData().getLabel() + "_" + i); idToLabel.put(node.getId(), node.getLabel() + "_" + i);
labelUsed.add(node.getNodeData().getLabel() + "_" + i); labelUsed.add(node.getLabel() + "_" + i);
break; break;
} }
} }
} else { } else {
idToLabel.put(node.getId(), node.getNodeData().getLabel()); idToLabel.put(node.getId(), node.getLabel());
labelUsed.add(node.getNodeData().getLabel()); labelUsed.add(node.getLabel());
} }
} }
} }
...@@ -205,21 +194,29 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -205,21 +194,29 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
break; break;
} }
Edge edge = edgeIterator.iterator().next(); Edge edge = edgeIterator.iterator().next();
double weight;
if (exportDynamicWeight) {
weight = edge.getWeight(graph.getView());
} else {
weight = edge.getWeight();
}
if (useLabels) { if (useLabels) {
writer.write(formatLabel(idToLabel.get(edge.getSource().getId()), false) + " " writer.write(formatLabel(idToLabel.get(edge.getSource().getId()), false) + " "
+ formatLabel(idToLabel.get(edge.getTarget().getId()), false) + " " + edge.getWeight(getLow, getHigh) + "\n"); + formatLabel(idToLabel.get(edge.getTarget().getId()), false) + " " + weight + "\n");
} else { } else {
writer.write(formatLabel(edge.getSource().getNodeData().getId(), false) + " " writer.write(formatLabel(edge.getSource().getId().toString(), false) + " "
+ formatLabel(edge.getTarget().getNodeData().getId(), false) + " " + edge.getWeight(getLow, getHigh) + "\n"); + formatLabel(edge.getTarget().getId().toString(), false) + " " + weight + "\n");
} }
if (!edge.isDirected()) { if (!edge.isDirected()) {
if (useLabels) { if (useLabels) {
writer.write(formatLabel(idToLabel.get(edge.getTarget().getId()), false) + " " writer.write(formatLabel(idToLabel.get(edge.getTarget().getId()), false) + " "
+ formatLabel(idToLabel.get(edge.getSource().getId()), false) + " " + edge.getWeight(getLow, getHigh) + "\n"); + formatLabel(idToLabel.get(edge.getSource().getId()), false) + " " + weight + "\n");
} else { } else {
writer.write(formatLabel(edge.getTarget().getNodeData().getId(), false) + " " writer.write(formatLabel(edge.getTarget().getId().toString(), false) + " "
+ formatLabel(edge.getSource().getNodeData().getId(), false) + " " + edge.getWeight(getLow, getHigh) + "\n"); + formatLabel(edge.getSource().getId().toString(), false) + " " + weight + "\n");
} }
} }
} }
...@@ -250,7 +247,13 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -250,7 +247,13 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
int maxLengthOfEdgeWeight = 0; int maxLengthOfEdgeWeight = 0;
if (makeSymmetricMatrix) { if (makeSymmetricMatrix) {
for (Edge edge : graph.getEdges()) { for (Edge edge : graph.getEdges()) {
maxLengthOfEdgeWeight = Math.max(maxLengthOfEdgeWeight, Double.toString(edge.getWeight(getLow, getHigh)).length()); double weight;
if (exportDynamicWeight) {
weight = edge.getWeight(graph.getView());
} else {
weight = edge.getWeight();
}
maxLengthOfEdgeWeight = Math.max(maxLengthOfEdgeWeight, Double.toString(weight).length());
} }
} }
...@@ -261,9 +264,9 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -261,9 +264,9 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
} }
if (useLabels) { if (useLabels) {
writer.write(formatLabel(idToNode.get(i).getNodeData().getLabel(), true)); writer.write(formatLabel(idToNode.get(i).getLabel(), true));
} else { } else {
writer.write(formatLabel(idToNode.get(i).getNodeData().getId(), true)); writer.write(formatLabel(idToNode.get(i).getId().toString(), true));
} }
} }
writer.write("\n"); writer.write("\n");
...@@ -280,10 +283,13 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -280,10 +283,13 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
} }
Node target = idToNode.get(j); Node target = idToNode.get(j);
double weight = 0; double weight = 0;
if (graph.getEdge(source, target) != null) { Edge edge = graph.getEdge(source, target);
weight = graph.getEdge(source, target).getWeight(getLow, getHigh); if (edge != null) {
} else if (graph.getEdge(target, source) != null && !graph.getEdge(target, source).isDirected()) { if (exportDynamicWeight) {
weight = graph.getEdge(target, source).getWeight(getLow, getHigh); weight = edge.getWeight(graph.getView());
} else {
weight = edge.getWeight();
}
} }
writer.write(Double.toString(weight) + " "); writer.write(Double.toString(weight) + " ");
if (makeSymmetricMatrix) { if (makeSymmetricMatrix) {
...@@ -306,4 +312,4 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask { ...@@ -306,4 +312,4 @@ public class ExporterDL implements GraphExporter, CharacterExporter, LongTask {
public void setProgressTicket(ProgressTicket progressTicket) { public void setProgressTicket(ProgressTicket progressTicket) {
this.progressTicket = progressTicket; this.progressTicket = progressTicket;
} }
} }
\ No newline at end of file
...@@ -43,12 +43,11 @@ package org.gephi.io.exporter.plugin; ...@@ -43,12 +43,11 @@ package org.gephi.io.exporter.plugin;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import org.gephi.data.attributes.api.AttributeModel; import org.gephi.attribute.api.AttributeModel;
import org.gephi.data.attributes.type.TimeInterval; import org.gephi.attribute.api.Column;
import org.gephi.dynamic.DynamicUtilities;
import org.gephi.dynamic.api.DynamicModel;
import org.gephi.graph.api.Edge; import org.gephi.graph.api.Edge;
import org.gephi.graph.api.Graph; import org.gephi.graph.api.Graph;
import org.gephi.graph.api.GraphController;
import org.gephi.graph.api.GraphModel; import org.gephi.graph.api.GraphModel;
import org.gephi.graph.api.Node; import org.gephi.graph.api.Node;
import org.gephi.io.exporter.spi.CharacterExporter; import org.gephi.io.exporter.spi.CharacterExporter;
...@@ -57,6 +56,7 @@ import org.gephi.project.api.Workspace; ...@@ -57,6 +56,7 @@ import org.gephi.project.api.Workspace;
import org.gephi.utils.longtask.spi.LongTask; import org.gephi.utils.longtask.spi.LongTask;
import org.gephi.utils.progress.ProgressTicket; import org.gephi.utils.progress.ProgressTicket;
import org.openide.util.Exceptions; import org.openide.util.Exceptions;
import org.openide.util.Lookup;
/** /**
* *
...@@ -66,11 +66,10 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -66,11 +66,10 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
private boolean exportVisible = false; private boolean exportVisible = false;
private Workspace workspace; private Workspace workspace;
private Writer writer;
private GraphModel graphModel; private GraphModel graphModel;
private AttributeModel attributeModel; private AttributeModel attributeModel;
private Writer writer;
private ProgressTicket progressTicket; private ProgressTicket progressTicket;
private TimeInterval visibleInterval;
private boolean cancel = false; private boolean cancel = false;
//options //options
private int spaces = 2; private int spaces = 2;
...@@ -79,6 +78,7 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -79,6 +78,7 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
private boolean exportCoordinates = true; private boolean exportCoordinates = true;
private boolean exportNodeSize = true; private boolean exportNodeSize = true;
private boolean exportEdgeSize = true; private boolean exportEdgeSize = true;
private boolean exportDynamicWeight = true;
private boolean exportColor = true; private boolean exportColor = true;
private boolean exportNotRecognizedElements = true; private boolean exportNotRecognizedElements = true;
//data to normalize //data to normalize
...@@ -87,9 +87,6 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -87,9 +87,6 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
double minY, maxY; double minY, maxY;
double minZ, maxZ; double minZ, maxZ;
double minSize, maxSize; double minSize, maxSize;
private double getLow;//borders for dynamic edge weight
private double getHigh;
public boolean isNormalize() { public boolean isNormalize() {
return normalize; return normalize;
...@@ -99,35 +96,29 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -99,35 +96,29 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
this.normalize = normalize; this.normalize = normalize;
} }
@Override
public void setExportVisible(boolean exportVisible) { public void setExportVisible(boolean exportVisible) {
this.exportVisible = exportVisible; this.exportVisible = exportVisible;
} }
@Override
public boolean isExportVisible() { public boolean isExportVisible() {
return exportVisible; return exportVisible;
} }
@Override
public boolean execute() { public boolean execute() {
attributeModel = workspace.getLookup().lookup(AttributeModel.class); GraphController graphController = Lookup.getDefault().lookup(GraphController.class);
graphModel = workspace.getLookup().lookup(GraphModel.class); graphModel = graphController.getGraphModel(workspace);
Graph graph; attributeModel = graphController.getAttributeModel(workspace);
Graph graph = null;
if (exportVisible) { if (exportVisible) {
graph = graphModel.getGraphVisible(); graph = graphModel.getGraphVisible();
} else { } else {
graph = graphModel.getGraph(); graph = graphModel.getGraph();
} }
progressTicket.start(graph.getNodeCount() + graph.getEdgeCount()); progressTicket.start(graph.getNodeCount() + graph.getEdgeCount());
DynamicModel dynamicModel = workspace.getLookup().lookup(DynamicModel.class);
visibleInterval = dynamicModel != null && exportVisible ? dynamicModel.getVisibleInterval() : new TimeInterval();
getLow = Double.NEGATIVE_INFINITY;//whole interval, if graph is not dynamic
getHigh = Double.POSITIVE_INFINITY;
if (visibleInterval != null)
{
getLow = visibleInterval.getLow();
getHigh = visibleInterval.getHigh();
}
graph.readLock(); graph.readLock();
if (normalize) { if (normalize) {
...@@ -143,7 +134,7 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -143,7 +134,7 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
graph.readUnlock(); graph.readUnlock();
return !cancel; return !cancel;
} }
private void printOpen(String s) throws IOException { private void printOpen(String s) throws IOException {
for (int i = 0; i < currentSpaces; i++) { for (int i = 0; i < currentSpaces; i++) {
writer.write(' '); writer.write(' ');
...@@ -177,38 +168,42 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -177,38 +168,42 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
private void exportData(Graph graph) throws IOException { private void exportData(Graph graph) throws IOException {
printOpen("graph"); printOpen("graph");
printTag("Creator Gephi"); printTag("Creator Gephi");
if (graph.getGraphModel().isDirected()) { if (graph.isDirected() || graph.isMixed()) {
printTag("directed 1"); printTag("directed 1");
} else if (graph.getGraphModel().isUndirected()) { } else if (graph.isUndirected()) {
printTag("directed 0"); printTag("directed 0");
} }
for (Node node : graph.getNodes()) { for (Node node : graph.getNodes()) {
if (cancel) { if (cancel) {
break; break;
} }
printNode(node); printNode(node, graph);
} }
for (Edge edge : graph.getEdges()) { for (Edge edge : graph.getEdges()) {
if (cancel) { if (cancel) {
break; break;
} }
printEdge(edge, graph.getGraphModel().isMixed()); printEdge(edge, graph);
} }
printClose(); printClose();
} }
private void printEdge(Edge edge, boolean graphMixed) throws IOException { private void printEdge(Edge edge, Graph graph) throws IOException {
printOpen("edge"); printOpen("edge");
printTag("id " + edge.getId()); printTag("id " + edge.getId());
printTag("source " + edge.getSource().getId()); printTag("source " + edge.getSource().getId());
printTag("target " + edge.getTarget().getId()); printTag("target " + edge.getTarget().getId());
if (exportLabel && edge.getEdgeData().getLabel() != null) { if (exportLabel && edge.getLabel() != null) {
printTag("label \"" + edge.getEdgeData().getLabel() + "\""); printTag("label \"" + edge.getLabel() + "\"");
} }
if (exportEdgeSize) { if (exportEdgeSize) {
printTag("value " + edge.getWeight(getLow, getHigh)); if (exportDynamicWeight) {
printTag("value " + edge.getWeight(graph.getView()));
} else {
printTag("value " + edge.getWeight());
}
} }
if (graphMixed) { //if graph not mixed, then all edges have the same direction, described earlier if (graph.isMixed()) { //if graph not mixed, then all edges have the same direction, described earlier
if (edge.isDirected()) { if (edge.isDirected()) {
printTag("directed 1"); printTag("directed 1");
} else if (!edge.isDirected()) { } else if (!edge.isDirected()) {
...@@ -217,14 +212,12 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -217,14 +212,12 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
} }
if (exportNotRecognizedElements) { if (exportNotRecognizedElements) {
for (int i = 0; i < edge.getAttributes().countValues(); i++) { for (Column col : attributeModel.getEdgeTable()) {
String s = attributeModel.getEdgeTable().getColumn(i).getTitle(); if (!col.isProperty()) {
//don't print again standart attributes Object value = edge.getAttribute(col, graph.getView());
if (edge.getAttributes().getValue(i) != null && !s.equals("Weight") if (value != null) {
&& !s.equals("Id") && !s.equals("Time Interval") printTag(formatTitle(col.getTitle()) + " \"" + formatValue(value) + "\"");
&& DynamicUtilities.getDynamicValue(edge.getAttributes().getValue(i), }
visibleInterval.getLow(), visibleInterval.getHigh()) != null) {
printTag(formatTitle(s) + " \"" + formatValue(edge.getAttributes().getValue(i)) + "\"");
} }
} }
} }
...@@ -233,51 +226,48 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -233,51 +226,48 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
progressTicket.progress(); progressTicket.progress();
} }
private void printNode(Node node) throws IOException { private void printNode(Node node, Graph graph) throws IOException {
printOpen("node"); printOpen("node");
printTag("id " + node.getId()); printTag("id " + node.getId());
if (exportLabel && node.getNodeData().getLabel() != null) { if (exportLabel && node.getLabel() != null) {
printTag("label \"" + node.getNodeData().getLabel() + "\""); printTag("label \"" + node.getLabel() + "\"");
} }
if (exportCoordinates || exportNodeSize || exportColor) { if (exportCoordinates || exportNodeSize || exportColor) {
printOpen("graphics"); printOpen("graphics");
if (exportCoordinates) { if (exportCoordinates) {
if (!normalize) { if (!normalize) {
printTag("x " + node.getNodeData().x()); printTag("x " + node.x());
printTag("y " + node.getNodeData().y()); printTag("y " + node.y());
printTag("z " + node.getNodeData().z()); printTag("z " + node.z());
} else { } else {
printTag("x " + (node.getNodeData().x() - minX) / (maxX - minX)); printTag("x " + (node.x() - minX) / (maxX - minX));
printTag("y " + (node.getNodeData().y() - minY) / (maxY - minY)); printTag("y " + (node.y() - minY) / (maxY - minY));
printTag("z " + (node.getNodeData().z() - minZ) / (maxZ - minZ)); printTag("z " + (node.z() - minZ) / (maxZ - minZ));
} }
} }
if (exportNodeSize) { if (exportNodeSize) {
if (!normalize) { if (!normalize) {
printTag("w " + node.getNodeData().getSize()); printTag("w " + node.size());
printTag("h " + node.getNodeData().getSize()); printTag("h " + node.size());
printTag("d " + node.getNodeData().getSize()); printTag("d " + node.size());
} else { } else {
printTag("w " + (node.getNodeData().getSize() - minSize) / (maxSize - minSize)); printTag("w " + (node.size() - minSize) / (maxSize - minSize));
printTag("h " + (node.getNodeData().getSize() - minSize) / (maxSize - minSize)); printTag("h " + (node.size() - minSize) / (maxSize - minSize));
printTag("d " + (node.getNodeData().getSize() - minSize) / (maxSize - minSize)); printTag("d " + (node.size() - minSize) / (maxSize - minSize));
} }
} }
if (exportColor) { if (exportColor) {
printTag("fill \"#" + Integer.toString((int) (node.getNodeData().r() * 255), 16) printTag("fill \"#" + Integer.toString((int) (node.r() * 255), 16)
+ Integer.toString((int) (node.getNodeData().g() * 255), 16) + Integer.toString((int) (node.getNodeData().b() * 255), 16) + "\""); + Integer.toString((int) (node.g() * 255), 16) + Integer.toString((int) (node.b() * 255), 16) + "\"");
} }
printClose(); printClose();
} }
if (exportNotRecognizedElements) { if (exportNotRecognizedElements) {
for (int i = 0; i < node.getAttributes().countValues(); i++) { for (Column col : attributeModel.getNodeTable()) {
if (node.getAttributes().getValue(i) != null) { if (!col.isProperty()) {
String s = attributeModel.getNodeTable().getColumn(i).getTitle(); Object value = node.getAttribute(col, graph.getView());
//don't print again standart attributes if (value != null) {
if (!s.equals("d") && !s.equals("Label") && !s.equals("Id") && !s.equals("Time Interval") printTag(formatTitle(col.getTitle()) + " \"" + formatValue(value) + "\"");
&& DynamicUtilities.getDynamicValue(node.getAttributes().getValue(i),
visibleInterval.getLow(), visibleInterval.getHigh()) != null) {
printTag(formatTitle(s) + " \"" + formatValue(node.getAttributes().getValue(i)) + "\"");
} }
} }
} }
...@@ -286,23 +276,28 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -286,23 +276,28 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
progressTicket.progress(); progressTicket.progress();
} }
@Override
public void setWorkspace(Workspace workspace) { public void setWorkspace(Workspace workspace) {
this.workspace = workspace; this.workspace = workspace;
} }
@Override
public Workspace getWorkspace() { public Workspace getWorkspace() {
return workspace; return workspace;
} }
@Override
public void setWriter(Writer writer) { public void setWriter(Writer writer) {
this.writer = writer; this.writer = writer;
} }
@Override
public boolean cancel() { public boolean cancel() {
cancel = true; cancel = true;
return true; return true;
} }
@Override
public void setProgressTicket(ProgressTicket progressTicket) { public void setProgressTicket(ProgressTicket progressTicket) {
this.progressTicket = progressTicket; this.progressTicket = progressTicket;
} }
...@@ -378,16 +373,16 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -378,16 +373,16 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
if (cancel) { if (cancel) {
break; break;
} }
minX = Math.min(minX, node.getNodeData().x()); minX = Math.min(minX, node.x());
minY = Math.min(minY, node.getNodeData().y()); minY = Math.min(minY, node.y());
minZ = Math.min(minZ, node.getNodeData().z()); minZ = Math.min(minZ, node.z());
maxX = Math.max(maxX, node.getNodeData().x()); maxX = Math.max(maxX, node.x());
maxY = Math.max(maxY, node.getNodeData().y()); maxY = Math.max(maxY, node.y());
maxZ = Math.max(maxZ, node.getNodeData().z()); maxZ = Math.max(maxZ, node.z());
minSize = Math.min(minSize, node.getNodeData().getSize()); minSize = Math.min(minSize, node.size());
maxSize = Math.max(maxSize, node.getNodeData().getSize()); maxSize = Math.max(maxSize, node.size());
} }
} }
...@@ -403,14 +398,7 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask { ...@@ -403,14 +398,7 @@ public class ExporterGML implements GraphExporter, CharacterExporter, LongTask {
} }
private String formatValue(Object obj) { private String formatValue(Object obj) {
System.err.println("tos " + obj.toString()); String res = obj.toString();
String res;
if (visibleInterval != null) {
//dynamic value could be null, if it doesn't exist in visibleInterval, but such cases are filtered higher
res = DynamicUtilities.getDynamicValue(obj, visibleInterval.getLow(), visibleInterval.getHigh()).toString();
} else {
res = obj.toString();
}
return res.replace("\r\n", " ").replace("\n", " ").replace('\"', ' ');//remove " and line feeds return res.replace("\r\n", " ").replace("\n", " ").replace('\"', ' ');//remove " and line feeds
} }
} }
\ No newline at end of file
/* /*
Copyright 2008-2011 Gephi Copyright 2008-2011 Gephi
Authors : Daniel Bernardes <daniel.bernardes@polytechnique.edu> Authors : Daniel Bernardes <daniel.bernardes@polytechnique.edu>
Website : http://www.gephi.org Website : http://www.gephi.org
This file is part of Gephi. This file is part of Gephi.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
Copyright 2011 Gephi Consortium. All rights reserved. Copyright 2011 Gephi Consortium. All rights reserved.
The contents of this file are subject to the terms of either the GNU The contents of this file are subject to the terms of either the GNU
General Public License Version 3 only ("GPL") or the Common General Public License Version 3 only ("GPL") or the Common
Development and Distribution License("CDDL") (collectively, the Development and Distribution License("CDDL") (collectively, the
"License"). You may not use this file except in compliance with the "License"). You may not use this file except in compliance with the
License. You can obtain a copy of the License at License. You can obtain a copy of the License at
http://gephi.org/about/legal/license-notice/ http://gephi.org/about/legal/license-notice/
or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the
specific language governing permissions and limitations under the specific language governing permissions and limitations under the
License. When distributing the software, include this License Header License. When distributing the software, include this License Header
Notice in each file and include the License files at Notice in each file and include the License files at
/cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the
License Header, with the fields enclosed by brackets [] replaced by License Header, with the fields enclosed by brackets [] replaced by
your own identifying information: your own identifying information:
"Portions Copyrighted [year] [name of copyright owner]" "Portions Copyrighted [year] [name of copyright owner]"
If you wish your version of this file to be governed by only the CDDL If you wish your version of this file to be governed by only the CDDL
or only the GPL Version 3, indicate your decision by adding or only the GPL Version 3, indicate your decision by adding
"[Contributor] elects to include this software in this distribution "[Contributor] elects to include this software in this distribution
under the [CDDL or GPL Version 3] license." If you do not indicate a under the [CDDL or GPL Version 3] license." If you do not indicate a
single choice of license, a recipient has the option to distribute single choice of license, a recipient has the option to distribute
your version of this file under either the CDDL, the GPL Version 3 or your version of this file under either the CDDL, the GPL Version 3 or
to extend the choice of license to its licensees as provided above. to extend the choice of license to its licensees as provided above.
However, if you add GPL Version 3 code and therefore, elected the GPL However, if you add GPL Version 3 code and therefore, elected the GPL
Version 3 license, then the option applies only if the new code is Version 3 license, then the option applies only if the new code is
made subject to such option by the copyright holder. made subject to such option by the copyright holder.
Contributor(s): Contributor(s):
Portions Copyrighted 2011 Gephi Consortium. Portions Copyrighted 2011 Gephi Consortium.
*/ */
package org.gephi.io.exporter.plugin; package org.gephi.io.exporter.plugin;
import java.io.Writer; import java.io.Writer;
import java.util.HashMap; import java.util.HashMap;
import org.gephi.graph.api.Edge; import org.gephi.graph.api.Edge;
import org.gephi.graph.api.Graph;
import org.gephi.graph.api.GraphModel; import org.gephi.graph.api.GraphModel;
import org.gephi.graph.api.HierarchicalGraph;
import org.gephi.graph.api.Node; import org.gephi.graph.api.Node;
import org.gephi.graph.api.UndirectedGraph; import org.gephi.graph.api.UndirectedGraph;
import org.gephi.io.exporter.api.FileType; import org.gephi.io.exporter.api.FileType;
...@@ -72,11 +72,11 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -72,11 +72,11 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
private boolean exportVisible; private boolean exportVisible;
private boolean cancel = false; private boolean cancel = false;
private ProgressTicket progressTicket; private ProgressTicket progressTicket;
public void setExportEdgeWeight(boolean exportEdgeWeight) { public void setExportEdgeWeight(boolean exportEdgeWeight) {
this.exportEdgeWeight = exportEdgeWeight; this.exportEdgeWeight = exportEdgeWeight;
} }
public boolean isExportEdgeWeight() { public boolean isExportEdgeWeight() {
return exportEdgeWeight; return exportEdgeWeight;
} }
...@@ -84,40 +84,47 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -84,40 +84,47 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
public void setExportPosition(boolean exportPosition) { public void setExportPosition(boolean exportPosition) {
this.exportPosition = exportPosition; this.exportPosition = exportPosition;
} }
public boolean isExportPosition() { public boolean isExportPosition() {
return exportPosition; return exportPosition;
} }
@Override
public boolean cancel() { public boolean cancel() {
cancel = true; cancel = true;
return true; return true;
} }
@Override
public void setProgressTicket(ProgressTicket progressTicket) { public void setProgressTicket(ProgressTicket progressTicket) {
this.progressTicket = progressTicket; this.progressTicket = progressTicket;
} }
@Override
public boolean isExportVisible() { public boolean isExportVisible() {
return exportVisible; return exportVisible;
} }
@Override
public void setExportVisible(boolean exportVisible) { public void setExportVisible(boolean exportVisible) {
this.exportVisible = exportVisible; this.exportVisible = exportVisible;
} }
@Override
public void setWriter(Writer writer) { public void setWriter(Writer writer) {
this.writer = writer; this.writer = writer;
} }
@Override
public Workspace getWorkspace() { public Workspace getWorkspace() {
return workspace; return workspace;
} }
@Override
public void setWorkspace(Workspace workspace) { public void setWorkspace(Workspace workspace) {
this.workspace = workspace; this.workspace = workspace;
} }
public String getName() { public String getName() {
return NbBundle.getMessage(getClass(), "ExporterPajek_name"); return NbBundle.getMessage(getClass(), "ExporterPajek_name");
} }
...@@ -127,13 +134,14 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -127,13 +134,14 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
return new FileType[]{ft}; return new FileType[]{ft};
} }
@Override
public boolean execute() { public boolean execute() {
GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class); GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class);
HierarchicalGraph graph = null; Graph graph = null;
if (exportVisible) { if (exportVisible) {
graph = graphModel.getHierarchicalGraphVisible(); graph = graphModel.getGraphVisible();
} else { } else {
graph = graphModel.getHierarchicalGraph(); graph = graphModel.getGraph();
} }
try { try {
exportData(graph); exportData(graph);
...@@ -144,9 +152,9 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -144,9 +152,9 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
return !cancel; return !cancel;
} }
private void exportData(HierarchicalGraph graph) throws Exception { private void exportData(Graph graph) throws Exception {
int max = graph.getNodeCount(), i=1; int max = graph.getNodeCount(), i = 1;
HashMap<String, Integer> idx = new HashMap<String, Integer>(3*max/2+1); HashMap<String, Integer> idx = new HashMap<String, Integer>(3 * max / 2 + 1);
Progress.start(progressTicket, max); Progress.start(progressTicket, max);
graph.readLock(); graph.readLock();
...@@ -155,12 +163,12 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -155,12 +163,12 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
for (Node node : graph.getNodes()) { for (Node node : graph.getNodes()) {
writer.append(Integer.toString(i)); writer.append(Integer.toString(i));
writer.append(" \"" + node.getNodeData().getLabel() + "\""); writer.append(" \"" + node.getLabel() + "\"");
if(exportPosition) { if (exportPosition) {
writer.append(" "+node.getNodeData().x()+" "+node.getNodeData().y()+" "+node.getNodeData().z()); writer.append(" " + node.x() + " " + node.y() + " " + node.z());
} }
writer.append("\n"); writer.append("\n");
idx.put(node.getNodeData().getId(), i++); // assigns Ids from the interval [1..max] idx.put(node.getId().toString(), i++); // assigns Ids from the interval [1..max]
} }
if (graph instanceof UndirectedGraph) { if (graph instanceof UndirectedGraph) {
...@@ -169,13 +177,13 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -169,13 +177,13 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
writer.append("*Arcs\n"); writer.append("*Arcs\n");
} }
for (Edge edge : graph.getEdgesAndMetaEdges()) { for (Edge edge : graph.getEdges()) {
if (cancel) { if (cancel) {
break; break;
} }
if (edge != null) { if (edge != null) {
writer.append(Integer.toString(idx.get(edge.getSource().getNodeData().getId())) + " "); writer.append(Integer.toString(idx.get(edge.getSource().getId().toString())) + " ");
writer.append(Integer.toString(idx.get(edge.getTarget().getNodeData().getId()))); writer.append(Integer.toString(idx.get(edge.getTarget().getId().toString())));
if (exportEdgeWeight) { if (exportEdgeWeight) {
writer.append(" " + edge.getWeight()); writer.append(" " + edge.getWeight());
} }
...@@ -189,5 +197,4 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask ...@@ -189,5 +197,4 @@ public class ExporterPajek implements GraphExporter, CharacterExporter, LongTask
Progress.finish(progressTicket); Progress.finish(progressTicket);
} }
} }
...@@ -43,11 +43,8 @@ package org.gephi.io.exporter.plugin; ...@@ -43,11 +43,8 @@ package org.gephi.io.exporter.plugin;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.util.Arrays; import org.gephi.attribute.api.AttributeModel;
import org.gephi.data.attributes.api.AttributeModel; import org.gephi.attribute.api.Column;
import org.gephi.data.attributes.type.TimeInterval;
import org.gephi.dynamic.DynamicUtilities;
import org.gephi.dynamic.api.DynamicModel;
import org.gephi.graph.api.Edge; import org.gephi.graph.api.Edge;
import org.gephi.graph.api.Graph; import org.gephi.graph.api.Graph;
import org.gephi.graph.api.GraphModel; import org.gephi.graph.api.GraphModel;
...@@ -68,15 +65,14 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -68,15 +65,14 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
private Workspace workspace; private Workspace workspace;
private boolean cancel = false; private boolean cancel = false;
private ProgressTicket progressTicket; private ProgressTicket progressTicket;
private TimeInterval visibleInterval;
private AttributeModel attributeModel; private AttributeModel attributeModel;
private DynamicModel dynamicModel;
//settings //settings
private boolean exportEdgeWeight = true; private boolean exportEdgeWeight = true;
private boolean exportCoords = true; private boolean exportCoords = true;
private boolean exportSize = true; private boolean exportSize = true;
private boolean exportShortLabel = true; private boolean exportShortLabel = true;
private boolean exportColor = true; private boolean exportColor = true;
private boolean exportDynamicWeight = true;
private boolean exportAttributes = true; private boolean exportAttributes = true;
private boolean normalize = false; private boolean normalize = false;
private Writer writer; private Writer writer;
...@@ -91,14 +87,17 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -91,14 +87,17 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
private double getLow;//borders for dynamic edge weight private double getLow;//borders for dynamic edge weight
private double getHigh; private double getHigh;
@Override
public void setExportVisible(boolean exportVisible) { public void setExportVisible(boolean exportVisible) {
this.exportVisible = exportVisible; this.exportVisible = exportVisible;
} }
@Override
public boolean isExportVisible() { public boolean isExportVisible() {
return exportVisible; return exportVisible;
} }
@Override
public boolean execute() { public boolean execute() {
attributeModel = workspace.getLookup().lookup(AttributeModel.class); attributeModel = workspace.getLookup().lookup(AttributeModel.class);
GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class); GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class);
...@@ -108,15 +107,6 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -108,15 +107,6 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
} else { } else {
graph = graphModel.getGraph(); graph = graphModel.getGraph();
} }
dynamicModel = workspace.getLookup().lookup(DynamicModel.class);
visibleInterval = dynamicModel != null && exportVisible ? dynamicModel.getVisibleInterval() : new TimeInterval();
getLow = Double.NEGATIVE_INFINITY;//whole interval, if graph is not dynamic
getHigh = Double.POSITIVE_INFINITY;
if (visibleInterval != null) {
getLow = visibleInterval.getLow();
getHigh = visibleInterval.getHigh();
}
graph.readLock(); graph.readLock();
...@@ -152,8 +142,7 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -152,8 +142,7 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
/* /*
* For non-standart and string attributes * For non-standart and string attributes
*/ */
private String printParameter(Object s) { private String printParameter(Object val) {
Object val = DynamicUtilities.getDynamicValue(s, visibleInterval.getLow(), visibleInterval.getHigh());
if (val == null) { if (val == null) {
return valueForEmptyAttributes; return valueForEmptyAttributes;
} }
...@@ -164,13 +153,10 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -164,13 +153,10 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
return res; return res;
} }
} }
//sorted arrays
static final private String[] standartNodeAttributes = {"Id", "Label", "Time Interval"};
static final private String[] standartEdgeAttributes = {"Id", "Label", "Time Interval", "Weight"};
private boolean atLeastOneNonStandartAttribute() { private boolean atLeastOneNonStandartAttribute() {
for (int i = 0; i < attributeModel.getNodeTable().getColumns().length; i++) { for (Column col : attributeModel.getNodeTable()) {
if (Arrays.binarySearch(standartNodeAttributes, attributeModel.getNodeTable().getColumn(i).getTitle()) < 0) { if (!col.isProperty()) {
return true; return true;
} }
} }
...@@ -184,10 +170,9 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -184,10 +170,9 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
//header //header
stringBuilder.append("*Node data\n"); stringBuilder.append("*Node data\n");
stringBuilder.append("ID"); stringBuilder.append("ID");
for (int i = 0; i < attributeModel.getNodeTable().getColumns().length; i++) { for (Column column : attributeModel.getNodeTable()) {
if (Arrays.binarySearch(standartNodeAttributes, attributeModel.getNodeTable().getColumn(i).getTitle()) < 0) //ignore standart if (!column.isProperty()) {
{ stringBuilder.append(" ").append(column.getTitle().replace(' ', '_').toString());
stringBuilder.append(" ").append(attributeModel.getNodeTable().getColumn(i).getTitle().replace(' ', '_').toString());
//replace spaces because importer can't read attributes titles in quotes //replace spaces because importer can't read attributes titles in quotes
} }
} }
...@@ -199,13 +184,12 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -199,13 +184,12 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
if (cancel) { if (cancel) {
break; break;
} }
stringBuilder.append(printParameter(node.getNodeData().getId())); stringBuilder.append(printParameter(node.getId()));
for (Column column : attributeModel.getNodeTable()) {
for (int i = 0; i < attributeModel.getNodeTable().getColumns().length; i++) { if (!column.isProperty()) {
if (Arrays.binarySearch(standartNodeAttributes, attributeModel.getNodeTable().getColumn(i).getTitle()) < 0) //ignore standart Object value = node.getAttribute(column, graph.getView());
{ if (value != null) {
if (node.getNodeData().getAttributes().getValue(i) != null) { stringBuilder.append(" ").append(printParameter(value));
stringBuilder.append(" ").append(printParameter(node.getNodeData().getAttributes().getValue(i)));
} else { } else {
stringBuilder.append(" ").append(valueForEmptyAttributes); stringBuilder.append(" ").append(valueForEmptyAttributes);
} }
...@@ -230,14 +214,14 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -230,14 +214,14 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
if (cancel) { if (cancel) {
break; break;
} }
minX = Math.min(minX, node.getNodeData().x()); minX = Math.min(minX, node.x());
maxX = Math.max(maxX, node.getNodeData().x()); maxX = Math.max(maxX, node.x());
minY = Math.min(minY, node.getNodeData().y()); minY = Math.min(minY, node.y());
maxY = Math.max(maxY, node.getNodeData().y()); maxY = Math.max(maxY, node.y());
minSize = Math.min(minSize, node.getNodeData().r()); minSize = Math.min(minSize, node.r());
maxSize = Math.max(maxSize, node.getNodeData().r()); maxSize = Math.max(maxSize, node.r());
} }
} }
...@@ -268,48 +252,54 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -268,48 +252,54 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
if (cancel) { if (cancel) {
break; break;
} }
stringBuilder.append(node.getNodeData().getId()); stringBuilder.append(node.getId());
if (exportCoords) { if (exportCoords) {
if (!normalize) { if (!normalize) {
stringBuilder.append(" ").append(node.getNodeData().x()).append(" ").append(node.getNodeData().y()); stringBuilder.append(" ").append(node.x()).append(" ").append(node.y());
} else { } else {
stringBuilder.append(" ").append((node.getNodeData().x() - minX) / (maxX - minX)).append(" ").append((node.getNodeData().y() - minY) / (maxY - minY)); stringBuilder.append(" ").append((node.x() - minX) / (maxX - minX)).append(" ").append((node.y() - minY) / (maxY - minY));
} }
} }
if (exportSize) { if (exportSize) {
if (!normalize) { if (!normalize) {
stringBuilder.append(" ").append(node.getNodeData().getRadius()); stringBuilder.append(" ").append(node.size());
} else { } else {
stringBuilder.append(" ").append((node.getNodeData().getRadius() - minSize) / (maxSize - minSize)); stringBuilder.append(" ").append((node.size() - minSize) / (maxSize - minSize));
} }
} }
if (exportColor) { if (exportColor) {
stringBuilder.append(" ").append((int) (node.getNodeData().r() * 255f));//[0..1] to [0..255] stringBuilder.append(" ").append((int) (node.r() * 255f));//[0..1] to [0..255]
} }
if (exportShortLabel) { if (exportShortLabel) {
if (node.getNodeData().getLabel() != null) { if (node.getLabel() != null) {
stringBuilder.append(" ").append(printParameter(node.getNodeData().getLabel())); stringBuilder.append(" ").append(printParameter(node.getLabel()));
} else { } else {
stringBuilder.append(" ").append(printParameter(node.getNodeData().getId())); stringBuilder.append(" ").append(printParameter(node.getId()));
} }
} }
stringBuilder.append("\n"); stringBuilder.append("\n");
} }
} }
void printEdgeData(Edge edge, Node source, Node target) { void printEdgeData(Edge edge, Node source, Node target, Graph graph) {
stringBuilder.append(printParameter(source.getNodeData().getId()));//from stringBuilder.append(printParameter(source.getId()));//from
stringBuilder.append(" ").append(printParameter(target.getNodeData().getId()));//to stringBuilder.append(" ").append(printParameter(target.getId()));//to
if (exportEdgeWeight) { if (exportEdgeWeight) {
stringBuilder.append(" ").append(edge.getWeight(getLow, getHigh));//strength Double weight;
if (exportDynamicWeight) {
weight = edge.getWeight(graph.getView());
} else {
weight = edge.getWeight();
}
stringBuilder.append(" ").append(weight.toString());
} }
if (exportAttributes) { if (exportAttributes) {
for (int i = 0; i < attributeModel.getEdgeTable().getColumns().length; i++) { for (Column column : attributeModel.getEdgeTable()) {
if (Arrays.binarySearch(standartEdgeAttributes, attributeModel.getEdgeTable().getColumn(i).getTitle()) < 0) //ignore standart if (!column.isProperty()) {
{ Object value = edge.getAttribute(column, graph.getView());
if (edge.getEdgeData().getAttributes().getValue(i) != null) { if (value != null) {
stringBuilder.append(" ").append(printParameter(edge.getEdgeData().getAttributes().getValue(i))); stringBuilder.append(" ").append(printParameter(value));
} else { } else {
stringBuilder.append(" " + valueForEmptyAttributes); stringBuilder.append(" " + valueForEmptyAttributes);
} }
...@@ -329,10 +319,9 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -329,10 +319,9 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
stringBuilder.append(" strength"); stringBuilder.append(" strength");
} }
if (exportAttributes) { if (exportAttributes) {
for (int i = 0; i < attributeModel.getEdgeTable().getColumns().length; i++) { for (Column col : attributeModel.getEdgeTable()) {
if (Arrays.binarySearch(standartEdgeAttributes, attributeModel.getEdgeTable().getColumn(i).getTitle()) < 0) //ignore standart if (!col.isProperty()) {
{ stringBuilder.append(" ").append(printParameter(col.getTitle()).replace(' ', '_'));
stringBuilder.append(" ").append(printParameter(attributeModel.getEdgeTable().getColumn(i).getTitle()).replace(' ', '_'));
//replace spaces because importer can't read attributes titles in quotes //replace spaces because importer can't read attributes titles in quotes
} }
} }
...@@ -344,30 +333,35 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask { ...@@ -344,30 +333,35 @@ public class ExporterVNA implements GraphExporter, CharacterExporter, LongTask {
break; break;
} }
progressTicket.progress(); progressTicket.progress();
printEdgeData(edge, edge.getSource(), edge.getTarget());//all edges in vna are directed, so make clone printEdgeData(edge, edge.getSource(), edge.getTarget(), graph);//all edges in vna are directed, so make clone
if (!edge.isDirected() && !edge.isSelfLoop()) { if (!edge.isDirected() && !edge.isSelfLoop()) {
printEdgeData(edge, edge.getTarget(), edge.getSource()); printEdgeData(edge, edge.getTarget(), edge.getSource(), graph);
} }
} }
} }
@Override
public void setWorkspace(Workspace workspace) { public void setWorkspace(Workspace workspace) {
this.workspace = workspace; this.workspace = workspace;
} }
@Override
public Workspace getWorkspace() { public Workspace getWorkspace() {
return workspace; return workspace;
} }
@Override
public boolean cancel() { public boolean cancel() {
cancel = true; cancel = true;
return true; return true;
} }
@Override
public void setProgressTicket(ProgressTicket progressTicket) { public void setProgressTicket(ProgressTicket progressTicket) {
this.progressTicket = progressTicket; this.progressTicket = progressTicket;
} }
@Override
public void setWriter(Writer writer) { public void setWriter(Writer writer) {
this.writer = writer; this.writer = writer;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册