/*
* 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 com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.PrecisionModel;
/**
* A DXF ENTITY is equivalent to a JUMP feature. This class is the parent class
* for POLYLINE, POINT, LINE and every kind of geometric entity present in a
* DXF file.
* @author Micha�l Michaud
* @version 0.5.0
*/
// History
// 2006-10-19 : add multi-geometry export
// add attribute tests an ability to export ANY jump layer
// add ability to export holes in a separate layer or not
@SuppressWarnings("nls")
public class DxfENTITY {
protected static GeometryFactory gF = new GeometryFactory();
public final static DxfGroup LINE = new DxfGroup(0, "LINE");
public final static DxfGroup POINT = new DxfGroup(0, "POINT");
public final static DxfGroup CIRCLE = new DxfGroup(0, "CIRCLE");
public final static DxfGroup ARC = new DxfGroup(0, "ARC");
public final static DxfGroup TRACE = new DxfGroup(0, "TRACE");
public final static DxfGroup SOLID = new DxfGroup(0, "SOLID");
public final static DxfGroup TEXT = new DxfGroup(0, "TEXT");
public final static DxfGroup SHAPE = new DxfGroup(0, "SHAPE");
public final static DxfGroup BLOCK = new DxfGroup(0, "BLOCK");
public final static DxfGroup ENDBLK = new DxfGroup(0, "ENDBLK");
public final static DxfGroup INSERT = new DxfGroup(0, "INSERT");
public final static DxfGroup ATTDEF = new DxfGroup(0, "ATTDEF");
public final static DxfGroup ATTRIB = new DxfGroup(0, "ATTRIB");
public final static DxfGroup POLYLINE = new DxfGroup(0, "POLYLINE");
public final static DxfGroup LWPOLYLINE = new DxfGroup(0, "LWPOLYLINE");
public final static DxfGroup VERTEX = new DxfGroup(0, "VERTEX");
public final static DxfGroup SEQEND = new DxfGroup(0, "SEQEND");
public final static DxfGroup _3DFACE = new DxfGroup(0, "3DFACE");
public final static DxfGroup VIEWPORT = new DxfGroup(0, "VIEWPORT");
public final static DxfGroup DIMENSION = new DxfGroup(0, "DIMENSION");
public final static PrecisionModel DPM = new PrecisionModel();
public static int precision = 3;
private String layerName = "DEFAULT";
private String lineType = null;
private float elevation = 0f;
private float thickness = 0f;
private int colorNumber = 256;
private int space = 0;
private double[] extrusionDirection = null;
private int flags = 0;
public String getLayerName() {
return layerName;
}
public void setLayerName( String layerName ) {
this.layerName = layerName;
}
public DxfENTITY( String layerName ) {
this.layerName = layerName;
}
// public static String feature2Dxf( SimpleFeature feature, String layerName, boolean suffix ) {
// Geometry g = (Geometry) feature.getDefaultGeometry();
// if (g.getGeometryType().equals("Point")) {
// return point2Dxf(feature, layerName);
// } else if (g.getGeometryType().equals("LineString")) {
// return lineString2Dxf(feature, layerName);
// } else if (g.getGeometryType().equals("Polygon")) {
// return polygon2Dxf(feature, layerName, suffix);
// } else if (g instanceof GeometryCollection) {
// StringBuffer sb = new StringBuffer();
// for( int i = 0; i < g.getNumGeometries(); i++ ) {
// SimpleFeature ff = SimpleFeatureBuilder.copy(feature);
// ff.setDefaultGeometry(g.getGeometryN(i));
// sb.append(feature2Dxf(ff, layerName, suffix));
// }
// return sb.toString();
// } else {
// return null;
// }
// }
//
// public static String point2Dxf( SimpleFeature feature, String layerName ) {
// StringBuffer sb = null;
// boolean hasText = (feature.getSchema().hasAttribute("TEXT") && !feature
// .getAttribute("TEXT").equals(""));
// if (hasText) {
// sb = new StringBuffer(DxfGroup.toString(0, "TEXT"));
// } else {
// sb = new StringBuffer(DxfGroup.toString(0, "POINT"));
// }
// if (feature.getSchema().hasAttribute("LAYER")
// && !feature.getString("LAYER").trim().equals("")) {
// sb.append(DxfGroup.toString(8, feature.getAttribute("LAYER")));
// } else {
// sb.append(DxfGroup.toString(8, layerName));
// }
// if (feature.getSchema().hasAttribute("LTYPE")
// && !feature.getAttribute("LTYPE").equals("BYLAYER")) {
// sb.append(DxfGroup.toString(6, feature.getAttribute("LTYPE")));
// }
// if (feature.getSchema().hasAttribute("ELEVATION")
// && !feature.getAttribute("ELEVATION").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(38, feature.getAttribute("ELEVATION")));
// }
// if (feature.getSchema().hasAttribute("THICKNESS")
// && !feature.getAttribute("THICKNESS").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(39, feature.getAttribute("THICKNESS")));
// }
// if (feature.getSchema().hasAttribute("COLOR")
// && !(((Integer) feature.getAttribute("COLOR")).intValue() == 256)) {
// sb.append(DxfGroup.toString(62, feature.getAttribute("COLOR").toString()));
// }
// Coordinate coord = ((Point) feature.getGeometry()).getCoordinate();
// sb.append(DxfGroup.toString(10, coord.x, precision));
// sb.append(DxfGroup.toString(20, coord.y, precision));
// if (!Double.isNaN(coord.z))
// sb.append(DxfGroup.toString(30, coord.z, precision));
// if (feature.getSchema().hasAttribute("TEXT_HEIGHT")
// && !feature.getAttribute("TEXT_HEIGHT").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(40, feature.getAttribute("TEXT_HEIGHT")));
// }
// if (hasText && feature.getSchema().hasAttribute("TEXT_HEIGHT")) {
// sb.append(DxfGroup.toString(1, feature.getAttribute("TEXT")));
// }
// if (hasText && feature.getSchema().hasAttribute("TEXT_HEIGHT")) {
// sb.append(DxfGroup.toString(7, feature.getAttribute("TEXT_STYLE")));
// }
// return sb.toString();
// }
//
// public static String lineString2Dxf( Feature feature, String layerName ) {
// LineString geom = (LineString) feature.getGeometry();
// Coordinate[] coords = geom.getCoordinates();
// // Correction added by L. Becker and R Littlefield on 2006-11-08
// // It writes 2 points-only polylines in a line instead of a polyline
// // to make it possible to incorporate big dataset in View32
// boolean isLine = (coords.length == 2);
// StringBuffer sb;
// if (!isLine) {
// sb = new StringBuffer(DxfGroup.toString(0, "POLYLINE"));
// } else {
// sb = new StringBuffer(DxfGroup.toString(0, "LINE"));
// }
// // StringBuffer sb = new StringBuffer(DxfGroup.toString(0, "POLYLINE"));
// if (feature.getSchema().hasAttribute("LAYER")
// && !feature.getString("LAYER").trim().equals("")) {
// sb.append(DxfGroup.toString(8, feature.getAttribute("LAYER")));
// } else {
// sb.append(DxfGroup.toString(8, layerName));
// }
// if (feature.getSchema().hasAttribute("LTYPE")
// && !feature.getAttribute("LTYPE").equals("BYLAYER")) {
// sb.append(DxfGroup.toString(6, feature.getAttribute("LTYPE")));
// }
// if (feature.getSchema().hasAttribute("ELEVATION")
// && !feature.getAttribute("ELEVATION").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(38, feature.getAttribute("ELEVATION")));
// }
// if (feature.getSchema().hasAttribute("THICKNESS")
// && !feature.getAttribute("THICKNESS").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(39, feature.getAttribute("THICKNESS")));
// }
// if (feature.getSchema().hasAttribute("COLOR")
// && !(((Integer) feature.getAttribute("COLOR")).intValue() == 256)) {
// sb.append(DxfGroup.toString(62, feature.getAttribute("COLOR").toString()));
// }
// // modified by L. Becker and R. Littlefield (add the Line case)
// if (isLine) {
// sb.append(DxfGroup.toString(10, coords[0].x, precision));
// sb.append(DxfGroup.toString(20, coords[0].y, precision));
// if (!Double.isNaN(coords[0].z))
// sb.append(DxfGroup.toString(30, "0.0"));
// sb.append(DxfGroup.toString(11, coords[1].x, precision));
// sb.append(DxfGroup.toString(21, coords[1].y, precision));
// if (!Double.isNaN(coords[1].z))
// sb.append(DxfGroup.toString(31, "0.0"));
// } else {
// sb.append(DxfGroup.toString(66, 1));
// sb.append(DxfGroup.toString(10, "0.0"));
// sb.append(DxfGroup.toString(20, "0.0"));
// if (!Double.isNaN(coords[0].z))
// sb.append(DxfGroup.toString(30, "0.0"));
// sb.append(DxfGroup.toString(70, 8));
//
// for( int i = 0; i < coords.length; i++ ) {
// sb.append(DxfGroup.toString(0, "VERTEX"));
// if (feature.getSchema().hasAttribute("LAYER")
// && !feature.getString("LAYER").trim().equals("")) {
// sb.append(DxfGroup.toString(8, feature.getAttribute("LAYER")));
// } else {
// sb.append(DxfGroup.toString(8, layerName));
// }
// sb.append(DxfGroup.toString(10, coords[i].x, precision));
// sb.append(DxfGroup.toString(20, coords[i].y, precision));
// if (!Double.isNaN(coords[i].z))
// sb.append(DxfGroup.toString(30, coords[i].z, precision));
// sb.append(DxfGroup.toString(70, 32));
// }
// sb.append(DxfGroup.toString(0, "SEQEND"));
// }
// return sb.toString();
// }
//
// public static String polygon2Dxf( Feature feature, String layerName, boolean suffix ) {
// // System.out.println("polygon2Dxf " + suffix);
// Polygon geom = (Polygon) feature.getGeometry();
// Coordinate[] coords = geom.getExteriorRing().getCoordinates();
// StringBuffer sb = new StringBuffer(DxfGroup.toString(0, "POLYLINE"));
// sb.append(DxfGroup.toString(8, layerName));
// if (feature.getSchema().hasAttribute("LTYPE")
// && !feature.getAttribute("LTYPE").equals("BYLAYER")) {
// sb.append(DxfGroup.toString(6, feature.getAttribute("LTYPE")));
// }
// if (feature.getSchema().hasAttribute("ELEVATION")
// && !feature.getAttribute("ELEVATION").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(38, feature.getAttribute("ELEVATION")));
// }
// if (feature.getSchema().hasAttribute("THICKNESS")
// && !feature.getAttribute("THICKNESS").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(39, feature.getAttribute("THICKNESS")));
// }
// if (feature.getSchema().hasAttribute("COLOR")
// && !(((Integer) feature.getAttribute("COLOR")).intValue() == 256)) {
// sb.append(DxfGroup.toString(62, feature.getAttribute("COLOR").toString()));
// }
// sb.append(DxfGroup.toString(66, 1));
// sb.append(DxfGroup.toString(10, "0.0"));
// sb.append(DxfGroup.toString(20, "0.0"));
// if (!Double.isNaN(coords[0].z))
// sb.append(DxfGroup.toString(30, "0.0"));
// sb.append(DxfGroup.toString(70, 9));
// for( int i = 0; i < coords.length; i++ ) {
// sb.append(DxfGroup.toString(0, "VERTEX"));
// sb.append(DxfGroup.toString(8, layerName));
// sb.append(DxfGroup.toString(10, coords[i].x, precision));
// sb.append(DxfGroup.toString(20, coords[i].y, precision));
// if (!Double.isNaN(coords[i].z))
// sb.append(DxfGroup.toString(30, coords[i].z, precision));
// sb.append(DxfGroup.toString(70, 32));
// }
// sb.append(DxfGroup.toString(0, "SEQEND"));
// for( int h = 0; h < geom.getNumInteriorRing(); h++ ) {
// // System.out.println("polygon2Dxf (hole)" + suffix);
// sb.append(DxfGroup.toString(0, "POLYLINE"));
// if (suffix)
// sb.append(DxfGroup.toString(8, layerName + "_"));
// else
// sb.append(DxfGroup.toString(8, layerName));
// if (feature.getSchema().hasAttribute("LTYPE")
// && !feature.getAttribute("LTYPE").equals("BYLAYER")) {
// sb.append(DxfGroup.toString(6, feature.getAttribute("LTYPE")));
// }
// if (feature.getSchema().hasAttribute("THICKNESS")
// && !feature.getAttribute("THICKNESS").equals(new Float(0f))) {
// sb.append(DxfGroup.toString(39, feature.getAttribute("THICKNESS")));
// }
// if (feature.getSchema().hasAttribute("COLOR")
// && !(((Integer) feature.getAttribute("COLOR")).intValue() == 256)) {
// sb.append(DxfGroup.toString(62, feature.getAttribute("COLOR")));
// }
// sb.append(DxfGroup.toString(66, 1));
// sb.append(DxfGroup.toString(10, "0.0"));
// sb.append(DxfGroup.toString(20, "0.0"));
// if (!Double.isNaN(coords[0].z))
// sb.append(DxfGroup.toString(30, "0.0"));
// sb.append(DxfGroup.toString(70, 9));
// coords = geom.getInteriorRingN(h).getCoordinates();
// for( int i = 0; i < coords.length; i++ ) {
// sb.append(DxfGroup.toString(0, "VERTEX"));
// if (suffix)
// sb.append(DxfGroup.toString(8, layerName + "_"));
// else
// sb.append(DxfGroup.toString(8, layerName));
// sb.append(DxfGroup.toString(10, coords[i].x, precision));
// sb.append(DxfGroup.toString(20, coords[i].y, precision));
// if (!Double.isNaN(coords[i].z))
// sb.append(DxfGroup.toString(30, coords[i].z, precision));
// sb.append(DxfGroup.toString(70, 32));
// }
// sb.append(DxfGroup.toString(0, "SEQEND"));
// }
//
// return sb.toString();
// }
}