Revision 10539 branches/v10/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgEllipse.java
DwgEllipse.java | ||
---|---|---|
34 | 34 |
*/ |
35 | 35 |
package com.iver.cit.jdwglib.dwg.objects; |
36 | 36 |
|
37 |
import java.util.ArrayList; |
|
38 |
import java.util.Vector; |
|
37 |
import java.awt.geom.Point2D; |
|
38 |
import java.util.List; |
|
39 |
import java.util.Map; |
|
39 | 40 |
|
41 |
import com.iver.cit.gvsig.fmap.core.FPolyline2D; |
|
42 |
import com.iver.cit.gvsig.fmap.core.FShape; |
|
43 |
import com.iver.cit.jdwglib.dwg.DwgFile; |
|
40 | 44 |
import com.iver.cit.jdwglib.dwg.DwgObject; |
41 |
import com.iver.cit.jdwglib.dwg.DwgUtil; |
|
45 |
import com.iver.cit.jdwglib.dwg.IDwg2FMap; |
|
46 |
import com.iver.cit.jdwglib.dwg.IDwg3DTestable; |
|
47 |
import com.iver.cit.jdwglib.dwg.IDwgBlockMember; |
|
48 |
import com.iver.cit.jdwglib.util.FMapUtil; |
|
49 |
import com.iver.cit.jdwglib.util.GisModelCurveCalculator; |
|
42 | 50 |
|
43 | 51 |
/** |
44 | 52 |
* The DwgEllipse class represents a DWG Ellipse |
45 | 53 |
* |
46 | 54 |
* @author jmorell |
47 | 55 |
*/ |
48 |
public class DwgEllipse extends DwgObject { |
|
56 |
public class DwgEllipse extends DwgObject |
|
57 |
implements IDwg3DTestable, IDwg2FMap, IDwgBlockMember{ |
|
58 |
public DwgEllipse(int index) { |
|
59 |
super(index); |
|
60 |
// TODO Auto-generated constructor stub |
|
61 |
} |
|
49 | 62 |
private double[] center; |
50 | 63 |
private double[] majorAxisVector; |
51 | 64 |
private double[] extrusion; |
... | ... | |
53 | 66 |
private double initAngle; |
54 | 67 |
private double endAngle; |
55 | 68 |
|
56 |
/** |
|
57 |
* Read a Ellipse in the DWG format Version 15 |
|
58 |
* |
|
59 |
* @param data Array of unsigned bytes obtained from the DWG binary file |
|
60 |
* @param offset The current bit offset where the value begins |
|
61 |
* @throws Exception If an unexpected bit value is found in the DWG file. Occurs |
|
62 |
* when we are looking for LwPolylines. |
|
63 |
*/ |
|
64 |
public void readDwgEllipseV15(int[] data, int offset) throws Exception { |
|
65 |
int bitPos = offset; |
|
66 |
bitPos = readObjectHeaderV15(data, bitPos); |
|
67 |
ArrayList v = DwgUtil.getBitDouble(data, bitPos); |
|
68 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
69 |
double x = ((Double)v.get(1)).doubleValue(); |
|
70 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
71 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
72 |
double y = ((Double)v.get(1)).doubleValue(); |
|
73 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
74 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
75 |
double z = ((Double)v.get(1)).doubleValue(); |
|
76 |
double[] coord = new double[]{x, y, z}; |
|
77 |
center = coord; |
|
78 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
79 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
80 |
x = ((Double)v.get(1)).doubleValue(); |
|
81 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
82 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
83 |
y = ((Double)v.get(1)).doubleValue(); |
|
84 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
85 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
86 |
z = ((Double)v.get(1)).doubleValue(); |
|
87 |
coord = new double[]{x, y, z}; |
|
88 |
majorAxisVector = coord; |
|
89 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
90 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
91 |
x = ((Double)v.get(1)).doubleValue(); |
|
92 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
93 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
94 |
y = ((Double)v.get(1)).doubleValue(); |
|
95 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
96 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
97 |
z = ((Double)v.get(1)).doubleValue(); |
|
98 |
coord = new double[]{x, y, z}; |
|
99 |
extrusion = coord; |
|
100 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
101 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
102 |
double val = ((Double)v.get(1)).doubleValue(); |
|
103 |
axisRatio = val; |
|
104 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
105 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
106 |
val = ((Double)v.get(1)).doubleValue(); |
|
107 |
initAngle = val; |
|
108 |
v = DwgUtil.getBitDouble(data, bitPos); |
|
109 |
bitPos = ((Integer)v.get(0)).intValue(); |
|
110 |
val = ((Double)v.get(1)).doubleValue(); |
|
111 |
endAngle = val; |
|
112 |
bitPos = readObjectTailV15(data, bitPos); |
|
113 |
} |
|
114 | 69 |
/** |
115 | 70 |
* @return Returns the axisRatio. |
116 | 71 |
*/ |
... | ... | |
177 | 132 |
public double[] getExtrusion() { |
178 | 133 |
return extrusion; |
179 | 134 |
} |
180 |
/* (non-Javadoc) |
|
181 |
* @see java.lang.Object#clone() |
|
182 |
*/ |
|
183 |
public Object clone() { |
|
184 |
DwgEllipse dwgEllipse = new DwgEllipse(); |
|
185 |
dwgEllipse.setType(type); |
|
186 |
dwgEllipse.setHandle(handle); |
|
187 |
dwgEllipse.setVersion(version); |
|
188 |
dwgEllipse.setMode(mode); |
|
189 |
dwgEllipse.setLayerHandle(layerHandle); |
|
190 |
dwgEllipse.setColor(color); |
|
191 |
dwgEllipse.setNumReactors(numReactors); |
|
192 |
dwgEllipse.setNoLinks(noLinks); |
|
193 |
dwgEllipse.setLinetypeFlags(linetypeFlags); |
|
194 |
dwgEllipse.setPlotstyleFlags(plotstyleFlags); |
|
195 |
dwgEllipse.setSizeInBits(sizeInBits); |
|
196 |
dwgEllipse.setExtendedData(extendedData); |
|
197 |
dwgEllipse.setGraphicData(graphicData); |
|
198 |
//dwgEllipse.setInsideBlock(insideBlock); |
|
199 |
dwgEllipse.setCenter(center); |
|
200 |
dwgEllipse.setMajorAxisVector(majorAxisVector); |
|
201 |
dwgEllipse.setExtrusion(extrusion); |
|
202 |
dwgEllipse.setAxisRatio(axisRatio); |
|
203 |
dwgEllipse.setInitAngle(initAngle); |
|
204 |
dwgEllipse.setEndAngle(endAngle); |
|
205 |
return dwgEllipse; |
|
206 |
} |
|
207 | 135 |
/** |
208 | 136 |
* @param extrusion The extrusion to set. |
209 | 137 |
*/ |
210 | 138 |
public void setExtrusion(double[] extrusion) { |
211 | 139 |
this.extrusion = extrusion; |
212 | 140 |
} |
141 |
/* (non-Javadoc) |
|
142 |
* @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData() |
|
143 |
*/ |
|
144 |
public boolean has3DData() { |
|
145 |
return (getCenter()[2] !=0.0); |
|
146 |
} |
|
147 |
/* (non-Javadoc) |
|
148 |
* @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ() |
|
149 |
*/ |
|
150 |
public double getZ() { |
|
151 |
return getCenter()[2]; |
|
152 |
} |
|
153 |
/* (non-Javadoc) |
|
154 |
* @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapGeometry(boolean) |
|
155 |
*/ |
|
156 |
public FShape toFMapGeometry(boolean is3DFile) { |
|
157 |
FPolyline2D arcc; |
|
158 |
double[] c = getCenter(); |
|
159 |
Point2D center = new Point2D.Double(c[0], c[1]); |
|
160 |
double[] majorAxisVector = getMajorAxisVector(); |
|
161 |
Point2D mav = new Point2D.Double(majorAxisVector[0], |
|
162 |
majorAxisVector[1]); |
|
163 |
double axisRatio = getAxisRatio(); |
|
164 |
double initAngle = Math.toDegrees(getInitAngle()); |
|
165 |
double endAngle = Math.toDegrees(getEndAngle()); |
|
166 |
Point2D[] arc = GisModelCurveCalculator |
|
167 |
.calculateGisModelEllipse(center, mav, axisRatio, |
|
168 |
initAngle, endAngle); |
|
169 |
if (is3DFile) { |
|
170 |
double[][] arc3D = new double[arc.length][3]; |
|
171 |
for (int j = 0; j < arc.length; j++) { |
|
172 |
arc3D[j][0] = arc[j].getX(); |
|
173 |
arc3D[j][1] = arc[j].getY(); |
|
174 |
arc3D[j][2] = c[2]; |
|
175 |
} |
|
176 |
arcc = FMapUtil.points3DToFPolyline3D(arc3D); |
|
177 |
} else { |
|
178 |
arcc = FMapUtil.points2DToFPolyline2D(arc); |
|
179 |
} |
|
180 |
return arcc; |
|
181 |
} |
|
182 |
|
|
183 |
/* (non-Javadoc) |
|
184 |
* @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean) |
|
185 |
*/ |
|
186 |
public String toFMapString(boolean is3DFile) { |
|
187 |
if(is3DFile) |
|
188 |
return "FPolyline3D"; |
|
189 |
else |
|
190 |
return "FPolyline2D"; |
|
191 |
} |
|
192 |
|
|
193 |
public String toString(){ |
|
194 |
return "Ellipse"; |
|
195 |
} |
|
196 |
public void transform2Block(double[] bPoint, Point2D insPoint, |
|
197 |
double[] scale, double rot, |
|
198 |
List dwgObjectsWithoutBlocks, |
|
199 |
Map handleObjWithoutBlocks, |
|
200 |
DwgFile callBack) { |
|
201 |
DwgEllipse transformedEntity = null; |
|
202 |
double[] center = this.getCenter(); |
|
203 |
Point2D pointAux = new Point2D.Double(center[0] - bPoint[0], center[1] - bPoint[1]); |
|
204 |
double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot)); |
|
205 |
double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot)); |
|
206 |
double laZ = center[2] * scale[2]; |
|
207 |
double[] transformedCenter = new double[]{laX, laY, laZ}; |
|
208 |
double[] majorAxisVector = this.getMajorAxisVector(); |
|
209 |
double[] transformedMajorAxisVector = new double[]{majorAxisVector[0] * scale[0], majorAxisVector[1] * scale[1], majorAxisVector[2] * scale[2]}; |
|
210 |
//TODO: Rotar un ?ngulo rot el vector majorAxisVector fijado en |
|
211 |
// center. |
|
212 |
double axisRatio = this.getAxisRatio(); |
|
213 |
double transformedAxisRatio = axisRatio; |
|
214 |
double initAngle = this.getInitAngle(); |
|
215 |
double endAngle = this.getEndAngle(); |
|
216 |
double transformedInitAngle = initAngle + rot; |
|
217 |
if (transformedInitAngle<0) { |
|
218 |
transformedInitAngle = transformedInitAngle + (2*Math.PI); |
|
219 |
} else if (transformedInitAngle>(2*Math.PI)) { |
|
220 |
transformedInitAngle = transformedInitAngle - (2*Math.PI); |
|
221 |
} |
|
222 |
double transformedEndAngle = endAngle + rot; |
|
223 |
if (transformedEndAngle<0) { |
|
224 |
transformedEndAngle = transformedEndAngle + (2*Math.PI); |
|
225 |
} else if (transformedEndAngle>(2*Math.PI)) { |
|
226 |
transformedEndAngle = transformedEndAngle - (2*Math.PI); |
|
227 |
} |
|
228 |
transformedEntity = (DwgEllipse)this.clone(); |
|
229 |
transformedEntity.setCenter(transformedCenter); |
|
230 |
transformedEntity.setMajorAxisVector(transformedMajorAxisVector); |
|
231 |
transformedEntity.setAxisRatio(transformedAxisRatio); |
|
232 |
transformedEntity.setInitAngle(transformedInitAngle); |
|
233 |
transformedEntity.setEndAngle(transformedEndAngle); |
|
234 |
dwgObjectsWithoutBlocks.add(transformedEntity); |
|
235 |
handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity); |
|
236 |
// dwgObjectsWithoutBlocks.add(this); |
|
237 |
} |
|
238 |
/* (non-Javadoc) |
|
239 |
* @see java.lang.Object#clone() |
|
240 |
*/ |
|
241 |
public Object clone(){ |
|
242 |
DwgEllipse obj = new DwgEllipse(index); |
|
243 |
this.fill(obj); |
|
244 |
return obj; |
|
245 |
} |
|
246 |
|
|
247 |
protected void fill(DwgObject obj){ |
|
248 |
super.fill(obj); |
|
249 |
DwgEllipse myObj = (DwgEllipse)obj; |
|
250 |
|
|
251 |
myObj.setAxisRatio(axisRatio); |
|
252 |
myObj.setCenter(center); |
|
253 |
myObj.setEndAngle(endAngle); |
|
254 |
myObj.setExtrusion(extrusion); |
|
255 |
myObj.setInitAngle(initAngle); |
|
256 |
myObj.setMajorAxisVector(majorAxisVector); |
|
257 |
|
|
258 |
} |
|
259 |
|
|
213 | 260 |
} |
Also available in: Unified diff