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.Rectangle2D; 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.DXFLineType; 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; /** * * * @source $URL$ */ public class DXFText extends DXFEntity { private static final Log log = LogFactory.getLog(DXFText.class); public DXFPoint _point = new DXFPoint(); // 10 ,20 public String _value = ""; // 1 public double _height = 0; // 40 public double _rotation = 0; // 50 public int _align = 0; // 72 public String _style = ""; // 7 public double _angle = 0; // 51 public double _zoomfactor = 1; // 41 public Rectangle2D.Double _r = new Rectangle2D.Double(); public DXFText(DXFText newText) { this(newText._point._point.x, newText._point._point.y, newText._value, newText._rotation, newText.getThickness(), newText._height, newText._align, newText._style, newText.getColor(), newText.getRefLayer(), newText._angle, newText._zoomfactor, 0, newText.getLineType()); setType(newText.getType()); setStartingLineNumber(newText.getStartingLineNumber()); setUnivers(newText.getUnivers()); // Hack voor label setKey(newText._value); } public DXFText(double x, double y, String value, double rotation, double thickness, double height, int align, String style, int c, DXFLayer l, double angle, double zoomFactor, int visibility, DXFLineType lineType) { super(c, l, visibility, lineType, thickness); _point = new DXFPoint(x, y, c, l, visibility, thickness); _value = value; _rotation = rotation; _height = height; _align = align; _style = style; _angle = angle; _zoomfactor = zoomFactor; setName("DXFText"); } public DXFText(double x, double y, String value, double rotation, double thickness, double height, int align, String style, int c, DXFLayer l, double angle, double zoomFactor, int visibility, DXFLineType lineType, DXFExtendedData extData) { super(c, l, visibility, lineType, thickness); _point = new DXFPoint(x, y, c, l, visibility, thickness); _value = value; _rotation = rotation; _height = height; _align = align; _style = style; _angle = angle; _zoomfactor = zoomFactor; _extendedData = extData; setName("DXFText"); } public static DXFText read(DXFLineNumberReader br, DXFUnivers univers) throws IOException { DXFLayer l = null; String value = "", style = "STANDARD"; int visibility = 0, align = 0, c = -1; DXFLineType lineType = null; double x = 0, y = 0, angle = 0, rotation = 0, zoomfactor = 1, thickness = DXFTables.defaultThickness, height = 0; 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" x = cvp.getDoubleValue(); break; case Y_1: //"20" y = cvp.getDoubleValue(); break; case TEXT: //"1" value = cvp.getStringValue(); break; case ANGLE_1: //"50" rotation = cvp.getDoubleValue(); break; case THICKNESS: //"39" thickness = cvp.getDoubleValue(); break; case DOUBLE_1: //"40" height = cvp.getDoubleValue(); break; case ANGLE_2: //"51" angle = cvp.getDoubleValue(); break; case DOUBLE_2: //"41" zoomfactor = cvp.getDoubleValue(); break; case INT_3: //"72" align = cvp.getShortValue(); break; case LAYER_NAME: //"8" l = univers.findLayer(cvp.getStringValue()); break; case COLOR: //"62" c = cvp.getShortValue(); break; case TEXT_STYLE_NAME: //"7" style = cvp.getStringValue(); break; case VISIBILITY: //"60" visibility = cvp.getShortValue(); break; case LINETYPE_NAME: //"6" lineType = univers.findLType(cvp.getStringValue()); break; case XDATA_APPLICATION_NAME: String appName = cvp.getStringValue(); _extData = DXFExtendedData.getExtendedData(br); _extData.setAppName(appName); break; default: break; } } DXFText e = new DXFText(x, y, value, rotation, thickness, height, align, style, c, l, angle, zoomfactor, visibility, lineType, _extData); e.setType(GeometryType.POINT); e.setStartingLineNumber(sln); e.setUnivers(univers); // Hack voor label e.setKey(value); log.debug(e.toString(x, y, value, rotation, thickness, height, align, style, c, angle, zoomfactor, visibility)); log.debug(">Exit at line: " + br.getLineNumber()); return e; } @Override public Geometry getGeometry() { if (geometry == null) { } return super.getGeometry(); } public void updateGeometry() { geometry = getUnivers().getGeometryFactory().createPoint(toCoordinate()); } public Coordinate toCoordinate() { if (_point == null || _point._point == null) { addError("coordinate can not be created."); return null; } return rotateAndPlace(new Coordinate(_point._point.getX(), _point._point.getY())); } public String toString(double x, double y, String value, double rotation, double thickness, double height, double align, String style, int c, double angle, double zoomfactor, int visibility) { StringBuffer s = new StringBuffer(); s.append("DXFText ["); s.append("x: "); s.append(x + ", "); s.append("y: "); s.append(y + ", "); s.append("value: "); s.append(value + ", "); s.append("rotation: "); s.append(rotation + ", "); s.append("thickness: "); s.append(thickness + ", "); s.append("height: "); s.append(height + ", "); s.append("align: "); s.append(align + ", "); s.append("style: "); s.append(style + ", "); s.append("color: "); s.append(c + ", "); s.append("angle: "); s.append(angle + ", "); s.append("zoomfactor: "); s.append(zoomfactor + ", "); s.append("visibility: "); s.append(visibility); s.append("]"); return s.toString(); } @Override public DXFEntity translate(double x, double y) { _point._point.x += x; _point._point.y += y; return this; } @Override public DXFEntity clone() { return new DXFText(this); } }