Statistics
| Revision:

root / import / ext3D / trunk / ext3D / src / com / iver / ai2 / gvsig3d / map3d / layers / FLayers3D.java @ 15266

History | View | Annotate | Download (37.4 KB)

1
package com.iver.ai2.gvsig3d.map3d.layers;
2

    
3
import java.awt.Component;
4
import java.awt.Point;
5
import java.awt.geom.Rectangle2D;
6
import java.io.File;
7
import java.util.ArrayList;
8

    
9
import javax.swing.JOptionPane;
10

    
11
import org.cresques.cts.ICoordTrans;
12
import org.cresques.cts.IProjection;
13
import org.gvsig.cacheservice.CacheServiceException;
14
import org.gvsig.cacheservice.TileNum;
15

    
16
import com.hardcode.driverManager.Driver;
17
import com.hardcode.driverManager.DriverLoadException;
18
import com.iver.ai2.gvsig3d.cacheservices.FLayerCacheService;
19
import com.iver.ai2.gvsig3d.cacheservices.VectorCacheService;
20
import com.iver.ai2.gvsig3d.map3d.MapContext3D;
21
import com.iver.ai2.gvsig3d.resources.ResourcesFactory;
22
import com.iver.andami.PluginServices;
23
import com.iver.cit.gvsig.fmap.DriverException;
24
import com.iver.cit.gvsig.fmap.MapContext;
25
import com.iver.cit.gvsig.fmap.ViewPort;
26
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
27
import com.iver.cit.gvsig.fmap.drivers.DefaultDBDriver;
28
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
29
import com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver;
30
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
31
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
32
import com.iver.cit.gvsig.fmap.layers.FLayer;
33
import com.iver.cit.gvsig.fmap.layers.FLayers;
34
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
35
import com.iver.cit.gvsig.fmap.layers.FLyrRaster;
36
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
37
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
38
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
39
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
40
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
41
import com.iver.cit.gvsig.fmap.layers.LayerListener;
42
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
43
import com.iver.cit.gvsig.fmap.layers.LegendListener;
44
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
45
import com.iver.cit.gvsig.fmap.layers.XMLException;
46
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
47
import com.iver.cit.gvsig.fmap.rendering.Legend;
48
import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
49
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
50
import com.iver.utiles.IPersistance;
51
import com.iver.utiles.XMLEntity;
52

    
53
import es.upv.ai2.libjosg.AutoTransform;
54
import es.upv.ai2.libjosg.Group;
55
import es.upv.ai2.libjosg.Node;
56
import es.upv.ai2.libjosg.Vec3;
57
import es.upv.ai2.libjosg.planets.Planet;
58
import es.upv.ai2.libjosg.planets.RequestLayerListener;
59
import es.upv.ai2.libjosg.planets.TilePagedLod;
60
import es.upv.ai2.libjosg.planets.TileCreatedListener;
61
import es.upv.ai2.libjosg.planets.TileEvent;
62
import es.upv.ai2.libjosg.planets.Planet.PlanetType;
63
import es.upv.ai2.libjosg.viewer.Camera;
64
import es.upv.ai2.libjosg.viewer.IViewerContainer;
65

    
66
public class FLayers3D extends FLayers implements TileCreatedListener,
67
                RequestLayerListener, LegendListener, LayerListener {
68

    
69
        // JOSG library objects
70
        private Planet m_planet;
71

    
72
        private IViewerContainer m_canvas3d;
73

    
74
        private IProjection m_viewProjection;
75

    
76
        private boolean m_bLoading = false;
77

    
78
        private boolean m_bListenToLegend = true;
79

    
80
        // separate lists for image, elevation and vector layers
81
        private ArrayList m_layerLists = new ArrayList();
82

    
83
        private boolean m_bEmptyView = true;
84
        
85
        private float verticalExageration;
86

    
87
        // protected static Logger logger =
88
        // Logger.getLogger(FLayers.class.getName());
89

    
90
        /**
91
         * Constructor that can be used to create a MapContext containing the
92
         * FLayers3D
93
         * 
94
         * @param fmap
95
         *            MapContext (can be null)
96
         * @param parent
97
         *            FLayers (can be null)
98
         */
99
        public FLayers3D(MapContext fmap, FLayers parent, ViewPort vp) {
100

    
101
                super(fmap, parent);
102
                if (fmap == null) {
103
                        MapContext newMap = new MapContext3D(this, vp);
104
                        this.fmap = newMap;
105
                } else {
106
                        fmap.setViewPort(vp);
107
                }
108

    
109
                ArrayList textureLayers = new ArrayList();
110
                ArrayList elevationLayers = new ArrayList();
111
                ArrayList vectorLayers = new ArrayList();
112
                m_layerLists.add(textureLayers);
113
                m_layerLists.add(elevationLayers);
114
                m_layerLists.add(vectorLayers);
115
        }
116

    
117
        public void setPlanet(Planet planet) {
118
                if (planet == m_planet)
119
                        return;
120

    
121
                m_planet = planet;
122

    
123
                // add layers to planet
124

    
125
                for (int iType = 0; iType < 3; iType++) {
126
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
127
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
128

    
129
                                FLayer layer = (FLayer) layerList.get(iLayer);
130
                                Layer3DProps props = getLayer3DProps(layer);
131
                                addLayerToPlanet(layer, props.getOrder(), false);
132

    
133
                                // Layer active or not
134
                                if (props.getType() == Layer3DProps.layer3DImage) {
135
                                        m_planet.setEnabledTextureLayer(props.getOrder(), layer
136
                                                        .isVisible());
137
                                }
138
                                if (props.getType() == Layer3DProps.layer3DElevation) {
139
                                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
140
                                }
141
                        }
142
                        if (iType == Layer3DProps.layer3DElevation && layerList.size() > 0)
143
                                m_planet.invalidateHeightfieldLayer(0);
144
                }
145
        }
146

    
147
        public Planet getPlanet() {
148
                return m_planet;
149
        }
150

    
151
        public void setViewer(IViewerContainer canvas) {
152
                m_canvas3d = canvas;
153
        }
154

    
155
        // overrides for layer collection events
