| | |
| | | package com.ximple.io.dgn7; |
| | | |
| | | import java.nio.ByteOrder; |
| | | import java.util.ArrayList; |
| | | |
| | | import org.apache.log4j.Logger; |
| | | |
| | | import com.vividsolutions.jts.geom.Coordinate; |
| | | import com.vividsolutions.jts.geom.Geometry; |
| | | import com.vividsolutions.jts.geom.GeometryFactory; |
| | | |
| | | import com.ximple.util.DgnUtility; |
| | | |
| | | public class EllipseElement extends Element implements GeometryConverter |
| | | { |
| | | private static final Logger logger = Logger.getLogger(EllipseElement.class); |
| | | |
| | | public EllipseElement(byte[] raw) |
| | | { |
| | | super(raw); |
| | |
| | | byte[] primary = new byte[8]; |
| | | rawBuffer.get(primary); |
| | | rawBuffer.order(bo); |
| | | return Utility.convertDGNToIEEEDouble(primary) / 1000.0; |
| | | return DgnUtility.convertDGNToIEEEDouble(primary) / 1000.0; |
| | | } |
| | | |
| | | public void setPrimary(double value) |
| | | { |
| | | double temp = value * 1000.0; |
| | | short[] primary = Utility.convertIEEEDoubleToDGN(temp); |
| | | short[] primary = DgnUtility.convertIEEEDoubleToDGN(temp); |
| | | |
| | | System.arraycopy(primary, 0, raw, 18, 4); |
| | | } |
| | |
| | | byte[] secondary = new byte[8]; |
| | | rawBuffer.get(secondary); |
| | | rawBuffer.order(bo); |
| | | return Utility.convertDGNToIEEEDouble(secondary) / 1000.0; |
| | | return DgnUtility.convertDGNToIEEEDouble(secondary) / 1000.0; |
| | | } |
| | | |
| | | public void setSecondary(double value) |
| | | { |
| | | double temp = value * 1000.0; |
| | | short[] secondary = Utility.convertIEEEDoubleToDGN(temp); |
| | | short[] secondary = DgnUtility.convertIEEEDoubleToDGN(temp); |
| | | |
| | | System.arraycopy(secondary, 0, raw, 22, 4); |
| | | } |
| | |
| | | int rotation = (raw[26] << 16 & 0xffff0000); |
| | | rotation |= raw[27] & 0x0000ffff; |
| | | |
| | | return Utility.converIntToRotation(rotation); |
| | | return DgnUtility.converIntToRotation(rotation); |
| | | } |
| | | |
| | | public void setRotationAngle(double value) |
| | | { |
| | | int angle = Utility.converRotatioToInt(value); |
| | | int angle = DgnUtility.converRotatioToInt(value); |
| | | |
| | | raw[26] = (short) (angle >> 16 & 0x0000ffff); |
| | | raw[27] = (short) (angle & 0x0000ffff); |
| | |
| | | byte[] rawValue = new byte[8]; |
| | | |
| | | rawBuffer.get(rawValue); // x |
| | | double dx = Utility.converUnitToCoord(Utility.convertDGNToIEEEDouble(rawValue)); |
| | | double dx = DgnUtility.converUnitToCoord(DgnUtility.convertDGNToIEEEDouble(rawValue)); |
| | | |
| | | rawBuffer.get(rawValue); // y |
| | | double dy = Utility.converUnitToCoord(Utility.convertDGNToIEEEDouble(rawValue)); |
| | | double dy = DgnUtility.converUnitToCoord(DgnUtility.convertDGNToIEEEDouble(rawValue)); |
| | | |
| | | rawBuffer.order(bo); |
| | | |
| | |
| | | |
| | | public void setOrigin(Coordinate value) |
| | | { |
| | | double temp = Utility.converCoordToUnit(value.x); |
| | | short[] x = Utility.convertIEEEDoubleToDGN(temp); |
| | | double temp = DgnUtility.converCoordToUnit(value.x); |
| | | short[] x = DgnUtility.convertIEEEDoubleToDGN(temp); |
| | | |
| | | System.arraycopy(x, 0, raw, 28, 4); |
| | | temp = Utility.converCoordToUnit(value.y); |
| | | temp = DgnUtility.converCoordToUnit(value.y); |
| | | |
| | | short[] y = Utility.convertIEEEDoubleToDGN(temp); |
| | | short[] y = DgnUtility.convertIEEEDoubleToDGN(temp); |
| | | |
| | | System.arraycopy(y, 0, raw, 32, 4); |
| | | } |
| | |
| | | |
| | | private Coordinate[] convertToLineString(int pts) |
| | | { |
| | | Coordinate[] result = new Coordinate[pts]; |
| | | double beta = -getRotationAngle() / 180 * Math.PI; |
| | | double sinbeta = Math.sin(beta); |
| | | double cosbeta = Math.cos(beta); |
| | | ArrayList<Coordinate> result = new ArrayList<Coordinate>(); |
| | | double beta = DgnUtility.converRotationToRadian(-getRotationAngle()); |
| | | double startAngle = getStartAngle(); |
| | | double endAngle = getSweepAngle(); |
| | | double steps = Math.abs(startAngle - endAngle) / pts; |
| | | int i = 0; |
| | | for (double current = startAngle; current < endAngle; current += steps) |
| | | double sweepAngle = getSweepAngle(); |
| | | double endAngle = startAngle + sweepAngle; |
| | | double steps = sweepAngle / pts; |
| | | double current; |
| | | if (sweepAngle < 0) |
| | | { |
| | | if (i < pts) |
| | | for (current = startAngle; current > endAngle; current += steps) |
| | | { |
| | | Coordinate pt = new Coordinate(); |
| | | double alpha = current / 180 * Math.PI; |
| | | double sinalpha = Math.sin(alpha); |
| | | double cosalpha = Math.cos(alpha); |
| | | pt.x = getOrigin().x + (getPrimary() * cosalpha * cosbeta - |
| | | getSecondary() * sinalpha * sinbeta); |
| | | pt.y = getOrigin().y + (getPrimary() * cosalpha * sinbeta + |
| | | getSecondary() * sinalpha * cosbeta); |
| | | result[i] = pt; |
| | | i++; |
| | | Coordinate pt = computePointOnArcByAngle(beta, current); |
| | | result.add(pt); |
| | | } |
| | | |
| | | } else |
| | | { |
| | | for (current = startAngle; current < endAngle; current += steps) |
| | | { |
| | | Coordinate pt = computePointOnArcByAngle(beta, current); |
| | | result.add(pt); |
| | | } |
| | | } |
| | | return result; |
| | | |
| | | Coordinate pt = computePointOnArcByAngle(beta, endAngle); |
| | | result.add(pt); |
| | | |
| | | if (!result.get(0).equals(result.get(result.size() - 1))) |
| | | { |
| | | result.add(result.get(0)); |
| | | } |
| | | |
| | | return result.toArray(new Coordinate[result.size()]); |
| | | } |
| | | |
| | | |
| | | private Coordinate computePointOnArcByAngle(double beta, double current) |
| | | { |
| | | double sinbeta = Math.sin(beta); |
| | | double cosbeta = Math.cos(beta); |
| | | Coordinate pt = new Coordinate(); |
| | | double alpha = DgnUtility.converRotationToRadian(current); |
| | | double sinalpha = Math.sin(alpha); |
| | | double cosalpha = Math.cos(alpha); |
| | | pt.x = getOrigin().x + (getPrimary() * cosalpha * cosbeta - |
| | | getSecondary() * sinalpha * sinbeta); |
| | | pt.y = getOrigin().y + (getPrimary() * cosalpha * sinbeta + |
| | | getSecondary() * sinalpha * cosbeta); |
| | | return pt; |
| | | } |
| | | |
| | | public static class ElementHandler extends Element.ElementHandler |