Statistics
| Revision:

root / branches / gvSIG_19_ext3D_osgVP_2_2_0 / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 31666

History | View | Annotate | Download (35.8 KB)

1
package org.gvsig.gvsig3d.map3d;
2

    
3
import java.awt.Dimension;
4
import java.awt.Graphics2D;
5
import java.awt.Point;
6
import java.awt.geom.AffineTransform;
7
import java.awt.geom.Rectangle2D;
8
import java.awt.image.BufferedImage;
9
import java.awt.image.ImagingOpException;
10
import java.awt.image.RenderedImage;
11
import java.io.File;
12
import java.io.IOException;
13
import java.util.Hashtable;
14
import java.util.Vector;
15

    
16
import javax.print.attribute.PrintRequestAttributeSet;
17

    
18
import org.apache.log4j.Logger;
19
import org.cresques.cts.IProjection;
20
import org.gvsig.cacheservice.TileNum;
21
import org.gvsig.gvsig3d.cacheservices.FLayerCacheService;
22
import org.gvsig.gvsig3d.cacheservices.OSGCacheService;
23
import org.gvsig.gvsig3d.cacheservices.VectorCacheService;
24
import org.gvsig.gvsig3d.drivers.GvsigDriverOSG;
25
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
26
import org.gvsig.osgvp.core.osg.Image;
27
import org.gvsig.osgvp.core.osg.Matrix;
28
import org.gvsig.osgvp.core.osg.Node;
29
import org.gvsig.osgvp.core.osg.Vec3;
30
import org.gvsig.osgvp.core.osg.Vec4;
31
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
32
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
33
import org.gvsig.osgvp.exceptions.node.NodeException;
34
import org.gvsig.osgvp.terrain.DataLoader;
35
import org.gvsig.osgvp.terrain.Extent;
36
import org.gvsig.osgvp.terrain.HeightfieldLayer;
37
import org.gvsig.osgvp.terrain.JavaDataDriver;
38
import org.gvsig.osgvp.terrain.Layer;
39
import org.gvsig.osgvp.terrain.LayerManager;
40
import org.gvsig.osgvp.terrain.RasterLayer;
41
import org.gvsig.osgvp.terrain.RequestDataEvent;
42
import org.gvsig.osgvp.terrain.Terrain;
43
import org.gvsig.osgvp.terrain.TerrainViewer;
44
import org.gvsig.osgvp.terrain.UpdateDataEvent;
45
import org.gvsig.osgvp.terrain.VectorLayer;
46
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
47
import org.gvsig.osgvp.viewer.Camera;
48
import org.gvsig.osgvp.viewer.IViewerContainer;
49
import org.gvsig.osgvp.viewer.PrintUtilities;
50

    
51
import com.hardcode.driverManager.Driver;
52
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
53
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
54
import com.iver.andami.PluginServices;
55
import com.iver.andami.messages.NotificationManager;
56
import com.iver.andami.ui.mdiManager.IWindow;
57
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
58
import com.iver.cit.gvsig.fmap.MapContext;
59
import com.iver.cit.gvsig.fmap.ViewPort;
60
import com.iver.cit.gvsig.fmap.layers.FBitSet;
61
import com.iver.cit.gvsig.fmap.layers.FLayer;
62
import com.iver.cit.gvsig.fmap.layers.FLayers;
63
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
64
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
65
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
66
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
67
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
68
import com.iver.cit.gvsig.fmap.layers.LayerListener;
69
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
70
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
71
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
72
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
73
import com.iver.cit.gvsig.fmap.layers.SelectionSupport;
74
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
75
import com.iver.cit.gvsig.fmap.layers.XMLException;
76
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
77
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
78
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
79
import com.iver.utiles.XMLEntity;
80
import com.iver.utiles.swing.threads.Cancellable;
81

    
82
public class MapContext3D extends MapContext implements DataLoader,
83
                LayerListener, LegendListener, SelectionListener {
84

    
85
        // JOSG library objects
86
        private Terrain                         _terrain;
87
        private IViewerContainer         _canvas3d;
88
        private TerrainViewer                _terrainViewer;
89
        private LayerManager                _terrainLayerManager;
90
        private JavaDataDriver                _terrainDataManager = null;
91
        
92
        private Hashtable<FLayer, Layer>         _terrainFLayerMap = new Hashtable<FLayer, Layer>();
93
        private Hashtable<String, FLayer>        _terrainLayerMap = new Hashtable<String, FLayer>();
94
        
95
        // separate lists for image, elevation and vector layers
96
        //private ArrayList                         _layerLists = new ArrayList();
97
        private IProjection                 _viewProjection;
98
        private boolean                         _bEmptyView = true;
99
        private boolean                         _bListenToLegend = true;
100
        private boolean                         _bLoading = false;
101
        private TerrainViewer                 _canvasoff = null;
102
        private boolean                         _renewCanvasOff = false;
103
        private static Logger                 _logger = Logger.getLogger(MapContext3D.class.getName());
104
        TerrainViewer                                 _printViewer = null;
105
        Layer                                                _testRasterLayer = null;
106

    
107
        private boolean visibilityChange = false;
108

    
109
        @Override
110
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
111
                        double scale) throws ReadDriverException {
112

    
113
                double x = getViewPort().getOffset().getX();
114
                double y = getViewPort().getOffset().getY();
115
                double w = image.getWidth();
116
                double h = image.getHeight();
117

    
118
                if (_canvasoff == null) {
119
                        try {
120
                                _canvasoff = new TerrainViewer();
121
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
122
                                _canvasoff.addTerrain(((TerrainViewer) _canvas3d.getOSGViewer())
123
                                                .getTerrain(0));
124
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d.getOSGViewer())
125
                                                .getFeatures()));
