Revision 3102 trunk/extensions/extGeoreferencing/src/com/iver/cit/gvsig/fmap/layers/FLyrPoints.java

View differences:

FLyrPoints.java
41 41
package com.iver.cit.gvsig.fmap.layers;
42 42

  
43 43
import java.awt.Color;
44
import java.awt.Dimension;
44 45
import java.awt.Graphics2D;
45 46
import java.awt.geom.Point2D;
46 47
import java.awt.geom.Rectangle2D;
......
71 72
 */
72 73
public class FLyrPoints extends FLyrDefault {
73 74
	
75
	/**
76
	 * Punto de la capa que representa una coordenada en pixeles de la imagen a
77
	 * georreferenciar, una coordenada de la vista, el viewPort de las mini imagenes
78
	 * ,el centro de estas y el flag activo que dice si el punto tiene que ser tomado en 
79
	 * cuenta o no. 
80
	 * @author Nacho Brodin (brodin_ign@gva.es)
81
	 *
82
	 */
74 83
	public class GeoPoint{
75 84
		public Point2D pixelPoint = null;
76 85
		public Point2D mapPoint = null;
77 86
		public ViewPort leftViewPort =  null, rightViewPort = null;
78 87
		public Point2D  leftCenterPoint = null, rightCenterPoint = null;
88
		public boolean active = true;
79 89
		public GeoPoint(Point2D p, Point2D m){
80 90
			this.pixelPoint = p;
81 91
			this.mapPoint = m;
82 92
		}
93
		
94
		/**
95
		 * Hace una copia de la instancia del punto.
96
		 * @return GeoPoint
97
		 */
98
		public GeoPoint cloneGeoPoint(){
99
			Point2D pixel = null;
100
			Point2D map = null;
101
			if(pixelPoint != null)
102
				pixel = (Point2D)pixelPoint.clone();
103
			if(mapPoint != null)
104
				map = (Point2D)mapPoint.clone();
105
			
106
			GeoPoint gp = new GeoPoint(pixel, map);
107
			
108
			if(leftViewPort != null){
109
				gp.leftViewPort = new ViewPort(leftViewPort.getProjection());
110
				gp.leftViewPort.setExtent((Rectangle2D)leftViewPort.getExtent().clone());
111
				gp.leftViewPort.setImageSize((Dimension)leftViewPort.getImageSize().clone());
112
				gp.leftViewPort.setScale();
113
			}
114
			
115
			if(rightViewPort != null){
116
				gp.rightViewPort = new ViewPort(rightViewPort.getProjection());
117
				gp.rightViewPort.setExtent((Rectangle2D)rightViewPort.getExtent().clone());
118
				gp.rightViewPort.setImageSize((Dimension)rightViewPort.getImageSize().clone());
119
				gp.rightViewPort.setScale();
120
			}
121
		
122
			if(leftCenterPoint != null)
123
				gp.leftCenterPoint = (Point2D)this.leftCenterPoint.clone();
124
			if(rightCenterPoint != null)
125
				gp.rightCenterPoint = (Point2D)this.rightCenterPoint.clone();
126
			gp.active = this.active;
127
			return gp;
128
		}
83 129

  
84 130
	}
85 131
	
132
	/**
133
	 * Estado de la capa de puntos. 
134
	 * @author Nacho Brodin (brodin_ign@gva.es)
135
	 *
136
	 */
137
	public class FLyrPointsState{
138
		public ArrayList pointList = new ArrayList();
139
		public boolean showNumber = true;
140
		public String lastTool = "zoomIn";
141
	}
142
	
86 143
	private ArrayList pointList = new ArrayList();
87 144
	private final int DIAM_CIRCLE = 18;
88
	private String lastTool = null;
145
	private String lastTool = "zoomIn";
146
	private boolean showNumber = true;
147
	private FLyrPointsState state = null;
89 148
	
90 149
	/**
91 150
	 * Obtiene el array de puntos
......
96 155
	}
97 156
	
98 157
	/**
158
	 * Salva el estado actual de la capa de puntos. Podr? ser recuperado
159
	 * este ?ltimo estado salvado con la funci?n recoveryState
160
	 *
161
	 */
162
	public void saveState(){
163
		if(state == null)
164
			state = new FLyrPointsState();
165
		else
166
			state.pointList.clear();
167

  
168
		for(int i=0;i<pointList.size();i++)
169
			state.pointList.add(((GeoPoint)pointList.get(i)).cloneGeoPoint());
170
		
171
		state.showNumber = showNumber;
172
		state.lastTool = lastTool;
173
	}
174
	
175
	/**
176
	 * Recupera el estado de la capa de puntos desde la ?ltima vez que se
177
	 * ejecut? la funci?n saveState. Si no hay ning?n estdo salvado es que
178
	 * al principio estaba la capa vacia por lo que reiniciamos la capa de puntos.
179
	 */
180
	public void recoveryState(){
181
		if(state != null){
182
			pointList.clear();
183
			for(int i=0;i<state.pointList.size();i++)
184
				pointList.add(((GeoPoint)state.pointList.get(i)).cloneGeoPoint());
185
			
186
			showNumber = state.showNumber;
187
			lastTool = state.lastTool;
188
		}else{
189
			pointList = new ArrayList();
190
			showNumber = true;
191
			lastTool = "zoomIn";
192
			state = null;
193
		}
194
	}
195
	
196
	/**
99 197
	 * Asigna el array de puntos 
100 198
	 * @param list
101 199
	 */
......
109 207
	 */
110 208
	public void draw(BufferedImage image, Graphics2D g, ViewPort vp,
111 209
			Cancellable cancel,double scale) throws DriverException {
210
		
112 211
		View theView = (View) PluginServices.getMDIManager().getActiveView();
113 212
		//BufferedImage img = theView.getMapControl().getImage();
114 213
		//g.drawImage(img, 0, 0, null);
......
132 231
				//Punto de la imagen
133 232
				pto = ((GeoPoint)pointList.get(i)).pixelPoint;
134 233
				
135
				if(pto != null){
136
					Point2D p = lyrGeoRaster.img2World(pto);
137
					p = vp.fromMapPoint(p);
138
					drawPixelCrux(g, p);
234
				if(((GeoPoint)pointList.get(i)).active){
235
					if(pto != null){
236
						Point2D p = lyrGeoRaster.img2World(pto);
237
						p = vp.fromMapPoint(p);
238
						drawPixelCrux(g, p, i);
239
						
240
					}
139 241
					
242
					//Punto de la vista
243
					pto = ((GeoPoint)pointList.get(i)).mapPoint;
244
					if(pto != null){
245
						Point2D p = vp.fromMapPoint(pto);
246
						drawMapCrux(g, p, i);
247
					}
140 248
				}
141
				
142
				//Punto de la vista
143
				pto = ((GeoPoint)pointList.get(i)).mapPoint;
144
				if(pto != null){
145
					Point2D p = vp.fromMapPoint(pto);
146
					drawMapCrux(g, p);
147
				}
148 249
			}
149 250
		} 
150 251
	}
