Statistics
| Revision:

svn-gvsig-desktop / tags / v1_0_2_Build_912 / extensions / extGeoreferencing / src / org / gvsig / georeferencing / utils / PointManager.java @ 11422

History | View | Annotate | Download (32.1 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.georeferencing.utils;
20

    
21
import java.awt.Component;
22
import java.awt.geom.Point2D;
23
import java.awt.geom.Rectangle2D;
24

    
25
import javax.swing.JDesktopPane;
26
import javax.swing.JInternalFrame;
27
import javax.swing.JLayeredPane;
28
import javax.swing.JOptionPane;
29
import javax.xml.transform.TransformerException;
30

    
31
import org.gvsig.georeferencing.GeoOperations;
32
import org.gvsig.georeferencing.GeoreferencingToolsModule;
33
import org.gvsig.georeferencing.gui.dialog.GeoreferencingDialog;
34
import org.gvsig.georeferencing.gui.listeners.GeoRasterFrameListener;
35
import org.gvsig.georeferencing.gui.listeners.GeorefPointSelectorListener;
36
import org.gvsig.georeferencing.gui.panels.AdjustGeorefPanel;
37
import org.gvsig.georeferencing.gui.panels.OptionsPanel;
38
import org.gvsig.georeferencing.gui.panels.ZoomControlPanel;
39
import org.gvsig.georeferencing.gui.pointsTable.TablePanelButtons;
40
import org.gvsig.georeferencing.gui.pointsTable.TableControlerPanel;
41
import org.gvsig.georeferencing.gui.pointsTable.TablePointsPanel;
42
import org.gvsig.georeferencing.gui.pointsTable.TablePointsPanel.PointTable;
43
import org.gvsig.georeferencing.gui.selectPoints.DataPointPanel;
44
import org.gvsig.georeferencing.gui.selectPoints.ErrorPointPanel;
45
import org.gvsig.georeferencing.gui.selectPoints.SelectPointsPanel;
46

    
47
import com.iver.andami.PluginServices;
48
import com.iver.andami.ui.mdiFrame.MDIFrame;
49
import com.iver.cit.gvsig.fmap.ViewPort;
50
import com.iver.cit.gvsig.fmap.layers.FLyrGeoRaster;
51
import com.iver.cit.gvsig.fmap.layers.FLyrPoints;
52
import com.iver.cit.gvsig.fmap.layers.GeoPoint;
53
import com.iver.cit.gvsig.fmap.layers.IGeoUi;
54
import com.iver.cit.gvsig.project.documents.view.gui.View;
55

    
56
/**
57
 * Gestor de puntos. Contiene metodos para a?adir. borrar, seleccionar,..
58
 * puntos coordinando la capa de puntos y la visualizaci?n del interfaz
59
 * gr?fico.
60
 * 
61
 * @author Nacho Brodin (brodin_ign@gva.es)
62
 *
63
 */
64
public class PointManager{
65

    
66
        //**********************Vars**********************************
67
        private        GeoreferencingDialog                 dialog = null;
68
        
69
        private SelectPointsPanel                         selectPointsPanel = null;
70
        private ErrorPointPanel                         errorPointPanel = null;
71
        private DataPointPanel                                 dataPointPanel = null;
72
        private TableControlerPanel                 tableControlerPanel1 = null;
73
        
74
        private TablePointsPanel                         tablePointsPanel = null;
75
        private TableControlerPanel                 tableControlerPanel2 = null;
76
        private TablePanelButtons                        buttonsExportImportPanel = null;
77
        
78
        private OptionsPanel                                optionsPanel = null;
79
        private ZoomControlPanel                        zoomControlPanelLeft = null;
80
        private ZoomControlPanel                        zoomControlPanelRight = null;
81
        
82
        private FLyrPoints                                         lyrPoints = null;
83
        private        double                                                currentMapX = 0D;
84
        private        double                                                currentMapY = 0D;
85
        private        double                                                currentPixelX = 0D;
86
        private        double                                                currentPixelY = 0D;
87
        private boolean                                         disableAllControls = false;
88
        //**********************End Vars******************************
89
        
90
        //**********************Methods*******************************
91
        /**
92
         * Constructor
93
         */
94
        public PointManager(GeoreferencingDialog dialog, FLyrPoints flyrPoints){
95
                this.dialog = dialog;
96
                this.selectPointsPanel = dialog.getSelectPointsPanel();
97
                this.errorPointPanel = dialog.getSelectPointsPanel().getErrorPointPanel();
98
                this.dataPointPanel = dialog.getSelectPointsPanel().getDataPointPanel();
99
                this.tableControlerPanel1 = dialog.getSelectPointsPanel().getTableControlerPanel();
100
                this.tablePointsPanel = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel();
101
                this.tableControlerPanel2 = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getTableControlerPanel();
102
                this.buttonsExportImportPanel = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getPTablePanelButtons();
103
                this.optionsPanel = dialog.getConectorPanel().getAdjustGeorefPanel().getOptionsPanel();
104
                this.zoomControlPanelLeft = dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft();
105
                this.zoomControlPanelRight = dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight();
106
                this.lyrPoints = flyrPoints;
107
        }
108
        
109
        /**
110
         * Crea un nuevo punto vacio en la capa y lo a?ade al interfaz gr?fico para
111
         * que puedan ser introducidas las coordenadas por el usuario
112
         */
113
        public void newEmptyPoint(){
114
                try{
115
                        //Antes de a?adir un nuevo pto compruba que los textField del anterior no est?n vacios
116
                        if(tableControlerPanel1.getItemCount() > 0)
117
                                selectPointsPanel.checkInfoPointText();
118
                        
119
                        //A?ade un punto vacio a la capa
120
                        lyrPoints.addPoint(null, null);
121
                        
122
                        //A?ade un punto al control de tabla y checkea la activaci?n de los botones
123
                        tableControlerPanel1.addPointToTable(lyrPoints.getCountPoints());
124
                                                        
125
                        //Guardamos el ?ltimo punto seleccionado por si hay que recuperarlo
126
                        selectPointsPanel.setLastIndexSelection(lyrPoints.getCountPoints() - 1);
127
                                                                        
128
                        //resetea los controles de (del, delall, selectFromView y miniimagenes)
129
                        dialog.resetControls(true);
130
                        
131
                        //Desactivamos los controles de las miniimagenes para que no capture los
132
                        //eventos hasta que no se hayan introducido los puntos
133
                        dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(false);
134
                        dialog.getConectorPanel().getAdjustGeorefPanel().setLZoomRight("1:");
135
                        dialog.getConectorPanel().getAdjustGeorefPanel().setLZoomLeft("1:");
136
                                                                        
137
                }catch(NoSuchFieldException exc){
138
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(),
139
                                PluginServices.getText(this, "coordenadas_vacias"));
140
                }
141
        }
142
        
143
        /**
144
         * A partir de nuevas coordenadas actualiza la vista, minimagen, capa de puntos el
145
         * dialogo y la tabla.
146
         *
147
         */
148
        public void updateData(int nPunto, Point2D pixel, Point2D map, IGeoUi geoUI, View view){
149
                dialog = (GeoreferencingDialog)geoUI;
150
                if(dialog == null)
151
                        return;
152
                if(pixel == null && map == null)
153
                        return;
154
                
155
                //Actualizamos los textBox
156
                if(pixel != null)
157
                        dialog.setPixelText(GeoUtils.tailDecimals(pixel.getX(), 2), GeoUtils.tailDecimals(pixel.getY(), 2));
158
                
159
                if(map != null)
160
                        dialog.setMapCoordText(map.getX(), map.getY());
161
                
162
                //El Checkbox de activaci?n
163
                GeoPoint gp = ((GeoPoint)lyrPoints.getPoint(nPunto - 1));
164
                if(gp != null){
165
                        dataPointPanel.getCbActive().setSelected(gp.active);
166
                        dialog.setEnabled(gp.active);
167
                }
168
            
169
                //Actualizamos la tabla
170
                
171
                while(dialog.getTableRowCount() < nPunto)
172
                        dialog.addTableNew();
173
                if(gp != null)
174
                        dialog.setCheckValueAt(new Boolean(gp.active), nPunto - 1);
175
                dialog.setTableValueAt(String.valueOf(nPunto), nPunto - 1, 1);
176
                
177
                if(pixel != null){        
178
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(pixel.getX()), 5), nPunto - 1, 2);
179
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(pixel.getY()), 5), nPunto - 1, 3);
180
                }