156

    
157
        protected void callLayerAdded(LayerCollectionEvent event) {
158
                FLayer layer = event.getAffectedLayer();
159
                layerAddedEvent(layer);
160
                super.callLayerAdded(event);
161
        }
162

    
163
        protected void callLayerRemoved(LayerCollectionEvent event) {
164
                FLayer layer = event.getAffectedLayer();
165
                layerRemovedEvent(layer);
166
                super.callLayerRemoved(event);
167
        }
168

    
169
        protected void callLayerMoved(LayerPositionEvent event) {
170
                super.callLayerMoved(event);
171

    
172
                FLayer layer = event.getAffectedLayer();
173
                if (layer instanceof FLayers)
174
                        return; // group layers not added to 3D as such layers
175

    
176
                Layer3DProps props3D = getLayer3DProps(layer);
177
                if (props3D.getType() != Layer3DProps.layer3DImage)
178
                        return;
179

    
180
                // remove 'old' layer in list
181
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
182
                int currentOrder = props3D.getOrder();
183
                layerList.remove(currentOrder);
184

    
185
                int newOrder = addLayerByType(layer);
186
                if (currentOrder == newOrder)
187
                        return;
188

    
189
                m_planet.reorderTextureLayer(currentOrder, newOrder);
190

    
191
                // PrintDebugLayers();
192
                // REPAINTING VIEWER
193
                if (m_canvas3d != null)
194
                        m_canvas3d.repaint();
195
        }
196

    
197
        protected void layerAddedEvent(FLayer layer) {
198

    
199
                if (layer instanceof FLayers)
200
                        return; // group layers not added to 3D as such layers
201

    
202
                if (layer instanceof Classifiable) {
203
                        Classifiable legendLyr = (Classifiable) layer;
204
                        legendLyr.addLegendListener((LegendListener) this);
205
                }
206
                layer.addLayerListener((LayerListener) this);
207

    
208
                // if (layer instanceof FLyrWMS) {
209
                // FLyrWMS wmsLayer = (FLyrWMS) layer;
210
                // wmsLayer.setSRS("EPSG:4326");
211
                // }
212

    
213
                int order = addLayerByType(layer);
214
                if (order == -1) {
215
                        // an error has been generated
216
                        this.removeLayer(layer);
217
                        return;
218
                }
219

    
220
                if (!m_bLoading)
221
                        addLayerToPlanet(layer, order, true);
222

    
223
                // Only do this the first time to add layer
224
                ArrayList layerListI = (ArrayList) m_layerLists
225
                                .get(Layer3DProps.layer3DImage);
226
                ArrayList layerListV = (ArrayList) m_layerLists
227
                                .get(Layer3DProps.layer3DVector);
228

    
229
                if (m_bEmptyView && !m_bLoading) {
230
                        if (!((layerListI.size() == 1) && (layerListV.size() == 0))
231
                                        || !((layerListI.size() == 0) && (layerListV.size() == 1))) {
232
                                // Doing Zoom to extend to layer added, only if layer is the
233
                                // first one added in the list
234
                                try {
235
                                        zoomToExtent(layer.getFullExtent(), 0);
236
                                        m_bEmptyView = false;
237
                                } catch (DriverException e) {
238
                                        // System.out
239
                                        // .println("ZOOM TO EXTEND DON�T WORK CORRECTLY!!!!");
240
                                        e.printStackTrace();
241
                                }
242
                        }
243
                }
244

    
245
                // PrintDebugLayers();
246
        }
247

    
248
        private void addLayerToPlanet(FLayer layer, int order, boolean bVerifyLegend) {
249
                Layer3DProps props3D = getLayer3DProps(layer);
250
                if (props3D.getType() == Layer3DProps.layer3DVector)
251
                        CreateVectors(layer, props3D); // special case for now without
252
                // disk cache
253
                else {
254
                        try {
255
                                Rectangle2D layerExtent = layer.getFullExtent();
256
                                if (layerExtent == null) { // hack for missing extents
257
                                        if (m_planet.getType() == PlanetType.SPHERICAL_MODE)
258
                                                layerExtent = new Rectangle2D.Double(-180.0, -90.0,
259
                                                                360.0, 180.0);
260
                                        else
261
                                                layerExtent = new Rectangle2D.Double(-20000000.0,
262
                                                                -10000000.0, 40000000.0, 20000000.0);
263
                                        if (layer instanceof FLyrWCS)
264
                                                ((FLyrWCS) layer).setFullExtent(layerExtent);
265
                                }
266
                                if (props3D.getType() == Layer3DProps.layer3DElevation)
267
                                        m_planet.addHeightfieldLayer(layerExtent, 3);
268
                                else if (props3D.getType() == Layer3DProps.layer3DImage) {
269
                                        m_planet.addTextureLayer(layerExtent, 0);
270
                                        ArrayList imageList = (ArrayList) m_layerLists
271
                                                        .get(Layer3DProps.layer3DImage);
272
                                        int currentOrder = imageList.size() - 1;
273
                                        if (currentOrder != order)
274
                                                m_planet.reorderTextureLayer(currentOrder, order);
275
                                }
276
                                // REPAINTING VIEWER
277
                                if (m_canvas3d != null)
278
                                        m_canvas3d.repaint();
279
                        } catch (DriverException e) {
280
                                // TODO Auto-generated catch block
281
                                e.printStackTrace();
282
                        }
283

    
284
                        if (bVerifyLegend) {
285
                                m_bListenToLegend = false;
286
                                props3D.VerifyLegend(m_planet);
287
                                m_bListenToLegend = true;
288
                        }
289
                }
290
        }
291

    
292
        protected void layerRemovedEvent(FLayer layer) {
293

    
294
                if (layer instanceof FLayers)
295
                        return; // group layers not added to 3D as such layers
296

    
297
                if (layer instanceof Classifiable) {
298
                        Classifiable legendLyr = (Classifiable) layer;
299
                        legendLyr.removeLegendListener((LegendListener) this);
300
                }
301
                layer.removeLayerListener((LayerListener) this);
302

    
303
                int order = removeLayerByType(layer);
304
                if (order == -1)
305
                        return;
306

    
307
                Layer3DProps props3D = getLayer3DProps(layer);
308

    
309
                if (props3D.getType() == Layer3DProps.layer3DVector) {
310
                        DeleteVectors(layer, props3D);
311
                } else if (props3D.getType() == Layer3DProps.layer3DImage) {
312
                        m_planet.removeTextureLayer(order);
313
                } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
314
                        m_planet.removeHeightfieldLayer(order);
315
                }
