| | |
| | | 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; |
| | |
| | | */ |
| | | 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); |
| | | } |
| | | |
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | 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); |
| | |
| | | |
| | | 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); |
| | |
| | | |
| | | 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); |
| | |
| | | public double getRotationAngle() |
| | | { |
| | | int rotation = (raw[30] << 16 & 0xffff0000); |
| | | |
| | | rotation |= raw[31] & 0x0000ffff; |
| | | |
| | | return Utility.converIntToRotation(rotation); |
| | |
| | | |
| | | 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); |
| | |
| | | |
| | | 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)); |
| | |
| | | return instance; |
| | | } |
| | | |
| | | protected Element createElement(short[] raw) |
| | | protected Element createElement(byte[] raw) |
| | | { |
| | | return new ArcElement(raw); |
| | | } |