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

View differences:

DwgLine.java
34 34
 */
35 35
package com.iver.cit.jdwglib.dwg.objects;
36 36

  
37
import java.util.ArrayList;
37
import java.awt.geom.Point2D;
38
import java.util.List;
39
import java.util.Map;
38 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;
39 44
import com.iver.cit.jdwglib.dwg.DwgObject;
40
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.dwg.IDwgExtrusionable;
49
import com.iver.cit.jdwglib.util.AcadExtrusionCalculator;
50
import com.iver.cit.jdwglib.util.FMapUtil;
41 51

  
42 52
/**
43 53
 * The DwgLine class represents a DWG Line
44 54
 * 
45
 * @author jmorell
55
 * @author jmorell, azabala
46 56
 */
47
public class DwgLine extends DwgObject {
57
public class DwgLine extends DwgObject 
58
	implements /*IDwgExtrusionable,*/ IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
59
	public DwgLine(int index) {
60
		super(index);
61
		// TODO Auto-generated constructor stub
62
	}
48 63
	private double[] p1;
49 64
	private double[] p2;
50 65
	private double thickness;
......
52 67
	private boolean zflag = false;
53 68
	
54 69
	/**
55
	 * Read a Line in the DWG format Version 15
56
	 * 
57
	 * @param data Array of unsigned bytes obtained from the DWG binary file
58
	 * @param offset The current bit offset where the value begins
59
	 * @throws Exception If an unexpected bit value is found in the DWG file. Occurs
60
	 * 		   when we are looking for LwPolylines.
61
	 */
62
	public void readDwgLineV15(int[] data, int offset) throws Exception {
63
		int bitPos = offset;
64
		bitPos = readObjectHeaderV15(data, bitPos);
65
		ArrayList v = DwgUtil.testBit(data, bitPos);
66
		bitPos = ((Integer)v.get(0)).intValue();
67
		zflag = ((Boolean)v.get(1)).booleanValue();
68
		v = DwgUtil.getRawDouble(data, bitPos);
69
		bitPos = ((Integer)v.get(0)).intValue();
70
		double x1 = ((Double)v.get(1)).doubleValue();
71
		v = DwgUtil.getDefaultDouble(data, bitPos, x1);
72
		bitPos = ((Integer)v.get(0)).intValue();
73
		double x2 = ((Double)v.get(1)).doubleValue();
74
		v = DwgUtil.getRawDouble(data, bitPos);
75
		bitPos = ((Integer)v.get(0)).intValue();
76
		double y1 = ((Double)v.get(1)).doubleValue();
77
		v = DwgUtil.getDefaultDouble(data, bitPos, y1);
78
		bitPos = ((Integer)v.get(0)).intValue();
79
		double y2 = ((Double)v.get(1)).doubleValue();
80
		double[] p1;
81
		double[] p2;
82
	    if (!zflag) {
83
			v = DwgUtil.getRawDouble(data, bitPos);
84
			bitPos = ((Integer)v.get(0)).intValue();
85
			double z1 = ((Double)v.get(1)).doubleValue();
86
			v = DwgUtil.getDefaultDouble(data, bitPos, z1);
87
			bitPos = ((Integer)v.get(0)).intValue();
88
			double z2 = ((Double)v.get(1)).doubleValue();
89
			p1 = new double[]{x1, y1, z1};
90
			p2 = new double[]{x2, y2, z2};
91
		} else {
92
			p1 = new double[]{x1, y1};
93
			p2 = new double[]{x2, y2};
94
		}
95
	    this.p1 = p1;
96
	    this.p2 = p2;
97
		v = DwgUtil.testBit(data, bitPos);
98
		bitPos = ((Integer)v.get(0)).intValue();
99
		boolean flag = ((Boolean)v.get(1)).booleanValue();
100
	    double val;
101
		if (flag) {
102
			val=0.0;
103
		} else {
104
			v = DwgUtil.getBitDouble(data, bitPos);
105
			bitPos = ((Integer)v.get(0)).intValue();
106
			val = ((Double)v.get(1)).doubleValue();
107
		}
108
		thickness = val;
109
		v = DwgUtil.testBit(data, bitPos);
110
		bitPos = ((Integer)v.get(0)).intValue();
111
		flag = ((Boolean)v.get(1)).booleanValue();
112
		double x, y, z;
113
	    if (flag) {
114
			 x = y = 0.0;
115
			 z = 1.0;
116
		} else {
117
			v = DwgUtil.getBitDouble(data, bitPos);
118
			bitPos = ((Integer)v.get(0)).intValue();
119
			x = ((Double)v.get(1)).doubleValue();
120
			v = DwgUtil.getBitDouble(data, bitPos);
121
			bitPos = ((Integer)v.get(0)).intValue();
122
			y = ((Double)v.get(1)).doubleValue();
123
			v = DwgUtil.getBitDouble(data, bitPos);
124
			bitPos = ((Integer)v.get(0)).intValue();
125
			z = ((Double)v.get(1)).doubleValue();
126
		}
127
		double[] coord = new double[]{x, y, z};
128
		extrusion = coord;
129
		bitPos = readObjectTailV15(data, bitPos);
130
	}
131
	/**
132 70
	 * @return Returns the p1.
133 71
	 */
134 72
	public double[] getP1() {
......
179 117
	/* (non-Javadoc)
180 118
	 * @see java.lang.Object#clone()
181 119
	 */
182
	public Object clone() {
183
		DwgLine dwgLine = new DwgLine();
184
		dwgLine.setType(type);
185
		dwgLine.setHandle(handle);
186
		dwgLine.setVersion(version);
187
		dwgLine.setMode(mode);
188
		dwgLine.setLayerHandle(layerHandle);
189
		dwgLine.setColor(color);
190
		dwgLine.setNumReactors(numReactors);
191
		dwgLine.setNoLinks(noLinks);
192
		dwgLine.setLinetypeFlags(linetypeFlags);
193
		dwgLine.setPlotstyleFlags(plotstyleFlags);
194
		dwgLine.setSizeInBits(sizeInBits);
195
		dwgLine.setExtendedData(extendedData);
196
		dwgLine.setGraphicData(graphicData);
197
		//dwgLine.setInsideBlock(insideBlock);
198
		dwgLine.setP1(p1);
199
		dwgLine.setP2(p2);
200
		dwgLine.setThickness(thickness);
201
		dwgLine.setExtrusion(extrusion);
202
		return dwgLine;
203
	}
120
//	public Object clone() {
121
//		DwgLine dwgLine = new DwgLine(index);
122
//		dwgLine.setType(type);
123
//		dwgLine.setHandle(handle);
124
//		dwgLine.setVersion(version);
125
//		dwgLine.setMode(mode);
126
//		dwgLine.setLayerHandle(layerHandle);
127
//		dwgLine.setColor(color);
128
//		dwgLine.setNumReactors(numReactors);
129
//		dwgLine.setNoLinks(noLinks);
130
//		dwgLine.setLinetypeFlags(linetypeFlags);
131
//		dwgLine.setPlotstyleFlags(plotstyleFlags);
132
//		dwgLine.setSizeInBits(sizeInBits);
133
//		dwgLine.setExtendedData(extendedData);
134
//		dwgLine.setGraphicData(graphicData);
135
//		//dwgLine.setInsideBlock(insideBlock);
136
//		dwgLine.setP1(p1);
137
//		dwgLine.setP2(p2);
138
//		dwgLine.setThickness(thickness);
139
//		dwgLine.setExtrusion(extrusion);
140
//		dwgLine.setSubEntityHandle(subEntityHandle);
141
//		return dwgLine;
142
//	}
204 143
    /**
205 144
     * @return Returns the zflag.
206 145
     */
......
213 152
    public void setZflag(boolean zflag) {
214 153
        this.zflag = zflag;
215 154
    }
155
	/* (non-Javadoc)
156
	 * @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion()
157
	 */
158
	public void applyExtrussion() {
159
		 double[] lineP1 = getP1();
160
         double[] lineP2 = getP2();
161
         boolean zflag = isZflag();
162
         if (zflag) {
163
             // elev = 0.0;
164
             lineP1 = new double[]{lineP1[0], lineP1[1], 0.0};
165
             lineP2 = new double[]{lineP2[0], lineP2[1], 0.0};
166
         }
167
         double[] lineExt = getExtrusion();
168
         lineP1 = AcadExtrusionCalculator.extrude2(lineP1, lineExt);
169
         lineP2 = AcadExtrusionCalculator.extrude2(lineP2, lineExt);
170
         setP1(lineP1);
171
         setP2(lineP2);
172
	}
173
	/* (non-Javadoc)
174
	 * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
175
	 */
176
	public boolean has3DData() {
177
	  if (!isZflag()) {
178
		double z1 = getP1()[2];
179
		double z2 = getP2()[2];
180
		if (z1!=0.0 || z2!=0.0) 
181
			return  true;
182
	  }//TODO y si zflag vale true? REVISAR
183
	  return false;
184
	}
185
	public double getZ() {
186
		double[] p1 = getP1();
187
		double[] p2 = getP2();
188
		if(isZflag()){
189
			if (p1[2] == p2[2])
190
				return p1[2];
191
			else
192
				return 0d;
193
		} else {
194
				return 0d;
195
		}
196
	}
197
	public FShape toFMapGeometry(boolean is3DFile) {
198
		FPolyline2D line = null;
199
		double[] p1 = getP1();
200
		Point2D point1 = new Point2D.Double(p1[0], p1[1]);
201
		double[] p2 = getP2();
202
		Point2D point2 = new Point2D.Double(p2[0], p2[1]);
203
		Point2D[] lin = new Point2D[] { point1, point2 };
204
		if (is3DFile && isZflag()) {
205
			double[][] lin3D = new double[2][3];
206
			lin3D[0][0] = lin[0].getX();
207
			lin3D[0][1] = lin[0].getY();
208
			lin3D[0][2] = p1[2];
209
			lin3D[1][0] = lin[1].getX();
210
			lin3D[1][1] = lin[1].getY();
211
			lin3D[1][2] = p2[2];
212
			line = FMapUtil.points3DToFPolyline3D(lin3D);
213
		} else if (is3DFile && ! isZflag()) {
214
			double[][] lin3D = new double[2][3];
215
			lin3D[0][0] = lin[0].getX();
216
			lin3D[0][1] = lin[0].getY();
217
			lin3D[0][2] = 0.0;
218
			lin3D[1][0] = lin[1].getX();
219
			lin3D[1][1] = lin[1].getY();
220
			lin3D[1][2] = 0.0;
221
			line = FMapUtil.points3DToFPolyline3D(lin3D);
222
		} else {
223
			line = FMapUtil.points2DToFPolyline2D(lin);
224
		}
225
		return line;
226
		
227
	}
228
	public String toFMapString(boolean is3DFile) {
229
		if(is3DFile){
230
			return "FPolyline3D";
231
		}else{
232
			return "FPolyline2D";
233
		}
234
	}
235
	
236
	public String toString(){
237
		return "Line";
238
	}
239
	public void transform2Block(double[] bPoint, Point2D insPoint,
240
			double[] scale, double rot, 
241
			List dwgObjectsWithoutBlocks, 
242
			Map handleObjWithoutBlocks,
243
			DwgFile callBack) {
244
		DwgLine transformedEntity = null;
245
		double[] p1 = this.getP1();
246
		if(p1.length < 3)
247
		{
248
			double[] newp1 = new double[3];
249
			System.arraycopy(p1, 0, newp1, 0, p1.length);
250
			p1 = newp1;
251
			setP1(newp1);
252
		}
253
		double[] p2 = this.getP2();
254
		if(p2.length < 3)
255
		{
256
			double[] newp2 = new double[3];
257
			System.arraycopy(p2, 0, newp2, 0, p2.length);
258
			p2 = newp2;
259
			setP2(newp2);
260
		}
261
		Point2D pointAux = new Point2D.Double(p1[0] - bPoint[0], p1[1] - bPoint[1]);
262
		double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
263
		double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
264
		double[] transformedP1 = null;
265
        if (this.isZflag() ) {
266
			double laZ = p1[2] * scale[2];
267
			transformedP1 = new double[]{laX, laY, laZ};
268
		} else {
269
			transformedP1 = new double[]{laX, laY, 0d};
270
		}
271
		//double[] transformedP1 = new double[]{laX, laY};
272
		pointAux = new Point2D.Double(p2[0] - bPoint[0], p2[1] - bPoint[1]);
273
		laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
274
		laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
275
        double[] transformedP2 = null;
276
		if (this.isZflag() ) {
277
			double laZ = p2[2] * scale[2];
278
			transformedP2 = new double[]{laX, laY, laZ};
279
		} else {
280
			transformedP2 = new double[]{laX, laY, 0d};
281
		}
282
		//double[] transformedP2 = new double[]{laX, laY};
283
		transformedEntity = (DwgLine)this.clone();
284
		transformedEntity.setP1(transformedP1);
285
		transformedEntity.setP2(transformedP2);
286
		dwgObjectsWithoutBlocks.add(transformedEntity);
287
		handleObjWithoutBlocks.put(new Integer(transformedEntity.getHandle().getOffset()), transformedEntity);
288
//		dwgObjectsWithoutBlocks.add(this);
289
	}
290
	public Object clone(){
291
		DwgLine dwgLine = new DwgLine(index);
292
		this.fill(dwgLine);
293
		return dwgLine;
294
	}
295
	
296
	protected void fill(DwgObject obj){
297
		super.fill(obj);
298
		DwgLine myObj = (DwgLine)obj;
299

  
300
		myObj.setExtrusion(extrusion);
301
		myObj.setP1(p1);
302
		myObj.setP2(p2);
303
		myObj.setThickness(thickness);
304

  
305
	}
306

  
216 307
}

Also available in: Unified diff