181
                if(map != null){
182
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(map.getX()), 5), nPunto - 1, 4);
183
                        dialog.setTableValueAt(GeoUtils.tailDecimals(String.valueOf(map.getY()), 5), nPunto - 1, 5);
184
                }
185
                
186
                //Actualizamos la capa de puntos
187
                if(pixel != null || map != null)
188
                        lyrPoints.updatePoint(pixel, map, nPunto - 1);
189
                
190
                //Actualizamos la miniimagen
191
                if(view != null){
192
                        ViewPort viewPort = view.getMapControl().getMapContext().getViewPort();
193

    
194
                        if(pixel != null){
195
                                dialog.getZoomControlLeft().setCenterPoint(lyrPoints.getLyrGeoRaster().img2World(pixel));
196
                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setViewPort(viewPort, lyrPoints.getPoint(nPunto - 1).zoomLeft);
197
                                //Si est? extendido hacemos un draw corriente sino es q est? plegado y tocar? asignar el extent de la miniimagen
198
                                if(dialog.isEnlarge())
199
                                        dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().draw();
200
                                
201
                                lyrPoints.setMiniExtent(nPunto - 1, 
202
                                                                                lyrPoints.getLyrGeoRaster().img2World(pixel), 
203
                                                                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().getCanvas().initViewPort(viewPort, lyrPoints.getLyrGeoRaster().img2World(pixel), null, 1),
204
                                                                                false);
205
                        }
206
                        
207
                        if(map != null){
208
                                dialog.getZoomControlRight().setCenterPoint(map);
209
                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().setViewPort(viewPort, lyrPoints.getPoint(nPunto - 1).zoomRight);
210
                                //Si est? extendido hacemos un draw corriente sino es q est? plegado y tocar? asignar el extent de la miniimagen
211
                                if(dialog.isEnlarge())
212
                                        dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().draw();
213
                                
214
                                lyrPoints.setMiniExtent(nPunto - 1, 
215
                                                                                map, 
216
                                                                                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomRight().getCanvas().initViewPort(viewPort, map, null, 1),
217
                                                                                true);
218
                        }
219
                                                                        
220
                        //Actualizamos la vista
221
                        view.getMapControl().getMapContext().invalidate();
222
                }
