From 2595f91f4aae3020cee3e0b4022aca6d9bc15fe6 Mon Sep 17 00:00:00 2001 From: ?? ? <ulysseskao@ximple.com.tw> Date: Tue, 13 May 2008 18:07:49 +0800 Subject: [PATCH] update for EOFM-83 --- xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementType.java | 173 +----------------- xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java | 173 +++++++++++++++++++ .gitattributes | 1 xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ArcElement.java | 136 +++++++++----- 4 files changed, 270 insertions(+), 213 deletions(-) diff --git a/.gitattributes b/.gitattributes index bb43b22..647c266 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11,6 +11,7 @@ xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Dgn7fileReader.java svneol=native#text/plain xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/Element.java svneol=native#text/plain xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementType.java svneol=native#text/plain +xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java svneol=native#text/plain xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/FrammeAttributeData.java svneol=native#text/plain xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/GeometryConverter.java svneol=native#text/plain xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/IElementHandler.java svneol=native#text/plain diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ArcElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ArcElement.java index 0e0a507..70bd380 100644 --- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ArcElement.java +++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ArcElement.java @@ -20,6 +20,40 @@ super(raw); } + public double getStartAngle() + { + int angle = (raw[18] << 16 & 0xffff0000); + + angle += raw[19] & 0x0000ffff; + + return Utility.ConverIntToRotation(angle); + } + + public void setStartAngle(double value) + { + int angle = Utility.ConverRotatioToInt(value); + + raw[18] = (short) (angle >>> 16 & 0x0000ffff); + raw[19] = (short) (angle & 0x0000ffff); + } + + public double getSweepAngle() + { + int angle = (raw[20] << 16 & 0xffff0000); + + angle += raw[21] & 0x0000ffff; + + return Utility.ConverIntToRotation(angle); + } + + public void setSweepAngle(double value) + { + int angle = Utility.ConverRotatioToInt(value); + + raw[20] = (short) (angle >> 16 & 0x0000ffff); + raw[21] = (short) (angle & 0x0000ffff); + } + public double getPrimary() { short[] primary = new short[4]; @@ -54,6 +88,23 @@ 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 void setRotationAngle(double value) + { + int angle = Utility.ConverRotatioToInt(value); + + raw[30] = (short) (angle >> 16 & 0x0000ffff); + raw[31] = (short) (angle & 0x0000ffff); + } + public Coordinate getOrigin() { short[] x = new short[4]; @@ -83,60 +134,41 @@ System.arraycopy(y, 0, raw, 36, 4); } - public double getStartAngle() - { - int angle = (int) (raw[18] << 16 & 0xffff0000); - - angle += raw[19] & 0x0000ffff; - - return Utility.ConverIntToRotation(angle); - } - - public void setStartAngle(double value) - { - int angle = Utility.ConverRotatioToInt(value); - - raw[18] = (short) (angle >>> 16 & 0x0000ffff); - raw[19] = (short) (angle & 0x0000ffff); - } - - public double getSweepAngle() - { - int angle = (int) (raw[20] << 16 & 0xffff0000); - - angle += raw[21] & 0x0000ffff; - - return Utility.ConverIntToRotation(angle); - } - - public void setSweepAngle(double value) - { - int angle = Utility.ConverRotatioToInt(value); - - raw[20] = (short) (angle >> 16 & 0x0000ffff); - raw[21] = (short) (angle & 0x0000ffff); - } - - public double getRotationAngle() - { - int rotation = (int) (raw[30] << 16 & 0xffff0000); - - rotation += raw[31] & 0x0000ffff; - - return Utility.ConverIntToRotation(rotation); - } - - public void setRotationAngle(double value) - { - int angle = Utility.ConverRotatioToInt(value); - - raw[30] = (short) (angle >> 16 & 0x0000ffff); - raw[31] = (short) (angle & 0x0000ffff); - } - public Geometry toGeometry(GeometryFactory factory) { - return null; // To change body of implemented methods use File | Settings | File Templates. + double temp = Math.abs(getStartAngle() - getSweepAngle()); + temp /= 4; + int pts = (temp < 3) ? 3 : (int) temp; + return factory.createLineString(convertToLineString(pts)); + } + + 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); + double startAngle = getStartAngle(); + double endAngle = getSweepAngle(); + double steps = Math.abs(startAngle - endAngle) / pts; + int i = 0; + for (double current = startAngle; current < endAngle; current += steps) + { + if (i < pts) + { + 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++; + } + } + return result; } public static class ElementHandler extends Element.ElementHandler diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementType.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementType.java index dda70b2..d3ecac1 100644 --- a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementType.java +++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/ElementType.java @@ -215,162 +215,39 @@ public boolean isComplexElement() { - if (id == 2) - { - return true; - } + return id == 2 || id == 7 || id == 12 || id == 14 || id == 18 || + id == 19 || id == 106 || id == 107; - if (id == 7) - { - return true; - } - - if (id == 12) - { - return true; - } - - if (id == 14) - { - return true; - } - - if (id == 18) - { - return true; - } - - if (id == 19) - { - return true; - } - - if (id == 106) - { - return true; - } - - if (id == 107) - { - return true; - } - - return false; } public boolean isPointType() { - if (id == 7) - { - return true; - } + return id == 7 || id == 17; - if (id == 17) - { - return true; - } - - return false; } public boolean isLineType() { - if (id == 3) - { - return true; - } + return id == 3 || id == 4 || id == 11 || id == 12 || id == 16; - if (id == 4) - { - return true; - } - - if (id == 11) - { - return true; - } - - if (id == 12) - { - return true; - } - - if (id == 16) - { - return true; - } - - return false; } public boolean isPolygonType() { - if (id == 6) - { - return true; - } + return id == 6 || id == 14; - if (id == 14) - { - return true; - } - - return false; } public boolean isMultiPointType() { - if (id == 3) - { - return true; - } + return id == 3 || id == 4 || id == 6 || id == 11 || id == 12 || + id == 13 || id == 14 || id == 15 || id == 16 || id == 22; - if (id == 4) - { - return true; - } + } - if (id == 6) - { - return true; - } - - if (id == 11) - { - return true; - } - - if (id == 12) - { - return true; - } - - if (id == 13) - { - return true; - } - - if (id == 14) - { - return true; - } - - if (id == 15) - { - return true; - } - - if (id == 16) - { - return true; - } - - if (id == 22) - { - return true; - } - - return false; + public boolean isArcType() + { + return id == 15 || (id == 16); } /** @@ -387,72 +264,58 @@ { case 0 : t = NULL; - break; case 3 : t = LINE; - break; case 4 : t = LINESTRING; - break; case 6 : t = SHAPE; - break; case 7 : t = TEXTNODE; - break; case 8 : t = IGDSDIGITIZER; - break; case 9 : t = TCB; - break; case 10 : t = LEVELSYMBOLOGY; - break; case 12 : t = COMPLEXCHAIN; - break; case 14 : t = COMPLEXSHAPE; - break; case 15 : t = ELLIPSE; - break; case 16 : t = ARC; - break; case 17 : t = TEXT; - break; default : t = UNDEFINED; - break; } @@ -467,62 +330,50 @@ { case 3 : handler = LineElement.ElementHandler.getInstance(); - break; case 4 : handler = LineStringElement.ElementHandler.getInstance(); - break; case 6 : handler = ShapeElement.ElementHandler.getInstance(); - break; case 7 : handler = TextNodeElement.ElementHandler.getInstance(); - break; case 8 : handler = new Element.ElementHandler(this); - break; case 9 : handler = new Element.ElementHandler(this); - break; case 10 : handler = new Element.ElementHandler(this); - break; case 12 : handler = ComplexChainElement.ElementHandler.getInstance(); - break; case 14 : handler = ComplexShapeElement.ElementHandler.getInstance(); - break; case 15 : - handler = new Element.ElementHandler(this); - + handler = EllipseElement.ElementHandler.getInstance(); break; case 16 : handler = ArcElement.ElementHandler.getInstance(); - break; case 17 : handler = TextElement.ElementHandler.getInstance(); - break; default : diff --git a/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java new file mode 100644 index 0000000..d176583 --- /dev/null +++ b/xdgnjobs/ximple-dgnio/src/main/java/com/ximple/io/dgn7/EllipseElement.java @@ -0,0 +1,173 @@ +package com.ximple.io.dgn7; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; + +public class EllipseElement extends Element implements GeometryConverter +{ + public EllipseElement(short[] raw) + { + super(raw); + } + + public double getStartAngle() + { + return 0.0; + } + + public void setStartAngle(double value) + { + } + + public double getSweepAngle() + { + return 360.0; + } + + public void setSweepAngle(double value) + { + } + + public double getPrimary() + { + short[] primary = new short[4]; + + System.arraycopy(raw, 18, primary, 0, 4); + + return Utility.DGNToIEEEDouble(primary) / 1000.0; + } + + public void setPrimary(double value) + { + double temp = value * 1000.0; + short[] primary = Utility.IEEEDoubleToDGN(temp); + + System.arraycopy(primary, 0, raw, 18, 4); + } + + public double getSecondary() + { + short[] secondary = new short[4]; + + System.arraycopy(raw, 22, secondary, 0, 4); + + return Utility.DGNToIEEEDouble(secondary) / 1000.0; + } + + public void setSecondary(double value) + { + double temp = value * 1000.0; + short[] secondary = Utility.IEEEDoubleToDGN(temp); + + System.arraycopy(secondary, 0, raw, 22, 4); + } + + public double getRotationAngle() + { + int rotation = (raw[26] << 16 & 0xffff0000); + + rotation += raw[27] & 0x0000ffff; + + return Utility.ConverIntToRotation(rotation); + } + + public void setRotationAngle(double value) + { + int angle = Utility.ConverRotatioToInt(value); + + raw[26] = (short) (angle >> 16 & 0x0000ffff); + raw[27] = (short) (angle & 0x0000ffff); + } + + public Coordinate getOrigin() + { + short[] x = new short[4]; + + System.arraycopy(raw, 28, x, 0, 4); + + double dx = Utility.ConverUnitToCoord((int) Utility.DGNToIEEEDouble(x)); + short[] y = new short[4]; + + System.arraycopy(raw, 32, y, 0, 4); + + double dy = Utility.ConverUnitToCoord((int) Utility.DGNToIEEEDouble(y)); + + return new Coordinate(dx, dy); + } + + public void setOrigin(Coordinate value) + { + double temp = Utility.ConverCoordToUnit(value.x); + short[] x = Utility.IEEEDoubleToDGN(temp); + + System.arraycopy(x, 0, raw, 28, 4); + temp = Utility.ConverCoordToUnit(value.y); + + short[] y = Utility.IEEEDoubleToDGN(temp); + + System.arraycopy(y, 0, raw, 32, 4); + } + + public Geometry toGeometry(GeometryFactory factory) + { + double temp = Math.abs(getStartAngle() - getSweepAngle()); + temp /= 4; + int pts = (temp < 3) ? 3 : (int) temp; + return factory.createLineString(convertToLineString(pts)); + } + + 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); + double startAngle = getStartAngle(); + double endAngle = getSweepAngle(); + double steps = Math.abs(startAngle - endAngle) / pts; + int i = 0; + for (double current = startAngle; current < endAngle; current += steps) + { + if (i < pts) + { + 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++; + } + } + return result; + } + + public static class ElementHandler extends Element.ElementHandler + { + private static ElementHandler instance = null; + + public ElementHandler() + { + super(ElementType.ELLIPSE); + } + + public static IElementHandler getInstance() + { + if (instance == null) + { + instance = new ElementHandler(); + } + + return instance; + } + + protected Element createElement(short[] raw) + { + return new EllipseElement(raw); + } + } +} -- Gitblit v0.0.0-SNAPSHOT