?? ?
2010-04-22 6523c1f6534042d89ff8a07d4e7c06050276521e
dgn7 write function for complex chain
8 files modified
1 files added
313 ■■■■ changed files
.gitattributes 1 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java 25 ●●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Dgn7fileWriter.java 15 ●●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java 23 ●●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementFactory.java 23 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7OracleReaderTest.java 1 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7TextElementReaderTest.java 1 ●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7fileWriterTest.java 47 ●●●●● patch | view | raw | blame | history
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/ElementFactoryTest.java 177 ●●●●● patch | view | raw | blame | history
.gitattributes
@@ -39,6 +39,7 @@
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7TextElementReaderTest.java svneol=native#text/plain
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7fileReaderTest.java svneol=native#text/plain
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7fileWriterTest.java -text svneol=unset#text/plain
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/ElementFactoryTest.java -text svneol=unset#text/plain
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/OracleTarget.java svneol=native#text/plain
xdgnjobs/ximple-dgnio/src/test/resources/com/ximple/io/dgn7/test-data/Demo.dgn -text
xdgnjobs/ximple-dgnio/src/test/resources/com/ximple/io/dgn7/test-data/HV88491-1.dgn -text
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ComplexChainElement.java
@@ -1,6 +1,7 @@
package com.ximple.io.dgn7;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
@@ -155,10 +156,32 @@
        return factory.createMultiLineString(lines);
    }
    public double getElementSize() {
    public short getTotalLength() {
        return raw[18];
    }
    protected void setTotalLength(short value) {
        raw[18] = value;
    }
    public short getNumOfElement() {
        return raw[19];
    }
    protected void setNumOfElement(short value) {
        raw[19] = value;
    }
    public short[] getAttributes() {
        return Arrays.copyOfRange(raw, 20, 23);
    }
    protected void setAttributes(short[] values) {
        if (values.length < 4) return;
        System.arraycopy(values, 0, raw, 20, 24 - 20);
    }
    public boolean isClosed() {
        if (isEmpty()) {
            return false;
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Dgn7fileWriter.java
@@ -304,8 +304,19 @@
    }
    public void writeElement(Element element) throws IOException {
        // element.raw
        if (element == null) return;
        if (element.getElementType().isComplexElement()) {
            writeTo(element);
            ComplexElement complexElement = (ComplexElement) element;
            for (Element component : complexElement) {
                writeTo(component);
            }
        } else {
            writeTo(element);
        }
    }
    private void writeTo(Element element) throws IOException {
        ByteBuffer writeBuffer = ByteBuffer.allocateDirect(element.raw.length * 2);
        writeBuffer.order(ByteOrder.LITTLE_ENDIAN);
        for (short word : element.raw) {
@@ -316,6 +327,8 @@
        channel.write(writeBuffer);
    }
    public void toEnd() throws IOException, Dgn7fileException {
        while (hasNext()) {
            nextElement();
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java
@@ -17,7 +17,6 @@
 *
 * @author Ulysses
 * @version 0.1
 * @since 2006/5/18 �W�� 11:14:50
 */
public class Element {
    public static final int CONSTRUCTION_CLASS = 0;
@@ -85,6 +84,10 @@
        raw[5] = (short) (temp >> 16 & 0x0000ffff);
        raw[4] = (short) (temp & 0x0000ffff);
        // lowZ
        raw[7] = 0;
        raw[8] = 0;
        int highCoorX = DgnUtility.converCoordToUnit(bbox.getMaxX());
        temp = DgnUtility.converToDGN(highCoorX);
        raw[9] = (short) (temp >> 16 & 0x0000ffff);
@@ -94,6 +97,11 @@
        temp = DgnUtility.converToDGN(highCoorY);
        raw[11] = (short) (temp >> 16 & 0x0000ffff);
        raw[10] = (short) (temp & 0x0000ffff);
        // highZ
        raw[13] = (short) 0xffff;
        raw[12] = (short) 0xffff;
    }
    public boolean isComponentElement() {
@@ -163,6 +171,15 @@
        }
    }
    public short getFollowLength() {
        return raw[1];
    }
    protected void setFollowLength(short value) {
        assert (raw.length >= value + 2);
        raw[1] = value;
    }
    public void addUserAttributeData(byte[] pDataBlock, Class dataClass, int iLinkageId) throws Element.Exception {
    }
@@ -183,6 +200,10 @@
        return true;
    }
    public int getUserAttributeDataOffset() {
        return (raw[15] + 16);
    }
    public List<UserAttributeData> getUserAttributeData() {
        short[] data;
        short length, nextAttribute;
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementFactory.java
@@ -9,11 +9,11 @@
import java.util.LinkedList;
public class ElementFactory {
    private static final int DEFAULT_ELMHEAD_LENGTH = 28;
    private static final int DEFAULT_DISPHEAD_LENGTH = 8;
    private static final int MINIMAL_ELEMLENGTH = 18 * 2;
    static final int DEFAULT_ELMHEAD_LENGTH = 28;
    static final int DEFAULT_DISPHEAD_LENGTH = 8;
    static final int MINIMAL_ELEMLENGTH = 18 * 2;
    private static final int MAXINUM_LINESTRING_PTLEN = 100;
    static final int MAXINUM_LINESTRING_PTLEN = 100;
    private static ElementFactory elementFactory = new ElementFactory();
    private static GeometryFactory factory = new GeometryFactory();
@@ -35,6 +35,7 @@
        }
        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);
@@ -52,6 +53,7 @@
        }
        element.setVerticeSize(pts.length);
        element.setType(ElementType.LINESTRING.id);
        element.setFollowLength((short) ((elmsize / 2) - 2));
        element.setLevelIndex(0);
        element.setColorIndex(0);
        element.setWeight(0);
@@ -68,6 +70,7 @@
        }
        element.setVerticeSize(pts.length);
        element.setType(ElementType.SHAPE.id);
        element.setFollowLength((short) ((elmsize / 2) - 2));
        element.setLevelIndex(0);
        element.setColorIndex(0);
        element.setWeight(0);
@@ -80,13 +83,16 @@
        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, Coordinate[].class);
                    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;