126
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
127
                                                .getClearColor();
128
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(), color.w());
129
                                this.setRenewCanvasOff(false);
130
                        } catch (NodeException e) {
131
                                // TODO Auto-generated catch block
132
                                e.printStackTrace();
133
                        }
134

    
135
                }
136

    
137
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
138
                Matrix refView = refCam.getViewMatrix();
139
                Matrix refProy = refCam.getProjectionMatrix();
140
                Matrix.Perspective pers = refProy.getPerspective();
141
                Camera viewCam = new Camera();
142
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
143
                                pers.zFar);
144
                viewCam.setViewMatrix(refView);
145
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
146
                _canvasoff.setCamera(viewCam);
147
                _canvasoff.takeScreenshotToMemory();
148
                _canvasoff.frame();
149

    
150
                Image OSGimage = _canvasoff.getScreenshotImage();
151

    
152
                BufferedImage img = null;
153
                try {
154
                        img = OSGimage.getBufferedImage();
155
                } catch (ImageConversionException e1) {
156
                        // TODO Auto-generated catch block
157
                        e1.printStackTrace();
158
                } catch (IOException e1) {
159
                        // TODO Auto-generated catch block
160
                        e1.printStackTrace();
161
                }
162

    
163
                double scalex = w / img.getWidth(null);
164
                double scaley = h / img.getHeight(null);
165
                try {
166
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
167
                                        scaley);
168
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
169
                        xpos.concatenate(xform);
170
                        g.drawRenderedImage(img, xpos);
171
                } catch (ImagingOpException e) {
172
                        NotificationManager.addError("Dibujando FFramePicture", e);
173
                }
174

    
175
        }
176

    
177
        public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2)
178
                        throws ReadDriverException {
179

    
180
                int x = (int) getViewPort().getOffset().getX();
181
                int y = (int) getViewPort().getOffset().getY();
182
                int w = (int) g.getClipBounds().getWidth();
183
                int h = (int) g.getClipBounds().getHeight();
184
                System.err.println("x " + x + "; y " + y + "; w " + w + "; h" + h);
185

    
186
                Camera viewerCam = _canvas3d.getOSGViewer().getCamera();
187
                BufferedImage s = null;
188

    
189
                try {
190
                        int minw = (int) w / 10;
191
                        int minh = (int) h / 10;
192
                        System.out.println("minw" + minw + " minh" + minh);
193

    
194
                        _printViewer = new TerrainViewer();
195
                        _printViewer.addTerrain(((TerrainViewer) _canvas3d.getOSGViewer()).getTerrain(0));
196
                        _printViewer.addFeature((((TerrainViewer) _canvas3d.getOSGViewer()).getFeatures()));
197
                        Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer()).getClearColor();
198
                        _printViewer.setClearColor(color.x(), color.y(), color.z(), color.w());
199
                        _printViewer.setUpViewerInBackground(0, 0, minw, minh);
200

    
201
                        PrintUtilities util = new PrintUtilities();
202
                        util.setViewer(_printViewer);
203
                        s = util.getHighResolutionImage(viewerCam, w, h);
204

    
205
                        RenderedImage render = s;
206
                } catch (NodeException e1) {
207
                        // TODO Auto-generated catch block
208
                        e1.printStackTrace();
209
                }
210

    
211
                double scalex = w / s.getWidth(null);
212
                double scaley = h / s.getHeight(null);
213
                try {
214
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
215
                                        scaley);
216
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
217
                        xpos.concatenate(xform);
218
                        g.drawRenderedImage(s, xpos);
219
                        // g.drawRenderedImage(img, new AffineTransform());
220
                } catch (ImagingOpException e) {
221
                        NotificationManager.addError("Dibujando FFramePicture", e);
222
                }
223
                _printViewer.releaseGLContext();
224
                _printViewer.dispose();
225
                System.gc();
226
        }
227

    
228
        public MapContext3D(ViewPort vp) {
229
                super(vp);
230
        }
231

    
232
        public MapContext3D(FLayers fLayers, ViewPort vp) {
233
                super(fLayers, vp);
234
        }
235

    
236
        public void setTerrain(Terrain terrain) {
237
                if (_terrain == terrain) return;
238
                
239
                _terrain = terrain;
240

    
241
                // add layers to terrain
242
                //addCurrentLayersToTerrain(_terrain);
243
        }
244

    
245
        public Terrain getTerrain() {
246
                return _terrain;
247
        }
248
        
249
        public void setDataManager(JavaDataDriver manager) {
250
                _terrainDataManager = manager;
251
                _terrainDataManager.setDataLoader(this);
252
        }
253

    
254
        public JavaDataDriver getDataManager() {
255
                return _terrainDataManager;
256
        }
257
        
258
        public void setLayerManager(LayerManager manager) {
259
                _terrainLayerManager = manager;
260
        }
