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

View differences:

DwgText.java
35 35
package com.iver.cit.jdwglib.dwg.objects;
36 36

  
37 37
import java.awt.geom.Point2D;
38
import java.util.ArrayList;
38
import java.util.List;
39
import java.util.Map;
39 40

  
40
import com.iver.cit.javacad.util.TextToUnicodeConverter;
41
import com.iver.cit.gvsig.fmap.core.FPoint2D;
42
import com.iver.cit.gvsig.fmap.core.FPoint3D;
43
import com.iver.cit.gvsig.fmap.core.FShape;
44
import com.iver.cit.jdwglib.dwg.DwgFile;
45
import com.iver.cit.jdwglib.dwg.DwgHandleReference;
41 46
import com.iver.cit.jdwglib.dwg.DwgObject;
42
import com.iver.cit.jdwglib.dwg.DwgUtil;
47
import com.iver.cit.jdwglib.dwg.IDwg2FMap;
48
import com.iver.cit.jdwglib.dwg.IDwg3DTestable;
49
import com.iver.cit.jdwglib.dwg.IDwgBlockMember;
50
import com.iver.cit.jdwglib.dwg.IDwgExtrusionable;
51
import com.iver.cit.jdwglib.util.AcadExtrusionCalculator;
43 52

  
44 53
/**
45 54
 * The DwgText class represents a DWG Text
46 55
 * 
47 56
 * @author jmorell
48 57
 */
