package ika.geoexport;
import java.io.*;
import ika.geo.*;
/**
* Exporter for the ESRI Ungenerate file format.<br>
* Ungenerate is a very simple text format for spaghetti data.
* @author Bernhard Jenny, Institute of Cartography, ETH Zurich.
*/
public class UngenerateExporter extends GeoSetExporter {
public UngenerateExporter() {
}
public String getFileFormatName() {
return "Ungenerate";
}
public String getFileExtension() {
return "lin";
}
/**
* Writes GeoPaths contained in a GeoSet to an Ungenerate file.
* @param geoSet The GeoSet containing the GeoPaths to export.
* @param outputStream The output stream to receive the data.
*/
protected void write(GeoSet geoSet, OutputStream outputStream)
throws IOException {
if (geoSet == null || outputStream == null) {
throw new IllegalArgumentException();
}
PrintWriter writer = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(outputStream)));
this.writeLines(geoSet, writer, 0);
writer.println("end");
writer.flush();
}
/**
* An internal helper method that writes paths to a PrintWriter.
*/
private int writeLines(GeoSet geoSet, PrintWriter writer, int id) {
if (geoSet.isVisible() == false) {
return id;
}
final int numberOfChildren = geoSet.getNumberOfChildren();
for (int i = 0; i < numberOfChildren; i++) {
GeoObject geoObject = geoSet.getGeoObject(i);
// only write visible objects
if (geoObject.isVisible() == false) {
continue;
}
if (geoObject instanceof GeoPath) {
GeoPath geoPath = (GeoPath) geoObject;
GeoPathIterator iterator = geoPath.getIterator();
double lastMoveToX = Double.NaN;
double lastMoveToY = Double.NaN;
do {
final int type = iterator.getInstruction();
switch (type) {
case GeoPathModel.CLOSE:
if (iterator.atFirstInstruction()) {
continue;
}
writer.print(Double.toString(lastMoveToX));
writer.print("\t");
writer.println(Double.toString(lastMoveToY));
break;
case GeoPathModel.MOVETO:
if (!iterator.atFirstInstruction()) {
writer.println("end");
}
writer.println(id++);
lastMoveToX = iterator.getX();
lastMoveToY = iterator.getY();
// fall thru
case GeoPathModel.LINETO:
final double x = iterator.getX();
final double y = iterator.getY();
writer.print(Double.toString(x));
writer.print("\t");
writer.println(Double.toString(y));
break;
default:
System.err.println("UngenerateExporter: unsupported path segment");
}
} while (iterator.next());
writer.println("end");
} else if (geoObject instanceof GeoSet) {
GeoSet childGeoSet = (GeoSet) geoObject;
id = writeLines(childGeoSet, writer, id);
}
}
return id;
}
}