Revision 10539 branches/v10/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgText.java
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