49
public class DwgText extends DwgObject {
58
public class DwgText extends DwgObject 
59
					implements IDwgExtrusionable, 
60
					IDwg3DTestable, 
61
					IDwg2FMap,
62
					IDwgBlockMember{
63
	public DwgText(int index) {
64
		super(index);
65
		// TODO Auto-generated constructor stub
66
	}
50 67
	private int dataFlag;
51 68
	private double elevation;
52 69
	private Point2D insertionPoint;
......
61 78
	private int generation;
62 79
	private int halign;
63 80
	private int valign;
81
	private DwgHandleReference styleHdl;
64 82
	
65 83
	/**
66
	 * Read a Text in the DWG format Version 15
67
	 * 
68
	 * @param data Array of unsigned bytes obtained from the DWG binary file
69
	 * @param offset The current bit offset where the value begins
70
	 * @throws Exception If an unexpected bit value is found in the DWG file. Occurs
71
	 * 		   when we are looking for LwPolylines.
72
	 */
73
	public void readDwgTextV15(int[] data, int offset) throws Exception {
74
		int bitPos = offset;
75
		bitPos = readObjectHeaderV15(data, bitPos);
76
		ArrayList v = DwgUtil.getRawChar(data, bitPos);
77
		bitPos = ((Integer)v.get(0)).intValue();
78
		int dflag = ((Integer)v.get(1)).intValue();
79
		dataFlag = dflag;
80
		if ((dflag & 0x1)==0) {
81
			v = DwgUtil.getRawDouble(data, bitPos);
82
			bitPos = ((Integer)v.get(0)).intValue();
83
			double elev = ((Double)v.get(1)).doubleValue();
84
			elevation = elev;
85
		}
86
		v = DwgUtil.getRawDouble(data, bitPos);
87
		bitPos = ((Integer)v.get(0)).intValue();
88
		double x1 = ((Double)v.get(1)).doubleValue();
89
		v = DwgUtil.getRawDouble(data, bitPos);
90
		bitPos = ((Integer)v.get(0)).intValue();
91
		double y1 = ((Double)v.get(1)).doubleValue();
92
		insertionPoint = new Point2D.Double(x1, y1);
93
		if ((dflag & 0x2)==0) {
94
			v = DwgUtil.getDefaultDouble(data, bitPos, x1);
95
			bitPos = ((Integer)v.get(0)).intValue();
96
			double xa = ((Double)v.get(1)).doubleValue();
97
			v = DwgUtil.getDefaultDouble(data, bitPos, y1);
98
			bitPos = ((Integer)v.get(0)).intValue();
99
			double ya = ((Double)v.get(1)).doubleValue();
100
			alignmentPoint = new Point2D.Double(xa, ya);
101
		}
102
		v = DwgUtil.testBit(data, bitPos);
103
		bitPos = ((Integer)v.get(0)).intValue();
104
		boolean flag = ((Boolean)v.get(1)).booleanValue();
105
		double x, y, z;
106
		if (flag) {
107
			x = 0.0;
108
			y = 0.0;
109
			z = 1.0;
110
		} else {
111
			v = DwgUtil.getBitDouble(data, bitPos);
112
			bitPos = ((Integer)v.get(0)).intValue();
113
			x = ((Double)v.get(1)).doubleValue();
114
			v = DwgUtil.getBitDouble(data, bitPos);
115
			bitPos = ((Integer)v.get(0)).intValue();
116
			y = ((Double)v.get(1)).doubleValue();
117
			v = DwgUtil.getBitDouble(data, bitPos);
118
			bitPos = ((Integer)v.get(0)).intValue();
119
			z = ((Double)v.get(1)).doubleValue();
120
		}
121
		double[] coord = new double[]{x, y, z};
122
		extrusion = coord;
123
		v = DwgUtil.testBit(data, bitPos);
124
		bitPos = ((Integer)v.get(0)).intValue();
125
		flag = ((Boolean)v.get(1)).booleanValue();
126
	    double th;
127
		if (flag) {
128
			th=0.0;
129
		} else {
130
			v = DwgUtil.getBitDouble(data, bitPos);
131
			bitPos = ((Integer)v.get(0)).intValue();
132
			th = ((Double)v.get(1)).doubleValue();
133
		}
134
		thickness = th;
135
		if ((dflag & 0x4) == 0) {
136
			v = DwgUtil.getRawDouble(data, bitPos);
137
			bitPos = ((Integer)v.get(0)).intValue();
138
			double oblique = ((Double)v.get(1)).doubleValue();
139
			obliqueAngle = oblique;
140
		}
141
		if ((dflag & 0x8) == 0) {
142
			v = DwgUtil.getRawDouble(data, bitPos);
143
			bitPos = ((Integer)v.get(0)).intValue();
144
			double rot = ((Double)v.get(1)).doubleValue();
145
			rotationAngle = rot;
146
		}
147
		v = DwgUtil.getRawDouble(data, bitPos);
148
		bitPos = ((Integer)v.get(0)).intValue();
149
		double height = ((Double)v.get(1)).doubleValue();
150
		this.height = height;
151
		if ((dflag & 0x10) == 0) {
152
			v = DwgUtil.getRawDouble(data, bitPos);
153
			bitPos = ((Integer)v.get(0)).intValue();
154
			double width = ((Double)v.get(1)).doubleValue();
155
			widthFactor = width;
156
		}
157
		v = DwgUtil.getTextString(data, bitPos);
158
		bitPos = ((Integer)v.get(0)).intValue();
159
		String text = (String)v.get(1);
160
		text = TextToUnicodeConverter.convertText(text);
161
		this.text = text;
162
		if ((dflag & 0x20) == 0) {
163
			v = DwgUtil.getBitShort(data, bitPos);
164
			bitPos = ((Integer)v.get(0)).intValue();
165
			int gen = ((Integer)v.get(1)).intValue();
166
		    generation = gen;
167
		}
168
		if ((dflag & 0x40) == 0) {
169
			v = DwgUtil.getBitShort(data, bitPos);
170
			bitPos = ((Integer)v.get(0)).intValue();
171
			int halign = ((Integer)v.get(1)).intValue();
172
		    this.halign = halign;
173
		}
174
		if ((dflag & 0x80) == 0) {
175
			v = DwgUtil.getBitShort(data, bitPos);
176
			bitPos = ((Integer)v.get(0)).intValue();
177
			int valign = ((Integer)v.get(1)).intValue();
178
		    this.valign = valign;
179
		}
180
		bitPos = readObjectTailV15(data, bitPos);
181
	}
182
	/**
183 84
	 * @return Returns the dataFlag.
184 85
	 */
185 86
	public int getDataFlag() {
......
221 122
	public double getRotationAngle() {
222 123
		return rotationAngle;
223 124
	}
125
	
126
	public double getRotationAngleInDegrees(){
127
		int dflag = getDataFlag();
128
		if ((dflag & 0x8) == 0) {
129
			double textRot = getRotationAngle();
130
			return Math.toDegrees(textRot);
131
		} else {
132
			return 0d;
133
		}
134
	}
224 135
	/**
225 136
	 * @param rotationAngle The rotationAngle to set.
226 137
	 */
......
269 180
    public double[] getExtrusion() {
270 181
        return extrusion;
271 182
    }
272
	/* (non-Javadoc)
273
	 * @see java.lang.Object#clone()
274
	 */
275
	public Object clone() {
276
		DwgText dwgText = new DwgText();
277
		dwgText.setType(type);
278
		dwgText.setHandle(handle);
279
		dwgText.setVersion(version);
280
		dwgText.setMode(mode);
281
		dwgText.setLayerHandle(layerHandle);
282
		dwgText.setColor(color);
283
		dwgText.setNumReactors(numReactors);
284
		dwgText.setNoLinks(noLinks);
285
		dwgText.setLinetypeFlags(linetypeFlags);
286
		dwgText.setPlotstyleFlags(plotstyleFlags);
287
		dwgText.setSizeInBits(sizeInBits);
288
		dwgText.setExtendedData(extendedData);
289
		dwgText.setGraphicData(graphicData);
290
		//dwgText.setInsideBlock(insideBlock);
291
		dwgText.setDataFlag(dataFlag);
292
		dwgText.setElevation(elevation);
293
		dwgText.setInsertionPoint(insertionPoint);
294
		dwgText.setAlignmentPoint(alignmentPoint);
295
		dwgText.setExtrusion(extrusion);
296
		dwgText.setThickness(thickness);
297
		dwgText.setObliqueAngle(obliqueAngle);
298
		dwgText.setRotationAngle(rotationAngle);
299
		dwgText.setHeight(height);
300
		dwgText.setWidthFactor(widthFactor);
301
		dwgText.setText(text);
302
		dwgText.setGeneration(generation);
303
		dwgText.setHalign(halign);
304
		dwgText.setValign(valign);
305
		return dwgText;
306
	}
183

  
307 184
	/**
308 185
	 * @return Returns the alignmentPoint.
309 186
	 */
......
382 259
	public void setExtrusion(double[] extrusion) {
383 260
		this.extrusion = extrusion;
384 261
	}
262
	/* (non-Javadoc)
263
	 * @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion()
264
	 */
265
	public void applyExtrussion() {
266
		 Point2D tpoint = getInsertionPoint();
267
         double elev = getElevation();
268
         double[] textPoint = new double[]{tpoint.getX(), tpoint.getY(), elev};
269
         double[] textExt = getExtrusion();
270
         textPoint = AcadExtrusionCalculator.extrude2(textPoint, textExt);
271
         setInsertionPoint(new Point2D.Double(textPoint[0], textPoint[1]));
272
         setElevation(elev);
273
	}
274
	/* (non-Javadoc)
275
	 * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
276
	 */
277
	public boolean has3DData() {
278
		return (getElevation() !=0.0);
279
	}
280
	public double getZ() {
281
		return getElevation();
282
	}
283
	public FShape toFMapGeometry(boolean is3DFile) {
284
		FPoint2D point = null;
285
		Point2D p = getInsertionPoint();
286
		double elev = 0.0;
287
		if ((getDataFlag() & 0x1) == 0)
288
			elev = getElevation();
289
		if (is3DFile) {
290
			point = new FPoint3D(p.getX(), p.getY(), elev);
291
		} else {
292
			point = new FPoint2D(p.getX(), p.getY());
293
		}
294
		return point;
295
	}
296
	
297
	public String toFMapString(boolean is3DFile) {
298
		if(is3DFile)
299
			return "FPoint3D";
300
		else
301
			return "FPoint2D";
302
	}
303
	public String toString(){
304
		return "Text";
305
	}
306
	/**
307
	 * @param styleHdl
308
	 */
309
	public void setStyleHandle(DwgHandleReference styleHdl) {
310
		this.styleHdl = styleHdl;
311
	}
312

  
313
	/* (non-Javadoc)
314
	 * @see java.lang.Object#clone()
315
	 */
316
	public Object clone(){
317
		DwgText obj = new DwgText(index);
318
		this.fill(obj);
319
		return obj;
320
	}
321
	
322
	protected void fill(DwgObject obj){
323
		super.fill(obj);
324
		DwgText myObj = (DwgText)obj;
325

  
326
		myObj.setAlignmentPoint(alignmentPoint);
327
		myObj.setDataFlag(dataFlag);
328
		myObj.setElevation(elevation);
329
		myObj.setExtrusion(extrusion);
330
		myObj.setGeneration(generation);
331
		myObj.setHalign(halign);
332
		myObj.setHeight(height);
333
		myObj.setInsertionPoint(insertionPoint);
334
		myObj.setObliqueAngle(obliqueAngle);
335
		myObj.setRotationAngle(rotationAngle);
336
		myObj.setStyleHandle(styleHdl);
337
		myObj.setText(text);
338
		myObj.setThickness(thickness);
339
		myObj.setValign(valign);
340
		myObj.setWidthFactor(widthFactor);
341
	}
342
	
343
	//TODO Implement
344
	public void transform2Block(double[] bPoint, Point2D insPoint, double[] scale, double rot, List dwgObjectsWithoutBlocks, Map handle_objectsWithoutBlocks, DwgFile callBack) {
345
		 Point2D pointAux = new Point2D.Double(insertionPoint.getX() - bPoint[0], 
346
				 insertionPoint.getY() - bPoint[1]);
347
		 double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
348
		 double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
349

  
350
		 Point2D.Double newInsertionPoint = new Point2D.Double(laX, laY);
351
		 DwgText transformedEntity = (DwgText) this.clone();
352
		 transformedEntity.setInsertionPoint(newInsertionPoint);
353
		 
354
		 if(alignmentPoint != null){
355
			 pointAux = new Point2D.Double(alignmentPoint.getX() - bPoint[0], 
356
					 alignmentPoint.getY() - bPoint[1]);
357
			 laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot));
358
			 laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot));
359
			 Point2D.Double newAlignPoint = new Point2D.Double(laX, laY);
360
			 transformedEntity.setAlignmentPoint(newAlignPoint);
361
		 }
362
		 //TODO Transformar el resto de parametros en base a los datos del bloque
363
		 //altura, etc.
364
	}
365

  
385 366
}

Also available in: Unified diff