package org.geotools.data.dxf.entities;
import org.geotools.data.dxf.parser.DXFLineNumberReader;
import java.io.EOFException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.geotools.data.GeometryType;
import org.geotools.data.dxf.parser.DXFUnivers;
import org.geotools.data.dxf.header.DXFLayer;
import org.geotools.data.dxf.header.DXFLineType;
import org.geotools.data.dxf.parser.DXFCodeValuePair;
import org.geotools.data.dxf.parser.DXFGroupCode;
import org.geotools.data.dxf.parser.DXFParseException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LinearRing;
/**
*
*
* @source $URL$
*/
public class DXFSolid extends DXFEntity {
private static final Log log = LogFactory.getLog(DXFSolid.class);
public DXFPoint _p1 = new DXFPoint();
public DXFPoint _p2 = new DXFPoint();
public DXFPoint _p3 = new DXFPoint();
public DXFPoint _p4 = null;
public DXFSolid(DXFSolid newSolid) {
this(new DXFPoint(newSolid._p1._point.x, newSolid._p1._point.y, newSolid.getColor(), null, 0, newSolid.getThickness()),
new DXFPoint(newSolid._p2._point.x, newSolid._p2._point.y, newSolid.getColor(), null, 0, newSolid.getThickness()),
new DXFPoint(newSolid._p3._point.x, newSolid._p3._point.y, newSolid.getColor(), null, 0, newSolid.getThickness()),
new DXFPoint(newSolid._p4._point.x, newSolid._p4._point.y, newSolid.getColor(), null, 0, newSolid.getThickness()),
newSolid.getThickness(), newSolid.getColor(), newSolid.getRefLayer(), 0, newSolid.getLineType());
setType(newSolid.getType());
setStartingLineNumber(newSolid.getStartingLineNumber());
setUnivers(newSolid.getUnivers());
}
public DXFSolid(DXFPoint p1, DXFPoint p2, DXFPoint p3, DXFPoint p4,
double thickness, int c, DXFLayer l, int visibility, DXFLineType lineType) {
super(c, l, visibility, lineType, thickness);
_p1 = p1;
_p2 = p2;
_p3 = p3;
if (p4 == null) {
_p4 = p3;
} else {
_p4 = p4;
}
setName("DXFSolid");
}
public DXFSolid(DXFPoint p1, DXFPoint p2, DXFPoint p3, DXFPoint p4,
double thickness, int c, DXFLayer l, int visibility, DXFLineType lineType, DXFExtendedData extData) {
super(c, l, visibility, lineType, thickness);
_p1 = p1;
_p2 = p2;
_p3 = p3;
if (p4 == null) {
_p4 = p3;
} else {
_p4 = p4;
}
_extendedData = extData;
setName("DXFSolid");
}
public static DXFEntity read(DXFLineNumberReader br, DXFUnivers univers) throws IOException {
double p1_x = 0, p2_x = 0, p3_x = 0, p4_x = 0, p1_y = 0, p2_y = 0, p3_y = 0, p4_y = 0;
double thickness = 0;
int visibility = 0, c = -1;
DXFLayer l = null;
DXFLineType lineType = null;
int sln = br.getLineNumber();
log.debug(">>Enter at line: " + sln);
DXFCodeValuePair cvp = null;
DXFGroupCode gc = null;
DXFExtendedData _extData = null;
boolean doLoop = true;
while (doLoop) {
cvp = new DXFCodeValuePair();
try {
gc = cvp.read(br);
} catch (DXFParseException ex) {
throw new IOException("DXF parse error" + ex.getLocalizedMessage());
} catch (EOFException e) {
doLoop = false;
break;
}
switch (gc) {
case TYPE:
String type = cvp.getStringValue();
// geldt voor alle waarden van type
br.reset();
doLoop = false;
break;
case X_1: //"10"
p1_x = cvp.getDoubleValue();
break;
case X_2: //"11"
p2_x = cvp.getDoubleValue();
break;
case X_3: //"12"
p3_x = cvp.getDoubleValue();
break;
case X_4: //"13"
p4_x = cvp.getDoubleValue();
break;
case Y_1: //"20"
p1_y = cvp.getDoubleValue();
break;
case Y_2: //"21"
p2_y = cvp.getDoubleValue();
break;
case Y_3: //"22"
p3_y = cvp.getDoubleValue();
break;
case Y_4: //"23"
p4_y = cvp.getDoubleValue();
break;
case THICKNESS: //"39"
thickness = cvp.getDoubleValue();
break;
case LAYER_NAME: //"8"
l = univers.findLayer(cvp.getStringValue());
break;
case COLOR: //"62"
c = cvp.getShortValue();
break;
case LINETYPE_NAME: //"6"
lineType = univers.findLType(cvp.getStringValue());
break;
case VISIBILITY: //"60"
visibility = cvp.getShortValue();
break;
case XDATA_APPLICATION_NAME:
String appName = cvp.getStringValue();
_extData = DXFExtendedData.getExtendedData(br);
_extData.setAppName(appName);
break;
default:
break;
}
}
DXFSolid e = new DXFSolid(
new DXFPoint(p1_x, p1_y, c, null, visibility, 1),
new DXFPoint(p2_x, p2_y, c, null, visibility, 1),
new DXFPoint(p3_x, p3_y, c, null, visibility, 1),
new DXFPoint(p4_x, p4_y, c, null, visibility, 1),
thickness,
c,
l,
visibility,
lineType, _extData);
e.setType(GeometryType.POLYGON);
e.setStartingLineNumber(sln);
e.setUnivers(univers);
log.debug(e.toString(p1_x, p2_x, p3_x, p4_x, p1_y, p2_y, p3_y, p4_y, thickness, c, visibility));
log.debug(">>Exit at line: " + br.getLineNumber());
return e;
}
public Coordinate[] toCoordinateArray() {
List<Coordinate> lc = new ArrayList<Coordinate>();
DXFPoint[] points = {_p1, _p2, _p3, _p4};
for (DXFPoint point : points) {
Coordinate c = new Coordinate(point.X(), point.Y());
lc.add(c);
}
// Fix last line in LinearRing
lc.add(lc.get(0));
return rotateAndPlace(lc.toArray(new Coordinate[]{}));
}
@Override
public Geometry getGeometry() {
if (geometry == null) {
updateGeometry();
}
return super.getGeometry();
}
public void updateGeometry() {
Coordinate[] ca = toCoordinateArray();
if (ca != null && ca.length > 1) {
LinearRing lr = getUnivers().getGeometryFactory().createLinearRing(ca);
geometry = getUnivers().getGeometryFactory().createPolygon(lr, null);
} else {
addError("coordinate array faulty, size: " + (ca == null ? 0 : ca.length));
}
}
public String toString(double p1_x,
double p2_x,
double p3_x,
double p4_x,
double p1_y,
double p2_y,
double p3_y,
double p4_y,
double thickness,
int c,
int visibility) {
StringBuffer s = new StringBuffer();
s.append("DXFSolid [");
s.append("p1_x: ");
s.append(p1_x + ", ");
s.append("p2_x: ");
s.append(p2_x + ", ");
s.append("p3_x: ");
s.append(p3_x + ", ");
s.append("p4_x: ");
s.append(p4_x + ", ");
s.append("p1_y: ");
s.append(p1_y + ", ");
s.append("p2_y: ");
s.append(p2_y + ", ");
s.append("p3_y: ");
s.append(p3_y + ", ");
s.append("p4_y: ");
s.append(p4_y + ", ");
s.append("thickness: ");
s.append(thickness + ", ");
s.append("color: ");
s.append(c + ", ");
s.append("visibility: ");
s.append(visibility);
s.append("]");
return s.toString();
}
@Override
public DXFEntity translate(double x, double y) {
_p1._point.x += x;
_p1._point.y += y;
_p2._point.x += x;
_p2._point.y += y;
_p3._point.x += x;
_p3._point.y += y;
_p4._point.x += x;
_p4._point.y += y;
return this;
}
@Override
public DXFEntity clone() {
return new DXFSolid(this);
}
}