261

    
262
        public LayerManager getLayerManager() {
263
                return _terrainLayerManager;
264
        }
265

    
266
        public void setViewer(IViewerContainer canvas) {
267
                _canvas3d = canvas;
268
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
269
        }
270

    
271
        public IProjection getViewProjection() {
272
                return _viewProjection;
273
        }
274

    
275
        public void setViewProjection(IProjection projection) {
276
                _viewProjection = projection;
277
        }
278

    
279
        public IViewerContainer getCanvas3d() {
280
                return _canvas3d;
281
        }
282

    
283
        public void setLoading(boolean bLoading) {
284
                _bLoading = bLoading;
285
        }
286

    
287
        public FLayers getNewGroupLayer(FLayers parent) {
288
                return new FLayers3D(this, parent, getViewPort());
289
        }
290

    
291
        /** * LAYER CHANGES called by FLayers3D ** */
292

    
293
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
294
                        int newPos) {
295

    
296
                if (layer instanceof FLayers) {
297
                        FLayers group = (FLayers) layer;
298
                        if (newPos > oldPos) {
299
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
300
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
301
                                                        oldPos, newPos);
302
                        } else {
303
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
304
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
305
                                                        oldPos, newPos);
306
                        }
307
                        return;
308
                }
309
                
310
                Layer3DProps props3D = getLayer3DProps(layer);
311
                int type = props3D.getType();
312
                
313
                // Now reorder in layer manager only for terrain layer types
314
                if((type == Layer3DProps.layer3DOSG) || ((type == Layer3DProps.layer3DVector))) return;
315
                
316
                // Obtain the old position in the layer
317
                Layer terrainLayer = _terrainFLayerMap.get(layer);
318
                Vector<Integer> terrainOldPos = _terrainLayerManager.getOrder(terrainLayer);
319
                
320
                int terrainNewPos = 0;
321
                //Compute the new position.
322
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
323
                while (lyrIterator.hasNext()) {
324
                        FLayer auxLayer = lyrIterator.next();
325
                        if(auxLayer == layer) break;
326
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
327
                        if((auxProps3D.getType() != Layer3DProps.layer3DOSG) 
328
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector))
329
                        {
330
                                terrainNewPos++;
331
                        }
332
                        
333
                }
334
                
335
                if((terrainOldPos == null) || (terrainOldPos.size() == 0)) return;
336
                _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
337
                
338
                System.out.println("En el toc antes era el "+oldPos+" y ahora el "+newPos);
339
                System.out.println("En el terrain antes era el "+terrainOldPos+" y ahora el "+terrainNewPos);
340

    
341
                PrintDebugLayers();
342
        }
343

    
344
        public void layerAdded(FLayers3D parent, FLayer layer) {
345

    
346
                // to add group layers to 3D, just add recursively child data layers
347
                if (layer instanceof FLayers) {
348
                        FLayers group = (FLayers) layer;
349
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
350
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
351
                        }
352
                        getLayer3DProps(layer).setHooked(true);
353
                        return;
354
                }
355

    
356
                if (layer instanceof Classifiable) {
357
                        Classifiable legendLyr = (Classifiable) layer;
358
                        // legendLyr.addLegendListener((LegendListener) this);
359
                        this.addLayerListener(this);
360
                }
361
                layer.addLayerListener((LayerListener) this);
362

    
363
                // listener to manage the selection for the layers
364
                if (layer.getClass().equals(FLyrVect.class)) {
365
                        FLyrVect lyr = (FLyrVect) layer;
366
                        try {
367
                                SelectableDataSource recordSet = lyr.getRecordset();
368
                                if (recordSet != null) {
369
                                        SelectionSupport selectionSupport = recordSet
370
                                                        .getSelectionSupport();
371
                                        selectionSupport.addSelectionListener(this);
372
                                }
373
                        } catch (ReadDriverException e) {
374
                                // TODO Auto-generated catch block
375
                                e.printStackTrace();
376
                        }
377
                }
378

    
379
                if (!_bLoading)
380
                        addLayerToTerrain(layer, true);
381
                
382
                // Only do this the first time to add layer
383
                if (_bEmptyView && !_bLoading) {
384
                        if (layers.getLayersCount() > 0) {
385
                                try {
386
                                        zoomToExtent(layer.getFullExtent());
387
                                } catch (ExpansionFileReadException e) {
388
                                        e.printStackTrace();
389
                                } catch (ReadDriverException e) {
390
                                        e.printStackTrace();
391
                                }
392
                                _bEmptyView = false;
393
                        }
394
                }
395

    
396
                PrintDebugLayers();
397
        }
398

    
399
        public void layerRemoved(FLayers3D parent, FLayer layer) {
400

    
401
                // to remove group layers to 3D, just remove recursively child data
402
                // layers
403
                if (layer instanceof FLayers) {
404
                        FLayers group = (FLayers) layer;
405
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
406
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
407
                        }
408
                        getLayer3DProps(layer).setHooked(false);
409
                        return;
410
                }
411

    
412
                if (layer instanceof Classifiable) {
413
                        Classifiable legendLyr = (Classifiable) layer;
414
                        legendLyr.removeLegendListener((LegendListener) this);
415
                }
416
                
417
                layer.removeLayerListener((LayerListener) this);
418

    
419
                removeLayerToTerrain(layer);
420

    
421
                // All layers are removed