316

    
317
                // REPAINTING VIEWER
318
                if (m_canvas3d != null)
319
                        m_canvas3d.repaint();
320

    
321
                ArrayList layerListI = (ArrayList) m_layerLists
322
                                .get(Layer3DProps.layer3DImage);
323
                ArrayList layerListV = (ArrayList) m_layerLists
324
                                .get(Layer3DProps.layer3DVector);
325
                // All layers are removed
326
                if ((layerListI.size() == 0) && (layerListV.size() == 0)) {
327
                        m_bEmptyView = true;
328
                }
329

    
330
                // PrintDebugLayers();
331
        }
332

    
333
        /**
334
         * DOCUMENT ME!
335
         * 
336
         * @param e
337
         *            DOCUMENT ME!
338
         */
339
        public void legendChanged(LegendChangedEvent e) {
340

    
341
                if (!m_bListenToLegend)
342
                        return;
343

    
344
                VectorialLegend newLegend = e.getNewLegend();
345
                // find layer whose legend changed
346
                FLayer found = null;
347
                SingleLayerIterator lyrIterator = new SingleLayerIterator(this);
348
                while (lyrIterator.hasNext()) {
349
                        FLayer lyr = lyrIterator.next();
350
                        if (lyr instanceof Classifiable) {
351
                                Classifiable classLyr = (Classifiable) lyr;
352
                                Legend legend = classLyr.getLegend();
353
                                if (legend instanceof VectorialLegend) {
354
                                        if ((VectorialLegend) legend == newLegend) {
355
                                                found = lyr;
356
                                                break;
357
                                        }
358
                                }
359
                        }
360
                }
361

    
362
                if (found != null) {
363
                        Layer3DProps props3D = getLayer3DProps(found);
364
                        refreshLayerInPlanet(props3D, true);
365
                        m_bListenToLegend = false;
366
                        props3D.VerifyLegend(m_planet);
367
                        m_bListenToLegend = true;
368
                        // REPAINTING VIWER
369
                        if (m_canvas3d != null)
370
                                m_canvas3d.repaint();
371
                }
372
        }
373

    
374
        public void visibilityChanged(LayerEvent e) {
375
                FLayer lyr = e.getSource();
376

    
377
                Layer3DProps props3D = getLayer3DProps(lyr);
378

    
379
                if (props3D.getType() == Layer3DProps.layer3DVector) {
380
                        refreshLayerVectorsVisibility(lyr);
381
                } else {
382
                        refreshLayerVisibility(lyr);
383
                }
384
                m_canvas3d.repaint();
385
        }
386

    
387
        private void refreshLayerVectorsVisibility(FLayer lyr) {
388
                if (m_planet == null || m_viewProjection == null)
389
                        return;
390

    
391
                Layer3DProps props3D = getLayer3DProps(lyr);
392

    
393
                VectorCacheService cacheService = (VectorCacheService) props3D
394
                                .getCacheService();
395
                if (cacheService != null) {
396
                        // use VectorCacheService to add features to planet
397
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
398
                }
399

    
400
        }
401

    
402
        public void activationChanged(LayerEvent e) {
403
                // TODO Auto-generated method stub
404
        }
405

    
406
        public void nameChanged(LayerEvent e) {
407
                // TODO Auto-generated method stub
408
        }
409

    
410
        public void editionChanged(LayerEvent e) {
411
                // TODO Auto-generated method stub
412
        }
413

    
414
        protected Layer3DProps getLayer3DProps(FLayer layer) {
415
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
416
                if (props3D == null) {
417
                        props3D = new Layer3DProps();
418
                        props3D.setLayer(layer);
419
                        props3D.initCacheName(m_planet.getType(), m_viewProjection);
420
                        FLyrDefault baseLayer = (FLyrDefault) layer;
421
                        baseLayer.setProperty("3DLayerExtension", props3D);
422
                        props3D.setVerticalEx(this.getVerticalExageration());
423
                } else {
424
                        if (m_bLoading)
425
                                props3D.setChooseType(false);
426
                        props3D.setLayer(layer);
427
                }
428

    
429
                return props3D;
430
        }
431

    
432
        public void refreshLayerInPlanet(Layer3DProps props, boolean bRemoveCache) {
433
                if (props == null)
434
                        return;
435

    
436
                if (m_planet == null)
437
                        return; // view not opened yet
438

    
439
        // clear cache
440

    
441
                if (bRemoveCache) {
442
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
443
                                        + m_planet.getPlanetName() + "/" + props.getCacheName();
444
                        removeCache(layerCacheDir);
445
                }
446
                
447
                // refresh layer in planet
448

    
449
                int type = props.getType();
450
                if (type == Layer3DProps.layer3DImage) {
451
                        int order = props.getOrder();
452
                        // m_planet.refreshTextureInfo(order);
453
                        m_planet.invalidateTextureLayer(order);
454
                } else if (type == Layer3DProps.layer3DElevation) {
455
                        m_planet.invalidateHeightfieldLayer(0);
456
                } else if (type == Layer3DProps.layer3DVector) {
457
                        invalidateVectorLayer(props);
458
                }
459

    
460
                // REPAINTING VIEWER
461
                if (m_canvas3d != null)
462
                        m_canvas3d.repaint();
463
        }
464

    
465
        private void invalidateVectorLayer(Layer3DProps props) {
466
                // TODO Auto-generated method stub
467
                if (m_planet == null || m_viewProjection == null)
468
                        return;
469

    
470
                VectorCacheService cacheService = (VectorCacheService) props
471
                                .getCacheService();
472
                if (cacheService != null) {
473
                        // use VectorCacheService to add features to planet
474
                        cacheService.RefreshFeaturesToPlanet();
475
                }
476
        }
