Statistics
| Revision:

gvsig-3d / 2.0 / trunk / org.gvsig.gvsig3d / org.gvsig.gvsig3d.lib / org.gvsig.gvsig3d.lib.impl / src / main / java / org / gvsig / gvsig3d / impl / map3d / MapContext3DImpl.java @ 257

History | View | Annotate | Download (33.2 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.gvsig3d.impl.map3d;
23

    
24
import java.awt.Graphics2D;
25
import java.awt.Point;
26
import java.awt.geom.AffineTransform;
27
import java.awt.geom.Rectangle2D;
28
import java.awt.image.BufferedImage;
29
import java.awt.image.ImagingOpException;
30
import java.io.File;
31
import java.io.IOException;
32
import java.util.Hashtable;
33

    
34
import javax.print.attribute.PrintRequestAttributeSet;
35

    
36
import org.cresques.cts.IProjection;
37
import org.gvsig.fmap.mapcontext.ViewPort;
38
import org.gvsig.fmap.mapcontext.layers.FLayer;
39
import org.gvsig.fmap.mapcontext.layers.FLayers;
40
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
41
import org.gvsig.fmap.mapcontext.layers.LayerListener;
42
import org.gvsig.fmap.mapcontext.layers.SelectionEvent;
43
import org.gvsig.fmap.mapcontext.layers.SingleLayerIterator;
44
import org.gvsig.fmap.mapcontext.layers.operations.Classifiable;
45
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
46
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendChangedEvent;
47
import org.gvsig.gvsig3d.map3d.Layer3DProps;
48
import org.gvsig.gvsig3d.map3d.MapContext3D;
49
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
50
import org.gvsig.osgvp.core.osg.Image;
51
import org.gvsig.osgvp.core.osg.Matrix;
52
import org.gvsig.osgvp.core.osg.Node;
53
import org.gvsig.osgvp.core.osg.Vec3;
54
import org.gvsig.osgvp.core.osg.Vec4;
55
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
56
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
57
import org.gvsig.osgvp.exceptions.node.NodeException;
58
import org.gvsig.osgvp.terrain.JavaDataDriver;
59
import org.gvsig.osgvp.terrain.Layer;
60
import org.gvsig.osgvp.terrain.LayerManager;
61
import org.gvsig.osgvp.terrain.RequestDataEvent;
62
import org.gvsig.osgvp.terrain.Terrain;
63
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
64
import org.gvsig.osgvp.terrain.TerrainViewer;
65
import org.gvsig.osgvp.terrain.UpdateDataEvent;
66
import org.gvsig.osgvp.viewer.Camera;
67
import org.gvsig.osgvp.viewer.IViewerContainer;
68
import org.gvsig.tools.task.Cancellable;
69

    
70
/**
71
 * @author gvSIG Team
72
 * @version $Id$
73
 * 
74
 */
75
public class MapContext3DImpl extends MapContext3D {
76

    
77
        private Terrain _terrain;
78
        private IViewerContainer _canvas3d;
79
        private TerrainViewer _terrainViewer;
80
        private LayerManager _terrainLayerManager;
81
        private JavaDataDriver _terrainDataManager = null;
82

    
83
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
84
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
85

    
86
        private IProjection _viewProjection;
87
        private float _verticalExaggeration;
88
        private boolean _bEmptyView = true;
89
        private boolean _bListenToLegend = true;
90
        private boolean _bLoading = false;
91
        private TerrainViewer _canvasoff = null;
92
        private boolean _renewCanvasOff = false;
93

    
94
        TerrainViewer _printViewer = null;
95
        Layer _testRasterLayer = null;
96

    
97
        private boolean visibilityChange = false;
98

    
99
        
100
        public MapContext3DImpl(){}
101

    
102
        public MapContext3DImpl(ViewPort vp) {
103
                super(vp);
104
        }
105
        
106
        public MapContext3DImpl(FLayers fLayers, ViewPort vp){
107
                
108
                super(fLayers,vp);
109
                
110
        }
111

    
112
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
113
                        double scale) {
114

    
115
                if (_canvas3d == null || _canvas3d.getOSGViewer() == null)
116
                        return;
117
                double x = getViewPort().getOffset().getX();
118
                double y = getViewPort().getOffset().getY();
119
                double w = image.getWidth();
120
                double h = image.getHeight();
121

    
122
                if (_canvasoff == null) {
123
                        try {
124
                                _canvasoff = new TerrainViewer();
125
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
126

    
127
                                Terrain planetView3D = ((TerrainViewer) _canvas3d
128
                                                .getOSGViewer()).getTerrain(0);
129
                                Terrain terrain = new Terrain();
130
                                terrain.setCoordinateSystemType(planetView3D
131
                                                .getCoordinateSystemType());
132
                                terrain.setCoordinateSystemName(planetView3D
133
                                                .getCoordinateSystemName());
134
                                terrain.setCoordinateSystemFormat(planetView3D
135
                                                .getCoordinateSystemFormat());
136
                                terrain.setExtent(planetView3D.getExtent());
137
                                terrain.setTerrainName(planetView3D.getTerrainName());
138

    
139
                                terrain.init();
140
                                terrain.setLayerManager(_terrainLayerManager);
141

    
142
                                _canvasoff.addTerrain(terrain);
143
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
144
                                                .getOSGViewer()).getFeatures()));
145
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
146
                                                .getClearColor();
147
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(),
148
                                                color.w());