422
                if (layers.getLayersCount() == 0) {
423
                        _bEmptyView = true;
424
                }
425

    
426
                PrintDebugLayers();
427
        }
428

    
429
        /**
430
         * DOCUMENT ME!
431
         * 
432
         * @param e
433
         *            DOCUMENT ME!
434
         */
435
        public void legendChanged(LegendChangedEvent e) {
436

    
437
                if (!_bListenToLegend)
438
                        return;
439
                if ((e == null) && (!visibilityChange)){
440

    
441
                        // find layer whose legend changed
442
                        FLayer found = null;
443
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
444
                        while (lyrIterator.hasNext()) {
445
                                FLayer lyr = lyrIterator.next();
446
                                if (lyr instanceof FLyrVect) {
447
                                        FLyrVect lyrVect = (FLyrVect) lyr;
448
                                        long newDrawVersion = lyrVect.getDrawVersion();
449
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
450
                                        if (newDrawVersion != props3D.drawVersion) {
451
                                                props3D.drawVersion = lyrVect.getDrawVersion();
452
                                                refreshLayerInTerrain(props3D, true);
453
                                                _bListenToLegend = false;
454
                                                props3D.VerifyLegend(_terrain.getTerrainName());
455
                                                _bListenToLegend = true;
456
                                        }
457
                                }
458
                        }
459

    
460
                        IWindow f = PluginServices.getMDIManager().getActiveWindow();
461
                        if (f instanceof BaseView) {
462
                                BaseView view3D = (BaseView) f;
463
                                view3D.getTOC().refresh();
464
                        }
465
                }
466
                visibilityChange = false;
467
        }
468

    
469
        public void visibilityChanged(LayerEvent e) {
470
                FLayer lyr = e.getSource();
471

    
472
                Layer3DProps props3D = getLayer3DProps(lyr);
473

    
474
                if (props3D.getType() == Layer3DProps.layer3DVector) {
475
                        refreshLayerVectorsVisibility(lyr);
476
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
477
                        refreshLayer3DOSGVisibility(lyr);
478
                }else {
479
                        refreshLayerVisibility(lyr);
480
                }
481
                visibilityChange = true;
482
        }
483

    
484
        private void refreshLayer3DOSGVisibility(FLayer lyr) {
485
                if (_terrain == null || _viewProjection == null)
486
                        return;
487

    
488
                Layer3DProps props3D = getLayer3DProps(lyr);
489
                
490
                OSGCacheService cacheService = (OSGCacheService) props3D
491
                                .getCacheService();
492
                if (cacheService != null) {
493
                        // use VectorCacheService to add features to terrain
494
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
495
                }
496
                
497
        }
498

    
499
        private void refreshLayerVisibility(FLayer layer) {
500
                
501
                Layer terrainLayer = _terrainFLayerMap.get(layer);
502
                terrainLayer.setEnabled(layer.isVisible());
503

    
504
                Layer3DProps props3D = getLayer3DProps(layer);
505
                System.out.println("Texture layer "+props3D.getTerrainOrder()+" is "+layer.isVisible());
506
        }
507

    
508
        private void refreshLayerVectorsVisibility(FLayer lyr) {
509
                if (_terrain == null || _viewProjection == null)
510
                        return;
511

    
512
                Layer3DProps props3D = getLayer3DProps(lyr);
513

    
514
                VectorCacheService cacheService = (VectorCacheService) props3D
515
                                .getCacheService();
516
                if (cacheService != null) {
517
                        // use VectorCacheService to add features to terrain
518
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
519
                }
520

    
521
        }
522

    
523
        public void activationChanged(LayerEvent e) {
524
                // TODO Implement this method
525
        }
526

    
527
        public void nameChanged(LayerEvent e) {
528
                // TODO Implement this method
529
        }
530

    
531
        public void editionChanged(LayerEvent e) {
532
                // TODO Implement this method
533

    
534
        }
535

    
536
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
537
                if (props == null)
538
                        return;
539

    
540
                if (_terrain == null)
541
                        return; // view not opened yet
542

    
543
                // clear cache
544

    
545
                if (bRemoveCache) {
546
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
547
                                        + _terrain.getTerrainName() + "/" + props.getCacheName();
548
                        removeCache(layerCacheDir);
549
                }
550

    
551
                // refresh layer in terrain
552
                int type = props.getType();
553
                if (type == Layer3DProps.layer3DImage) {
554
                        int order = props.getTerrainOrder();
555
                        // m_planet.refreshTextureInfo(order);
556
                        //TODO: Capas
557
                        //_terrain.invalidateTextureLayer(order);
558
                } else if (type == Layer3DProps.layer3DElevation) {
559
                        //TODO: Capas
560
                        //_terrain.invalidateHeightfieldLayer(0);
561
                } else if (type == Layer3DProps.layer3DVector) {
562
                        invalidateVectorLayer(props);
563
                }
564
        }
565

    
566
        private void invalidateVectorLayer(Layer3DProps props) {
567
                // TODO Auto-generated method stub
568
                if (_terrain == null || _viewProjection == null)
569
                        return;
570

    
571
                VectorCacheService cacheService = (VectorCacheService) props
572
                                .getCacheService();
573
                if (cacheService != null) {
574
                        // use VectorCacheService to add features to terrain
575
                        cacheService.refreshFeaturesToTerrain();
576
                }
577
        }