477

    
478
        private boolean removeCache(String folder) {
479
                File dir = new File(folder);
480
                if (dir.isDirectory()) {
481
                        String[] children = dir.list();
482
                        for (int i = 0; i < children.length; i++) {
483
                                boolean success = removeCache(folder + "/" + children[i]);
484
                                // Do not interrupt if it can't delete one file 
485
                                //if (!success) {
486
                                //        return false;
487
                                //}
488
                        }
489
                }
490

    
491
                // The directory is now empty so delete it
492
                return dir.delete();
493
        }
494

    
495
        private void refreshLayerVisibility(FLayer layer) {
496

    
497
                Layer3DProps props3D = getLayer3DProps(layer);
498
                if (props3D.getType() == Layer3DProps.layer3DImage) {
499
                        m_planet.setEnabledTextureLayer(props3D.getOrder(), layer
500
                                        .isVisible());
501
                }
502
                if (props3D.getType() == Layer3DProps.layer3DElevation) {
503
                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
504
                }
505
                // REPAINTING VIEWER
506
                if (m_canvas3d != null)
507
                        m_canvas3d.repaint();
508
        }
509

    
510
        private int addLayerByType(FLayer layer) {
511
                int resultOrder = -1;
512

    
513
                int typeOrder[] = new int[3];
514
                typeOrder[Layer3DProps.layer3DImage] = 0;
515
                typeOrder[Layer3DProps.layer3DElevation] = 0;
516
                typeOrder[Layer3DProps.layer3DVector] = 0;
517

    
518
                SingleLayerIterator lyrIterator = new SingleLayerIterator(this);
519
                while (lyrIterator.hasNext()) {
520
                        FLayer lyr = lyrIterator.next();
521
                        Layer3DProps props3D = getLayer3DProps(lyr);
522
                        int type = props3D.getType();
523
                        // in pilot, limit to 1 the number of elevation layers
524
                        if (type == Layer3DProps.layer3DElevation && typeOrder[type] == 1) {
525
                                JOptionPane.showMessageDialog((Component) PluginServices
526
                                                .getMainFrame(), PluginServices.getText(this,
527
                                                "Only_one_elevation_messg"), PluginServices.getText(
528
                                                this, "Only_one_elevation_title"),
529
                                                JOptionPane.INFORMATION_MESSAGE);
530
                                return -1; // error value
531
                        }
532

    
533
                        props3D.setOrder(typeOrder[type]);
534
                        typeOrder[type] += 1;
535

    
536
                        if (layer == lyr) {
537
                                resultOrder = props3D.getOrder();
538
                                ArrayList layerList = (ArrayList) m_layerLists.get(type);
539
                                if (resultOrder == layerList.size()
540
                                                || layerList.get(resultOrder) != layer)
541
                                        layerList.add(resultOrder, layer);
542
                        }
543
                }
544

    
545
                return resultOrder;
546
        }
547

    
548
        private int removeLayerByType(FLayer layer) {
549

    
550
                Layer3DProps props3D = getLayer3DProps(layer);
551
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
552
                int currentOrder = props3D.getOrder();
553
                if (currentOrder == -1)
554
                        return -1;
555

    
556
                layerList.remove(currentOrder);
557

    
558
                for (int i = currentOrder; i < layerList.size(); i++) {
559
                        FLayer lyrAux = (FLayer) layerList.get(i);
560
                        Layer3DProps props3DAux = getLayer3DProps(lyrAux);
561
                        props3DAux.setOrder(i);
562
                }
563
                return currentOrder;
564
        }
565

    
566
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
567
                if (m_planet == null || m_viewProjection == null)
568
                        return;
569

    
570
                VectorCacheService cacheService = (VectorCacheService) props3D
571
                                .getCacheService();
572
                if (cacheService == null) {
573
                        cacheService = new VectorCacheService(m_canvas3d, m_planet, props3D
574
                                        .getCacheName(), layer, m_viewProjection);
575
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
576
                        props3D.setCacheService(cacheService);
577
                }
578

    
579
                // use VectorCacheService to add features to planet
580
                cacheService.AddFeaturesToPlanet();
581
        }
582

    
583
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
584
                if (m_planet == null || m_viewProjection == null)
585
                        return;
586

    
587
                VectorCacheService cacheService = (VectorCacheService) props3D
588
                                .getCacheService();
589
                if (cacheService != null) {
590
                        // use VectorCacheService to delete features to planet
591
                        cacheService.DeleteFeaturesToPlanet();
592
                }
593
        }
594

    
595
        // Object persistence
596

    
597
        /**
598
         * Devuelve el XMLEntity a partir del objeto.
599
         * 
600
         * @return XMLEntity.
601
         * @throws XMLException
602
         */
603
        public XMLEntity getXMLEntity() throws XMLException {
604
                XMLEntity xml = super.getXMLEntity();
605

    
606
                // A�adir aqu� algo si hace falta para 3D
607

    
608
                return xml;
609
        }
610

    
611
        /**
612
         * Inserta los valores de los atributos del XMLEntity al objeto.
613
         * 
614
         * @param xml
615
         *            XMLEntity.
616
         * 
617
         * @throws XMLException
618
         * @throws DriverException
619
         * @throws DriverIOException
620
         */
621
        public void setXMLEntity(XMLEntity xml) throws XMLException {
622
                m_bLoading = true;
623
                super.setXMLEntity(xml);
624
                m_bLoading = false;
625
        }
626

    
627
        public IProjection getViewProjection() {
628
                return m_viewProjection;
629
        }
630

    
631
        public void setViewProjection(IProjection projection) {
632
                m_viewProjection = projection;
633
        }
634

    
635
        public void zoomToExtent(Rectangle2D geoExtent, double maxHeight) {
636

    
637
                // Getting extent positions
638
                double minLat = geoExtent.getMinY();
639
                double maxLat = geoExtent.getMaxY();
640
                double cenLon = geoExtent.getCenterX();
641
                double cenLat = geoExtent.getCenterY();
642

    
643
                double elevation = 0;
644

    
645
                // calculate altitude
646
                double avLat = 0;
647
                if (minLat > 0.0 || maxLat < 0.0)
648
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
649
                double avLon = Math.min(180.0, geoExtent.getWidth());
650

    
651
                double planetRadius = m_planet.getRadiusEquatorial();
652
                double radiusLat = planetRadius * Math.cos(Math.toRadians(avLat));
653
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
654
                                * (1 - Math.cos(Math.toRadians(avLon))));