149
                                this.setRenewCanvasOff(false);
150
                        } catch (NodeException e) {
151
                                // TODO Auto-generated catch block
152
                                e.printStackTrace();
153
                        }
154

    
155
                }
156

    
157
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
158
                Matrix refView = refCam.getViewMatrix();
159
                Matrix refProy = refCam.getProjectionMatrix();
160
                Matrix.Perspective pers = refProy.getPerspective();
161
                Camera viewCam = new Camera();
162
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
163
                                pers.zFar);
164
                viewCam.setViewMatrix(refView);
165
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
166
                _canvasoff.setCamera(viewCam);
167
                _canvasoff.takeScreenshotToMemory();
168
                _canvasoff.frame();
169

    
170
                Image OSGimage = _canvasoff.getScreenshotImage();
171

    
172
                BufferedImage img = null;
173
                try {
174
                        img = OSGimage.getBufferedImage();
175
                } catch (ImageConversionException e1) {
176
                        // TODO Auto-generated catch block
177
                        e1.printStackTrace();
178
                } catch (IOException e1) {
179
                        // TODO Auto-generated catch block
180
                        e1.printStackTrace();
181
                }
182

    
183
                double scalex = w / img.getWidth(null);
184
                double scaley = h / img.getHeight(null);
185
                try {
186
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
187
                                        scaley);
188
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
189
                        xpos.concatenate(xform);
190
                        g.drawRenderedImage(img, xpos);
191
                } catch (ImagingOpException e) {
192

    
193
                }
194

    
195
        }
196

    
197
        public void CreateOSGLayer(FLayer layer, Layer3DProps props3d) {
198
                // if (_terrain == null || _viewProjection == null)
199
                // return;
200
                //
201
                // OSGCacheService cacheService = (OSGCacheService) props3D
202
                // .getCacheService();
203
                // if (cacheService == null) {
204
                // cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
205
                // .getCacheName(), layer, _viewProjection);
206
                // cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
207
                // props3D.setCacheService(cacheService);
208
                // }
209
                //
210
                // // use VectorCacheService to add features to planet
211
                // cacheService.AddFeaturesToTerrain();
212

    
213
        }
214

    
215
        public void DeleteOSGLayer(FLayer layer, Layer3DProps props3d) {
216
                // if (_terrain == null || _viewProjection == null)
217
                // return;
218
                //
219
                // OSGCacheService cacheService = (OSGCacheService) props3D
220
                // .getCacheService();
221
                // if (cacheService != null) {
222
                // // use VectorCacheService to delete features to terrain
223
                // cacheService.DeleteFeaturesToTerrain();
224
                // }
225

    
226
        }
227

    
228
        public void PrintDebugLayers() {
229
                if (_terrainLayerManager != null) {
230
                        System.out.println("===========================");
231
                        System.out.println("Total terrain layers: "
232
                                        + _terrainLayerManager.getNumLayers());
233
                        System.out.println("===========================");
234
                }
235
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
236
                int pos = 0;
237
                while (lyrIterator.hasNext()) {
238
                        FLayer layer = lyrIterator.next();
239
                        System.out.println("  Layer " + layer.getName());
240
                        Layer3DProps props3D = getLayer3DProps(layer);
241
                        System.out.println("    Type " + props3D.getType());
242
                        System.out.println("    Order " + pos);
243
                        pos++;
244
                }
245

    
246
        }
247

    
248
        public void activationChanged(LayerEvent e) {
249

    
250
        }
251

    
252
        public void addCurrentLayers() {
253

    
254
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
255
                while (lyrIterator.hasNext()) {
256
                        FLayer layer = lyrIterator.next();
257
                        Layer3DProps props = getLayer3DProps(layer);
258
                        addLayerToTerrain(layer, false);
259
                }
260

    
261
        }
262

    
263
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
264

    
265
                 Layer3DProps props3D = getLayer3DProps(layer);
266
                //
267
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
268
                // CreateVectors(layer, props3D); // special case for now without
269
                // // disk cache
270
                // } else
271
                // if (props3D.getType() == Layer3DProps.layer3DOSG) {
272
                // CreateOSGLayer(layer, props3D);
273
                // } else {
274
                // Rectangle2D layerExtent = null;
275
                // try {
276
                // layerExtent = layer.getFullExtent();
277
                // } catch (ExpansionFileReadException e) {
278
                // e.printStackTrace();
279
                // } catch (ReadDriverException e) {
280
                // e.printStackTrace();
281
                // }
282
                // if (layerExtent == null) { // hack for missing extents
283
                // if (_terrain.getCoordinateSystemType() ==
284
                // Terrain.CoordinateSystemType.GEOCENTRIC)
285
                // layerExtent =
286
                // new Rectangle2D.Double(-180.0, -90.0, 360.0, 180.0);
287
                // else
288
                // layerExtent =
289
                // new Rectangle2D.Double(-20000000.0, -10000000.0,
290
                // 40000000.0, 20000000.0);
291
                // // TODO toggle comment because this code use WCS extension.