223
                
224
                //Calculamos los errores
225
                try{
226
                        if(pixel != null || map != null)
227
                                setErrors(nPunto - 1);
228
                }catch(ArrayIndexOutOfBoundsException ex){
229
                        //Esta excepci?n ocurre despues de introducir el primer punto ya que map es null
230
                        //En este caso no hacemos nada y no se calcula el error
231
                }
232
            
233
        }
234
        
235
        /**
236
         * Al actualizar un punto debemos recalcular los errores RMS y Total para ello tenemos que
237
         * pedir la transformaci?n de toda la lista de puntos. Esta funci?n calcula esta lista
238
         * transformada y la asigna a un array en la capa de puntos. Esta funci?n tiene en cuenta
239
         * que un punto puede estar inactivo.
240
         */
241
        private void transformPointList(){
242
                try{
243
                        GeoOperations go = new GeoOperations(lyrPoints);
244
                        Point2D[] pointList = new Point2D[lyrPoints.getCountActivePoints()];
245
                        int pActive = 0;
246
                        for(int i=0; i< lyrPoints.getCountPoints(); i++){
247
                                if(lyrPoints.getPoint(i).active){
248
                                        pointList[pActive] = lyrPoints.getPoint(i).pixelPoint;
249
                                        pActive ++;
250
                                }
251
                        }
252
                        
253
                        Point2D[] transformActivePointList = go.transformPoints(pointList);
254
                        Point2D[] transformPointList = new Point2D[lyrPoints.getCountPoints()];
255
                        
256
                        pActive = 0;
257
                        for(int i=0; i< lyrPoints.getCountPoints(); i++){
258
                                if(lyrPoints.getPoint(i).active){
259
                                        transformPointList[i] = transformActivePointList[pActive];
260
                                        pActive ++;
261
                                }else
262
                                        transformPointList[i] = null;
263
                        }
264
                        
265
                        lyrPoints.setTransformPointList(transformPointList);
266
                }catch(NullPointerException e){
267
                        //Si ocurre esta excepci?n es que se est? intentando incluir un punto que se acaba de crear
268
                        //y por lo tanto no tiene el valor asignado todavia por lo que es mejor no hacer nada 
269
                        //y seguir con el proceso
270
                }
271
        }
272
        
273
        /**
274
         * Busca el punto en la capa FLyrPoint que corresponde con la posicion pos
275
         * y carga la informaci?n de este en el panel de informaci?n pasado por par?metro.
276
         * @param pos Posici?n del punto
277
         * @param panel donde se carga la informaci?n
278
         */
279
        public void selectPoint(int pos, GeoreferencingDialog dialog){
280
                GeoPoint pto = null;
281
                try{
282
                        pto = lyrPoints.getPoint(pos);
283
                        if(pto == null)
284
                                return;
285
                }catch(ArrayIndexOutOfBoundsException exc){
286
                        //Todavia no hay puntos por lo que no hacemos nada
287
                        return;
288
                }
289
                
290
                //Actualizamos el valor del combo
291
                try{
292
                        tableControlerPanel1.getCPoint().setSelectedIndex(pos);
293
                }catch(IllegalArgumentException ex){}
294
                try{
295
                        tableControlerPanel2.getCPoint().setSelectedIndex(pos);
296
                }catch(IllegalArgumentException ex){}
297
                
298
                DataPointPanel dpp = dialog.getConectorPanel().getDataPointsTabPanel().getSelectPointsPanel().getDataPointPanel();
299
                
300
                //Llenamos los JTextField con los valores del punto
301
                if(pto.pixelPoint != null){
302
                        dpp.getTX().setText(GeoUtils.tailDecimals(pto.pixelPoint.getX(), 2)+"");
303
                        dpp.getTY().setText(GeoUtils.tailDecimals(pto.pixelPoint.getY(), 2)+"");
304
            }
305
            if(pto.mapPoint != null){
306
                    dpp.getLatitud().setText(GeoUtils.tailDecimals(String.valueOf(pto.mapPoint.getY()), 5));
307
                    dpp.getLongitud().setText(GeoUtils.tailDecimals(String.valueOf(pto.mapPoint.getX()), 5));
308
            }
309
            
310
            //El Checkbox de activaci?n
311
            dataPointPanel.getCbActive().setSelected(pto.active);
312
            dialog.setEnabled(pto.active);
313
                        
314
            //Seleccionamos la fila de la tabla
315
            PointTable table = dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getJTable();
316
            try{
317
                    table.getTable().setRowSelectionInterval(pos, pos);
318
            }catch(IllegalArgumentException exc){
319
                    System.err.println("Intervalo erroneo "+pos);
320
            }
321
            
322
            //Cargamos las mini imagenes
323
            dialog.getZoomControlLeft().setCenterPoint(lyrPoints.getCenterPoint(pos, false));
324
            
325
            try{
326
                    ViewPort vpL = GeoUtils.calcZoom(lyrPoints.getMiniExtent(pos, false), lyrPoints.getZoomLeft(pos));
327
                    dialog.getZoomControlLeft().setNewViewPort(vpL);
328
                    dialog.getZoomControlLeft().draw();
329
            }catch(NullPointerException ex){
330
                    //Todavia no hay un viewPort por lo que dar? una excepci?n. 
331
            }
332
                        
333
            dialog.getZoomControlRight().setCenterPoint(lyrPoints.getCenterPoint(pos, true));
334
            try{
335
                    ViewPort vpR = GeoUtils.calcZoom(lyrPoints.getMiniExtent(pos, true), lyrPoints.getZoomRight(pos));
336
                    dialog.getZoomControlRight().setNewViewPort(vpR);
337
                    dialog.getZoomControlRight().draw();
338
            }catch(NullPointerException ex){
339
                    //Todavia no hay un viewPort por lo que dar? una excepci?n
340
            }
341
                        
342
            //Consultamos si hay que centrar la vista sobre el punto seleccionado
343
            
344
                if(dialog.isCenterPoint()){
345
                        try{
346
                                centerView(lyrPoints.getCenterPoint(pos, false));
347
                        }catch(NullPointerException ex){
348
                                //Excepci?n cuando se cargan los puntos desde fichero. No hacemos nada
349
                        }
350
                }
351
                
352
            //Calculamos los errores
353
            if(pto.pixelPoint != null && pto.mapPoint != null)
354
                    setErrors(pos);
355
        }