655
                double deltaLat = Math.sqrt(2 * planetRadius * planetRadius
656
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
657

    
658
                double zoomFactor = 1.0;
659
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
660

    
661
                // Calculate XYZ positions for camera.
662

    
663
                int planetType = this.m_planet.getType();
664

    
665
                Vec3 eye = new Vec3();
666
                Vec3 center = new Vec3();
667
                Vec3 up = new Vec3();
668
                // Calculate positions for PLAIN MODE.
669
                if (planetType == PlanetType.PLANE_MODE) {
670

    
671
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
672
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
673
                        double height;
674

    
675
                        height = Math.sqrt(difx * difx + dify * dify);
676

    
677
                        // EYE
678
                        eye.setX(cenLon);
679
                        eye.setY(cenLat);
680
                        eye.setZ(height);
681
                        // eye.setZ(5000000 * 4.6);
682
                        // CENTER
683
                        center.setX(cenLon);
684
                        center.setY(cenLat);
685
                        center.setZ(0.0);
686
                        // UP
687
                        up.setX(0.0);
688
                        up.setY(1.0);
689
                        up.setZ(0.0);
690
                } else
691
                // Calculate positions for SPHERICAL MODE.
692
                if (planetType == PlanetType.SPHERICAL_MODE) {
693
                        // EYE
694
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
695
                        eye = m_planet.convertLatLongHeightToXYZ(aux);
696
                        // CENTER
697
                        center.setX(0.0);
698
                        center.setY(0.0);
699
                        center.setZ(0.0);
700
                        // UP
701
                        up.setX(0.0);
702
                        up.setY(0.0);
703
                        up.setZ(1.0);
704
                }
705
                Camera cam = new Camera();
706
                cam.setViewByLookAt(eye, center, up);
707

    
708
                // UtilCoord.imprimeCamara(cam);
709

    
710
                m_canvas3d.getOSGViewer().setCamera(cam);
711
                // REPAINTING VIEWER
712
                if (m_canvas3d != null)
713
                        m_canvas3d.repaint();
714
        }
715

    
716
        public void tileCreated(TileEvent evt) {
717
                int textureStage = 0;
718
                int MDTStage = 0;
719

    
720
                SingleLayerIterator lyrIterator = new SingleLayerIterator(this);
721
                while (lyrIterator.hasNext()) {
722
                        FLayer lyr = lyrIterator.next();
723

    
724
                        Layer3DProps props3D = getLayer3DProps(lyr);
725
                        int dataType = props3D.getType();
726

    
727
                        if (lyr.isVisible()) { // if (true) {
728
                                if (dataType == Layer3DProps.layer3DVector)
729
                                        continue; // get/create cache service
730
                                FLayerCacheService cacheService = (FLayerCacheService) props3D
731
                                                .getCacheService();
732
                                if (cacheService == null) {
733
                                        cacheService = new FLayerCacheService(m_planet, props3D
734
                                                        .getCacheName(), lyr, m_viewProjection);
735
                                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
736
                                        props3D.setCacheService(cacheService);
737
                                }
738

    
739
                                Point tileIndices = new Point(evt.getX(), evt.getY());
740
                                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
741

    
742
                                String tileFileName;
743

    
744
                                if (cacheService.intersectsLayer(tileNum)) { // extent test
745
                                        try {
746
                                                tileFileName = cacheService.getTileAsFName(tileNum);
747
                                        } catch (CacheServiceException e) {
748
                                                return;
749
                                        }
750

    
751
                                        if (dataType == Layer3DProps.layer3DImage) {
752
                                                // float opacity = 1.0f;
753
                                                String fileExtension = "png";
754
                                                m_planet.setTexture(evt.getTilePagedLod(),
755
                                                                tileFileName, textureStage);
756
                                                m_planet.setTextureOpacityLayer(textureStage, props3D
757
                                                                .getOpacity());
758
                                                textureStage++;
759
                                        } else if (dataType == Layer3DProps.layer3DElevation) {
760
                                                String fileExtension = "tif";
761
                                                m_planet.setHeightfield(evt.getTilePagedLod(),
762
                                                                tileFileName, MDTStage);
763
                                                m_planet.setVerticalExaggerationLayer(MDTStage, props3D
764
                                                                .getVerticalEx());
765
                                                MDTStage++;
766
                                        }
767
                                } else { // no intersection
768
                                        if (dataType == Layer3DProps.layer3DImage) {
769
                                                m_planet.setTexture(evt.getTilePagedLod(), "",
770
                                                                textureStage++);
771
                                        }
772
                                        if (dataType == Layer3DProps.layer3DElevation) {
773
                                                m_planet.setHeightfield(evt.getTilePagedLod(), "",
774
                                                                MDTStage);
775
                                        }
776
                                }
777
                        } else {
778
                                if (dataType == Layer3DProps.layer3DImage) {
779
                                        textureStage++;
780
                                }
781
                                if (dataType == Layer3DProps.layer3DElevation) {
782
                                        MDTStage++;
783
                                }
784
                        } // REPAINTING VIEWER
785
                        if (m_canvas3d != null)
786
                                m_canvas3d.repaint();
787
                }
788
        }
