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