292
                // // When
293
                // // WCS extension runs correctly uncoment!!!
294
                //
295
                // if (layer instanceof FLyrWCS)
296
                // ((FLyrWCS) layer).setFullExtent(layerExtent);
297
                // }
298
                //
299
                // Extent extent = null;
300
                // if (_terrain.getCoordinateSystemType() ==
301
                // CoordinateSystemType.PROJECTED) {
302
                // extent =
303
                // new Extent(layerExtent.getMinX(),
304
                // layerExtent.getMinY(), layerExtent.getMaxX(),
305
                // layerExtent.getMaxY());
306
                // } else {
307
                // extent =
308
                // new Extent(Math.toRadians(layerExtent.getMinX()), Math
309
                // .toRadians(layerExtent.getMinY()), Math
310
                // .toRadians(layerExtent.getMaxX()), Math
311
                // .toRadians(layerExtent.getMaxY()));
312
                // }
313
                //
314
                // if (props3D.getType() == Layer3DProps.layer3DImage) {
315
                // RasterLayer rlayer = new RasterLayer();
316
                // rlayer.setEnabled(layer.isVisible());
317
                // rlayer.setExtent(extent);
318
                // rlayer.setOpacity(props3D.getOpacity());
319
                // rlayer.setDataDriver(_terrainDataManager);
320
                // _logger.warn("computed optimum level = "
321
                // + computeOptimumLevel(layer, 20, 256));
322
                // rlayer
323
                // .setMaxResolution(computeOptimumLevel(layer, 20, 256));
324
                // try {
325
                // _terrainLayerManager.addLayer(rlayer);
326
                // } catch (LayerManagementException e) {
327
                // // TODO Auto-generated catch block
328
                // e.printStackTrace();
329
                // }
330
                // _terrainFLayerMap.put(layer, rlayer);
331
                // _terrainLayerMap.put(rlayer.getLayerID(), layer);
332
                // props3D.setTerrainLayer(rlayer);
333
                // // Refresh cache for vector rasterized layers
334
                // if (layer.getClass().equals(FLyrVect.class)) {
335
                // refreshLayerInTerrain(props3D, true);
336
                // }
337
                // } else
338
                // if (props3D.getType() == Layer3DProps.layer3DElevation) {
339
                // HeightfieldLayer hlayer = new HeightfieldLayer();
340
                // hlayer.setEnabled(layer.isVisible());
341
                // hlayer.setExtent(extent);
342
                // hlayer.setVerticalExaggeration(props3D.getVerticalEx());
343
                // _logger.warn("computed optimum level = "
344
                // + computeOptimumLevel(layer, 20, 32));
345
                // hlayer.setMaxResolution(computeOptimumLevel(layer, 20,
346
                // 32));
347
                // hlayer.setDataDriver(_terrainDataManager);
348
                // try {
349
                // _terrainLayerManager.addLayer(hlayer);
350
                // } catch (LayerManagementException e) {
351
                // // TODO Auto-generated catch block
352
                // e.printStackTrace();
353
                // }
354
                // _terrainFLayerMap.put(layer, hlayer);
355
                // _terrainLayerMap.put(hlayer.getLayerID(), layer);
356
                // props3D.setTerrainLayer(hlayer);
357
                // } else
358
                // if (props3D.getType() == Layer3DProps.layer3DVectorMR) {
359
                // VectorLayer vlayer = new VectorLayer();
360
                // vlayer.setEnabled(true);
361
                // vlayer.setExtent(extent);
362
                // vlayer.setDensity(1.0f);
363
                // vlayer.setDataDriver(_terrainDataManager);
364
                // try {
365
                // _terrainLayerManager.addLayer(vlayer);
366
                // } catch (LayerManagementException e) {
367
                // // TODO Auto-generated catch block
368
                // e.printStackTrace();
369
                // }
370
                // _terrainFLayerMap.put(layer, vlayer);
371
                // _terrainLayerMap.put(vlayer.getLayerID(), layer);
372
                // props3D.setTerrainLayer(vlayer);
373
                // }
374
                //
375
                // if (bVerifyLegend) {
376
                // _bListenToLegend = false;
377
                // props3D.VerifyLegend(_terrain.getTerrainName());
378
                // _bListenToLegend = true;
379
                // }
380
                // }
381

    
382
        }
