Revision 5878 trunk/libraries/libFMap/src/com/iver/cit/gvsig/fmap/core/FGeometryCollection.java

View differences:

FGeometryCollection.java
49 49
import java.awt.geom.Rectangle2D;
50 50
import java.io.IOException;
51 51
import java.util.ArrayList;
52
import java.util.Comparator;
53
import java.util.TreeMap;
52 54

  
53 55
import org.cresques.cts.ICoordTrans;
54 56
import org.geotools.data.postgis.attributeio.WKBEncoder;
......
69 71
 */
70 72
public class FGeometryCollection implements IGeometry {
71 73
	private ArrayList geometries = new ArrayList();
72

  
74
	private int type=FShape.LINE;
73 75
	/**
74 76
	 * Crea un nuevo FGeometryCollection.
75 77
	 *
......
120 122
	 */
121 123
	public boolean intersects(Rectangle2D r) {
122 124
	    boolean resul = false;
123
		for (int i = 0; i < geometries.size(); i++)
124
		{
125
			resul = ((IGeometry)geometries.get(i)).intersects(r);
126
			if (resul) break;
125
		if (type==FShape.LINE) {
126
	    	for (int i = 0; i < geometries.size(); i++){
127
				resul = ((IGeometry)geometries.get(i)).intersects(r);
128
				if (resul) break;
129
			}
130
		}else if (type==FShape.POLYGON) {
131
			GeneralPathX gpx=new GeneralPathX();
132
			Handler lastHandler=null;
133
			for (int i = 0; i < geometries.size(); i++) {
134
				IGeometry geom=(IGeometry)geometries.get(i);
135
				GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null);
136
				Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER);
137
				if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) {
138
					gpx.append(gpxi,true);
139
				}else {
140
					gpx.append(gpxi,false);
141
				}
142
				lastHandler=handlers[handlers.length-1];
143
			}
144
			resul=ShapeFactory.createPolygon2D(gpx).intersects(r);
127 145
		}
128

  
129 146
		return resul;
130 147
	}
131 148

  
......
156 173

  
157 174
		return ret;
158 175
		*/
159
		return FShape.LINE;
176
		return type;
160 177
	}
161

  
178
	public void setGeometryType(int type) {
179
		this.type=type;
180
	}
162 181
	/* (non-Javadoc)
163 182
	 * @see com.iver.cit.gvsig.fmap.core.IGeometry#draw(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.core.v02.FSymbol)
164 183
	 */
165 184
	public void draw(Graphics2D g, ViewPort vp, FSymbol symbol) {
166
		for (int i = 0; i < geometries.size(); i++)
167
			((IGeometry)geometries.get(i)).draw(g, vp, symbol);
185
		if (type==FShape.LINE) {
186
			for (int i = 0; i < geometries.size(); i++)
187
				((IGeometry)geometries.get(i)).draw(g, vp, symbol);
188
		}else if (type==FShape.POLYGON) {
189
			//GeneralPathXIterator gpxi=(GeneralPathXIterator)getPathIterator(null);
190
			GeneralPathX gpx=new GeneralPathX();
191
			Handler lastHandler=null;
192
			for (int i = 0; i < geometries.size(); i++) {
193
				IGeometry geom=(IGeometry)geometries.get(i);
194
				GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null);
195
				Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER);
196
				if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) {
197
					gpx.append(gpxi,true);
198
				}else {
199
					gpx.append(gpxi,false);
200
				}
201
				lastHandler=handlers[handlers.length-1];
202
			}
203
			ShapeFactory.createPolygon2D(gpx).draw(g,vp,symbol);
204
		}
168 205
	}
169 206

  
170 207
	/* (non-Javadoc)
......
175 212

  
176 213
		for (int i = 0; i < geometries.size(); i++)
177 214
			newGeometries[i] = ((IGeometry)geometries.get(i)).cloneGeometry();
178

  
179
		return new FGeometryCollection(newGeometries);
215
		FGeometryCollection gc=new FGeometryCollection(newGeometries);
216
		gc.type=type;
217
		return gc;
180 218
	}
181 219

  
182 220
	/* (non-Javadoc)
......
189 227
            theGeoms[i] = ((IGeometry)geometries.get(i)).toJTSGeometry();
190 228
        }
191 229
        GeometryCollection geomCol = new GeometryFactory().createGeometryCollection(theGeoms);
192
        
193
        
230

  
231

  
194 232
		return geomCol;
195 233
	}
196 234

  
......
285 323
     * @see com.iver.cit.gvsig.fmap.core.IGeometry#drawInts(java.awt.Graphics2D, com.iver.cit.gvsig.fmap.ViewPort, com.iver.cit.gvsig.fmap.core.v02.FSymbol)
286 324
     */