578

    
579
        private boolean removeCache(String folder) {
580
                File dir = new File(folder);
581
                if (dir.isDirectory()) {
582
                        String[] children = dir.list();
583
                        for (int i = 0; i < children.length; i++) {
584
                                boolean success = removeCache(folder + "/" + children[i]);
585
                                // Do not interrupt if it can't delete one file
586
                                // if (!success) {
587
                                // return false;
588
                                // }
589
                        }
590
                }
591

    
592
                // The directory is now empty so delete it
593
                return dir.delete();
594
        }
595

    
596
        protected Layer3DProps getLayer3DProps(FLayer layer) {
597
                
598
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
599
                
600
                // Create instance of props for osg layers.
601
                if (props3D == null) {
602
                        props3D = new Layer3DProps();
603
                        if (layer instanceof FLyrVect) {
604
                                FLyrVect nLayer = (FLyrVect) layer;
605
                                Driver driver;
606
                                try {
607
                                        driver = nLayer.getRecordset().getDriver();
608
                                        if (driver instanceof GvsigDriverOSG) {
609
                                                props3D.setChooseType(false);
610
                                        }
611
                                } catch (ReadDriverException e) {
612
                                        // TODO Auto-generated catch block
613
                                        e.printStackTrace();
614
                                }
615

    
616
                        }
617
                        // Set the properties
618
                        props3D.setLayer(layer);
619

    
620
                        props3D.initCacheName(_terrain.getCoordinateSystemType(),
621
                                        _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
622
                        FLyrDefault baseLayer = (FLyrDefault) layer;
623
                        baseLayer.setProperty("3DLayerExtension", props3D);
624
                } else {
625
                        if (_bLoading)
626
                                props3D.setChooseType(false);
627
                        props3D.setLayer(layer);
628
                }
629

    
630
                return props3D;
631
        }
632
        
633
        /*public void addCurrentLayersToTerrain(Terrain terrain) {
634
                
635
                /*for (int iType = 0; iType < 4; iType++) {
636
                        ArrayList layerList = (ArrayList) _layerLists.get(iType);
637
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
638

639
                                FLayer layer = (FLayer) layerList.get(iLayer);
640
                                Layer3DProps props = getLayer3DProps(layer);
641
                                props.setTerrainOrder(props.getTocOrder());
642
                                addLayerToTerrain(layer, false);
643

644
                                // Layer active or not
645
                                if (props.getType() == Layer3DProps.layer3DImage) {
646
                                        //TODO: Capas
647
                                        //terrain.setEnabledTextureLayer(props.getTerrainOrder(),
648
                                        //                layer.isVisible());
649
                                        System.out.println("Texture layer "+props.getTerrainOrder()+" is "+layer.isVisible());
650
                                }
651
                                
652
                                if (props.getType() == Layer3DProps.layer3DElevation) {
653
                                        //TODO: Capas
654
                                        //terrain.setEnabledHeightfieldLayer(0, layer.isVisible());
655
                                }
656
                        }
657
                        if (iType == Layer3DProps.layer3DElevation && layerList.size() > 0)
658
                        {
659
                                //TODO: Capas
660
                                //terrain.invalidateHeightfieldLayer(0);
661
                        }
662
                }
663
        }*/
664

    
665
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
666
                Layer3DProps props3D = getLayer3DProps(layer);
667
                
668
                
669
                if (props3D.getType() == Layer3DProps.layer3DVector) {
670
                        CreateVectors(layer, props3D); // special case for now without
671
                        // disk cache
672
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
673
                        CreateOSGLayer(layer, props3D);
674
                } else {
675
                        Rectangle2D layerExtent = null;
676
                        try {
677
                                layerExtent = layer.getFullExtent();
678
                        } catch (ExpansionFileReadException e) {
679
                                e.printStackTrace();
680
                        } catch (ReadDriverException e) {
681
                                e.printStackTrace();
682
                        }
683
                        if (layerExtent == null) { // hack for missing extents
684
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
685
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
686
                                                        180.0);
687
                                else
688
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
689
                                                        -10000000.0, 40000000.0, 20000000.0);
690
                                // TODO toggle comment because this code use WCS extension. When
691
                                // WCS extension runs correctly uncoment!!!
692

    
693
                                if (layer instanceof FLyrWCS)
694
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
695
                        }
696
                        
697
                        Extent extent = null;
698
                        if(_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) 
699
                        {
700
                                extent = new Extent(layerExtent.getMinX(),
701
                                                layerExtent.getMinY(),
702
                                                layerExtent.getMaxX(),
703
                                                layerExtent.getMaxY());
704
                        } else {
705
                                extent = new Extent(Math.toRadians(layerExtent.getMinX()),
706
                                                Math.toRadians(layerExtent.getMinY()),
707
                                                Math.toRadians(layerExtent.getMaxX()),
708
                                                Math.toRadians(layerExtent.getMaxY()));
709
                        }
710
                        
711
                        if(props3D.getType() == Layer3DProps.layer3DImage) {
712
                                RasterLayer rlayer = new RasterLayer();
713
                                rlayer.setEnabled(true);
714
                                rlayer.setExtent(extent);
715
                                rlayer.setOpacity(1.0f);
716
                                rlayer.setDataDriver(_terrainDataManager);
717
                                _terrainLayerManager.addLayer(rlayer);
718
                                _terrainFLayerMap.put(layer, rlayer);
719
                                _terrainLayerMap.put(rlayer.getLayerID(), layer);
720
                        }
