package org.geotools.data.dxf.header; import java.io.EOFException; import java.io.IOException; import java.util.Vector; import java.util.Iterator; import org.geotools.data.dxf.parser.DXFColor; import org.geotools.data.dxf.parser.DXFParseException; import org.geotools.data.dxf.parser.DXFUnivers; import org.geotools.data.dxf.parser.DXFLineNumberReader; import org.geotools.data.dxf.entities.DXFEntity; import org.geotools.data.dxf.entities.DXFPoint; import org.geotools.data.dxf.entities.DXFInsert; 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 DXFBlock extends DXFEntity implements DXFConstants { private static final Log log = LogFactory.getLog(DXFBlock.class); public Vector<DXFEntity> theEntities = new Vector<DXFEntity>(); public DXFPoint _point = new DXFPoint(); public String _name; public int _flag; public DXFBlock(DXFBlock newBlock) { this(newBlock._point.X(), newBlock._point.Y(), newBlock._flag, newBlock._name, null, newBlock.getColor(), newBlock.getRefLayer()); // Copy entities Iterator iter = newBlock.theEntities.iterator(); while (iter.hasNext()) { theEntities.add(((DXFEntity) iter).clone()); } } public DXFBlock(double x, double y, int flag, String name, Vector<DXFEntity> ent, int c, DXFLayer l) { super(c, l, 0, null, DXFTables.defaultThickness); _point = new DXFPoint(x, y, c, l, 0, 1); _name = name; _flag = flag; if (ent == null) { ent = new Vector<DXFEntity>(); } theEntities = ent; } public static DXFBlock read(DXFLineNumberReader br, DXFUnivers univers) throws IOException { Vector<DXFEntity> sEnt = new Vector<DXFEntity>(); String name = ""; double x = 0, y = 0; int flag = 0; DXFLayer l = null; 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(ENDBLK)) { doLoop = false; } else if (type.equals(ENDSEC)) { // hack voor als ENDBLK ontbreekt doLoop = false; br.reset(); } else if (type.equals(BLOCK)) { doLoop = false; br.reset(); } else if (type.equals(INSERT)) { DXFInsert.read(br, univers); } else { // check of dit entities zijn br.reset(); sEnt.addAll(DXFEntities.readEntities(br, univers).theEntities); } break; case LAYER_NAME: l = univers.findLayer(cvp.getStringValue()); break; case NAME: name = cvp.getStringValue(); break; case INT_1: flag = cvp.getShortValue(); break; case X_1: x = cvp.getDoubleValue(); break; case Y_1: y = cvp.getDoubleValue(); break; default: break; } } DXFBlock e = new DXFBlock(x, y, flag, name, sEnt, DXFColor.getDefaultColorIndex(), l); log.debug(e.toString(x, y, flag, name, sEnt.size(), DXFColor.getDefaultColorIndex())); log.debug("Exit at line: " + br.getLineNumber()); return e; } public String toString(double x, double y, int flag, String name, int numEntities, int c) { StringBuffer s = new StringBuffer(); s.append("DXFBlock ["); s.append("x: "); s.append(x + ", "); s.append("y: "); s.append(y + ", "); s.append("flag: "); s.append(flag + ", "); s.append("name: "); s.append(name + ", "); s.append("color: "); s.append(c + ", "); s.append("numEntities: "); s.append(numEntities); s.append("]"); return s.toString(); } @Override public DXFEntity translate(double x, double y) { // Move all vertices Iterator iter = theEntities.iterator(); while (iter.hasNext()) { DXFEntity entity = (DXFEntity) iter.next(); entity.translate(x, y); } return this; } public DXFEntity clone() { return new DXFBlock(this); } }