356
        
357
        /**
358
         * Obtiene los errores en una matriz de Nx3 en la que cada fila es un punto y la
359
         * columna 0 es el error en X, la columna 1 es el error en Y y la columna 2 es el error RMS. 
360
         * @return matriz de errores
361
         */
362
        public double[][] getErrors(){
363
                
364
                transformPointList();
365
                
366
                //Al actualizar un punto debemos recalcular los errores RMS y Total para ello tenemos que
367
                //pedir la transformaci?n de toda la lista de puntos
368
                try{
369
                        GeoOperations go = new GeoOperations(lyrPoints);
370
                        Point2D[] pointList = new Point2D[lyrPoints.length()]; 
371
                        for(int i=0; i< lyrPoints.length(); i++)
372
                                pointList[i] = lyrPoints.getPoint(i).pixelPoint;
373
                        
374
                        Point2D[] transformPointList = go.transformPoints(pointList);
375
                        lyrPoints.setTransformPointList(transformPointList);
376
                }catch(NullPointerException e){
377
                        //Si ocurre esta excepci?n es que se est? intentando incluir un punto que se acaba de crear
378
                        //y por lo tanto no tiene el valor asignado todavia por lo que es mejor no hacer nada 
379
                        //y seguir con el proceso
380
                }
381
                
382
                double[][] err =  new double[lyrPoints.getCountPoints()][3];
383
                for(int i = 0; i<lyrPoints.getCountPoints(); i++){
384
                        err[i][0] = lyrPoints.calcDoubleResX(i);
385
                        err[i][1] = lyrPoints.calcDoubleResY(i);
386
                        err[i][2] = lyrPoints.calcDoubleRMS(i);
387
                }
388
                return err;
389
        }
390
        
391
        /**
392
         * Calcula los errores y los asigna al dialogo y tabla. Hay que tener en cuenta que 
393
         * hay que tener en la capa de puntos la lista de puntos transformados
394
         * @param pos
395
         */
396
        public void setErrors(int pos){
397
                
398
                if(lyrPoints != null){
399
                        transformPointList();
400
                        
401
                        //Calculamos los errores
402
                        double rms = lyrPoints.calcDoubleRMS(pos);
403
                    dialog.setRMS(String.valueOf(GeoUtils.tailDecimals(rms, 5)));
404
                    try{
405
                            dialog.setTableValueAt(String.valueOf(GeoUtils.tailDecimals(rms, 5)), pos, 8);
406
                    }catch(ArrayIndexOutOfBoundsException e){
407
                            //No asigna el valor a la tabla
408
                    }
409
                    
410
                    double rx = lyrPoints.calcDoubleResX(pos);
411
                    dialog.setResX(String.valueOf(GeoUtils.tailDecimals(rx, 5)));
412
                    try{
413
                            dialog.setTableValueAt(String.valueOf(GeoUtils.tailDecimals(rx, 5)), pos, 6);
414
                    }catch(ArrayIndexOutOfBoundsException e){
415
                            //No asigna el valor a la tabla
416
                    }
417
                    
418
                    double ry = lyrPoints.calcDoubleResY(pos);
419
                    dialog.setResY(String.valueOf(GeoUtils.tailDecimals(ry, 5)));
420
                    try{
421
                            dialog.setTableValueAt(String.valueOf(GeoUtils.tailDecimals(ry, 5)), pos, 7);
422
                    }catch(ArrayIndexOutOfBoundsException e){
423
                            //No asigna el valor a la tabla
424
                    }
425
                    
426
                    double total = lyrPoints.calcDoubleTotal();
427
                    dialog.setTotal(String.valueOf(GeoUtils.tailDecimals(total, 5)));
428
                }
429
            
430
        }