721
                        else if(props3D.getType() == Layer3DProps.layer3DElevation) {
722
                                HeightfieldLayer hlayer = new HeightfieldLayer();
723
                                hlayer.setEnabled(true);
724
                                hlayer.setExtent(extent);
725
                                hlayer.setVerticalExaggeration(1.0f);
726
                                hlayer.setDataDriver(_terrainDataManager);
727
                                _terrainLayerManager.addLayer(hlayer);
728
                                _terrainFLayerMap.put(layer, hlayer);
729
                                _terrainLayerMap.put(hlayer.getLayerID(), layer);
730
                        } else if(props3D.getType() == Layer3DProps.layer3DVectorMR) {
731
                                VectorLayer vlayer = new VectorLayer();
732
                                vlayer.setEnabled(true);
733
                                vlayer.setExtent(extent);
734
                                vlayer.setDensity(1.0f);
735
                                vlayer.setDataDriver(_terrainDataManager);
736
                                _terrainLayerManager.addLayer(vlayer);
737
                                _terrainFLayerMap.put(layer, vlayer);
738
                                _terrainLayerMap.put(vlayer.getLayerID(), layer);
739
                        }
740

    
741
                        if (bVerifyLegend) {
742
                                _bListenToLegend = false;
743
                                props3D.VerifyLegend(_terrain.getTerrainName());
744
                                _bListenToLegend = true;
745
                        }
746
                }
747
        }
748

    
749
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
750
                if (_terrain == null || _viewProjection == null)
751
                        return;
752

    
753
                OSGCacheService cacheService = (OSGCacheService) props3D
754
                                .getCacheService();
755
                if (cacheService == null) {
756
                        cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
757
                                        .getCacheName(), layer, _viewProjection);
758
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
759
                        props3D.setCacheService(cacheService);
760
                }
761

    
762
                // use VectorCacheService to add features to planet
763
                cacheService.AddFeaturesToTerrain();
764

    
765
        }
766

    
767
        @Override
768
        public XMLEntity getXMLEntity() throws XMLException {
769
                // TODO Auto-generated method stub
770
                XMLEntity xml = super.getXMLEntity();
771
                
772
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
773
                while (lyrIterator.hasNext()) {
774
                        FLayer lyr = lyrIterator.next();
775
                        Layer3DProps props3D = getLayer3DProps(lyr);
776
                        int type = props3D.getType();
777
                        if (type == Layer3DProps.layer3DOSG){
778
                                
779
                                OSGCacheService cacheService = (OSGCacheService) props3D
780
                                .getCacheService();
781
                                if (cacheService != null) {
782
                                        // use VectorCacheService to add features to planet
783
                                        if (props3D.isEditing()){
784
                                                // TODO: PONER AKI EL CODIGO DE SALVAR
785
                                        }
786
                                }
787
                        }
788
                }
789
                
790
                
791
                return xml;
792
                
793
        }
794

    
795
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
796
                if (_terrain == null || _viewProjection == null)
797
                        return;
798

    
799
                VectorCacheService cacheService = (VectorCacheService) props3D
800
                                .getCacheService();
801
                if (cacheService == null) {
802
                        cacheService = new VectorCacheService(_canvas3d, _terrain, props3D
803
                                        .getCacheName(), layer, _viewProjection);
804
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
805
                        props3D.setCacheService(cacheService);
806
                }
807

    
808
                // use VectorCacheService to add features to terrain
809
                cacheService.addFeaturesToTerrain();
810
        }
811

    
812
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
813
                if (_terrain == null || _viewProjection == null)
814
                        return;
815

    
816
                VectorCacheService cacheService = (VectorCacheService) props3D
817
                                .getCacheService();
818
                if (cacheService != null) {
819
                        // use VectorCacheService to delete features to terrain
820
                        cacheService.deleteFeaturesToTerrain();
821
                }
822
        }
823

    
824
        /**
825
         * Sets the given zoom extent to the view
826
         * 
827
         * @param extent
828
         *            The extent to zoom to.
829
         */
830
        public void zoomToExtent(Rectangle2D geoExtent) {
831
                double maxHeight = 0.0;
832

    
833
                // Getting extent positions
834
                double minLat = geoExtent.getMinY();
835
                double maxLat = geoExtent.getMaxY();
836
                double cenLon = geoExtent.getCenterX();
837
                double cenLat = geoExtent.getCenterY();
838

    
839
                double elevation = 0;
840

    
841
                // calculate altitude
842
                double avLat = 0;
843
                if (minLat > 0.0 || maxLat < 0.0)
844
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
845
                double avLon = Math.min(180.0, geoExtent.getWidth());
846

    
847
                double terrainRadius = _terrain.getRadiusEquatorial();
848
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
849
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
850
                                * (1 - Math.cos(Math.toRadians(avLon))));
851
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
852
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
853

    
854
                double zoomFactor = 1.5;
855
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
856

    
857
                // Calculate XYZ positions for camera.
858

    
859
                int terrainType = _terrain.getCoordinateSystemType();
860

    
861
                Vec3 eye = new Vec3();