789

    
790
        public void requestMDTLayer(TileEvent evt) {
791

    
792
                // TODO : All this method are not tested
793
                // ignore for now
794

    
795
                /* ********** UNCOMENT FOR TEST IT *************************** */
796
                int order = evt.getRequestedLayer();
797
                ArrayList imageLayers = (ArrayList) m_layerLists
798
                                .get(Layer3DProps.layer3DElevation);
799
                FLayer layer = (FLayer) imageLayers.get(order);
800
                if ((layer == null) || (!layer.isVisible()))
801
                        return;
802

    
803
                Layer3DProps props3D = getLayer3DProps(layer);
804
                // get/create cache service
805
                FLayerCacheService cacheService = (FLayerCacheService) props3D
806
                                .getCacheService();
807
                if (cacheService == null) {
808
                        cacheService = new FLayerCacheService(m_planet, props3D
809
                                        .getCacheName(), layer, m_viewProjection);
810
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
811
                        props3D.setCacheService(cacheService);
812
                }
813

    
814
                int dataType = props3D.getType();
815
                Point tileIndices = new Point(evt.getX(), evt.getY());
816
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
817

    
818
                String tileFileName;
819

    
820
                if (cacheService.intersectsLayer(tileNum)) { // extent test
821
                        try {
822
                                tileFileName = cacheService.getTileAsFName(tileNum);
823
                        } catch (CacheServiceException e) {
824
                                return;
825
                        }
826

    
827
                        if (dataType == Layer3DProps.layer3DElevation) {
828
                                String fileExtension = "tif";
829
                                // evt.getTilePagedLod().setHeightField(tileFileName,
830
                                // fileExtension, order);
831
                                m_planet.setHeightfield(evt.getTilePagedLod(), tileFileName,
832
                                                order);
833
                                // m_planet.setVerticalExaggeration(order,
834
                                // ((ProjectView3D) this.m_viewProjection)
835
                                // .getVerticalExaggeration());
836
                                m_planet.setVerticalExaggerationLayer(order, props3D
837
                                                .getVerticalEx());
838

    
839
                        }
840
                } else { // no intersection for elevation layer
841
                        // This code are not correctly for elevation layer
842
                        if (dataType == Layer3DProps.layer3DImage) {
843
                                m_planet.setHeightfield(evt.getTilePagedLod(), "", order);
844
                                // evt.getTilePagedLod().setHeightField("", "", order);
845
                        }
846
                }
847

    
848
                // REPAINTING VIEWWER
849
                if (m_canvas3d != null)
850
                        m_canvas3d.repaint();
851
        
852
        }
853

    
854
        public void requestTextureLayer(TileEvent evt) {
855

    
856
                int order = evt.getRequestedLayer();
857
                ArrayList imageLayers = (ArrayList) m_layerLists
858
                                .get(Layer3DProps.layer3DImage);
859

    
860
                // if there are not one layer return
861
                if (imageLayers.size() == 0)
862
                        return;
863
                FLayer layer = (FLayer) imageLayers.get(order);
864
                if ((layer == null) || (!layer.isVisible()))
865
                        return;
866

    
867
                Layer3DProps props3D = getLayer3DProps(layer);
868
                // get/create cache service
869
                FLayerCacheService cacheService = (FLayerCacheService) props3D
870
                                .getCacheService();
871
                if (cacheService == null) {
872
                        cacheService = new FLayerCacheService(m_planet, props3D
873
                                        .getCacheName(), layer, m_viewProjection);
874
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
875
                        props3D.setCacheService(cacheService);
876
                }
877

    
878
                int dataType = props3D.getType();
879
                Point tileIndices = new Point(evt.getX(), evt.getY());
880
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
881

    
882
                String tileFileName;
883

    
884
                if (cacheService.intersectsLayer(tileNum)) { // extent test
885
                        try {
886
                                tileFileName = cacheService.getTileAsFName(tileNum);
887
                        } catch (CacheServiceException e) {
888
                                return;
889
                        }
890

    
891
                        if (dataType == Layer3DProps.layer3DImage) {
892
                                // float opacity = 1.0f;
893
                                String fileExtension = "png";
894
                                // @TODO:aplicar texturas al planeta
895
                                // evt.getTilePagedLod().setTexture(tileFileName, fileExtension,
896
                                // order);
897
                                m_planet.setTexture(evt.getTilePagedLod(), tileFileName, order);
898
                                m_planet.setTextureOpacityLayer(order, props3D.getOpacity());
899
                        }
900
                        /*
901
                         * else { String fileExtension = "tif";
902
                         * evt.getTilePagedLod().setHeightField(tileFileName,
903
                         * fileExtension); }
904
                         */
905
                } else { // no intersection
906
                        if (dataType == Layer3DProps.layer3DImage) {
907
                                m_planet.setTexture(evt.getTilePagedLod(), "", order);
908
                                // evt.getTilePagedLod().setTexture("", "", order);
909
                        }
910
                }
911

    
912
                // REPAINTING VIEWWER
913
                if (m_canvas3d != null)
914
                        m_canvas3d.repaint();
915
        }
916

    
917
        private void PrintDebugLayers() {
918
                System.out.println("===========================");
919
                for (int iList = 0; iList < 3; iList++) {
920
                        ArrayList layerList = (ArrayList) m_layerLists.get(iList);
921
                        System.out.println("===== List " + iList + "=====");
922
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
923
                                FLayer layer = (FLayer) layerList.get(iLayer);
924
                                System.out.println("  Layer " + layer.getName());
925
                                Layer3DProps props3D = getLayer3DProps(layer);
926
                                System.out.println("    Type " + props3D.getType());
927
                                System.out.println("    Order " + props3D.getOrder());
928
                        }
929
                }
930
        }
931

    
932
        // this 2 method are for copy, cut and paste layer between 2 diferent views
933
        // (view -> view3D and view3D -> view)
934
        public boolean addLayerFromXMLEntity(XMLEntity xml, String name) {
935
                fmap.clearErrors();
936
                this.addLayerFromXML(xml, name);
937

    
938
                return (fmap.getLayersError().size() == 0);
939

    
940
        }