431
        
432
        /**
433
         * Elimina el punto seleccionado de la lista de puntos. Obtiene el punto seleccionado
434
         * del combobox del tableControler
435
         */
436
        public void deletePoint(){
437
                int op = JOptionPane.showConfirmDialog((Component)PluginServices.getMainFrame(),
438
                                PluginServices.getText(this, "eliminar_punto"));
439
                if(op == JOptionPane.OK_OPTION){
440
                        if(lyrPoints.length() == 1) //Si solo hay un punto reseteamos
441
                                clearVisualList();
442
                        else{
443
                                int posSelect = tableControlerPanel1.getSelectedIndex();
444
                                if(posSelect == -1)
445
                                        return;
446
                                deleteVisualPoint(posSelect);        
447
                                                                                        
448
                                if(posSelect == 0){
449
                                        selectPointsPanel.setLastIndexSelection(posSelect);
450
                                }else{
451
                                        selectPointsPanel.setLastIndexSelection(posSelect - 1);
452
                                }                                        
453
                        }
454
                }
455
        }
456
        
457
        /**
458
         * Elimina todos los puntos de la capa y resetea el dialogo
459
         */
460
        public void deleteAllPoints(){
461
                int op = JOptionPane.showConfirmDialog((Component)PluginServices.getMainFrame(),
462
                                PluginServices.getText(this, "eliminar_todos_puntos"));
463
                if(op == JOptionPane.OK_OPTION){
464
                        clearVisualList();
465
                }
466
                        
467
        }
468
        
469
        /**
470
         * Elimina un punto de la lista pasado por par?metro y lo elimina del panel 
471
         * @param pos        Posici?n del punto
472
         * @param grd        Panel a limpiar
473
         */
474
        private void deleteVisualPoint(int pos){
475
                lyrPoints.remove(pos);
476
                
477
                //Actualiza los controles de tabla y selector
478
                tableControlerPanel1.setNItems(lyrPoints.length());
479
                tableControlerPanel2.setNItems(lyrPoints.length());
480
                                
481
                //Elimina la fila de la tabla y renumera los puntos
482
                try{
483
                        dialog.removeTableValueAt(pos);
484
                
485
                        for(int i=0;i<lyrPoints.length();i++)
486
                                dialog.setTableValueAt(String.valueOf(i + 1), i, 1);
487
                }catch(ArrayIndexOutOfBoundsException exc){
488
                        //Si intentamos eliminar una fila que no existe no hacemos nada, simplemente no la eliminamos
489
                }
490
                                
491
                //Carga los puntos
492
                if(pos == 0){
493
                        dialog.getSelectPointsPanel().getTableControlerPanel().setSelectedIndex(pos);
494
                        selectPoint(pos, dialog);
495
                }else{
496
                        dialog.getConectorPanel().getDataPointsTabPanel().getTablePointsPanel().getTableControlerPanel().setSelectedIndex(pos - 1);
497
                        selectPoint(pos - 1, dialog);
498
                }
499
                
500
                //Controlamos las flechas del control de puntos
501
                tableControlerPanel1.checkArrows();
502
                tableControlerPanel2.checkArrows();
503
                
504
                //Redibujamos la vista
505
                View theView = null;
506
                try{
507
                        theView = (View) PluginServices.getMDIManager().getActiveWindow();
508
                        theView.getMapControl().getMapContext().invalidate();
509
                }catch(ClassCastException exc){
510
                        return;
511
                }
512
        }
513
        
514
        /**
515
         * Desplaza la vista centrando esta sobre el punto pasado como par?metro
516
         * @param center Punto sobre el que se centra la vista
517
         */
518
        private void centerView(Point2D center){
519
                //Obtenemos la vista
520
                View theView = null;
521
                try{
522
                        theView = (View) PluginServices.getMDIManager().getActiveWindow();
523
                }catch(ClassCastException exc){
524
                }
525
                
526
                //Calculamos el desplazamiento del extext viejo a partir de la diferencia de centros
527
                Rectangle2D oldExtent = theView.getMapControl().getMapContext().getViewPort().getExtent();
528
                double oldCenterX = oldExtent.getMinX() + (oldExtent.getWidth() / 2);
529
                double oldCenterY = oldExtent.getMaxY() - (oldExtent.getHeight() / 2);
530
                double difX = oldCenterX - center.getX();
531
                double difY = oldCenterY - center.getY();
532
                
533
                double minX = oldExtent.getMinX() - difX;
534
                double minY = oldExtent.getMinY() - difY;
535
                
536
                //Asignamos a la vista el nuevo extent
537
                Rectangle2D newExtent = new Rectangle2D.Double(minX, minY, oldExtent.getWidth(), oldExtent.getHeight());
538
                theView.getMapControl().getMapContext().getViewPort().setExtent(newExtent);
539
        }