383

    
384
        public int computeOptimumLevel(FLayer layer, int maxLevel, double tileSize) {
385
                int level = maxLevel;
386
                // if (!(layer instanceof FLyrRasterSE))
387
                // return level;
388
                //
389
                // Rectangle2D ext = null;
390
                // try {
391
                // ext = layer.getFullExtent();
392
                // } catch (ReadDriverException e1) {
393
                // NotificationManager.addError("Error al obtener el extent", e1);
394
                // }
395
                //
396
                // ArrayList attr = ((FLyrRasterSE) layer).getAttributes();
397
                // if (attr == null) {
398
                // return level;
399
                // }
400
                // int width = 0, height = 0;
401
                // for (int i = 0; i < attr.size(); i++) {
402
                // Object[] a = (Object[]) attr.get(i);
403
                // if (a[0].toString().equals("Width"))
404
                // width = ((Integer) a[1]).intValue();
405
                // if (a[0].toString().equals("Height"))
406
                // height = ((Integer) a[1]).intValue();
407
                // }
408
                //
409
                // if (ext != null && width != 0 && height != 0) {
410
                //
411
                // Extent destinationExtents = _terrain.getExtent();
412
                // double xMax = destinationExtents.xMax();
413
                // double xMin = destinationExtents.xMin();
414
                // double yMax = destinationExtents.yMax();
415
                // double yMin = destinationExtents.yMin();
416
                // int terrainType = _terrain.getCoordinateSystemType();
417
                // if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
418
                // xMax = Math.toDegrees(xMax);
419
                // xMin = Math.toDegrees(xMin);
420
                // yMax = Math.toDegrees(yMax);
421
                // yMin = Math.toDegrees(yMin);
422
                // }
423
                //
424
                // double destination_xRange = xMax - xMin;
425
                // double destination_yRange = yMax - yMin;
426
                // double AR = destination_xRange / destination_yRange;
427
                // int C1 = 1;
428
                // int R1 = 1;
429
                //
430
                // boolean swapAxis = AR < 1.0;
431
                // if (swapAxis)
432
                // AR = 1.0 / AR;
433
                //
434
                // double lower_AR = Math.floor(AR);
435
                // double upper_AR = Math.ceil(AR);
436
                //
437
                // if (AR < Math.sqrt(lower_AR * upper_AR)) {
438
                // C1 = (int) (lower_AR);
439
                // R1 = 1;
440
                // } else {
441
                // C1 = (int) (upper_AR);
442
                // R1 = 1;
443
                // }
444
                //
445
                // if (swapAxis) {
446
                // // std::swap(C1,R1);
447
                // int t = C1;
448
                // C1 = R1;
449
                // R1 = t;
450
                // }
451
                //
452
                // double source_xRange = ext.getMaxX() - ext.getMinX();
453
                // double source_yRange = ext.getMaxY() - ext.getMinY();
454
                //
455
                // float sourceResolutionX = ((float) source_xRange) / (float) width;
456
                // float sourceResolutionY = ((float) source_yRange) / (float) height;
457
                //
458
                // //
459
                // log(osg::NOTICE,"Source %s resX %f resY %f",source->getFileName().c_str(),
460
                // // sourceResolutionX, sourceResolutionX);
461
                //
462
                // int k_cols =
463
                // (int) (Math.ceil(1.0
464
                // + Math.log(destination_xRange
465
                // / (C1 * sourceResolutionX * tileSize)) / Math.log(2.0)));
466
                // int k_rows =
467
                // (int) (Math.ceil(1.0
468
                // + Math.log(destination_yRange
469
                // / (R1 * sourceResolutionY * tileSize)) / Math.log(2.0)));
470
                // level = Math.max(k_cols, k_rows);
471
                // level = Math.min(level, maxLevel);
472
                // level = Math.max(level, 0);
473
                // }
474
                return level;
475
        }
476

    
477
        public IViewerContainer getCanvas3d() {
478
                return _canvas3d;
479
        }
480

    
481
        public JavaDataDriver getDataManager() {
482
                return _terrainDataManager;
483
        }
484

    
485
        public Layer3DProps getLayer3DProps(FLayer layer) {
486
                // Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
487
                //
488
                // // Create instance of props for osg layers.
489
                // if (props3D == null) {
490
                // props3D = new Layer3DProps();
491
                // if (layer instanceof FLyrVect) {
492
                // FLyrVect nLayer = (FLyrVect) layer;
493
                // Driver driver;
494
                // try {
495
                // driver = nLayer.getRecordset().getDriver();
496
                // if (driver instanceof GvsigDriverOSG) {
497
                // props3D.setChooseType(false);
498
                // props3D.setType(Layer3DProps.layer3DOSG);
499
                // }
500
                // } catch (ReadDriverException e) {
501
                // // TODO Auto-generated catch block
502
                // e.printStackTrace();
503
                // }
504
                //
505
                // }
506
                // // Set the properties
507
                // props3D.setLayer(layer);
508
                //
509
                // props3D.initCacheName(_terrain.getCoordinateSystemType(),
510
                // _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
511
                // FLyrDefault baseLayer = (FLyrDefault) layer;
512
                // baseLayer.setProperty("3DLayerExtension", props3D);
513
                // props3D.setVerticalEx(getVerticalExaggeration());
514
                // } else {
515
                // if (_bLoading)
516
                // props3D.setChooseType(false);
517
                // props3D.setLayer(layer);
518
                // }
519

    
520
                // return props3D;
521

    
522
                return null;
523
        }
524

    
525
        public LayerManager getLayerManager() {
526
                return _terrainLayerManager;
527
        }
528

    
529
        public Node getSpecialNode() {
530
                Node specialNode = null;
531
                try {
532
                        specialNode = _terrainViewer.getFeature(0);
533
                } catch (ChildIndexOutOfBoundsExceptions e) {
534

    
535
                }
536
                return specialNode;
537
        }
538

    
539
        public Terrain getTerrain() {
540
                return _terrain;
541
        }
542

    
543
        public float getVerticalExaggeration() {
544
                return _verticalExaggeration;
545
        }
