package com.ximple.io.dgn7; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.LinearRing; import java.util.Arrays; import java.util.LinkedList; public class ElementFactory { static final int DEFAULT_ELMHEAD_LENGTH = 28; static final int DEFAULT_DISPHEAD_LENGTH = 8; static final int MINIMAL_ELEMLENGTH = 18 * 2; static final int MAXINUM_LINESTRING_PTLEN = 100; private static ElementFactory elementFactory = new ElementFactory(); private static GeometryFactory factory = new GeometryFactory(); public static Element createLineString(LineString linestring) { Coordinate[] pts = linestring.getCoordinates(); LineStringElement element = elementFactory.createLineStringElement(pts); element.setRange(linestring.getEnvelopeInternal()); return element; } public static Element createShape(LinearRing ring) { Coordinate[] pts = ring.getCoordinates(); int elmsize = MINIMAL_ELEMLENGTH + 2 + pts.length * 8; ShapeElement element = new ShapeElement(new byte[elmsize]); for (int i = 0; i < pts.length; i++) { element.setX(i, pts[i].x); element.setY(i, pts[i].y); } element.setVerticeSize(pts.length); element.setType(ElementType.SHAPE.id); element.setFollowLength((short) ((elmsize / 2) - 2)); element.setRange(ring.getEnvelopeInternal()); element.setLevelIndex(0); element.setColorIndex(0); element.setWeight(0); element.setLineStyle(0); return element; } private LineStringElement createLineStringElement(Coordinate[] pts) { int elmsize = MINIMAL_ELEMLENGTH + 2 + pts.length * 8; LineStringElement element = new LineStringElement(new byte[elmsize]); for (int i = 0; i < pts.length; i++) { element.setX(i, pts[i].x); element.setY(i, pts[i].y); } element.setVerticeSize(pts.length); element.setType(ElementType.LINESTRING.id); element.setFollowLength((short) ((elmsize / 2) - 2)); element.setLevelIndex(0); element.setColorIndex(0); element.setWeight(0); element.setLineStyle(0); return element; } private ShapeElement createShapeElement(Coordinate[] pts) { int elmsize = MINIMAL_ELEMLENGTH + 2 + pts.length * 8; ShapeElement element = new ShapeElement(new byte[elmsize]); for (int i = 0; i < pts.length; i++) { element.setX(i, pts[i].x); element.setY(i, pts[i].y); } element.setVerticeSize(pts.length); element.setType(ElementType.SHAPE.id); element.setFollowLength((short) ((elmsize / 2) - 2)); element.setLevelIndex(0); element.setColorIndex(0); element.setWeight(0); element.setLineStyle(0); return element; } public static Element createComplexChain(LineString linestring) { LinkedList elms = new LinkedList(); Coordinate[] allpts = linestring.getCoordinates(); int segsize = allpts.length / MAXINUM_LINESTRING_PTLEN; int currentpos = 0; int totalLength = 0; for (int seg = 0; seg < segsize; seg++) { Coordinate[] pts = Arrays.copyOfRange(allpts, currentpos, currentpos + MAXINUM_LINESTRING_PTLEN + 1, Coordinate[].class); LineStringElement element = elementFactory.createLineStringElement(pts); currentpos += MAXINUM_LINESTRING_PTLEN; element.setRange(element.toGeometry(factory).getEnvelopeInternal()); element.setComponentElement(true); element.setLevelIndex(0); totalLength += element.raw.length; elms.add(element); } int remain = allpts.length % MAXINUM_LINESTRING_PTLEN; Coordinate[] pts = Arrays.copyOfRange(allpts, currentpos, currentpos + remain, Coordinate[].class); LineStringElement element = elementFactory.createLineStringElement(pts); element.setRange(element.toGeometry(factory).getEnvelopeInternal()); element.setComponentElement(true); element.setLevelIndex(0); elms.add(element); totalLength += element.raw.length; ComplexChainElement result = new ComplexChainElement(new byte[MINIMAL_ELEMLENGTH + 12]); result.addAll(elms); result.setRange(linestring.getEnvelopeInternal()); result.setType(ElementType.COMPLEXCHAIN.id); result.setFollowLength((short) (((MINIMAL_ELEMLENGTH + 12) / 2) - 2)); result.setNumOfElement((short) elms.size()); totalLength += result.raw.length; totalLength -= 19; result.setTotalLength((short) totalLength); result.setLevelIndex(0); result.setColorIndex(0); result.setWeight(0); result.setLineStyle(0); return result; } }