540
        
541
        /**
542
         * Limpia la lista de puntos .
543
         */
544
        public void clearVisualList(){
545
                AdjustGeorefPanel agp = dialog.getConectorPanel().getAdjustGeorefPanel();
546
                
547
                //Limpiamos la lista de puntos
548
                lyrPoints.clear();
549
                //Limpiamos los controles del Selector de puntos
550
                selectPointsPanel.resetControls(false);
551
                selectPointsPanel.getTableControlerPanel().resetControls();
552
                
553
                //Limpiamos la tabla y sus controles
554
                tablePointsPanel.clearTable();
555
                tablePointsPanel.getTableControlerPanel().resetControls();
556
                                
557
                //Limpiamos las miniimagenes bloqueamos los controles
558
                agp.getZoomLeft().clear();
559
                agp.getZoomRight().clear();
560
                dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(false);
561
                
562
                //Desactivamos los controles de salvar puntos
563
                if(lyrPoints.getCountPoints() == 0)
564
                        dialog.setEnableSaveButtons(false);
565
                
566
                //Actualizamos la vista
567
                View theView = null;
568
                try{
569
                        theView = (View) PluginServices.getMDIManager().getActiveWindow();
570
                        theView.getMapControl().getMapContext().invalidate();
571
                }catch(ClassCastException exc){
572
                        return;
573
                }
574
        
575
        }
576
        
577
        /**
578
         * Realiza las acciones necesarias cuando se ha seleccionado el primer punto de la georreferenciaci?n. 
579
         * Este primer punto corresponde a las coordenadas en pixeles de la imagen. Los par?metros ya vienen
580
         * validados por quien llama.
581
         * @param tx Coordenada X en formato cadena
582
         * @param ty Coordenada Y en formato cadena
583
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
584
         */
585
        public void selectFirstPoint(String tx, String ty){
586
                //Obtenemos el punto seleccionado en coordenadas de la vista
587
                double x = Double.valueOf(tx).doubleValue();
588
                double y = Double.valueOf(ty).doubleValue();
589
                Point2D pixel = new Point2D.Double();
590
                pixel.setLocation(x, y);
591
                selectFirstPoint(pixel);
592
        }
593
        
594
        /**
595
         * Realiza las acciones necesarias cuando se ha seleccionado el primer punto de la georreferenciaci?n. 
596
         * Este primer punto corresponde a las coordenadas en pixeles de la imagen. Los par?metros ya vienen
597
         * validados por quien llama.
598
         * @param pixel Coordenada X, Y del punto
599
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
600
         */
601
        public void selectFirstPoint(Point2D pixel){
602
                restoreControlsValue();
603
                
604
                View theView = null;
605
                try{
606
                        theView = (View)PluginServices.getMDIManager().getActiveWindow();
607
                }catch(ClassCastException exc){
608
                        return;
609
                }
610
                
611
                //Obtenemos del dialogo el n? de pto seleccionado y lo actualizamos en la capa de ptos 
612
                int n = 1;
613
                try{
614
                        n = Integer.valueOf(dialog.getSelectPointsPanel().getTableControlerPanel().getCPoint().getSelectedItem().toString()).intValue();
615
                }catch(NullPointerException ex){
616
                        //n vale 1
617
                }
618
                updateData(n, pixel, null, dialog, theView);
619
                dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(false);
620
                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().setEnabled(true);
621
                
622
                disableAllControls();
623
                
624
                //Consultamos si ha de desactivarse la capa a georreferenciar despu?s del primer punto
625
                //y si es true la desactivamos
626
                if(dialog.isOffLayer())
627
                        lyrPoints.getLyrGeoRaster().setVisible(false);
628
                
629
                //Consultamos si ha de desactivarse la capa de puntos despues del primer punto y si es
630
                //true la desactivamos.
631
                if(dialog.isOffPoints())
632
                        lyrPoints.setHideViewOnly(false);
633
                
634
                GeorefPointSelectorListener.firstPoint = false;
635
        }
636
        
637
        /**
638
         * Realiza las acciones necesarias cuando se ha seleccionado el segundo punto de la georreferenciaci?n. 
639
         * Este segundo punto corresponde a las coordenadas en coordenadas del mundo. Los par?metros ya vienen
640
         * validados por quien llama.
641
         * @param tx Coordenada X en formato cadena
642
         * @param ty Coordenada Y en formato cadena
643
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
644
         */
645
        public void selectSecondPoint(String tx, String ty){
646
                //Obtenemos el punto seleccionado en coordenadas de la vista
647
                double x = Double.valueOf(tx).doubleValue();
648
                double y = Double.valueOf(ty).doubleValue();
649
                Point2D map = new Point2D.Double();
650
                map.setLocation(x, y);
651
                selectSecondPoint(map);
652
        }
653
        
654
        /**
655
         * Realiza las acciones necesarias cuando se ha seleccionado el primer punto de la georreferenciaci?n. 
656
         * Este primer punto corresponde a las coordenadas en pixeles de la imagen. Los par?metros ya vienen
657
         * validados por quien llama.
658
         * @param pixel Coordenada X, Y del punto
659
         * @throws TransformerException Es lanzada si el punto se encuentra fuera del marco de la imagen
660
         */
