/*
* Library name : dxf
* (C) 2006 Micha�l Michaud
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* For more information, contact:
*
* michael.michaud@free.fr
*
*/
package org.jgrasstools.gears.io.dxfdwg.libs.dxf;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.feature.DefaultFeatureCollection;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
/**
* A whole dataset contained in a DXF file, and main methods to read from and
* to write to the file.
*
* The DxfFile class is one of the main class of the dxf library.
* @author Micha�l Michaud
* @version 0.5.0
*/
// History
// 2006-11-12 : remove the header writing option
// 2006-10-19 : add optional '_' suffix
// add optional header writer
// DXF layer name is taken from layer attribute if it exists or
// from layer name else if
@SuppressWarnings("nls")
public class DxfFile {
public final static DxfGroup SECTION = new DxfGroup(0, "SECTION");
public final static DxfGroup ENDSEC = new DxfGroup(0, "ENDSEC");
public final static DxfGroup EOF = new DxfGroup(0, "EOF");
public final static DxfGroup HEADER = new DxfGroup(2, "HEADER");
// La section CLASSES suivante est posterieure � la version 12 de DXF
public final static DxfGroup CLASSES = new DxfGroup(2, "CLASSES");
public final static DxfGroup TABLES = new DxfGroup(2, "TABLES");
public final static DxfGroup BLOCKS = new DxfGroup(2, "BLOCKS");
public final static DxfGroup ENTITIES = new DxfGroup(2, "ENTITIES");
// La section OBJECTS suivante est posterieure � la version 12 de DXF
public final static DxfGroup OBJECTS = new DxfGroup(2, "OBJECTS");
// Schema de donn�es g�n�ral pour les ENTITIES
public static SimpleFeatureType DXF_POINTSCHEMA = null;
public static SimpleFeatureType DXF_LINESCHEMA = null;
public static SimpleFeatureType DXF_POLYGONSCHEMA = null;
public static boolean DXF_SCHEMA_INITIALIZED = false;
static int iterator = 0;
private DxfHEADER header = null;
private DxfCLASSES classes = null;
private DxfTABLES tables = null;
private DxfBLOCKS blocks = null;
private DxfENTITIES entities = null;
private int coordinatePrecision = 2;
Map featureSchemas = new HashMap();
Map datasets = new HashMap();
SimpleFeatureCollection pointFeatures;
SimpleFeatureCollection lineFeatures;
SimpleFeatureCollection polygonFeatures;
private final CoordinateReferenceSystem crs;
private static int fid = 0;
public static synchronized int getNextFid() {
fid = fid + 1;
return fid;
}
public static synchronized void resetFid() {
fid = 0;
}
public DxfFile( CoordinateReferenceSystem crs ) {
this.crs = crs;
resetFid();
initializeDXF_SCHEMA(crs);
}
/**
* Initialize a JUMP FeatureSchema to load dxf data keeping some graphic
* attributes.
*/
public static synchronized void initializeDXF_SCHEMA( CoordinateReferenceSystem crs ) {
if (DXF_POINTSCHEMA != null && DXF_POINTSCHEMA.getAttributeCount() != 0)
return;
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName("dxfpointfile");
b.setCRS(crs);
b.add("the_geom", Point.class);
b.add("LAYER", String.class);
b.add("LTYPE", String.class);
b.add("ELEVATION", Double.class);
b.add("THICKNESS", Double.class);
b.add("COLOR", Integer.class);
b.add("TEXT", String.class);
b.add("TEXT_HEIGHT", Double.class);
b.add("TEXT_STYLE", String.class);
DXF_POINTSCHEMA = b.buildFeatureType();
b = new SimpleFeatureTypeBuilder();
b.setName("dxflinefile");
b.setCRS(crs);
b.add("the_geom", LineString.class);
b.add("LAYER", String.class);
b.add("LTYPE", String.class);
b.add("ELEVATION", Double.class);
b.add("THICKNESS", Double.class);
b.add("COLOR", Integer.class);
b.add("TEXT", String.class);
b.add("TEXT_HEIGHT", Double.class);
b.add("TEXT_STYLE", String.class);
DXF_LINESCHEMA = b.buildFeatureType();
b = new SimpleFeatureTypeBuilder();
b.setName("dxfpolygonfile");
b.setCRS(crs);
b.add("the_geom", Polygon.class);
b.add("LAYER", String.class);
b.add("LTYPE", String.class);
b.add("ELEVATION", Double.class);
b.add("THICKNESS", Double.class);
b.add("COLOR", Integer.class);
b.add("TEXT", String.class);
b.add("TEXT_HEIGHT", Double.class);
b.add("TEXT_STYLE", String.class);
DXF_POLYGONSCHEMA = b.buildFeatureType();
}
public int getCoordinatePrecision() {
return coordinatePrecision;
}
public void setCoordinatePrecision( int coordinatePrecision ) {
this.coordinatePrecision = coordinatePrecision;
}
public static DxfFile createFromFile( File file, CoordinateReferenceSystem crs ) throws IOException {
RandomAccessFile raf = new RandomAccessFile(file, "r");
return createFromFile(raf, crs);
}
public static DxfFile createFromFile( RandomAccessFile raf, CoordinateReferenceSystem crs ) throws IOException {
DxfFile dxfFile = new DxfFile(crs);
initializeDXF_SCHEMA(crs);
dxfFile.pointFeatures = new DefaultFeatureCollection();
dxfFile.lineFeatures = new DefaultFeatureCollection();
dxfFile.polygonFeatures = new DefaultFeatureCollection();
DxfGroup group = null;
while( null != (group = DxfGroup.readGroup(raf)) ) {
if (group.equals(SECTION)) {
group = DxfGroup.readGroup(raf);
System.out.println("SECTION " + group.getValue());
if (group.equals(HEADER)) {
dxfFile.header = DxfHEADER.readHeader(raf);
} else if (group.equals(CLASSES)) {
dxfFile.classes = DxfCLASSES.readClasses(raf);
} else if (group.equals(TABLES)) {
dxfFile.tables = DxfTABLES.readTables(raf);
} else if (group.equals(BLOCKS)) {
dxfFile.blocks = DxfBLOCKS.readEntities(raf);
// dxfFile.datasets.put("BLOCKS", dxfFile.blocks.entities);
((DefaultFeatureCollection) dxfFile.pointFeatures)
.addAll((SimpleFeatureCollection) dxfFile.blocks.pointEntities);
((DefaultFeatureCollection) dxfFile.lineFeatures)
.addAll((SimpleFeatureCollection) dxfFile.blocks.lineEntities);
((DefaultFeatureCollection) dxfFile.polygonFeatures)
.addAll((SimpleFeatureCollection) dxfFile.blocks.polygonEntities);
} else if (group.equals(ENTITIES)) {
dxfFile.entities = DxfENTITIES.readEntities(raf);
// dxfFile.datasets.put("ENTITIES", dxfFile.entities.entities);
((DefaultFeatureCollection) dxfFile.pointFeatures)
.addAll((SimpleFeatureCollection) dxfFile.entities.pointEntities);
((DefaultFeatureCollection) dxfFile.lineFeatures)
.addAll((SimpleFeatureCollection) dxfFile.entities.lineEntities);
((DefaultFeatureCollection) dxfFile.polygonFeatures)
.addAll((SimpleFeatureCollection) dxfFile.entities.polygonEntities);
} else if (group.equals(OBJECTS)) {
// objects = DxfOBJECTS.readObjects(br);
System.out.println("Jump objects: " + group.getValue());
} else if (group.getCode() == 999) {
System.out.println("Jump 999: " + group.getValue());
} else {
System.out.println("Group " + group.getCode() + " " + group.getValue() + " UNKNOWN");
}
} else if (group.getCode() == 999) {
// System.out.println("Commentaire : " + group.getValue());
} else if (group.equals(EOF)) {
break;
} else {
// System.out.println("Group " + group.getCode() + " " + group.getValue() +
// " UNKNOWN");
}
}
raf.close();
return dxfFile;
}
public SimpleFeatureCollection getPoints() {
return pointFeatures;
}
public SimpleFeatureCollection getLines() {
return lineFeatures;
}
public SimpleFeatureCollection getPolygons() {
return polygonFeatures;
}
public static Set getLayers( File file ) throws IOException {
Set datasets = new HashSet();
datasets.add("BLOCKS");
datasets.add("ENTITIES");
return datasets;
}
// public static void write( FeatureCollection features, String[] layerNames, FileWriter fw,
// int precision, boolean suffix ) {
// FeatureSchema schema = features.getFeatureSchema();
// Envelope envelope = features.getEnvelope();
// // System.out.println("layerNames : " + layerNames + " (" + layerNames.length + ")");
// // System.out.println("header : " + header);
// // System.out.println("suffix : " + suffix);
// Date date = new Date(System.currentTimeMillis());
// try {
// // if (header) {
// // COMMENTAIRES DU TRADUCTEUR
// fw.write(DxfGroup.toString(999, Integer.toString(features.size()) + " features"));
// fw.write(DxfGroup.toString(999,
// "TRANSLATION BY fr.michaelm.jump.drivers.dxf.DxfFile (v 0.4)"));
// fw.write(DxfGroup.toString(999, "DATE : " + date.toString()));
//
// // ECRITURE DU HEADER
// fw.write(DxfGroup.toString(0, "SECTION"));
// fw.write(DxfGroup.toString(2, "HEADER"));
// fw.write(DxfGroup.toString(9, "$ACADVER"));
// fw.write(DxfGroup.toString(1, "AC1009"));
// fw.write(DxfGroup.toString(9, "$CECOLOR"));
// fw.write(DxfGroup.toString(62, 256));
// fw.write(DxfGroup.toString(9, "$CELTYPE"));
// fw.write(DxfGroup.toString(6, "DUPLAN"));
// fw.write(DxfGroup.toString(9, "$CLAYER"));
// fw.write(DxfGroup.toString(8, "0")); // corrected by L. Becker on 2006-11-08
// fw.write(DxfGroup.toString(9, "$ELEVATION"));
// fw.write(DxfGroup.toString(40, 0.0, 3));
// fw.write(DxfGroup.toString(9, "$EXTMAX"));
// fw.write(DxfGroup.toString(10, envelope.getMaxX(), 6));
// fw.write(DxfGroup.toString(20, envelope.getMaxY(), 6));
// // fw.write(DxfGroup.toString(30, envelope.getMaxX(), 6));
// fw.write(DxfGroup.toString(9, "$EXTMIN"));
// fw.write(DxfGroup.toString(10, envelope.getMinX(), 6));
// fw.write(DxfGroup.toString(20, envelope.getMinY(), 6));
// // fw.write(DxfGroup.toString(30, envelope.getMaxX(), 6));
// fw.write(DxfGroup.toString(9, "$INSBASE"));
// fw.write(DxfGroup.toString(10, 0.0, 1));
// fw.write(DxfGroup.toString(20, 0.0, 1));
// fw.write(DxfGroup.toString(30, 0.0, 1));
// fw.write(DxfGroup.toString(9, "$LIMCHECK"));
// fw.write(DxfGroup.toString(70, 1));
// fw.write(DxfGroup.toString(9, "$LIMMAX"));
// fw.write(DxfGroup.toString(10, envelope.getMaxX(), 6));
// fw.write(DxfGroup.toString(20, envelope.getMaxY(), 6));
// fw.write(DxfGroup.toString(9, "$LIMMIN"));
// fw.write(DxfGroup.toString(10, envelope.getMinX(), 6));
// fw.write(DxfGroup.toString(20, envelope.getMinY(), 6));
// fw.write(DxfGroup.toString(9, "$LUNITS"));
// fw.write(DxfGroup.toString(70, 2));
// fw.write(DxfGroup.toString(9, "$LUPREC"));
// fw.write(DxfGroup.toString(70, 2));
// fw.write(DxfGroup.toString(0, "ENDSEC"));
// // }
// // ECRITURE DES TABLES
// fw.write(DxfGroup.toString(0, "SECTION"));
// fw.write(DxfGroup.toString(2, "TABLES"));
// fw.write(DxfGroup.toString(0, "TABLE"));
// fw.write(DxfGroup.toString(2, "STYLE"));
// fw.write(DxfGroup.toString(70, 1));
// fw.write(DxfGroup.toString(0, "STYLE")); // added by L. Becker on 2006-11-08
// DxfTABLE_STYLE_ITEM style = new DxfTABLE_STYLE_ITEM("STANDARD", 0, 0f, 1f, 0f, 0, 1.0f,
// "xxx.txt", "yyy.txt");
// fw.write(style.toString());
// fw.write(DxfGroup.toString(0, "ENDTAB"));
// fw.write(DxfGroup.toString(0, "TABLE"));
// fw.write(DxfGroup.toString(2, "LTYPE"));
// fw.write(DxfGroup.toString(70, 1));
// fw.write(DxfGroup.toString(0, "LTYPE")); // added by L. Becker on 2006-11-08
// DxfTABLE_LTYPE_ITEM ltype = new DxfTABLE_LTYPE_ITEM("CONTINUE", 0, "", 65, 0f,
// new float[0]);
// fw.write(ltype.toString());
// fw.write(DxfGroup.toString(0, "ENDTAB"));
// fw.write(DxfGroup.toString(0, "TABLE"));
// fw.write(DxfGroup.toString(2, "LAYER"));
// fw.write(DxfGroup.toString(70, 2));
// for( int i = 0; i < layerNames.length; i++ ) {
// DxfTABLE_LAYER_ITEM layer = new DxfTABLE_LAYER_ITEM(layerNames[i], 0, 131,
// "CONTINUE");
// fw.write(DxfGroup.toString(0, "LAYER")); // added by L. Becker on 2006-11-08
// fw.write(layer.toString());
// if (suffix) {
// layer = new DxfTABLE_LAYER_ITEM(layerNames[i] + "_", 0, 131, "CONTINUE");
// fw.write(DxfGroup.toString(0, "LAYER")); // added by L. Becker on 2006-11-08
// fw.write(layer.toString());
// }
// }
// fw.write(DxfGroup.toString(0, "ENDTAB"));
// fw.write(DxfGroup.toString(0, "ENDSEC"));
//
// // ECRITURE DES FEATURES
// fw.write(DxfGroup.toString(0, "SECTION"));
// fw.write(DxfGroup.toString(2, "ENTITIES"));
// Iterator it = features.iterator();
// while( it.hasNext() ) {
// Feature feature = (Feature) it.next();
// // use the layer attribute for layer name
// if (feature.getSchema().hasAttribute("LAYER")) {
// fw.write(DxfENTITY.feature2Dxf(feature, feature.getString("LAYER"), suffix));
// }
// // use the JUMP layer name for DXF layer name
// else if (layerNames.length > 0) {
// fw.write(DxfENTITY.feature2Dxf(feature, layerNames[0], suffix));
// } else {
// fw.write(DxfENTITY.feature2Dxf(feature, "0", false));
// }
// }
// fw.write(DxfGroup.toString(0, "ENDSEC"));
//
// // FIN DE FICHIER
// fw.write(DxfGroup.toString(0, "EOF"));
// fw.flush();
// } catch (IOException ioe) {
// ioe.printStackTrace();
// }
// return;
// }
}