546

    
547
        public IProjection getViewProjection() {
548
                return _viewProjection;
549
        }
550

    
551
        public void invalidateVectorLayer(Layer3DProps props) {
552
                // TODO Auto-generated method stub
553
                // if (_terrain == null || _viewProjection == null)
554
                // return;
555
                //
556
                // VectorCacheService cacheService = (VectorCacheService) props
557
                // .getCacheService();
558
                // if (cacheService != null) {
559
                // // use VectorCacheService to add features to terrain
560
                // cacheService.refreshFeaturesToTerrain();
561
                // }
562

    
563
        }
564

    
565
        public boolean isRenewCanvasOff() {
566
                return _renewCanvasOff;
567
        }
568

    
569
        public void layerAdded(FLayers3D parent, FLayer layer) {
570
                
571
                System.out.println("Aรฑadida capa. Evento Capturado");
572
//                // to add group layers to 3D, just add recursively child data layers
573
//                if (layer instanceof FLayers) {
574
//                        FLayers group = (FLayers) layer;
575
//                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
576
//                                layerAdded((FLayers3D) group, group.getLayer(iChild));
577
//                        }
578
//                        getLayer3DProps(layer).setHooked(true);
579
//                        return;
580
//                }
581
//
582
//                if (layer instanceof Classifiable) {
583
//                        Classifiable legendLyr = (Classifiable) layer;
584
//                        // legendLyr.addLegendListener((LegendListener) this);
585
//                        this.addLayerListener(this);
586
//                }
587
//                layer.addLayerListener((LayerListener) this);
588
//
589
//                // listener to manage the selection for the layers
590
//                if (layer.getClass().equals(FLyrVect.class)) {
591
//                        FLyrVect lyr = (FLyrVect) layer;
592
//                        refreshLayerVectorsVisibility(lyr);
593
//                        try {
594
//                                SelectableDataSource recordSet = lyr.getRecordset();
595
//                                if (recordSet != null) {
596
//                                        SelectionSupport selectionSupport = recordSet
597
//                                                        .getSelectionSupport();
598
//                                        selectionSupport.addSelectionListener(this);
599
//                                }
600
//                        } catch (ReadDriverException e) {
601
//                                // TODO Auto-generated catch block
602
//                                e.printStackTrace();
603
//                        }
604
//                }
605
//
606
//                if (!_bLoading)
607
//                        addLayerToTerrain(layer, true);
608
//
609
//                // Only do this the first time to add layer
610
//                if (_bEmptyView && !_bLoading) {
611
//                        if (layers.getLayersCount() > 0) {
612
//                                try {
613
//                                        zoomToExtent(layer.getFullExtent());
614
//                                } catch (ExpansionFileReadException e) {
615
//                                        e.printStackTrace();
616
//                                } catch (ReadDriverException e) {
617
//                                        e.printStackTrace();
618
//                                }
619
//                                _bEmptyView = false;
620
//                        }
621
//                }
622
//
623
//                // PrintDebugLayers();
624

    
625
        }
626

    
627
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
628
                        int newPos) {
629
                // if (layer instanceof FLayers) {
630
                // FLayers group = (FLayers) layer;
631
                // if (newPos > oldPos) {
632
                // for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
633
                // layerMoved((FLayers3D) group, group.getLayer(iChild),
634
                // oldPos, newPos);
635
                // } else {
636
                // for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
637
                // layerMoved((FLayers3D) group, group.getLayer(iChild),
638
                // oldPos, newPos);
639
                // }
640
                // return;
641
                // }
642
                //
643
                // Layer3DProps props3D = getLayer3DProps(layer);
644
                // int type = props3D.getType();
645
                //
646
                // // Now reorder in layer manager only for terrain layer types
647
                // if ((type == Layer3DProps.layer3DOSG)
648
                // || ((type == Layer3DProps.layer3DVector)))
649
                // return;
650
                //
651
                // // Obtain the old position in the layer
652
                // Layer terrainLayer = _terrainFLayerMap.get(layer);
653
                // Vector<Integer> terrainOldPos=null;
654
                // try {
655
                // terrainOldPos = _terrainLayerManager
656
                // .getOrder(terrainLayer);
657
                // } catch (LayerManagementException e) {
658
                // // TODO Auto-generated catch block
659
                // e.printStackTrace();
660
                // }
661
                //
662
                // int terrainNewPos = 0;
663
                // // Compute the new position.
664
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
665
                // while (lyrIterator.hasNext()) {
666
                // FLayer auxLayer = lyrIterator.next();
667
                // if (auxLayer == layer)
668
                // break;
669
                // Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
670
                // if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
671
                // && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
672
                // terrainNewPos++;
673
                // }
674
                //
675
                // }
676
                //
677
                // if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
678
                // return;
679
                // if (terrainOldPos.get(0) != terrainNewPos)
680
                // try {
681
                // _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
682
                // } catch (LayerManagementException e) {
683
                // // TODO Auto-generated catch block
684
                // e.printStackTrace();
685
                // }
686
                //
687
                // System.out.println("En el toc antes era el " + oldPos +
688
                // " y ahora el "
689
                // + newPos);
690
                // System.out.println("En el terrain antes era el " + terrainOldPos
691
                // + " y ahora el " + terrainNewPos);
692
                //
693
                // PrintDebugLayers();
694

    
695
        }