661
        public void selectSecondPoint(Point2D map){
662
                View theView = null;
663
                try{
664
                        theView = (View)PluginServices.getMDIManager().getActiveWindow();
665
                }catch(ClassCastException exc){
666
                        return;
667
                }
668
                
669
                //Deseleccionamos la herramienta de marcado de puntos
670
                theView.getMapControl().setTool(dialog.getLyrPoints().getLastTool());
671
                
672
                //Volvemos a dejar los controles con su valor habitual
673
                dialog.getPointManager().restoreControlsValue();
674
                dialog.setEnableSaveButtons(true);
675
                
676
                //Obtenemos del dialogo el n? de pto seleccionado y lo actualizamos en la capa de ptos
677
                int n = Integer.valueOf(dialog.getSelectPointsPanel().getTableControlerPanel().getCPoint().getSelectedItem().toString()).intValue();
678
                updateData(n, null, map, dialog, theView);
679
                dialog.getConectorPanel().getAdjustGeorefPanel().getZoomLeft().draw();
680
                dialog.getConectorPanel().getAdjustGeorefPanel().setEnabled(true);
681
                setErrors(n - 1);
682
                
683
                //Consultamos si ha de desactivarse la capa a georreferenciar despu?s del primer punto
684
                //y si es true la volvemos a activar despu?s del segundo punto
685
                if(dialog.isOffLayer())
686
                        lyrPoints.getLyrGeoRaster().setVisible(true);
687
                
688
                //Consultamos si ha de desactivarse la capa de puntos despues del primer punto y si es
689
                //true la activamos despu?s del segundo punto.
690
                if(dialog.isOffPoints())
691
                        lyrPoints.setHideViewOnly(true);
692
                
693
                GeorefPointSelectorListener.firstPoint = true;
694
        }
695
        
696
        /**
697
         * Obtiene la ventana flotante sobre la que ir? el dialogo (GeoreferencingDialog).
698
         * @param obj
699
         * @return JInternalFrame
700
         */
701
        public static JInternalFrame getInternalFrame(Object obj){
702
                JInternalFrame panel = new JInternalFrame();
703
                panel.addInternalFrameListener(new GeoRasterFrameListener());
704
        panel.setClosable(true);
705
        panel.setResizable(false);
706
        panel.setTitle(PluginServices.getText(obj,"georreferenciar"));
707
        return panel;
708
        }
709
        
710
        
711
        public static GeoreferencingDialog initWindow(FLyrGeoRaster lyrGeoRaster, boolean show, Object obj){
712
                GeoreferencingDialog geoDialog = null;
713
                
714
                JInternalFrame panel = PointManager.getInternalFrame(obj);
715
        geoDialog = new GeoreferencingDialog(panel, lyrGeoRaster);             
716
                lyrGeoRaster.getStackZoom().setInitExtent(lyrGeoRaster.getAssignExtent(), true);
717
            lyrGeoRaster.getFLyrPoints().saveState();
718
        lyrGeoRaster.setGeoDialog(geoDialog);
719
        panel.setSize(geoDialog.getWidth() + 12, geoDialog.getHeight() + 10);
720
        panel.getContentPane().add(geoDialog);
721
       
722
        MDIFrame mainFrame = (MDIFrame) PluginServices.getMainFrame();
723
        
724
        JDesktopPane desk = new JDesktopPane();
725
        desk.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
726
              
727
        JLayeredPane lyrPane = mainFrame.getLayeredPane();
728
        lyrPane.add(panel, JDesktopPane.PALETTE_LAYER);    
729
        lyrPane.add(desk, JDesktopPane.OUTLINE_DRAG_MODE);
730
        if(show)
731
                panel.show();
732
        
733
        return geoDialog;
734
        }
735
                        
736
        /**
737
         * Esta funci?n deshabilita todos los controles y guarda sus valores
738
         * de habilitado o deshabilitado para que cuando se ejecute restoreControlsValue
739
         * se vuelvan a quedar como estaba
740
         */
741
        public void disableAllControls(){
742
                if(!disableAllControls){
743
                        disableAllControls = true;
744
                        //Salvamos los estados y desactivamos controles 
745
                        tableControlerPanel1.disableAllControls();
746
                        tablePointsPanel.disableAllControls();
747
                        tableControlerPanel2.disableAllControls();
748
                        dialog.disableAllControls();
749
                        dataPointPanel.getCbActive().setEnabled(false);
750
                        selectPointsPanel.getBExtended().setEnabled(false);
751
                        dialog.getFrame().setClosable(false);
752
                        
753
                        //Desactivamos las herramientas de georreferenciaci?n
754
                        GeoreferencingToolsModule.setEnabled(false);
755
                        dialog.getConectorPanel().getDataPointsTabPanel().getTbPoints().setEnabled(false);
756
                }
757
        }
758
        
759
        /**
760
         * Esta funci?n deja los controles como estaban al ejecutar la funci?n 
761
         * disableAllControls
762
         */
