Revision 10539 branches/v10/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgEllipse.java

View differences:

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