696

    
697
        public void layerRemoved(FLayers3D parent, FLayer layer) {
698
                System.out.println("Removed layer");
699
                
700
                // to remove group layers to 3D, just remove recursively child data
701
                // layers
702
                // if (layer instanceof FLayers) {
703
                // FLayers group = (FLayers) layer;
704
                // for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
705
                // layerRemoved((FLayers3D) group, group.getLayer(iChild));
706
                // }
707
                // getLayer3DProps(layer).setHooked(false);
708
                // return;
709
                // }
710
                //
711
                // if (layer instanceof Classifiable) {
712
                // Classifiable legendLyr = (Classifiable) layer;
713
                // legendLyr.removeLegendListener((LegendListener) this);
714
                // }
715
                //
716
                // layer.removeLayerListener((LayerListener) this);
717
                //
718
                // removeLayerToTerrain(layer);
719
                //
720
                // // All layers are removed
721
                // if (layers.getLayersCount() == 0) {
722
                // _bEmptyView = true;
723
                // }
724
                //
725
                // PrintDebugLayers();
726

    
727
        }
728

    
729
        public void legendChanged(LegendChangedEvent e) {
730
                // if (!_bListenToLegend)
731
                // return;
732
                // if ((e == null) && (!visibilityChange)) {
733
                // // find layer whose legend changed
734
                // FLayer found = null;
735
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
736
                // while (lyrIterator.hasNext()) {
737
                // FLayer lyr = lyrIterator.next();
738
                // if (lyr instanceof FLyrVect) {
739
                // FLyrVect lyrVect = (FLyrVect) lyr;
740
                // long newDrawVersion = lyrVect.getDrawVersion();
741
                // Layer3DProps props3D = getLayer3DProps(lyrVect);
742
                // if ((newDrawVersion - props3D.drawVersion) >= 1) {
743
                // props3D.drawVersion = lyrVect.getDrawVersion();
744
                // refreshLayerInTerrain(props3D, true);
745
                // refreshLayerVectorsVisibility(lyrVect);
746
                // _bListenToLegend = false;
747
                // //props3D.VerifyLegend(_terrain.getTerrainName());
748
                // _bListenToLegend = true;
749
                //
750
                // }
751
                // }
752
                // }
753
                //
754
                // IWindow f = PluginServices.getMDIManager().getActiveWindow();
755
                // if (f instanceof BaseView) {
756
                // BaseView view3D = (BaseView) f;
757
                // view3D.getTOC().refresh();
758
                // }
759
                // }
760
                // visibilityChange = false;
761

    
762
        }
763

    
764
        public UpdateDataEvent loadData(RequestDataEvent rde) {
765
                
766
                System.out.println("Load data");
767
                if (_terrainLayerMap.size() == 0)
768
                        return null;
769
                if (rde == null)
770
                        return null;
771
                if (rde.getExtent() == null)
772
                        return null;
773
                if (rde.getLayer() == null)
774
                        return null;
775
                if (rde.getLayerManager() == null)
776
                        return null;
777

    
778
                UpdateDataEvent ude = new UpdateDataEvent();
779
                ude.copyDataFromRequest(rde);
780

    
781
                String layerID = rde.getLayer().getLayerID();
782
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
783
                if (layer == null)
784
                        return null;
785
                if (!layer.isVisible())
786
                        return null;
787

    
788
                Layer3DProps props3D = getLayer3DProps(layer);
789

    
790
                // get/create cache service
791
//                FLayerCacheService cacheService = (FLayerCacheService) props3D
792
//                                .getCacheService();
793
//                if (cacheService == null) {
794
//
795
//                        cacheService = new FLayerCacheService(_terrain,
796
//                                        props3D.getCacheName(), layer, _viewProjection);
797
//                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
798
//                        props3D.setCacheService(cacheService);
799
//
800
//                }
801

    
802
                int dataType = props3D.getType();
803
                Point tileIndices = new Point(rde.getTileX(), rde.getTileY());
804
                //TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
805

    
806
                String tileFileName = "";
807

    
808
                double minX, minY, width, height;
809

    
810
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
811
                        minX = rde.getExtent().xMin();
812
                        minY = rde.getExtent().yMin();
813
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
814
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
815
                } else {
816
                        minX = Math.toDegrees(rde.getExtent().xMin());
817
                        minY = Math.toDegrees(rde.getExtent().yMin());
818
                        width = Math.toDegrees(rde.getExtent().xMax()
819
                                        - rde.getExtent().xMin());
820
                        height = Math.toDegrees(rde.getExtent().yMax()
821
                                        - rde.getExtent().yMin());
822
                }
823
                boolean failData = false;
