package org.geotools.data.dxf.entities;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import org.geotools.data.dxf.parser.DXFLineNumberReader;
import java.awt.geom.Point2D;
import java.io.EOFException;
import java.io.IOException;
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.DXFTables;
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;
public class DXFPoint extends DXFEntity {
private static final Log log = LogFactory.getLog(DXFPoint.class);
public Point2D.Double _point = new Point2D.Double(0, 0);
public DXFPoint(DXFPoint newPoint) {
this(newPoint._point.x, newPoint._point.y, newPoint.getColor(), newPoint.getRefLayer(), 0, newPoint.getThickness());
setType(newPoint.getType());
setStartingLineNumber(newPoint.getStartingLineNumber());
setUnivers(newPoint.getUnivers());
}
public DXFPoint(Point2D.Double p, int c, DXFLayer l, int visibility, float thickness) {
super(c, l, visibility, null, thickness);
if (p == null) {
p = new Point2D.Double(0, 0);
}
_point = p;
setName("DXFPoint");
}
public DXFPoint(Point2D.Double p) {
super(-1, null, 0, null, DXFTables.defaultThickness);
if (p == null) {
p = new Point2D.Double(0, 0);
}
_point = p;
setName("DXFPoint");
}
public DXFPoint() {
super(-1, null, 0, null, DXFTables.defaultThickness);
setName("DXFPoint");
}
public DXFPoint(double x, double y, int c, DXFLayer l, int visibility, double thickness) {
super(c, l, visibility, null, DXFTables.defaultThickness);
_point = new Point2D.Double(x, y);
setName("DXFPoint");
}
public void setX(double x) {
_point.x = x;
}
public void setY(double y) {
_point.y = y;
}
public double X() {
return _point.getX();
}
public double Y() {
return _point.getY();
}
public static DXFPoint read(DXFLineNumberReader br, DXFUnivers univers) throws NumberFormatException, IOException {
DXFLayer l = null;
int visibility = 0, c = -1;
double x = 0, y = 0, thickness = 0;
int sln = br.getLineNumber();
log.debug(">>Enter at line: " + sln);
DXFCodeValuePair cvp = null;
DXFGroupCode gc = 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 LAYER_NAME: //"8"
l = univers.findLayer(cvp.getStringValue());
break;
case X_1: //"10"
x = cvp.getDoubleValue();
break;
case Y_1: //"20"
y = cvp.getDoubleValue();
break;
case COLOR: //"62"
c = cvp.getShortValue();
break;
case VISIBILITY: //"60"
visibility = cvp.getShortValue();
break;
case THICKNESS: //"39"
thickness = cvp.getDoubleValue();
break;
default:
break;
}
}
DXFPoint e = new DXFPoint(x, y, c, l, visibility, thickness);
e.setType(GeometryType.POINT);
e.setStartingLineNumber(sln);
e.setUnivers(univers);
log.debug(e.toString(x, y, visibility, c, thickness));
log.debug(">>Exit at line: " + br.getLineNumber());
return e;
}
@Override
public Geometry getGeometry() {
if (geometry == null) {
updateGeometry();
}
return super.getGeometry();
}
@Override
public void updateGeometry(){
geometry = getUnivers().getGeometryFactory().createPoint(toCoordinate());
}
public Coordinate toCoordinate() {
if (_point == null) {
addError("coordinate can not be created.");
return null;
}
return rotateAndPlace(new Coordinate(_point.getX(), _point.getY()));
}
public String toString(double x, double y, int visibility, int c, double thickness) {
StringBuffer s = new StringBuffer();
s.append("DXFPoint [");
s.append("x: ");
s.append(x + ", ");
s.append("y: ");
s.append(y + ", ");
s.append("visibility: ");
s.append(visibility + ", ");
s.append("color: ");
s.append(c + ", ");
s.append("thickness: ");
s.append(thickness);
s.append("]");
return s.toString();
}
@Override
public DXFEntity translate(double x, double y) {
_point.x += x;
_point.y += y;
return this;
}
@Override
public DXFEntity clone() {
return new DXFPoint(this);
}
}