941

    
942
        private void addLayerFromXML(XMLEntity xml, String name) {
943
                FLayer layer = null;
944
                long t1 = System.currentTimeMillis();
945
                try {
946
                        if (name == null)
947
                                name = xml.getName();
948

    
949
                        String className = xml.getStringProperty("className");
950

    
951
                        if (className.equals(FLyrVect.class.getName())) {
952
                                String type = xml.getStringProperty("type");
953
                                if ("vectorial".equals(type)) {
954
                                        // String recordsetName =
955
                                        // xml.getChild(i).getStringProperty("recordset-name");
956
                                        IProjection proj = null;
957
                                        if (xml.contains("proj")) {
958
                                                proj = CRSFactory.getCRS(xml.getStringProperty("proj"));
959
                                        } else {
960
                                                proj = this.getMapContext().getViewPort()
961
                                                                .getProjection();
962
                                        }
963
                                        if (xml.contains("file")) {
964
                                                Driver d;
965
                                                try {
966
                                                        d = LayerFactory.getDM().getDriver(
967
                                                                        xml.getStringProperty("driverName"));
968
                                                } catch (DriverLoadException e1) {
969
                                                        throw new XMLException(e1);
970
                                                }
971
                                                layer = LayerFactory.createLayer(name,
972
                                                                (VectorialFileDriver) d, new File(xml
973
                                                                                .getStringProperty("file")), proj);
974

    
975
                                                checkProjection(layer, this.getMapContext()
976
                                                                .getViewPort());
977

    
978
                                        }
979
                                        if (xml.contains("db")) {
980

    
981
                                                String driverName = xml.getStringProperty("db");
982
                                                VectorialDatabaseDriver driver;
983
                                                try {
984
                                                        driver = (VectorialDatabaseDriver) LayerFactory
985
                                                                        .getDM().getDriver(driverName);
986
                                                        // Hay que separar la carga de los datos del
987
                                                        // XMLEntity del load.
988
                                                        driver.setXMLEntity(xml.getChild(2));
989

    
990
                                                        boolean loadOk = false;
991
                                                        try {
992
                                                                ((DefaultDBDriver) driver).load();
993
                                                                if (((DefaultDBDriver) driver).getConnection() != null) {
994
                                                                        loadOk = true;
995
                                                                }
996

    
997
                                                        } catch (DriverException e) {
998
                                                                e.printStackTrace();
999
                                                                loadOk = false;
1000

    
1001
                                                        }
1002

    
1003
                                                        layer = LayerFactory.createDBLayer(driver, name,
1004
                                                                        proj);
1005
                                                        if (!loadOk) {
1006
                                                                layer.setAvailable(false);
1007
                                                        }
1008

    
1009
                                                } catch (DriverLoadException e) {
1010
                                                        e.printStackTrace();
1011
                                                        throw new XMLException(e);
1012
                                                }
1013

    
1014
                                        }
1015
                                        // Clases con algun driver gen�rico creado por otro
1016
                                        // programador
1017
                                        if (xml.contains("other")) {
1018

    
1019
                                                String driverName = xml.getStringProperty("other");
1020
                                                VectorialDriver driver = null;
1021
                                                try {
1022
                                                        driver = (VectorialDriver) LayerFactory.getDM()
1023
                                                                        .getDriver(driverName);
1024
                                                } catch (DriverLoadException e) {
1025
                                                        // Si no existe ese driver, no pasa nada.
1026
                                                        // Puede que el desarrollador no quiera que
1027
                                                        // aparezca en el cuadro de di�logo y ha metido
1028
                                                        // el jar con sus clases en nuestro directorio lib.
1029
                                                        // Intentamos cargar esa clase "a pelo".
1030
                                                        if (xml.getChild(2).contains("className")) {
1031
                                                                String className2 = xml.getChild(2)
1032
                                                                                .getStringProperty("className");
1033
                                                                try {
1034
                                                                        driver = (VectorialDriver) Class.forName(
1035
                                                                                        className2).newInstance();
1036
                                                                } catch (Exception e1) {
1037
                                                                        throw new XMLException(e1);
1038
                                                                }
1039
                                                        }
1040
                                                } catch (NullPointerException npe) {
1041
                                                        // Si no existe ese driver, no pasa nada.
1042
                                                        // Puede que el desarrollador no quiera que
1043
                                                        // aparezca en el cuadro de di�logo y ha metido
1044
                                                        // el jar con sus clases en nuestro directorio lib.
1045
                                                        // Intentamos cargar esa clase "a pelo".
1046
                                                        if (xml.getChild(2).contains("className")) {
1047
                                                                String className2 = xml.getChild(2)
1048
                                                                                .getStringProperty("className");
1049
                                                                try {
1050
                                                                        driver = (VectorialDriver) Class.forName(
1051
                                                                                        className2).newInstance();
1052
                                                                } catch (Exception e1) {
1053
                                                                        throw new XMLException(e1);
1054
                                                                }
1055
                                                        }
1056
                                                }
1057
                                                if (driver instanceof IPersistance) {
1058
                                                        IPersistance persist = (IPersistance) driver;
1059
                                                        persist.setXMLEntity(xml.getChild(2));
1060
                                                }
1061
                                                layer = LayerFactory.createLayer(name, driver, proj);
1062
                                        }
1063

    
1064
                                } else if ("raster".equals(type)) {
1065
                                        /*
1066
                                         * if (xml.getChild(i).contains("file")) { Driver d =
1067
                                         * LayerFactory.getDM().getDriver(xml.getChild(i).getStringProperty("driverName"));
1068
                                         * layer = LayerFactory.createLayer(s[i], , new
1069
                                         * File(xml.getChild(i).getStringProperty("file")),
1070
                                         * this.getFMap().getViewPort().getProjection()); }
1071
                                         */}
1072

    
1073
                                layer.setXMLEntity(xml);
1074

    
1075
                                // } else if (className.equals(FLyrWMS.class.getName())) {
1076
                                // try {
1077
                                // layer = LayerFactory.createLayer(s[i],
1078
                                // StringUtilities.string2Rect(
1079
                                // xml.getChild(i).getStringProperty("fullExtent")),
1080
                                // new URL(xml.getChild(i).getStringProperty("host")),
1081
                                // xml.getChild(i).getStringProperty("format"),
1082
                                // xml.getChild(i).getStringProperty("layerQuery"),
1083
                                // xml.getChild(i).getStringProperty("infoLayerQuery"),
1084
                                // xml.getChild(i).getStringProperty("srs"));
1085
                                // layer.setXMLEntity(xml.getChild(i));
1086
                                // } catch (MalformedURLException e) {
1087
                                // throw new XMLException(e);
1088
                                // }
1089
                        } else if (className.equals((FLyrRaster.class.getName()))) {
1090
                                // if (xml.getChild(i).contains("file")) {
1091
                                /*
1092
                                 * layer = LayerFactory.createLayer(s[i],
1093
                                 * xml.getChild(i).getStringProperty("driverName"), new
1094
                                 * File(xml.getChild(i).getStringProperty("file")),
1095
                                 * this.getFMap().getViewPort().getProjection());
1096
                                 */
1097
                                layer = new FLyrRaster();
1098
                                layer.setName(name);
1099
                                if (!xml.contains("proj"))
1100
                                        ((FLyrRaster) layer).setProjection(this.getMapContext()
1101
                                                        .getViewPort().getProjection());
1102
                                layer.setXMLEntity(xml);
1103
                                try {
1104
                                        layer.load();
1105
                                } catch (DriverIOException e) {
1106
                                        throw new XMLException(e);
1107
                                }
1108

    
1109
                        } else if (className.equals((FLayers.class.getName()))) {
1110
                                layer = new FLayers(getMapContext(), this);
1111
                                layer.setXMLEntity(xml);
1112
                        } else {
1113
                                // Capas Nuevas (externas)
1114
                                Class clase = Class.forName(className);
1115
                                layer = (FLayer) clase.newInstance();
1116
                                layer.setName(name);
1117
                                layer.setXMLEntity(xml);
1118
                                try {
1119
                                        layer.load();
1120
                                } catch (DriverIOException e) {
1121
                                        throw new XMLException(e);
1122
                                }
1123

    
1124
                        }
1125

    
1126
                        this.addLayer(layer);
1127
                        long t2 = System.currentTimeMillis();
1128
                        // logger.debug("layer: "+ layer.getName() +" loaded. " + (t2-t1) +
1129
                        // " msecs.");
1130
                        // Comprobar que la proyecci�n es la misma que la de FMap
1131
                        // Si no lo es, es una capa que est� reproyectada al vuelo
1132
                        IProjection proj = layer.getProjection();
1133
                        if ((proj != null))
1134
                                if (proj != getMapContext().getProjection()) {
1135
                                        ICoordTrans ct = proj
1136
                                                        .getCT(getMapContext().getProjection());
1137
                                        // TODO: REVISAR CON LUIS
1138
                                        // Se lo fijamos a todas, luego cada una que se reproyecte
1139
                                        // si puede, o que no haga nada
1140
                                        layer.setCoordTrans(ct);
1141
                                        // NOTA: DESPU�S DE ESTO DEBER�AMOS CREAR LAS ETIQUETAS
1142
                                        // SI ES NECESARIO.
1143
                                        // TODO: REVISAR A FONDO ESTO, PORQUE LAS ETIQUETAS SE CREAN
1144
                                        // 2 VECES SI HAY REPROYECC�N
1145
                                        if (layer instanceof FLyrVect) {
1146
                                                FLyrVect lyrVect = (FLyrVect) layer;
1147
                                                VectorialLegend legend = (VectorialLegend) lyrVect
1148
                                                                .getLegend();
1149
                                                if (legend.getLabelField() != null) {
1150
                                                        lyrVect.createLabelLayer(lyrVect.getRecordset());
1151
                                                }
1152

    
1153
                                        }
1154
                                }
1155
                } catch (Exception e) {
1156
                        fmap.addLayerError(xml.getStringProperty("name"));
1157
                        // loadLayerException.addException(e);
1158
                        /*
1159
                         * if (layer!=null){ layer.setActive(false);
1160
                         * layer.setVisible(false); this.addLayer(layer); }
1161
                         */
1162
                        // throw new XMLException(e);
1163
                        System.err.println("No se ha podido cargar la capa : "
1164
                                        + xml.getStringProperty("name"));
1165
                        // logger.debug("No se ha podido cargar la capa :
1166
                        // "+xml.getStringProperty("name") + ". Raz�n:");
1167
                        // logger.debug(e.fillInStackTrace());
1168
                        e.printStackTrace();
1169
                }
1170

    
1171
        }
