package com.ximple.io.dgn7;
|
|
import java.util.ArrayList;
|
import java.util.Collection;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.ListIterator;
|
|
import org.apache.log4j.Logger;
|
|
import com.vividsolutions.jts.geom.Geometry;
|
import com.vividsolutions.jts.geom.GeometryFactory;
|
import com.vividsolutions.jts.geom.LineString;
|
import com.vividsolutions.jts.geom.LinearRing;
|
|
/**
|
* ComplexChainElement
|
*
|
* @author Ulysses
|
* @version 0.1
|
* @since 2006/5/18
|
*/
|
public class ComplexChainElement extends Element implements ComplexElement, GeometryConverter {
|
private static final Logger logger = Logger.getLogger(ComplexChainElement.class);
|
|
protected ArrayList<Element> list = new ArrayList<Element>();
|
|
ComplexChainElement(byte[] raw) {
|
super(raw);
|
attrOffset = 4;
|
}
|
|
public int size() {
|
return list.size();
|
}
|
|
public boolean isEmpty() {
|
return list.isEmpty();
|
}
|
|
public boolean contains(Object o) {
|
return list.contains(o);
|
}
|
|
public Iterator iterator() {
|
return list.iterator();
|
}
|
|
public Object[] toArray() {
|
return list.toArray();
|
}
|
|
public <T> T[] toArray(T[] ts) {
|
return list.toArray(ts);
|
}
|
|
public boolean add(Element element) {
|
return list.add(element);
|
}
|
|
public boolean remove(Object o) {
|
return list.remove(o);
|
}
|
|
public boolean containsAll(Collection<?> objects) {
|
return list.containsAll(objects);
|
}
|
|
public boolean addAll(Collection<? extends Element> elements) {
|
return list.addAll(elements);
|
}
|
|
public boolean addAll(int i, Collection<? extends Element> elements) {
|
return list.addAll(i, elements);
|
}
|
|
public boolean removeAll(Collection<?> objects) {
|
return list.removeAll(objects);
|
}
|
|
public boolean retainAll(Collection<?> objects) {
|
return list.retainAll(objects);
|
}
|
|
public void clear() {
|
list.clear();
|
}
|
|
public Element get(int index) {
|
return list.get(index);
|
}
|
|
public Element set(int i, Element element) {
|
return list.set(i, element);
|
}
|
|
public void add(int i, Element element) {
|
list.add(i, element);
|
}
|
|
public Element remove(int index) {
|
return list.remove(index);
|
}
|
|
public int indexOf(Object o) {
|
return list.indexOf(o);
|
}
|
|
public int lastIndexOf(Object o) {
|
return list.lastIndexOf(o);
|
}
|
|
public ListIterator listIterator() {
|
return list.listIterator();
|
}
|
|
public ListIterator listIterator(int index) {
|
return list.listIterator(index);
|
}
|
|
public List subList(int fromIndex, int toIndex) {
|
return list.subList(fromIndex, toIndex);
|
}
|
|
public Geometry toGeometry(GeometryFactory factory) {
|
ArrayList<LineString> lineStrings = new ArrayList<LineString>();
|
|
for (ListIterator it = listIterator(); it.hasNext();) {
|
Element element = (Element) it.next();
|
|
if (element instanceof ShapeElement) {
|
if (((ShapeElement) element).getVerticeSize() == 0 || ((ShapeElement) element).getVerticeSize() > 1) {
|
lineStrings.add((LinearRing) ((ShapeElement) element).toGeometry(factory));
|
}
|
} else if (element instanceof LineStringElement) {
|
if (((LineStringElement) element).getVerticeSize() == 0 || ((LineStringElement) element).getVerticeSize() > 1) {
|
lineStrings.add((LineString) ((LineStringElement) element).toGeometry(factory));
|
}
|
|
} else if (element instanceof LineElement) {
|
|
if (((LineElement) element).getVertices().length == 0 || ((LineElement) element).getVertices().length > 1) {
|
lineStrings.add((LineString) ((LineElement) element).toGeometry(factory));
|
}
|
} else if (element instanceof ArcElement) {
|
lineStrings.add((LineString) ((ArcElement) element).toGeometry(factory));
|
} else {
|
logger.warn("Unknown sub-element in ComplexChain Element-" + element.getElementType());
|
}
|
}
|
|
LineString[] lines = lineStrings.toArray(new LineString[lineStrings.size()]);
|
if ((lines == null) || (lines.length == 0))
|
return null;
|
return factory.createMultiLineString(lines);
|
}
|
|
public double getElementSize() {
|
return raw[18];
|
}
|
|
public boolean isClosed() {
|
if (isEmpty()) {
|
return false;
|
}
|
|
return false;
|
}
|
|
public static class ElementHandler extends Element.ElementHandler {
|
private static ElementHandler instance = null;
|
|
public ElementHandler() {
|
super(ElementType.COMPLEXCHAIN);
|
}
|
|
public static IElementHandler getInstance() {
|
if (instance == null) {
|
instance = new ElementHandler();
|
}
|
|
return instance;
|
}
|
|
protected Element createElement(byte[] raw) {
|
return new ComplexChainElement(raw);
|
}
|
}
|
}
|