Revision 23099 branches/v10/libraries/libDwg/src/com/iver/cit/jdwglib/dwg/objects/DwgPolyline3D.java

View differences:

DwgPolyline3D.java
1 1
/* jdwglib. Java Library for reading Dwg files.
2
 * 
2
 *
3 3
 * Author: Jose Morell Rama (jose.morell@gmail.com).
4 4
 * Port from the Pythoncad Dwg library by Art Haas.
5 5
 *
......
22 22
 * For more information, contact:
23 23
 *
24 24
 * Jose Morell (jose.morell@gmail.com)
25
 * 
25
 *
26 26
 * or
27 27
 *
28 28
 * IVER TI S.A.
......
38 38
import java.util.ArrayList;
39 39
import java.util.List;
40 40
import java.util.Map;
41
import java.util.Vector;
41
import org.apache.log4j.Logger;
42 42

  
43 43
import com.iver.cit.gvsig.fmap.core.FPolyline2D;
44 44
import com.iver.cit.gvsig.fmap.core.IGeometry;
......
55 55

  
56 56
/**
57 57
 * The DwgPolyline3D class represents a DWG Polyline3D
58
 * 
58
 *
59 59
 * @author jmorell
60 60
 */
61
public class DwgPolyline3D extends DwgObject 
61
public class DwgPolyline3D extends DwgObject
62 62
	implements IDwgPolyline, IDwg3DTestable, IDwg2FMap, IDwgBlockMember{
63
	
63

  
64 64
	private int splineFlags;
65 65
	private int closedFlags;
66 66
	private DwgHandleReference firstVertexHandle = null;
67 67
	private DwgHandleReference lastVertexHandle = null;
68 68
	private DwgHandleReference seqendHandle = null;
69
	private Vector vertexHandles = null;
69
	private ArrayList vertexHandles;
70 70
	private List vertices;
71 71
	private double[] bulges;
72
	
72

  
73
	private static Logger logger = Logger.getLogger(DwgPolyline3D.class.getName());
74

  
73 75
	public DwgPolyline3D(int index) {
74 76
		super(index);
75 77
		vertices = new ArrayList();
78
		vertexHandles = new ArrayList();
76 79
	}
77
	
78
	public void setVertexHandles(Vector Handles){
79
		this.vertexHandles = Handles;
80
	}
81
	
82
	public Vector getVertexHandles(){
83
		return this.vertexHandles;
84
	}
85
	
86
	
87
	
80

  
81

  
88 82
	/**
89 83
	 * @return Returns the closedFlags.
90 84
	 */
......
170 164
	public void setSplineFlags(int splineFlags) {
171 165
		this.splineFlags = splineFlags;
172 166
	}
173
	
167

  
174 168
	public void calculateGisModel(DwgFile dwgFile){
175
		DwgHandleReference firstHandle = null;
176
		DwgHandleReference lastHandle = null;
169
		ArrayList pts = new ArrayList();
170
		double[] pt = new double[3];
177 171

  
178 172
		int closedFlags = getClosedFlags();
179 173
		if(dwgFile.getDwgVersion().equalsIgnoreCase("Autocad R2004, R2005, R2006")){
180
			Vector Vertices = getVertexHandles();
181
			firstHandle = (DwgHandleReference)Vertices.firstElement();
182
			lastHandle =(DwgHandleReference)Vertices.lastElement();		
183
		}
184
		else {
185
			firstHandle = getFirstVertexHandle();
186
			lastHandle = getLastVertexHandle();
187
		}
188
		ArrayList pts = new ArrayList();
189
		double[] pt = new double[3];
190
		double bulge = 0d;
191
		
192
		DwgObject first = dwgFile.getDwgObjectFromHandle(firstHandle.getOffset());
193
		DwgObject last = dwgFile.getDwgObjectFromHandle(lastHandle.getOffset());
194
		DwgObject seqend = dwgFile.getDwgObjectFromHandle(seqendHandle.getOffset());
195
		if(last == null){
196
			System.out.println("Polyline3D con vertice final a null");
197
			return;
198
		}
199
		if(first == null){
200
			System.out.println("Polyline3D con offset = "+this.getHandle().getOffset() +" con vertice inicial a null");
174
			ArrayList vertexHandles = getVertexHandles();
175
			DwgObject seqend = null;
176
			for (int i=0; i<vertexHandles.size(); i++){
177
				DwgHandleReference vertice = (DwgHandleReference)vertexHandles.get(i);
178
				DwgObject objVertex = dwgFile.getDwgObjectFromHandle(vertice.getOffset());
179
				if (objVertex != null){
180
					if (objVertex instanceof DwgVertex3D) {
181
						pts.add(((DwgVertex3D)objVertex).getPoint());
182
					} else {
183
						logger.warn("Encontrado un "+objVertex.getClass().getName()+" " +
184
								"con indice "+i+" en la lista de vertices de Polyline3D");
185
					}
186
				} else {
187
					logger.warn("No se ha encontrado el vertice "+i+" de "+vertexHandles.size()
188
							+" de la Polyline3D "+this.getIndex());
189
					if (i==0){
190
						seqend = dwgFile.getDwgObjectFromHandle(seqendHandle.getOffset());
191
					}
192
				}
193
			}
201 194
			if(seqend != null){
202
				first = last;
203
				last = seqend;
204
			} else {
205
				System.out.println("Polyline3D con vertice seqend a null");
195
				if (seqend instanceof DwgVertex3D) {
196
					pts.add(((DwgVertex3D)seqend).getPoint());
197
				} else {
198
					logger.warn("Encontrado un "+seqend.getClass().getName()+" en seqend de Polyline3D "+
199
							this.getIndex()+" cuando debería ser un DwgVertex3D");
200
				}
206 201
			}
202

  
203
		} else {
204
			DwgHandleReference firstHandle = getFirstVertexHandle();
205
			DwgHandleReference lastHandle = getLastVertexHandle();
206
			double bulge = 0d;
207

  
208
			DwgObject first = dwgFile.getDwgObjectFromHandle(firstHandle.getOffset());
209
			DwgObject last = dwgFile.getDwgObjectFromHandle(lastHandle.getOffset());
210
			DwgObject seqend = dwgFile.getDwgObjectFromHandle(seqendHandle.getOffset());
211
			if(last == null){
212
				logger.warn("Polyline3D con vertice final a null");
213
				return;
214
			}
215
			if(first == null){
216
				logger.warn("Polyline3D con offset = "+this.getHandle().getOffset() +" con vertice inicial a null");
217
				if(seqend != null){
218
					first = last;
219
					last = seqend;
220
				} else {
221
					logger.warn("Polyline3D con vertice seqend a null");
222
				}
223
			}
224

  
225
			if(!(first instanceof DwgVertex3D)){
226
				logger.warn("El primer vertice de Polyline3D es "+
227
						first.getClass().getName());
228
				return;
229
			}
230

  
231
			if(!(last instanceof DwgVertex3D)){
232
				logger.warn("El ultimo vertice de Polyline3D es "+
233
						last.getClass().getName());
234
				return;
235
			}
236

  
237
			int firstObjIdx = dwgFile.getIndexOf(first);
238
			int lastObjIdx =  dwgFile.getIndexOf(last);
239
			if(firstObjIdx == -1 || lastObjIdx == -1){
240
				logger.warn("Calculate GIS Model: Problemas en la LinkedList: 1º="+firstObjIdx+",Ultimo="+lastObjIdx);
241
				return;
242
			}
243

  
244
			for(int i = firstObjIdx; i <= lastObjIdx; i++){
245
				DwgObject obj = dwgFile.getDwgObject(i);
246
				if(obj instanceof DwgVertex3D){
247
					DwgVertex3D vertex = (DwgVertex3D) obj;
248
					pt = ((DwgVertex3D)vertex).getPoint();
249
					pts.add(new double[]{pt[0], pt[1], pt[2]});
250
				}else if(obj instanceof DwgSeqend){
251
					//TODO En Polyline2D J.Morell no interrumpia el barrido,
252
					//pero aquí Sí. REVISAR
253
					break;
254
				}else{
255
					logger.warn("Encontrado "+obj.getClass().getName()+" en la lista de vertices de Polyline3D");
256
				}
257
			}//for
207 258
		}
208
		
209
		if(!(first instanceof DwgVertex3D)){
210
			System.out.println("El primer vertice de Polyline3D es "+
211
							first.getClass().getName());
212
			return;
213
		}
214
		
215
		if(!(last instanceof DwgVertex3D)){
216
			System.out.println("El ultimo vertice de Polyline3D es "+
217
							last.getClass().getName());
218
			return;
219
		}
220
		
221
		 int firstObjIdx = dwgFile.getIndexOf(first);
222
		 int lastObjIdx =  dwgFile.getIndexOf(last);
223
		 if(firstObjIdx == -1 || lastObjIdx == -1){
224
			 System.out.println("Calculate GIS Model: Problemas en la LinkedList: 1�="+firstObjIdx+",Ultimo="+lastObjIdx);
225
			 return;
226
		 }
227
		 System.out.println("Calculate GIS Model: LinkedList: 1�="+firstObjIdx+",Ultimo="+lastObjIdx);
228
		 
229
		 
230
//		 pt = ((DwgVertex2D)first).getPoint();
231
//		 pts.add(new Point2D.Double(pt[0], pt[1]));
232
//		 double bulge = ((DwgVertex2D)first).getBulge();
233
//		 bulges.add(new Double(bulge));
234
		 
235
		 for(int i = firstObjIdx; i <= lastObjIdx; i++){
236
			 DwgObject obj = dwgFile.getDwgObject(i);
237
			 if(obj instanceof DwgVertex3D){
238
			 	DwgVertex3D vertex = (DwgVertex3D) obj;
239
			 	pt = ((DwgVertex3D)vertex).getPoint();
240
				pts.add(new double[]{pt[0], pt[1], pt[2]});
241
			 }else if(obj instanceof DwgSeqend){
242
			 	//TODO En Polyline2D J.Morell no interrumpia el barrido,
243
			 	//pero aqu� S�. REVISAR
244
			 	break;
245
			 }else{
246
			 	System.out.println("Encontrado "+obj.getClass().getName()+" en la lista de vertices de Polyline3D");
247
			 }
248
		 }//for
249
		 
250
		 if (pts.size()>0) {
259
		if (pts.size()>0) {
251 260
			List newPts = new ArrayList();
252 261
			for (int j=0;j<pts.size();j++) {
253 262
				newPts.add(pts.get(j));
254 263
			}
255 264
			if ((closedFlags & 0x1)== 0x1) {
256
				
265

  
257 266
				newPts.add(pts.get(0));
258
			} 
267
			}
259 268
			setPts(newPts);
260 269
		} else {
261
			System.out.println("Encontrada polil�nea sin puntos ...");
262
			// TODO: No se debe mandar nunca una polilnea sin puntos, si esto
270
			logger.warn("Encontrada polilínea sin puntos ...");
271
			// TODO: No se debe mandar nunca una polilínea sin puntos, si esto
263 272
			// ocurre es porque existe un error que hay que corregir ...
264 273
		}
265
		
274

  
266 275
	}
267
	
268
	//TODO Metodo antiguo y muy ineficiente. Se deja hasta que se 
276

  
277
	//TODO Metodo antiguo y muy ineficiente. Se deja hasta que se
269 278
	//revise que funciona el nuevo perfectamente
270 279
	public void calculateGisModel(List dwgObjects) {
271 280
		int closedFlags = getClosedFlags();
272
		
281

  
273 282
//		En estas dos lineas de abajo y en el resto del metodo
274 283
//		se mantiene el mecanismo anterior al refactoring.
275 284
//		TODO: Pensar si deberiamos coger el handle completo.
276 285
//		Tal vez deberiamos tomar el handle completo y evaluar
277 286
//		a donde apuntan (pueden haber 2 handles con codigo y offset
278 287
//		distintos y que, sin embargo apunten al mismo objeto).
279
		
288

  
280 289
		int firstHandle = getFirstVertexHandle().getOffset();
281 290
		int lastHandle = getLastVertexHandle().getOffset();
282 291
		ArrayList pts = new ArrayList();
283 292
		double[] pt = new double[3];
284
		
293

  
285 294
		//TODO Sustituir esto por un hashtable handle->DwgObject
286 295
		for (int j=0;j< dwgObjects.size();j++) {
287 296
			DwgObject firstVertex = (DwgObject)dwgObjects.get(j);
......
305 314
					}//while
306 315
				}//if
307 316
			}//if
