package org.geotools.data.dxf.header;
import java.awt.geom.Point2D;
import java.io.EOFException;
import java.io.IOException;
import org.geotools.data.dxf.parser.DXFParseException;
import org.geotools.data.dxf.parser.DXFLineNumberReader;
import org.geotools.data.dxf.entities.DXFPoint;
import org.geotools.data.dxf.parser.DXFCodeValuePair;
import org.geotools.data.dxf.parser.DXFConstants;
import org.geotools.data.dxf.parser.DXFGroupCode;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DXFHeader implements DXFConstants {
private static final Log log = LogFactory.getLog(DXFHeader.class);
public DXFPoint _LIMMIN;
public DXFPoint _LIMMAX;
public DXFPoint _EXTMIN;
public DXFPoint _EXTMAX;
public int _FILLMODE;
public String _ACADVER;
public int _SRID;
public DXFHeader() {
_LIMMIN = new DXFPoint(new Point2D.Double(0, 0));
_LIMMAX = new DXFPoint(new Point2D.Double(100, 100));
_EXTMIN = new DXFPoint(new Point2D.Double(100, 100));
_EXTMAX = new DXFPoint(new Point2D.Double(50, 50));
_FILLMODE = 0;
_ACADVER = "AC1006";
_SRID = 28992;
}
public DXFHeader(DXFPoint limmin, DXFPoint limmax, DXFPoint extmin, DXFPoint extmax, int fillmode, String version, int srid) {
_LIMMIN = limmin;
_LIMMAX = limmax;
_EXTMIN = extmin;
_EXTMAX = extmax;
_FILLMODE = fillmode;
_ACADVER = version;
_SRID = srid;
}
public static DXFHeader read(DXFLineNumberReader br) throws IOException {
Point2D.Double limmin = null;
Point2D.Double limmax = null;
Point2D.Double extmin = null;
Point2D.Double extmax = null;
int fillmode = 0;
String version = "AC1006";
int srid = 28992; // default rd new
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();
if (type.equals(ENDSEC)) {
doLoop = false;
break;
}
break;
case VARIABLE_NAME:
String variableName = cvp.getStringValue();
double x = 0,
y = 0;
int tfillmode = 0;
String tversion = null;
boolean doLoop2 = true;
while (doLoop2) {
cvp = new DXFCodeValuePair();
try {
gc = cvp.read(br);
} catch (DXFParseException ex) {
throw new IOException("DXF parse error" + ex.getLocalizedMessage());
} catch (EOFException e) {
doLoop2 = false;
doLoop = false;
break;
}
switch (gc) {
case TYPE:
type = cvp.getStringValue();
if (type.equals(ENDSEC)) {
doLoop = false;
doLoop2 = false;
break;
}
break;
case VARIABLE_NAME:
doLoop2 = false;
br.reset();
break;
case X_1:
x = cvp.getDoubleValue();
break;
case Y_1:
y = cvp.getDoubleValue();
break;
case TEXT:
tversion = cvp.getStringValue();
break;
case INT_1:
tfillmode = cvp.getShortValue();
break;
default:
}
}
if (variableName.equals($LIMMIN)) {
limmin = new Point2D.Double(x, y);
} else if (variableName.equals($LIMMAX)) {
limmax = new Point2D.Double(x, y);
} else if (variableName.equals($EXTMIN)) {
extmin = new Point2D.Double(x, y);
} else if (variableName.equals($EXTMAX)) {
extmax = new Point2D.Double(x, y);
} else if (variableName.equals($ACADVER)) {
version = tversion;
} else if (variableName.equals($FILLMODE)) {
fillmode = tfillmode;
}
break;
default:
break;
}
}
DXFHeader e = new DXFHeader(new DXFPoint(limmin, -1, null, 1, 1),
new DXFPoint(limmax, -1, null, 1, 1),
new DXFPoint(extmin, -1, null, 1, 1),
new DXFPoint(extmax, -1, null, 1, 1),
fillmode, version, srid);
log.debug(e.toString(limmin, limmax, extmin, extmax, fillmode, version, srid));
log.debug(">Exit at line: " + br.getLineNumber());
return e;
}
public String toString(Point2D.Double limmin, Point2D.Double limmax, Point2D.Double extmin, Point2D.Double extmax, int fillmode, String version, int srid) {
StringBuffer s = new StringBuffer();
s.append("DXFHeader [");
s.append("limmin: ");
s.append(limmin + ", ");
s.append("limmax: ");
s.append(limmax + ", ");
s.append("extmin: ");
s.append(extmin + ", ");
s.append("extmax: ");
s.append(extmax + ", ");
s.append("fillmode: ");
s.append(fillmode + ",");
s.append("srid: ");
s.append(srid + ",");
s.append("version: ");
s.append(version);
s.append("]");
return s.toString();
}
}