287 325
    public void drawInts(Graphics2D g, ViewPort vp, FSymbol symbol) {
288
        for (int i = 0; i < geometries.size(); i++)
289
            ((IGeometry)geometries.get(i)).drawInts(g, vp, symbol);
326
    	if (type==FShape.LINE) {
327
			for (int i = 0; i < geometries.size(); i++)
328
				((IGeometry)geometries.get(i)).drawInts(g, vp, symbol);
329
    	}else if (type==FShape.POLYGON) {
330
			//GeneralPathXIterator gpxi=(GeneralPathXIterator)getPathIterator(null);
331
			GeneralPathX gpx=new GeneralPathX();
332
			Handler lastHandler=null;
333
			for (int i = 0; i < geometries.size(); i++) {
334
				IGeometry geom=(IGeometry)geometries.get(i);
335
				GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null);
336
				Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER);
337
				if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) {
338
					gpx.append(gpxi,true);
339
				}else {
340
					gpx.append(gpxi,false);
341
				}
342
				lastHandler=handlers[handlers.length-1];
343
			}
344
			IGeometry geom=ShapeFactory.createPolygon2D(gpx);
345
			geom.setGeometryType(type);
346
			geom.drawInts(g,vp,symbol);
347
		}
290 348

  
291 349
    }
292 350

  
......
315 373
		for (int i = 0; i < geometries.size(); i++){
316 374
			Handler[] handAux=((IGeometry)geometries.get(i)).getHandlers(type);
317 375
			for (int j=0;j<handAux.length;j++){
318
				handlers.add(handAux[j]);
376
				if (!handlers.contains(handAux[j]))
377
					handlers.add(handAux[j]);
319 378
			}
320 379
		}
321 380
		return (Handler[])handlers.toArray(new Handler[0]);
......
363 422
	}
364 423

  
365 424
	public boolean intersects(double x, double y, double w, double h) {
366
		boolean bRes;
367
		for (int i=0; i < geometries.size(); i++)
368
		{
369
			IGeometry gAux = (IGeometry) geometries.get(i);
370
			bRes = gAux.intersects(x,y, w, h);
371
			if (bRes) return bRes;
425
		boolean resul = false;
426
		if (type==FShape.LINE) {
427
			for (int i=0; i < geometries.size(); i++){
428
				IGeometry gAux = (IGeometry) geometries.get(i);
429
				resul= gAux.intersects(x,y, w, h);
430
				if (resul) break;
431
			}
432
		}else if (type==FShape.POLYGON) {
433
			GeneralPathX gpx=new GeneralPathX();
434
			Handler lastHandler=null;
435
			for (int i = 0; i < geometries.size(); i++) {
436
				IGeometry geom=(IGeometry)geometries.get(i);
437
				GeneralPathXIterator gpxi=(GeneralPathXIterator)geom.getPathIterator(null);
438
				Handler[] handlers=geom.getHandlers(IGeometry.SELECTHANDLER);
439
				if (lastHandler==null || handlers[0].getPoint().distance(lastHandler.getPoint())==0) {
440
					gpx.append(gpxi,true);
441
				}else {
442
					gpx.append(gpxi,false);
443
				}
444
				lastHandler=handlers[handlers.length-1];
445
			}
446
			IGeometry geom=ShapeFactory.createPolygon2D(gpx);
447
			geom.setGeometryType(FShape.POLYGON);
448
			resul=geom.intersects(x,y,w,h);
372 449
		}
373

  
374
		return false;
450
		return resul;
375 451
	}
376 452

  
377 453
	public Rectangle getBounds() {
......
413 489
	public Shape getInternalShape() {
414 490
		return this;
415 491
	}
492

  
493
	public int getOriginalGeometryType() {
494
		return type;
495
	}
496

  
497
	public boolean isClosed() {
498
		GeneralPathX gpx=new GeneralPathX();
499
		PathIterator pi=getPathIterator(null);
500
		gpx.append(pi,true);
501
		return gpx.isClosed();
502
	}
416 503
}

Also available in: Unified diff