......
154 255
	 * el pixel de la imagen.
155 256
	 * @param g Graphics
156 257
	 */
157
	private void drawPixelCrux(Graphics2D g, Point2D p){
258
	private void drawPixelCrux(Graphics2D g, Point2D p, int pointNumber){
158 259
		int dpto = (DIAM_CIRCLE >> 1);
159 260
		int incr = 5;
160 261
		g.setColor(Color.WHITE);
......
162 263
					(int)p.getY() - dpto + 1, 
163 264
					DIAM_CIRCLE - 2, 
164 265
					DIAM_CIRCLE - 2);
266
		g.drawLine((int)p.getX() - incr, (int)p.getY() - 1, (int)p.getX() - 1, (int)p.getY() - 1);
267
		g.drawLine((int)p.getX() - incr, (int)p.getY() + 1, (int)p.getX() - 1, (int)p.getY() + 1);
268
		
269
		g.drawLine((int)p.getX() + incr, (int)p.getY() - 1, (int)p.getX() + 1, (int)p.getY() - 1);
270
		g.drawLine((int)p.getX() + incr, (int)p.getY() + 1, (int)p.getX() + 1, (int)p.getY() + 1);
271
		
272
		g.drawLine((int)p.getX() - 1, (int)p.getY() - incr, (int)p.getX() - 1, (int)p.getY() - 1);
273
		g.drawLine((int)p.getX() + 1, (int)p.getY() - incr, (int)p.getX() + 1, (int)p.getY() - 1);
274
		
275
		g.drawLine((int)p.getX() - 1, (int)p.getY() + incr, (int)p.getX() - 1, (int)p.getY() + 1);
276
		g.drawLine((int)p.getX() + 1, (int)p.getY() + incr, (int)p.getX() + 1, (int)p.getY() + 1);
277
		
165 278
		g.setColor(Color.red);
166 279
		g.drawOval(	(int)p.getX() - dpto, 
167 280
					(int)p.getY() - dpto, 
168 281
					DIAM_CIRCLE, 
169 282
					DIAM_CIRCLE);
170
		g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto , (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto + DIAM_CIRCLE);
171
		g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto + DIAM_CIRCLE, (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto);
172
		//g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto + 3, (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto + DIAM_CIRCLE - 3);
173
		//g.drawLine((int)p.getX() - dpto + 3, (int)p.getY() - dpto + DIAM_CIRCLE, (int)p.getX() - dpto + DIAM_CIRCLE - 3, (int)p.getY() - dpto);
283
		g.drawLine((int)p.getX(), (int)p.getY() - dpto - incr, (int)p.getX(), (int)p.getY() + dpto + incr);
284
		g.drawLine((int)p.getX() - dpto - incr, (int)p.getY(), (int)p.getX() + dpto + incr, (int)p.getY());
285
		//g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto , (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto + DIAM_CIRCLE);
286
		//g.drawLine((int)p.getX() - dpto, (int)p.getY() - dpto + DIAM_CIRCLE, (int)p.getX() - dpto + DIAM_CIRCLE, (int)p.getY() - dpto);
287
		
288
		if(showNumber){
289
			g.setColor(Color.WHITE);
290
			g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 4), (int)(p.getY() - dpto - 4) );
