package com.ximple.io.dgn7;
|
|
import com.vividsolutions.jts.geom.CoordinateList;
|
import com.vividsolutions.jts.geom.GeometryFactory;
|
import com.vividsolutions.jts.geom.LineString;
|
import com.vividsolutions.jts.geom.MultiLineString;
|
import org.apache.commons.io.FileUtils;
|
import org.apache.log4j.Logger;
|
import org.geotools.TestData;
|
import org.testng.Assert;
|
import org.testng.annotations.BeforeTest;
|
import org.testng.annotations.Test;
|
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.io.RandomAccessFile;
|
import java.nio.channels.FileChannel;
|
|
/**
|
* Created by IntelliJ IDEA.
|
* User: Ulysses
|
* Date: 2010/4/21
|
*/
|
public class ElementFactoryTest {
|
private final static Logger logger = Logger.getLogger(Dgn7fileReaderTest.class);
|
|
// private final static String testFilePath = "test-data\\testHV.dgn";
|
private final static String testFilePath = "testHV.dgn";
|
|
private static GeometryFactory factory = new GeometryFactory();
|
|
private FileInputStream _fs;
|
private LineStringElement _testLineString = null;
|
private ComplexChainElement _testComplexChain = null;
|
|
@BeforeTest
|
public void setUp() throws IOException, Dgn7fileException {
|
File dataFile = TestData.file(this, testFilePath);
|
if (!dataFile.exists()) {
|
return;
|
}
|
|
_fs = new FileInputStream(dataFile);
|
|
fetchTestElement(_fs);
|
_fs.close();
|
}
|
|
private void fetchTestElement(FileInputStream fs) throws Dgn7fileException, IOException {
|
FileChannel fc = _fs.getChannel();
|
Dgn7fileReader reader = new Dgn7fileReader(fc, new Lock());
|
int count = 0;
|
Element lastComplex = null;
|
while (reader.hasNext()) {
|
Element.FileRecord record = reader.nextElement();
|
if (record.element() != null) {
|
Element element = (Element) record.element();
|
ElementType type = element.getElementType();
|
boolean completed = false;
|
if ((!type.isComplexElement()) && (!element.isComponentElement())) {
|
if (lastComplex != null) {
|
// @todo add process in here
|
if (!processCompleteElement(lastComplex)) break;
|
lastComplex = null;
|
}
|
|
// @todo add process in here
|
if (!processCompleteElement(element)) break;
|
} else if (element.isComponentElement()) {
|
if (lastComplex != null) {
|
((ComplexElement) lastComplex).add(element);
|
} else {
|
logger.warn("wong." + element.toString());
|
Assert.fail("Component Element cannot found parent.");
|
}
|
} else if (type.isComplexElement()) {
|
if (lastComplex != null) {
|
// @todo add process in here
|
if (!processCompleteElement(lastComplex)) break;
|
}
|
lastComplex = element;
|
}
|
}
|
count++;
|
}
|
}
|
|
private boolean processCompleteElement(Element element) throws IOException {
|
if (element instanceof LineStringElement) {
|
_testLineString = (LineStringElement) element;
|
}
|
|
if (element instanceof ComplexChainElement) {
|
_testComplexChain = (ComplexChainElement) element;
|
}
|
|
if ((_testLineString != null) && (_testComplexChain != null)) return false;
|
return true;
|
}
|
|
@Test
|
public void testCreateLineString() throws IOException, Dgn7fileException {
|
Assert.assertNotNull(_testLineString);
|
LineStringElement originElement = _testLineString;
|
|
LineString geometry = (LineString) originElement.toGeometry(factory);
|
Element cloneElement = ElementFactory.createLineString(geometry);
|
Assert.assertTrue(cloneElement instanceof LineStringElement);
|
cloneElement.setLevelIndex(originElement.getLevelIndex());
|
cloneElement.setColorIndex(originElement.getColorIndex());
|
cloneElement.setWeight(originElement.getWeight());
|
cloneElement.setLineStyle(originElement.getLineStyle());
|
cloneElement.setRange(geometry.getEnvelopeInternal());
|
|
int len = originElement.raw.length;
|
int lenClone = cloneElement.raw.length;
|
// Assert.assertEquals(lenClone, len - originElement.getUserAttributeDataOffset() + 1);
|
if (originElement.hasUserAttributeData()) {
|
Assert.assertEquals(lenClone, originElement.getUserAttributeDataOffset());
|
}
|
System.out.println("origin size=(" + len + ")-:- Clone size=(" + lenClone + ")");
|
int headerSize = ElementFactory.MINIMAL_ELEMLENGTH / 2;
|
for (int i = 0; i <= headerSize; i++) {
|
if (originElement.raw[i] != cloneElement.raw[i]) {
|
System.out.print("different index=" + i + ":");
|
System.out.println("origin[" + Integer.toHexString(originElement.raw[i])
|
+ "]-clone:[" + Integer.toHexString(cloneElement.raw[i]) + "]");
|
}
|
}
|
}
|
|
@Test
|
public void testCreateComplexChain() throws IOException, Dgn7fileException {
|
Assert.assertNotNull(_testComplexChain);
|
ComplexChainElement originElement = _testComplexChain;
|
|
System.out.print("len=" + originElement.raw.length);
|
for (Element elm : originElement) {
|
System.out.print(":" + elm.raw.length);
|
}
|
System.out.println();
|
|
MultiLineString geometries = (MultiLineString) originElement.toGeometry(factory);
|
LineString geometry = factory.createLineString(geometries.getCoordinates());
|
|
ComplexChainElement cloneElement = (ComplexChainElement) ElementFactory.createComplexChain(geometry);
|
Assert.assertTrue(cloneElement instanceof ComplexChainElement);
|
cloneElement.setLevelIndex(originElement.getLevelIndex());
|
cloneElement.setColorIndex(originElement.getColorIndex());
|
cloneElement.setWeight(originElement.getWeight());
|
cloneElement.setLineStyle(originElement.getLineStyle());
|
cloneElement.setRange(geometry.getEnvelopeInternal());
|
|
int len = originElement.raw.length;
|
int lenClone = cloneElement.raw.length;
|
// Assert.assertEquals(lenClone, len - originElement.getUserAttributeDataOffset() + 1);
|
System.out.print("clonelen=" + cloneElement.raw.length);
|
for (Element elm : cloneElement) {
|
System.out.print(":" + elm.raw.length);
|
}
|
System.out.println();
|
|
if (originElement.hasUserAttributeData()) {
|
Assert.assertEquals(lenClone, originElement.getUserAttributeDataOffset() + 4);
|
}
|
System.out.println("origin size=(" + len + ")-:- Clone size=(" + lenClone + ")");
|
int headerSize = ElementFactory.MINIMAL_ELEMLENGTH / 2 + 6;
|
for (int i = 0; i < headerSize; i++) {
|
if (originElement.raw[i] != cloneElement.raw[i]) {
|
System.out.print("different index=" + i + ":");
|
System.out.println("origin[" + Integer.toHexString(originElement.raw[i])
|
+ "]-clone:[" + Integer.toHexString(cloneElement.raw[i]) + "]");
|
}
|
}
|
}
|
}
|