824

    
825
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
826
//                if (cacheService.intersectsLayer(extent)) { // extent test
827
//                        try {
828
//                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
829
//                                if (tileFileName == null)
830
//                                        failData = true;
831
//                        } catch (Exception e) {
832
//                                failData = true;
833
//                                NotificationManager.addInfo("Problem reading tile:" + tileNum,
834
//                                                e);
835
//                                e.printStackTrace();
836
//                        }
837
//
838
//                        if (failData) {
839
//                                return null;
840
//                                // ude.setFailData();
841
//                        } else {
842
//                                switch (dataType) {
843
//                                case Layer3DProps.layer3DImage:
844
//                                        ude.setRasterData(tileFileName, "gdal");
845
//                                        break;
846
//                                case Layer3DProps.layer3DElevation:
847
//                                        ude.setHeightfieldData(tileFileName, "gdal");
848
//                                        break;
849
//                                case Layer3DProps.layer3DVectorMR:
850
//                                        ude.setVectorData(tileFileName, "osg");
851
//                                        break;
852
//                                }
853
//                        }
854
//                }
855

    
856
                return ude;
857
                
858
        }
859

    
860
        public void nameChanged(LayerEvent e) {
861
                System.out.println("Name change");
862

    
863
        }
864

    
865
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
866
                
867
                System.out.println("Refresh");
868
                // if (props == null)
869
                // return;
870
                //
871
                // if (_terrain == null)
872
                // return; // view not opened yet
873
                //
874
                // // clear cache
875
                //
876
                //
877
                //
878
                // // refresh layer in terrain
879
                // int type = props.getType();
880
                // if ((type == Layer3DProps.layer3DImage)
881
                // || (type == Layer3DProps.layer3DElevation)
882
                // || (type == Layer3DProps.layer3DVectorMR)) {
883
                //
884
                // if (bRemoveCache) {
885
                //
886
                // String layerCacheDir = Layer3DProps.m_cacheDir + File.separator
887
                // + _terrain.getTerrainName() + File.separator + props.getCacheName();
888
                //
889
                // FLayerCacheService cacheServices = (FLayerCacheService)
890
                // props.getCacheService();
891
                // if(cacheServices != null)
892
                // {
893
                // try {
894
                // cacheServices.free();
895
                // props.setCacheService(null);
896
                // } catch (Throwable e) {
897
                // // TODO Auto-generated catch block
898
                // e.printStackTrace();
899
                // }
900
                // }
901
                //
902
                // removeCache(new File(layerCacheDir));
903
                // }
904
                // try {
905
                // _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
906
                // } catch (LayerManagementException e) {
907
                // // TODO Auto-generated catch block
908
                // e.printStackTrace();
909
                // }
910
                // } else if (type == Layer3DProps.layer3DVector) {
911
                // invalidateVectorLayer(props);
912
                // }
913

    
914
        }
915

    
916
        public boolean removeCache(File path) {
917
                if (path.exists()) {
918
                        File[] files = path.listFiles();
919
                        for (int i = 0; i < files.length; i++) {
920
                                if (files[i].isDirectory()) {
921
                                        removeCache(files[i]);
922
                                } else {
923
                                        files[i].delete();
924
                                }
925
                        }
926
                }
927
                return (path.delete());
928
        }
929

    
930
        public void removeLayerToTerrain(FLayer layer) {
931
                // TODO Auto-generated method stub
932
                // Layer3DProps props3D = getLayer3DProps(layer);
933
                //
934
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
935
                // DeleteVectors(layer, props3D);
936
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
937
                // DeleteOSGLayer(layer, props3D);
938
                // } else {
939
                // Layer terrainLayer = _terrainFLayerMap.get(layer);
940
                // if (terrainLayer != null) {
941
                // FLayerCacheService cacheService = (FLayerCacheService)
942
                // props3D.getCacheService();
943
                // if(cacheService != null)
944
                // try {
945
                // cacheService.free();
946
                // } catch (Throwable e) {
947
                // // TODO Auto-generated catch block
948
                // e.printStackTrace();
949
                // }
950
                // _terrainLayerMap.remove(terrainLayer.getLayerID());
951
                // _terrainFLayerMap.remove(layer);
952
                //
953
                // try {
954
                // _terrainLayerManager.removeLayer(terrainLayer);
955
                // } catch (LayerManagementException e) {
956
                // // TODO Auto-generated catch block
957
                // e.printStackTrace();
958
                // }
959
                // }
960
                // }
961

    
962
        }
963

    
964
        public void selectionChanged(SelectionEvent e) {
965
                // TODO Auto-generated method stub
966
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
967
                // while (lyrIterator.hasNext()) {
968
                // FLayer layer = lyrIterator.next();
969
                // Layer3DProps props3D = getLayer3DProps(layer);
970
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
971
                // if (layer.getClass().equals(FLyrVect.class)) {
972
                // FLyrVect lyr = (FLyrVect) layer;
973
                //
974
                // FBitSet selection = null;
975
                // try {
976
                // selection = lyr.getRecordset().getSelectionSupport()
977
                // .getSelection();
978
                // } catch (ReadDriverException e1) {
979
                // // TODO Auto-generated catch block
980
                // e1.printStackTrace();
981
                // }
982
                //
983
                // if ((selection.cardinality() == 0)
984
                // || (!(selection.isEmpty()))) {
985
                // Layer3DProps props = Layer3DProps
986
                // .getLayer3DProps(layer);
987
                // refreshLayerInTerrain(props, true);
988
                // if (layer instanceof FLyrVect) {
989
                // FLyrVect fvect = (FLyrVect) layer;
990
                // props.drawVersion = fvect.getDrawVersion();
991
                // }
992
                // }
993
                // }
994
                // }
995
                // }
996

    
997
        }
