forked from geodmms/xdgnjobs

?? ?
2008-05-14 fe4bda7d456c106e1061afaa29d452e5553e9d96
xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ArcElement.java
@@ -1,6 +1,8 @@
package com.ximple.io.dgn7;
//~--- non-JDK imports --------------------------------------------------------
import java.nio.ByteOrder;
import org.apache.log4j.Logger;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
@@ -15,17 +17,16 @@
 */
public class ArcElement extends Element implements GeometryConverter
{
    public ArcElement(short[] raw)
    private static final Logger logger = Logger.getLogger(ArcElement.class);
    public ArcElement(byte[] raw)
    {
        super(raw);
    }
    public double getStartAngle()
    {
        int angle = (raw[18] << 16 & 0xffff0000);
        angle |= raw[19] & 0x0000ffff;
        int angle = (raw[18] & 0x0000ffff) << 16 | (raw[19] & 0x0000ffff);
        return Utility.converIntToRotation(angle);
    }
@@ -39,9 +40,9 @@
    public double getSweepAngle()
    {
        int angle = (raw[20] << 16 & 0xffff0000);
        angle |= raw[21] & 0x0000ffff;
        int angle = (raw[20] & 0x0000ffff) << 16 | (raw[21] & 0x0000ffff);
        if (angle < 0)
            angle = -1 * (angle & 0x7fffffff);
        return Utility.converIntToRotation(angle);
    }
@@ -49,6 +50,11 @@
    public void setSweepAngle(double value)
    {
        int angle = Utility.converRotatioToInt(value);
        if (angle < 0)
        {
            angle &= 0x7fffffff;
            angle |= 0x80000000;
        }
        raw[20] = (short) (angle >> 16 & 0x0000ffff);
        raw[21] = (short) (angle & 0x0000ffff);
@@ -56,16 +62,18 @@
    public double getPrimary()
    {
        short[] primary = new short[4];
        System.arraycopy(raw, 22, primary, 0, 4);
        rawBuffer.position(22 * 2);
        ByteOrder bo = rawBuffer.order();
        rawBuffer.order(ByteOrder.BIG_ENDIAN);
        byte[] primary = new byte[8];
        rawBuffer.get(primary);
        rawBuffer.order(bo);
        return Utility.convertDGNToIEEEDouble(primary) / 1000.0;
    }
    public void setPrimary(double value)
    {
        double  temp    = value * 1000.0;
        double temp = value * 1000.0;
        short[] primary = Utility.convertIEEEDoubleToDGN(temp);
        System.arraycopy(primary, 0, raw, 22, 4);
@@ -73,16 +81,18 @@
    public double getSecondary()
    {
        short[] secondary = new short[4];
        System.arraycopy(raw, 26, secondary, 0, 4);
        rawBuffer.position(26 * 2);
        ByteOrder bo = rawBuffer.order();
        rawBuffer.order(ByteOrder.BIG_ENDIAN);
        byte[] secondary = new byte[8];
        rawBuffer.get(secondary);
        rawBuffer.order(bo);
        return Utility.convertDGNToIEEEDouble(secondary) / 1000.0;
    }
    public void setSecondary(double value)
    {
        double  temp      = value * 1000.0;
        double temp = value * 1000.0;
        short[] secondary = Utility.convertIEEEDoubleToDGN(temp);
        System.arraycopy(secondary, 0, raw, 26, 4);
@@ -91,7 +101,6 @@
    public double getRotationAngle()
    {
        int rotation = (raw[30] << 16 & 0xffff0000);
        rotation |= raw[31] & 0x0000ffff;
        return Utility.converIntToRotation(rotation);
@@ -107,24 +116,26 @@
    public Coordinate getOrigin()
    {
        short[] x = new short[4];
        rawBuffer.position(32 * 2);
        ByteOrder bo = rawBuffer.order();
        rawBuffer.order(ByteOrder.BIG_ENDIAN);
        byte[] rawValue = new byte[8];
        System.arraycopy(raw, 32, x, 0, 4);
        rawBuffer.get(rawValue); // x
        double dx = Utility.converUnitToCoord(Utility.convertDGNToIEEEDouble(rawValue));
        double  dx = Utility.converUnitToCoord((int) Utility.convertDGNToIEEEDouble(x));
        short[] y  = new short[4];
        rawBuffer.get(rawValue); // y
        double dy = Utility.converUnitToCoord(Utility.convertDGNToIEEEDouble(rawValue));
        System.arraycopy(raw, 36, y, 0, 4);
        double dy = Utility.converUnitToCoord((int) Utility.convertDGNToIEEEDouble(y));
        rawBuffer.order(bo);
        return new Coordinate(dx, dy);
    }
    public void setOrigin(Coordinate value)
    {
        double  temp = Utility.converCoordToUnit(value.x);
        short[] x    = Utility.convertIEEEDoubleToDGN(temp);
        double temp = Utility.converCoordToUnit(value.x);
        short[] x = Utility.convertIEEEDoubleToDGN(temp);
        System.arraycopy(x, 0, raw, 32, 4);
        temp = Utility.converCoordToUnit(value.y);
@@ -136,7 +147,9 @@
    public Geometry toGeometry(GeometryFactory factory)
    {
        double temp = Math.abs(getStartAngle() - getSweepAngle());
        double start = getStartAngle();
        double end = getSweepAngle();
        double temp = Math.abs(start - end);
        temp /= 4;
        int pts = (temp < 3) ? 3 : (int) temp;
        return factory.createLineString(convertToLineString(pts));
@@ -190,7 +203,7 @@
            return instance;
        }
        protected Element createElement(short[] raw)
        protected Element createElement(byte[] raw)
        {
            return new ArcElement(raw);
        }