@@ -95,12 +101,19 @@
        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);
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7OracleReaderTest.java
@@ -17,7 +17,6 @@
 * Dgn7OracleReaderTest
 * User: Ulysses
 * Date: 2007/10/24
 * Time: ¤W¤È 10:49:54
 */
public class Dgn7OracleReaderTest {
    @BeforeTest
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7TextElementReaderTest.java
@@ -17,7 +17,6 @@
 * Dgn7TextElementReaderTest
 * User: Ulysses
 * Date: 2008/1/10
 * Time: �W�� 12:19:14
 */
public class Dgn7TextElementReaderTest {
    private final static Logger logger = Logger.getLogger(Dgn7fileReaderTest.class);
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/Dgn7fileWriterTest.java
@@ -3,6 +3,7 @@
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;
@@ -58,52 +59,31 @@
            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
                        processCompleteElement(lastComplex, writer);
                        lastComplex = null;
                    }
                    // @todo add process in here
                    processCompleteElement(element, writer);
                } 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) {
                        lastComplex = element;
                    } else {
                    if (lastComplex != null) {
                        // @todo add process in here
                        lastComplex = element;
                        processCompleteElement(lastComplex, writer);
                    }
                    lastComplex = element;
                }
                if (element.getElementType().isComplexElement()) {
                    if (element instanceof ComplexChainElement) {
                        ComplexChainElement complexChain = (ComplexChainElement) element;
                        int size = complexChain.size();
                        for (Object aComplexChain : complexChain) {
                            Element subElement = (Element) aComplexChain;
                            subElement.getType();
                        }
                    }
                    if (element instanceof ComplexShapeElement) {
                        ComplexShapeElement complexShape = (ComplexShapeElement) element;
                    }
                    if (element instanceof TextNodeElement) {
                        TextNodeElement textNode = (TextNodeElement) element;
                        int size = textNode.size();
                        for (int i = 0; i < size; i++) {
                            Element subElement = textNode.get(i);
                            subElement.getElementType();
                        }
                    }
                }
                writer.writeElement(element);
                // writer.writeElement(element);
            }
            count++;
        }
@@ -112,4 +92,9 @@
        // FileUtils.copyFile(target, new File("G://target.dgn"));
    }
    private boolean processCompleteElement(Element element, Dgn7fileWriter writer) throws IOException {
        writer.writeElement(element);
        return true;
    }
}
xdgnjobs/ximple-dgnio/src/test/java/com/ximple/io/dgn7/ElementFactoryTest.java
New file
@@ -0,0 +1,177 @@
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]) + "]");
            }
        }
    }
}