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<LineStringElement> elms = new LinkedList<LineStringElement>();
|
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;
|
}
|
}
|