1172

    
1173
        // funcion que comprueba la proyeccion y en caso de no coincidir pregunta si
1174
        // se quiere reproyectar
1175
        private void checkProjection(FLayer lyr, ViewPort viewPort) {
1176
                if (lyr instanceof FLyrVect) {
1177
                        FLyrVect lyrVect = (FLyrVect) lyr;
1178
                        IProjection proj = lyr.getProjection();
1179
                        // Comprobar que la projecci�n es la misma que la vista
1180
                        if (proj == null) {
1181
                                // SUPONEMOS que la capa est� en la proyecci�n que
1182
                                // estamos pidiendo (que ya es mucho suponer, ya).
1183
                                lyrVect.setProjection(viewPort.getProjection());
1184
                                return;
1185
                        }
1186
                        if (proj != viewPort.getProjection()) {
1187
                                int option = JOptionPane.YES_OPTION;
1188
                                if (!CRSFactory.doesRigurousTransformations()) {
1189
                                        option = JOptionPane.showConfirmDialog(null, PluginServices
1190
                                                        .getText(this, "reproyectar_aviso"), PluginServices
1191
                                                        .getText(this, "reproyectar_pregunta"),
1192
                                                        JOptionPane.YES_NO_OPTION);
1193
                                }
1194

    
1195
                                if (option == JOptionPane.NO_OPTION) {
1196
                                        return;
1197
                                } else {
1198
                                        ICoordTrans ct = proj.getCT(viewPort.getProjection());
1199
                                        lyrVect.setCoordTrans(ct);
1200
                                        System.err.println("coordTrans = " + proj.getAbrev() + " "
1201
                                                        + viewPort.getProjection().getAbrev());
1202
                                }
1203
                        }
1204
                }
1205

    
1206
        }
1207

    
1208
        public Node getSpecialNode() {
1209
                return this.m_canvas3d.getOSGViewer().getSpecialNode(0);
1210
        }
1211

    
1212
        public IViewerContainer getCanvas3d() {
1213
                return m_canvas3d;
1214
        }
1215

    
1216
        public void setCanvas3d(IViewerContainer m_canvas3d) {
1217
                this.m_canvas3d = m_canvas3d;
1218
        }
1219

    
1220
        public float getVerticalExageration() {
1221
                return verticalExageration;
1222
        }
1223

    
1224
        public void setVerticalExageration(float verticalExageration) {
1225
                this.verticalExageration = verticalExageration;
1226
        }
1227

    
1228
}