package com.ximple.io.dgn7;
|
|
//~--- JDK imports ------------------------------------------------------------
|
|
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.CoordinateList;
|
import com.vividsolutions.jts.geom.Geometry;
|
import com.vividsolutions.jts.geom.GeometryFactory;
|
|
/**
|
* ComplexShapeElement
|
*
|
* @author Ulysses
|
* @version 0.1
|
* @since 2006/5/18 下午 03:45:15
|
*/
|
public class ComplexShapeElement extends Element implements ComplexElement, GeometryConverter {
|
private static final Logger logger = Logger.getLogger(ComplexShapeElement.class);
|
|
ArrayList<Element> list = new ArrayList<Element>();
|
|
public ComplexShapeElement(byte[] raw) {
|
super(raw);
|
}
|
|
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<Geometry> list = new ArrayList<Geometry>();
|
|
for (ListIterator it = listIterator(); it.hasNext();) {
|
Element element = (Element) it.next();
|
|
if (element instanceof ShapeElement) {
|
if (((ShapeElement) element).getVerticeSize() == 0 || ((ShapeElement) element).getVerticeSize() > 1) {
|
list.add(((ShapeElement) element).toGeometry(factory));
|
}
|
} else if (element instanceof LineStringElement) {
|
if (((LineStringElement) element).getVerticeSize() == 0 || ((LineStringElement) element).getVerticeSize() > 1) {
|
list.add(((LineStringElement) element).toGeometry(factory));
|
}
|
} else if (element instanceof LineElement) {
|
if (((LineElement) element).getVertices().length == 0 || ((LineElement) element).getVertices().length > 1) {
|
list.add(((LineElement) element).toGeometry(factory));
|
}
|
} else if (element instanceof ArcElement) {
|
}
|
}
|
|
|
CoordinateList pts = new CoordinateList();
|
for (Geometry geom : list) {
|
pts.add(geom.getCoordinates(), true);
|
}
|
|
return factory.createLinearRing(pts.toCoordinateArray());
|
}
|
|
public static class ElementHandler extends Element.ElementHandler {
|
private static ElementHandler instance = null;
|
|
public ElementHandler() {
|
super(ElementType.COMPLEXSHAPE);
|
}
|
|
public static IElementHandler getInstance() {
|
if (instance == null) {
|
instance = new ElementHandler();
|
}
|
|
return instance;
|
}
|
|
protected Element createElement(byte[] raw) {
|
return new ComplexShapeElement(raw);
|
}
|
}
|
}
|