862
                Vec3 center = new Vec3();
863
                Vec3 up = new Vec3();
864
                // Calculate positions for PLAIN MODE.
865
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
866

    
867
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
868
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
869
                        double height;
870

    
871
                        height = Math.sqrt(difx * difx + dify * dify);
872
                        double fullWindowFactor = 1.7;
873
                        // EYE
874
                        eye.setX(cenLon);
875
                        eye.setY(cenLat);
876
                        eye.setZ(height * fullWindowFactor);
877
                        // CENTER
878
                        center.setX(cenLon);
879
                        center.setY(cenLat);
880
                        center.setZ(0.0);
881
                        // UP
882
                        up.setX(0.0);
883
                        up.setY(1.0);
884
                        up.setZ(0.0);
885
                } else
886
                // Calculate positions for SPHERICAL MODE.
887
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
888
                        // EYE
889
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
890
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
891
                        // CENTER
892
                        center.setX(0.0);
893
                        center.setY(0.0);
894
                        center.setZ(0.0);
895
                        // UP
896
                        up.setX(0.0);
897
                        up.setY(0.0);
898
                        up.setZ(1.0);
899
                }
900
                Camera cam = new Camera();
901
                cam.setViewByLookAt(eye, center, up);
902

    
903
                _terrainViewer.setCamera(cam);
904

    
905
        }
906

    
907
        private void PrintDebugLayers() {
908
                System.out.println("===========================");
909
                System.out.println("Total terrain layers: "+_terrainLayerManager.getNumLayers());
910
                System.out.println("===========================");
911
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
912
                int pos = 0;
913
                while (lyrIterator.hasNext()) {
914
                        FLayer layer = lyrIterator.next();
915
                        System.out.println("  Layer " + layer.getName());
916
                        Layer3DProps props3D = getLayer3DProps(layer);
917
                        System.out.println("    Type " + props3D.getType());
918
                        System.out.println("    Order " + pos);        
919
                        pos++;
920
                }
921
        }
922

    
923
        /**
924
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
925
         * 
926
         * @param xml
927
         *            XMLEntity
928
         * 
929
         * @return Nuevo MapContext3D.
930
         * 
931
         * @throws XMLException
932
         */
933
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
934
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
935

    
936
                FLayers layers = new FLayers3D(null, null, vp);
937
                layers.setXMLEntity(xml.getChild(1));
938

    
939
                MapContext fmap = layers.getMapContext();
940

    
941
                return fmap;
942
        }
943

    
944
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
945
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
946

    
947
                FLayers layers = new FLayers3D(null, null, vp);
948
                layers.setXMLEntity03(xml.getChild(1));
949

    
950
                MapContext fmap = layers.getMapContext();
951

    
952
                return fmap;
953
        }
954

    
955
        public GraphicLayer getGraphicsLayer() {
956
                GraphicLayer3D gra3D = new GraphicLayer3D(_terrainViewer, getTerrain());
957
                return gra3D;
958
        }
959

    
960
        public Node getSpecialNode() {
961
                Node specialNode = null;
962
                try {
963
                        specialNode = _terrainViewer.getFeature(0);
964
                } catch (ChildIndexOutOfBoundsExceptions e) {
965
                        _logger.error("Command: " + "Error child index out of bound.", e);
966
                }
967
                return specialNode;
968
        }
969

    
970
        public ViewPort getViewPort() {
971

    
972
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
973

    
974
                if (_canvas3d != null)
975
                        vp.setImageSize(new Dimension(_terrainViewer.getWidth(), _terrainViewer
976
                                        .getHeight()));
977
                vp.setTerrain(this.getTerrain());
978
                vp.setViewer(this._canvas3d);
979

    
980
                return vp;
981
        }
982

    
983
        /**
984
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
985
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
986
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
987
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
988
         */
989

    
990
        /*public void invalidate() {
991
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
992
                if (vp.getDirty()) {
993
                        vp.setDirty(false);
994
                }
995
                FLayer[] selectedExtent = getLayers().getActives();
996

997
                if (selectedExtent.length > 0) {
998
                        for (int i = 0; i < selectedExtent.length; i++) {
999
                                if (selectedExtent[0].isAvailable()) {
1000

1001
                                        FLayer lyr3D = selectedExtent[i];
1002
                                        Layer3DProps layer3DProps = Layer3DProps
1003
                                                        .getLayer3DProps(lyr3D);
1004
                                        
1005
                                        Layer terrainLayer = _terrainFLayerMap.get(lyr3D);
1006
                                        float opacity = (((FLyrDefault) lyr3D).getTransparency())
1007
                                                        / (float) 255;
1008
                                        if()
1009
                                        //_terrain.setTextureOpacityLayer(order, opacity);
1010
                                }
1011
                        }
1012

1013
                }
1014
        }*/
