Revision 10632 trunk/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgLwPolyline.java
DwgLwPolyline.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 | 39 |
import java.util.List; |
39 | 40 |
import java.util.Map; |
40 | 41 |
|
... | ... | |
47 | 48 |
import com.iver.cit.jdwglib.dwg.IDwgBlockMember; |
48 | 49 |
import com.iver.cit.jdwglib.dwg.IDwgExtrusionable; |
49 | 50 |
import com.iver.cit.jdwglib.dwg.IDwgPolyline; |
51 |
import com.iver.cit.jdwglib.dwg.IDwgVertex; |
|
50 | 52 |
import com.iver.cit.jdwglib.util.AcadExtrusionCalculator; |
51 | 53 |
import com.iver.cit.jdwglib.util.FMapUtil; |
52 | 54 |
import com.iver.cit.jdwglib.util.GisModelCurveCalculator; |
... | ... | |
59 | 61 |
public class DwgLwPolyline extends DwgObject |
60 | 62 |
implements IDwgPolyline, IDwgExtrusionable, |
61 | 63 |
IDwg3DTestable, IDwg2FMap, IDwgBlockMember{ |
62 |
public DwgLwPolyline(int index) { |
|
63 |
super(index); |
|
64 |
// TODO Auto-generated constructor stub |
|
65 |
} |
|
64 |
|
|
66 | 65 |
private int flag; |
67 | 66 |
private double constWidth; |
68 | 67 |
private double elevation; |
69 | 68 |
private double thickness; |
70 | 69 |
private double[] normal; |
71 |
private Point2D[] vertices;
|
|
70 |
private List vertices;
|
|
72 | 71 |
/* |
73 | 72 |
*The bulge is the tangent of 1/4 of the included angle for the arc |
74 | 73 |
*between the selected vertex and the next vertex in the polyline's vertex list. |
... | ... | |
83 | 82 |
private double[][] widths; |
84 | 83 |
|
85 | 84 |
|
85 |
public DwgLwPolyline(int index) { |
|
86 |
super(index); |
|
87 |
vertices = new ArrayList(); |
|
88 |
} |
|
86 | 89 |
/** |
87 | 90 |
* @return Returns the bulges. |
88 | 91 |
*/ |
... | ... | |
110 | 113 |
/** |
111 | 114 |
* @return Returns the vertices. |
112 | 115 |
*/ |
113 |
public Point2D[] getVertices() {
|
|
116 |
public List getVertices() {
|
|
114 | 117 |
return vertices; |
115 | 118 |
} |
116 | 119 |
/** |
117 | 120 |
* @param vertices The vertices to set. |
118 | 121 |
*/ |
119 |
public void setVertices(Point2D[] vertices) {
|
|
122 |
public void setVertices(List vertices) {
|
|
120 | 123 |
this.vertices = vertices; |
121 | 124 |
} |
122 | 125 |
/** |
... | ... | |
215 | 218 |
if (getVertices() == null) |
216 | 219 |
return; |
217 | 220 |
int flags = getFlag(); |
218 |
Point2D[] pts = getVertices();
|
|
221 |
List pts = getVertices();
|
|
219 | 222 |
double[] bulges = getBulges(); |
220 |
Point2D[] newPts = new Point2D[pts.length];
|
|
223 |
List newPts = new ArrayList();
|
|
221 | 224 |
double[] newBulges = null; |
222 | 225 |
if(bulges != null){ |
223 | 226 |
newBulges = new double[bulges.length]; |
224 | 227 |
System.arraycopy(bulges, 0, newBulges, 0, bulges.length); |
225 | 228 |
}else{ |
226 |
bulges = new double[pts.length ];
|
|
229 |
bulges = new double[pts.size() ];
|
|
227 | 230 |
newBulges = new double[bulges.length]; |
228 | 231 |
//dwg spec says numVertex (numSegments + 1) |
229 | 232 |
//TODO Check this |
... | ... | |
235 | 238 |
// TODO: Aqu? pueden existir casos no contemplados ... |
236 | 239 |
// System.out.println("flags = " + flags); |
237 | 240 |
if (flags==512 || flags==776 || flags==768) {//closed |
238 |
newPts = new Point2D[pts.length+1]; |
|
239 | 241 |
newBulges = new double[bulges.length+1]; |
240 |
for (int j=0;j<pts.length;j++) {
|
|
241 |
newPts[j] = (Point2D)pts[j];
|
|
242 |
for (int j=0;j<pts.size();j++) {
|
|
243 |
newPts.add(pts.get(j));
|
|
242 | 244 |
} |
243 |
newPts[pts.length] = (Point2D)pts[0];
|
|
244 |
newBulges[pts.length] = 0;
|
|
245 |
newPts.add(pts.get(0));
|
|
246 |
newBulges[pts.size()] = 0;
|
|
245 | 247 |
} else { |
246 |
for (int j=0;j<pts.length;j++) {
|
|
247 |
newPts[j] = (Point2D)pts[j];
|
|
248 |
for (int j=0;j<pts.size();j++) {
|
|
249 |
newPts.add(pts.get(j));
|
|
248 | 250 |
} |
249 | 251 |
} |
250 |
if (pts.length>0) {
|
|
252 |
if (newPts.size() > 0) {
|
|
251 | 253 |
setBulges(newBulges); |
252 |
Point2D[] points = GisModelCurveCalculator.calculateGisModelBulge(newPts, newBulges);
|
|
254 |
List points = GisModelCurveCalculator.calculateGisModelBulge(newPts, newBulges);
|
|
253 | 255 |
setVertices(points); |
254 |
} else { |
|
255 |
// System.out.println("Encontrada polil?nea sin puntos ..."); |
|
256 |
// TODO: No se debe mandar nunca una polil?nea sin puntos, si esto |
|
257 |
// ocurre es porque existe un error que hay que corregir ... |
|
258 |
} |
|
256 |
} |
|
257 |
// if (pts.size() > 0) { |
|
258 |
// setBulges(newBulges); |
|
259 |
// List points = GisModelCurveCalculator.calculateGisModelBulge(newPts, newBulges); |
|
260 |
// setVertices(points); |
|
261 |
// } |
|
262 |
// else { |
|
263 |
//// System.out.println("Encontrada polil?nea sin puntos ..."); |
|
264 |
// // TODO: No se debe mandar nunca una polil?nea sin puntos, si esto |
|
265 |
// // ocurre es porque existe un error que hay que corregir ... |
|
266 |
// } |
|
259 | 267 |
} |
260 | 268 |
/* (non-Javadoc) |
261 | 269 |
* @see com.iver.cit.jdwglib.dwg.IDwgExtrusionable#applyExtrussion() |
... | ... | |
263 | 271 |
public void applyExtrussion() { |
264 | 272 |
if (getVertices() == null) |
265 | 273 |
return; |
266 |
Point2D[] vertices = getVertices();
|
|
274 |
List vertices = getVertices();
|
|
267 | 275 |
double[] lwPolylineExt = getNormal(); |
268 | 276 |
// Normals and Extrusions aren`t the same |
269 | 277 |
if (lwPolylineExt[0]==0 && lwPolylineExt[1]==0 && lwPolylineExt[2]==0) |
270 | 278 |
lwPolylineExt[2] = 1.0; |
271 | 279 |
|
272 | 280 |
double elev = getElevation(); |
273 |
double[][] lwPolylinePoints3D = new double[vertices.length][3]; |
|
274 |
for (int j=0;j<vertices.length;j++) { |
|
275 |
lwPolylinePoints3D[j][0] = vertices[j].getX(); |
|
276 |
lwPolylinePoints3D[j][1] = vertices[j].getY(); |
|
277 |
lwPolylinePoints3D[j][2] = elev; |
|
278 |
lwPolylinePoints3D[j] = AcadExtrusionCalculator.extrude2(lwPolylinePoints3D[j], lwPolylineExt); |
|
281 |
List lwPolylinePoints3D = new ArrayList(); |
|
282 |
for (int j=0;j<vertices.size();j++) { |
|
283 |
double[] point = new double[3]; |
|
284 |
point[0] = ((double[])vertices.get(j))[0]; |
|
285 |
point[1] = ((double[])vertices.get(j))[1]; |
|
286 |
point[2] = elev; |
|
287 |
lwPolylinePoints3D.add(AcadExtrusionCalculator. |
|
288 |
extrude2(point, lwPolylineExt)); |
|
279 | 289 |
} |
280 | 290 |
setElevation(elev); |
281 |
for (int j=0;j<vertices.length;j++) { |
|
282 |
vertices[j] = new Point2D.Double(lwPolylinePoints3D[j][0], lwPolylinePoints3D[j][1]); |
|
291 |
List newVertices = new ArrayList(); |
|
292 |
for (int j=0;j<vertices.size();j++) { |
|
293 |
double[] point = (double[]) lwPolylinePoints3D.get(j); |
|
294 |
newVertices.add(new double[]{point[0], point[1]}); |
|
283 | 295 |
} |
284 |
setVertices(vertices);
|
|
296 |
setVertices(newVertices);
|
|
285 | 297 |
} |
286 | 298 |
/* (non-Javadoc) |
287 | 299 |
* @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData() |
... | ... | |
294 | 306 |
} |
295 | 307 |
public FShape toFMapGeometry(boolean is3DFile) { |
296 | 308 |
FPolyline2D lwpline = null; |
297 |
Point2D[] pts = getVertices();
|
|
309 |
List pts = getVertices();
|
|
298 | 310 |
double elev = getElevation(); |
299 |
if (pts != null) { |
|
311 |
if (pts != null && pts.size() > 0) {
|
|
300 | 312 |
|
301 | 313 |
if (is3DFile) { |
302 |
double[][] pline3D = new double[pts.length][3]; |
|
303 |
for (int j = 0; j < pts.length; j++) { |
|
304 |
pline3D[j][0] = pts[j].getX(); |
|
305 |
pline3D[j][1] = pts[j].getY(); |
|
306 |
pline3D[j][2] = elev; |
|
314 |
List pline3D = new ArrayList(); |
|
315 |
for (int j = 0; j < pts.size(); j++) { |
|
316 |
double[] pt = new double[3]; |
|
317 |
pt[0] = ((double[])pts.get(j))[0]; |
|
318 |
pt[1] = ((double[])pts.get(j))[1]; |
|
319 |
pt[2] = elev; |
|
320 |
pline3D.add(pt); |
|
307 | 321 |
} |
308 | 322 |
lwpline = FMapUtil.points3DToFPolyline3D(pline3D); |
309 | 323 |
} else { |
... | ... | |
330 | 344 |
List dwgObjectsWithoutBlocks, |
331 | 345 |
Map handleObjWithoutBlocks, DwgFile callBack) { |
332 | 346 |
DwgLwPolyline transformedEntity = null; |
333 |
Point2D[] vertices = this.getVertices();
|
|
347 |
List vertices = this.getVertices();
|
|
334 | 348 |
if (vertices!=null) { |
335 |
Point2D[] transformedVertices = new Point2D[vertices.length]; |
|
336 |
for (int i=0;i<vertices.length;i++) { |
|
337 |
Point2D pointAux = new Point2D.Double(vertices[i].getX() - bPoint[0], vertices[i].getY() - bPoint[1]); |
|
338 |
double laX = insPoint.getX() + ((pointAux.getX()*scale[0])*Math.cos(rot) + (pointAux.getY()*scale[1])*(-1)*Math.sin(rot)); |
|
339 |
double laY = insPoint.getY() + ((pointAux.getX()*scale[0])*Math.sin(rot) + (pointAux.getY()*scale[1])*Math.cos(rot)); |
|
340 |
transformedVertices[i] = new Point2D.Double(laX, laY); |
|
349 |
List transformedVertices = new ArrayList(); |
|
350 |
for (int i=0; i< vertices.size(); i++) { |
|
351 |
double[] point = (double[]) vertices.get(i); |
|
352 |
double[] pointAux = new double[]{point[0] - bPoint[0], |
|
353 |
point[1] - bPoint[1]}; |
|
354 |
double laX = insPoint.getX() + ((pointAux[0]*scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot)); |
|
355 |
double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot)); |
|
356 |
transformedVertices.add(new double[]{laX, laY}); |
|
341 | 357 |
} |
342 | 358 |
transformedEntity = (DwgLwPolyline)this.clone(); |
343 | 359 |
transformedEntity.setVertices(transformedVertices); |
... | ... | |
369 | 385 |
myObj.setWidths(widths); |
370 | 386 |
|
371 | 387 |
} |
388 |
public void addVertex(IDwgVertex vertex) { |
|
389 |
vertices.add(vertex.getPoint()); |
|
390 |
|
|
391 |
} |
|
372 | 392 |
|
373 | 393 |
} |
Also available in: Unified diff