308
		}//for 
309
		
317
		}//for
318

  
310 319
		if (pts.size()>0) {
311 320
			List newPts = new ArrayList();
312 321
			for (int j=0;j<pts.size();j++) {
......
317 326
			}
318 327
			setPts(newPts);
319 328
		} else {
320
//			System.out.println("Encontrada polilnea sin puntos ...");
321
			// TODO: No se debe mandar nunca una polilnea sin puntos, si esto
329
//			System.out.println("Encontrada polilinea sin puntos ...");
330
			// TODO: No se debe mandar nunca una polilinea sin puntos, si esto
322 331
			// ocurre es porque existe un error que hay que corregir ...
323 332
		}
324 333
	}
......
326 335
	 * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#has3DData()
327 336
	 */
328 337
	public boolean has3DData() {
329
		
338

  
330 339
		List pts = getPts();
331 340
		if(pts == null)
332 341
			return false;
333 342
		double z = 0d;
334 343
	    for (int j = 0; j<pts.size(); j++) {
335 344
	        z = ((double[])pts.get(j))[2];
336
			if (z != 0.0) 
345
			if (z != 0.0)
337 346
				return true;
338 347
	    }
339 348
	    return false;
340
	   
349

  
341 350
	}
342 351
	/* (non-Javadoc)
343 352
	 * @see com.iver.cit.jdwglib.dwg.IDwg3DTestable#getZ()
......
381 390
			return  ShapeFactory.createGeometry(pline);
382 391
		}//if
383 392
		return null;
384
		
393

  
385 394
	}
386 395
	/* (non-Javadoc)
387 396
	 * @see com.iver.cit.jdwglib.dwg.IDwg2FMap#toFMapString(boolean)
......
392 401
		else
393 402
			return "FPolyline2D";
394 403
	}
395
	
404

  
396 405
	public String toString(){
397 406
		return "Polyline3D";
398 407
	}
......
404 413
		this.fill(obj);
405 414
		return obj;
406 415
	}
407
	
416

  
408 417
	protected void fill(DwgObject obj){
409 418
		super.fill(obj);
410 419
		DwgPolyline3D myObj = (DwgPolyline3D)obj;
......
420 429
	public void addVertex(IDwgVertex vertex) {
421 430
		vertices.add(vertex.getPoint());
422 431
	}
423
	
424
	//TODO Por qu� Polyline3D no ten�a implementado el transform2Block???
425
	public void transform2Block(double[] bPoint, Point2D insPoint, 
426
			double[] scale, double rot, 
427
			List dwgObjectsWithoutBlocks, 
432

  
433
	//TODO Por qué Polyline3D no tenía implementado el transform2Block???
434
	public void transform2Block(double[] bPoint, Point2D insPoint,
435
			double[] scale, double rot,
436
			List dwgObjectsWithoutBlocks,
428 437
			Map handleObjWithoutBlocks, DwgFile callBack) {
429
		
438

  
430 439
		DwgPolyline3D transformedEntity = null;
431 440
		List vertices = this.getPts();
432
		
441

  
433 442
		if (vertices != null) {
434 443
		    List transformedVertices = new ArrayList();
435 444
			for (int i=0;i < vertices.size();i++) {
436 445
				double[] pointAux = null;
437 446
			    pointAux = new double[]{((double[]) vertices.get(i))[0] - bPoint[0],
438 447
			    		((double[]) vertices.get(i))[1] - bPoint[1]};
439
			    
448

  
440 449
				double laX = insPoint.getX() + ((pointAux[0] * scale[0])*Math.cos(rot) + (pointAux[1]*scale[1])*(-1)*Math.sin(rot));
441 450
				double laY = insPoint.getY() + ((pointAux[0]*scale[0])*Math.sin(rot) + (pointAux[1]*scale[1])*Math.cos(rot));
442 451
				double laZ = ((double[]) vertices.get(i))[2] - bPoint[2];
......
449 458
		}
450 459
	}
451 460

  
461
	/**
462
	 * @param Handles The vertexHandles to set.
463
	 */
464
	public void setVertexHandles(ArrayList Handles){
465
		this.vertexHandles = Handles;
466
	}
467

  
468
	/**
469
	 * @return Returns the vertexHandles.
470
	 */
471
	public ArrayList getVertexHandles(){
472
		return this.vertexHandles;
473
	}
474
	/**
475
	 * @param Handle The vertexHandles to add.
476
	 */
477
	public void addVertexHandle(DwgHandleReference handle){
478
		this.vertexHandles.add(handle);
479
	}
480

  
481

  
482

  
452 483
}

Also available in: Unified diff