291
			g.setColor(Color.red);
292
			g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 1), (int)(p.getY() - dpto - 1) );
293
		}
174 294
	}
175 295
	
176 296
	/**
......
178 298
	 * la coordenada de la vista.
179 299
	 * @param g Graphics
180 300
	 */
181
	private void drawMapCrux(Graphics2D g, Point2D p){
301
	private void drawMapCrux(Graphics2D g, Point2D p, int pointNumber){
182 302
		int dpto = (DIAM_CIRCLE >> 1);
183 303
		int incr = 5;
184 304
		g.setColor(Color.WHITE);
......
205 325
					DIAM_CIRCLE);
206 326
		g.drawLine((int)p.getX(), (int)p.getY() - dpto - incr, (int)p.getX(), (int)p.getY() + dpto + incr);
207 327
		g.drawLine((int)p.getX() - dpto - incr, (int)p.getY(), (int)p.getX() + dpto + incr, (int)p.getY());
328
		if(showNumber){
329
			g.setColor(Color.WHITE);
330
			g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 4), (int)(p.getY() - dpto - 4) );
331
			g.setColor(new Color(45, 8 , 165));
332
			g.drawString(String.valueOf(pointNumber + 1), (int)(p.getX() + dpto + 1), (int)(p.getY() - dpto - 1) );
333
		}
208 334
	}
209 335
	
210 336
	/* (non-Javadoc)
......
302 428
		else 
303 429
			return 0;
304 430
	}
305
		
431
	
306 432
	/**
433
	 * Activa o desactiva el punto de una posici?n de la lista
434
	 * @param n	N?mero de punto
435
	 * @param active	true activo, false desactivo
436
	 */
437
	public void setPointActive(int n, boolean active){
438
		if(n < 0 || n >= this.length())
439
			return;
440
		((GeoPoint)pointList.get(n)).active = active;
441
	}
442
	
443
	/**
444
	 * Dice si un punto de la lista est? activo o no
445
	 * @param n	Posici?n del punto 
446
	 * @return	true si est? activo y false si no lo est?.
447
	 */
448
	public boolean isPointActive(int n){
449
		if(n < 0 || n >= this.length())
450
			return false;
451
		return ((GeoPoint)pointList.get(n)).active;
452
	}
453
	
454
	/**
307 455
	 * Obtiene el extent de la capa
308 456
	 * @return extent en Rectangle2D.
309 457
	 */
......
389 537
	 * @param panel donde se carga la informaci?n
390 538
	 */