763
        public void restoreControlsValue(){
764
                if(disableAllControls){
765
                        disableAllControls = false;
766
                        //Activamos controles
767
                        tableControlerPanel1.restoreControlsValue();
768
                        tablePointsPanel.restoreControlsValue();
769
                        tableControlerPanel2.restoreControlsValue();
770
                        dialog.restoreControlsValue();
771
                        dataPointPanel.getCbActive().setEnabled(true);
772
                        selectPointsPanel.getBExtended().setEnabled(true);
773
                        dialog.getFrame().setClosable(true);
774
                        
775
                        //Activamos las herramientas de georreferenciaci?n
776
                        GeoreferencingToolsModule.setEnabled(true);
777
                        dialog.getConectorPanel().getDataPointsTabPanel().getTbPoints().setEnabled(true);
778
                }
779
        }
780
        //**********************End Methods***************************
781

    
782
        //**********************Getters & Setters*********************
783
        public FLyrPoints getFlyrPoints() {
784
                return lyrPoints;
785
        }
786

    
787
        public void setFlyrPoints(FLyrPoints flyrPoints) {
788
                this.lyrPoints = flyrPoints;
789
        }
790
        
791
        public GeoreferencingDialog getDialog() {
792
                return dialog;
793
        }
794
        
795
        /**
796
         * Salva en 2 variables de instancia el valor actual en coordenadas del 
797
         * mundo del punto seleccionado. Esto es util para su posterior restauraci?n.
798
         */
799
        public void setCurrentWC() {
800
                int posSelect = 0;
801
                try{
802
                        if(tableControlerPanel1 != null)
803
                                posSelect = tableControlerPanel1.getSelectedIndex();
804
                        if(lyrPoints != null){
805
                                this.currentMapX = lyrPoints.getPoint(posSelect).mapPoint.getX();
806
                                this.currentMapY = lyrPoints.getPoint(posSelect).mapPoint.getY();
807
                        }
808
                }catch(NullPointerException exc){
809
                        //Si tableControler o la capa de puntos son null no salvamos el punto
810
                }
811
        }
812
        
813
        /**
814
         * Asigna nuevos valores al texto de la latitud y longitud.
815
         * @param x        Longitud
816
         * @param y Latitud
817
         */
818
        public void setTempWC(double x, double y){
819
                dataPointPanel.getLongitud().setText(GeoUtils.tailDecimals(String.valueOf(x), 5) + "");
820
                dataPointPanel.getLatitud().setText(GeoUtils.tailDecimals(String.valueOf(y), 5) + "");
821
        }
822
        
823
        /**
824
         * Restaura el ?ltimo valor seleccionado por el usuario de la latitud
825
         * y longitud.
826
         */
827
        public void replaceWC(){
828
                dataPointPanel.getLongitud().setText(GeoUtils.tailDecimals(String.valueOf(currentMapX), 5) + "");
829
                dataPointPanel.getLatitud().setText(GeoUtils.tailDecimals(String.valueOf(currentMapY), 5) + "");
830
        }
831
        
832
        /**
833
         * Salva en 2 variables de instancia el valor actual en coordenadas del 
834
         * mundo del punto seleccionado. Esto es util para su posterior restauraci?n.
835
         */
836
        public void setCurrentPixelCoord() {
837
                int posSelect = 0;
838
                try{
839
                        if(tableControlerPanel1 != null)
840
                                posSelect = tableControlerPanel1.getSelectedIndex();
841
                        if(lyrPoints != null){
842
                                this.currentPixelX = lyrPoints.getPoint(posSelect).pixelPoint.getX();
843
                                this.currentPixelY = lyrPoints.getPoint(posSelect).pixelPoint.getY();
844
                        }
845
                }catch(NullPointerException exc){
846
                        //Si tableControler o la capa de puntos son null no salvamos el punto
847
                }
848
        }
849
        
850
        /**
851
         * Asigna nuevos valores al texto de la latitud y longitud.
852
         * @param x        Longitud
853
         * @param y Latitud
854
         */
855
        public void setTempPixelCoord(double x, double y){
856
                dataPointPanel.getTX().setText(GeoUtils.tailDecimals(String.valueOf(x), 2) + "");
857
                dataPointPanel.getTY().setText(GeoUtils.tailDecimals(String.valueOf(y), 2) + "");
858
        }
859
        
860
        /**
861
         * Restaura el ?ltimo valor seleccionado por el usuario de la latitud
862
         * y longitud.
863
         */
864
        public void replacePixelCoord(){
865
                dataPointPanel.getTX().setText(GeoUtils.tailDecimals(currentPixelX, 2) + "");
866
                dataPointPanel.getTY().setText(GeoUtils.tailDecimals(currentPixelY, 2) + "");
867
        }
868
        
869
        /**
870
         * Consulta si se han desactivado los controles salvando sus valores
871
         * @return true si se han desactivado los controles salvando previamente
872
         * sus valores y false si est?n en estado normal.
873
         */
874
        public boolean isDisableAllControls() {
875
                return disableAllControls;
876
        }
877
        //**********************End Getters & Setters*****************
878
}