998

    
999
        public void setDataManager(JavaDataDriver manager) {
1000
                // _terrainDataManager = manager;
1001
                // _terrainDataManager.setDataLoader(this);
1002

    
1003
        }
1004

    
1005
        public void setLayerManager(LayerManager manager) {
1006
                _terrainLayerManager = manager;
1007

    
1008
        }
1009

    
1010
        public void setLoading(boolean bLoading) {
1011
                _bLoading = bLoading;
1012

    
1013
        }
1014

    
1015
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1016
                _renewCanvasOff = renewCanvasOff;
1017

    
1018
        }
1019

    
1020
        public void setTerrain(Terrain terrain) {
1021
                if (_terrain == terrain)
1022
                        return;
1023

    
1024
                _terrain = terrain;
1025

    
1026
                // add layers to terrain necessary when we are loading
1027
                addCurrentLayers();
1028

    
1029
        }
1030

    
1031
        public void setVerticalExaggeration(float verticalExaggeration) {
1032
                _verticalExaggeration = verticalExaggeration;
1033

    
1034
        }
1035

    
1036
        public void setViewProjection(IProjection projection) {
1037
                _viewProjection = projection;
1038

    
1039
        }
1040

    
1041
        public void setViewer(IViewerContainer canvas) {
1042
                _canvas3d = canvas;
1043
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
1044

    
1045
        }
1046

    
1047
        public void visibilityChanged(LayerEvent e) {
1048
                // FLayer lyr = e.getSource();
1049
                //
1050
                // Layer3DProps props3D = getLayer3DProps(lyr);
1051
                //
1052
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
1053
                // refreshLayerVectorsVisibility(lyr);
1054
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1055
                // refreshLayer3DOSGVisibility(lyr);
1056
                // } else {
1057
                // refreshLayerVisibility(lyr);
1058
                // }
1059
                // visibilityChange = true;
1060

    
1061
        }
1062

    
1063
        public void zoomToExtent(Rectangle2D geoExtent) {
1064
                if (geoExtent == null)
1065
                        return;
1066
                if ((geoExtent.getWidth() == 0) || (geoExtent.getHeight() == 0))
1067
                        return;
1068

    
1069
                double maxHeight = 0.0;
1070

    
1071
                // Getting extent positions
1072
                double minLat = geoExtent.getMinY();
1073
                double maxLat = geoExtent.getMaxY();
1074
                double cenLon = geoExtent.getCenterX();
1075
                double cenLat = geoExtent.getCenterY();
1076

    
1077
                double elevation = 0;
1078

    
1079
                // calculate altitude
1080
                double avLat = 0;
1081
                if (minLat > 0.0 || maxLat < 0.0)
1082
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1083
                double avLon = Math.min(180.0, geoExtent.getWidth());
1084

    
1085
                double terrainRadius = _terrain.getRadiusEquatorial();
1086
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1087
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1088
                                * (1 - Math.cos(Math.toRadians(avLon))));
1089
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1090
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
1091

    
1092
                double zoomFactor = 1.5;
1093
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1094

    
1095
                // Calculate XYZ positions for camera.
1096

    
1097
                int terrainType = _terrain.getCoordinateSystemType();
1098

    
1099
                Vec3 eye = new Vec3();
1100
                Vec3 center = new Vec3();
1101
                Vec3 up = new Vec3();
1102
                // Calculate positions for PLAIN MODE.
1103
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1104

    
1105
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
1106
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
1107
                        double height;
1108

    
1109
                        height = Math.sqrt(difx * difx + dify * dify);
1110
                        double fullWindowFactor = 1.7;
1111
                        // EYE
1112
                        eye.setX(cenLon);
1113
                        eye.setY(cenLat);
1114
                        eye.setZ(height * fullWindowFactor);
1115
                        // CENTER
1116
                        center.setX(cenLon);
1117
                        center.setY(cenLat);
1118
                        center.setZ(0.0);
1119
                        // UP
1120
                        up.setX(0.0);
1121
                        up.setY(1.0);
1122
                        up.setZ(0.0);
1123
                } else
1124
                // Calculate positions for SPHERICAL MODE.
1125
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
1126
                        // EYE
1127
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
1128
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
1129
                        // CENTER
1130
                        center.setX(0.0);
1131
                        center.setY(0.0);
1132
                        center.setZ(0.0);
1133
                        // UP
1134
                        up.setX(0.0);
1135
                        up.setY(0.0);
1136
                        up.setZ(1.0);
1137
                }
1138
                Camera cam = new Camera();
1139
                cam.setViewByLookAt(eye, center, up);
1140

    
1141
                _terrainViewer.setCamera(cam);
1142

    
1143
        }
1144

    
1145
        public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2) {
1146
                // TODO Auto-generated method stub
1147

    
1148
        }
1149

    
1150
        public void editionChanged(LayerEvent e) {
1151
                // TODO Auto-generated method stub
1152
                
1153
        }
1154

    
1155
        public void drawValueChanged(LayerEvent e) {
1156
                // TODO Auto-generated method stub
1157
                
1158
        }
1159

    
1160
}