1015

    
1016
        public void selectionChanged(SelectionEvent e) {
1017
                // TODO Auto-generated method stub
1018
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1019
                while (lyrIterator.hasNext()) {
1020
                        FLayer layer = lyrIterator.next();
1021
                        Layer3DProps props3D = getLayer3DProps(layer);
1022
                        if(props3D.getType() != Layer3DProps.layer3DOSG)
1023
                        {
1024
                                if (layer.getClass().equals(FLyrVect.class)) {
1025
                                        FLyrVect lyr = (FLyrVect) layer;
1026

    
1027
                                        FBitSet selection = null;
1028
                                        try {
1029
                                                selection = lyr.getRecordset().getSelectionSupport()
1030
                                                                .getSelection();
1031
                                        } catch (ReadDriverException e1) {
1032
                                                // TODO Auto-generated catch block
1033
                                                e1.printStackTrace();
1034
                                        }
1035

    
1036
                                        if ((selection.cardinality() == 0)
1037
                                                        || (!(selection.isEmpty()))) {
1038
                                                Layer3DProps props = Layer3DProps
1039
                                                                .getLayer3DProps(layer);
1040
                                                refreshLayerInTerrain(props, true);
1041
                                                if (layer instanceof FLyrVect) {
1042
                                                        FLyrVect fvect = (FLyrVect) layer;
1043
                                                        props.drawVersion = fvect.getDrawVersion();
1044
                                                }
1045
                                        }
1046
                                }
1047
                        }
1048
                }
1049
        }
1050

    
1051
        public void removeLayerToTerrain(FLayer layer) {
1052
                // TODO Auto-generated method stub
1053
                Layer3DProps props3D = getLayer3DProps(layer);
1054

    
1055
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1056
                        DeleteVectors(layer, props3D);
1057
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1058
                        DeleteOSGLayer(layer, props3D);
1059
                } else {
1060
                        Layer terrainLayer = _terrainFLayerMap.get(layer);
1061
                        if(terrainLayer != null) {
1062
                                _terrainLayerManager.removeLayer(terrainLayer);
1063
                        
1064
                                _terrainLayerMap.remove(terrainLayer.getLayerID());
1065
                                _terrainFLayerMap.remove(layer);
1066
                        }
1067
                }
1068

    
1069
        }
1070

    
1071
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1072
                if (_terrain == null || _viewProjection == null)
1073
                        return;
1074

    
1075
                OSGCacheService cacheService = (OSGCacheService) props3D
1076
                                .getCacheService();
1077
                if (cacheService != null) {
1078
                        // use VectorCacheService to delete features to terrain
1079
                        cacheService.DeleteFeaturesToTerrain();
1080
                }
1081
        }
1082

    
1083
        public boolean isRenewCanvasOff() {
1084
                return _renewCanvasOff;
1085
        }
1086

    
1087
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1088
                _renewCanvasOff = renewCanvasOff;
1089
        }
1090

    
1091
        public void drawValueChanged(LayerEvent arg0) {
1092
                // TODO Auto-generated method stub
1093

    
1094
        }
1095

    
1096
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1097
                
1098
                if(_terrainLayerMap.size() == 0) return null;
1099
                if(rde == null) return null;
1100
                if(rde.getExtent() == null) return null;
1101
                if(rde.getLayer() == null) return null;
1102
                if(rde.getLayerManager() == null) return null;
1103
                
1104
                UpdateDataEvent ude = new UpdateDataEvent();
1105
                ude.copyDataFromRequest(rde);
1106
                
1107
                String layerID = rde.getLayer().getLayerID();
1108
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1109
                if(layer == null) return null;
1110
                if(!layer.isVisible()) return null;
1111
                
1112
                Layer3DProps props3D = getLayer3DProps(layer);
1113
                
1114
                // get/create cache service
1115
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1116
                                .getCacheService();
1117
                if (cacheService == null) {
1118
                        cacheService = new FLayerCacheService(_terrain, props3D
1119
                                        .getCacheName(), layer, _viewProjection);
1120
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1121
                        props3D.setCacheService(cacheService);
1122
                }
1123

    
1124
                int dataType = props3D.getType();
1125
                Point tileIndices = new Point(rde.getTileX(), rde.getTileY());
1126
                TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
1127

    
1128
                String tileFileName;
1129
                
1130
                double minX, minY, width, height;
1131
                
1132
                if(_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1133
                        minX = rde.getExtent().xMin();
1134
                        minY = rde.getExtent().yMin();
1135
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1136
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1137
                } else {
1138
                        minX = Math.toDegrees(rde.getExtent().xMin());
1139
                        minY = Math.toDegrees(rde.getExtent().yMin());
1140
                        width = Math.toDegrees(rde.getExtent().xMax() - rde.getExtent().xMin());
1141
                        height = Math.toDegrees(rde.getExtent().yMax() - rde.getExtent().yMin());
1142
                }
1143

    
1144
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1145
                if (cacheService.intersectsLayer(extent)) { // extent test
1146
                        try {
1147
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1148
                        } catch (Exception e) {
1149
                                //TODO: Fail file
1150
                                //planet.setFailTexture(rle.getTerrainNode(), order);
1151
                                return null;
1152
                        }
1153
                        
1154
                        switch(dataType) 
1155
                        {
1156
                        case Layer3DProps.layer3DImage:
1157
                                ude.setRasterData(tileFileName, "gdal");
1158
                                break;
1159
                        case Layer3DProps.layer3DElevation:
1160
                                ude.setHeightfieldData(tileFileName, "gdal");
1161
                                break;
1162
                        case Layer3DProps.layer3DVectorMR:
1163
                                ude.setVectorData(tileFileName, "osg");
1164
                                break;
1165
                        }
1166
                } 
1167
                
1168
                return ude;
1169
        }
1170
}