391 539
	public void loadVisualPoint(int pos, GeoreferencingDialog dialog){
392
		GeoPoint pto = this.getPoint(pos);
540
		GeoPoint pto = null;
541
		try{
542
			pto = this.getPoint(pos);
543
		}catch(ArrayIndexOutOfBoundsException exc){
544
			//Todavia no hay puntos por lo que no hacemos nada
545
			return;
546
		}
393 547
		DataPointPanel dpp = dialog.getConectorPanel().getDataPointsTabPanel().getSelectPointsPanel().getDataPointPanel();
548
		
549
		//Llenamos los JTextField con los valores del punto
394 550
		if(pto.pixelPoint != null){
395 551
			dpp.getTX().setText(""+pto.pixelPoint.getX());
396 552
			dpp.getTY().setText(""+pto.pixelPoint.getY());
......
400 556
    		dpp.getLongitud().setText(tailDecimal(""+pto.mapPoint.getX()));
401 557
    	}
402 558
    	
559
    	//El Checkbox de activaci?n
560
    	dialog.getOptionsPanel().getCbActivePoint().setSelected(pto.active);
561
    	    	
403 562
    	//Seleccionamos la fila de la tabla
404 563
    	PointTable table = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getJTable();
405
    	table.getTable().setRowSelectionInterval(pos, pos);
564
    	try{
565
    		table.getTable().setRowSelectionInterval(pos, pos);
566
    	}catch(IllegalArgumentException exc){
567
    		System.err.println("Intervalo erroneo "+pos);
568
    	}
406 569
    	
407 570
    	//Cargamos las mini imagenes
408
    	dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setCenterPoint(getCenterPoint(pos, false));
409
    	dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setNewViewPort(getMiniExtent(pos, false));
410
    	dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().draw();
571
    	dialog.getZoomControlLeft().setCenterPoint(getCenterPoint(pos, false));
572
    	dialog.getZoomControlLeft().setNewViewPort(getMiniExtent(pos, false));
573
    	dialog.getZoomControlLeft().draw();
411 574
    	
412
    	dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().setCenterPoint(getCenterPoint(pos, true));
413
    	dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().setNewViewPort(getMiniExtent(pos, true));
414
    	dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().draw();
575
    	dialog.getZoomControlRight().setCenterPoint(getCenterPoint(pos, true));
576
    	dialog.getZoomControlRight().setNewViewPort(getMiniExtent(pos, true));
577
    	dialog.getZoomControlRight().draw();
415 578
	}
416 579
	
417 580
	/**
......
433 596
		agp.getZoomRight().clear();
434 597
		
435 598
		//Actualizamos la vista
436
		View theView = (View) PluginServices.getMDIManager().getActiveView();
437
		theView.getMapControl().getMapContext().invalidate();
599
		View theView = null;
600
		try{
601
			theView = (View) PluginServices.getMDIManager().getActiveView();
602
			theView.getMapControl().getMapContext().invalidate();
603
		}catch(ClassCastException exc){
604
			return;
605
		}
438 606
	}
439 607

  
440 608
	/**
......
446 614
		remove(pos);
447 615
		
448 616
		//Actualiza los controles de tabla y selector
617
		grd.getSelectPointsPanel().getTableControlerPanel().setNItems(this.length());
449 618
		grd.getConectorPanel().getDataPointsTabPanel().
450
			getSelectPointsPanel().getTableControlerPanel().setNItems(this.length());
451
		grd.getConectorPanel().getDataPointsTabPanel().
452 619
			getTablePointsPanel().getTableControlerPanel().setNItems(this.length());
453 620
		
454 621
		//Elimina la fila de la tabla y renumera los puntos
......
461 628
		
462 629
		//Carga los puntos
463 630
		if(pos == 0){
464
			grd.getConectorPanel().getDataPointsTabPanel().getSelectPointsPanel().getTableControlerPanel().setSelectedIndex(pos);
631
			grd.getSelectPointsPanel().getTableControlerPanel().setSelectedIndex(pos);
465 632
			loadVisualPoint(pos, grd);
466 633
		}else{
467 634
			grd.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getTableControlerPanel().setSelectedIndex(pos - 1);
......
469 636
		}
470 637
		
471 638
		//Redibujamos la vista
472
		View theView = (View) PluginServices.getMDIManager().getActiveView();
473
		theView.getMapControl().getMapContext().invalidate();
639
		View theView = null;
640
		try{
641
			theView = (View) PluginServices.getMDIManager().getActiveView();
642
			theView.getMapControl().getMapContext().invalidate();
643
		}catch(ClassCastException exc){
644
			return;
645
		}
474 646
	}
475 647
	
476 648
	/**
......
488 660
				System.out.println("PUNTO "+i+": NULL");
489 661
		}
490 662
	}
663

  
664
	/**
665
	 * @return Returns the showNumber.
666
	 */
667
	public boolean isShowNumber() {
668
		return showNumber;
669
	}
670

  
671
	/**
672
	 * @param showNumber The showNumber to set.
673
	 */
674
	public void setShowNumber(boolean showNumber) {
675
		this.showNumber = showNumber;
676
	}
491 677
}

Also available in: Unified diff