Statistics
| Revision:

svn-gvsig-desktop / branches / gvSIG_19_ext3D_osgVP_2_2_0 / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 31879

History | View | Annotate | Download (36.9 KB)

1 21940 jcampos
package org.gvsig.gvsig3d.map3d;
2 14901 salva
3 15321 salva
import java.awt.Dimension;
4 20125 jcampos
import java.awt.Graphics2D;
5 15308 salva
import java.awt.Point;
6 20893 jcampos
import java.awt.geom.AffineTransform;
7 14949 salva
import java.awt.geom.Rectangle2D;
8 20125 jcampos
import java.awt.image.BufferedImage;
9 20893 jcampos
import java.awt.image.ImagingOpException;
10 22350 jcampos
import java.awt.image.RenderedImage;
11 15308 salva
import java.io.File;
12 20125 jcampos
import java.io.IOException;
13 31642 mten
import java.util.Hashtable;
14 31669 rgaitan
import java.util.Iterator;
15 31732 rgaitan
import java.util.Timer;
16 31666 mten
import java.util.Vector;
17 14949 salva
18 21525 jcampos
import javax.print.attribute.PrintRequestAttributeSet;
19 15308 salva
20 20893 jcampos
import org.apache.log4j.Logger;
21 15308 salva
import org.cresques.cts.IProjection;
22
import org.gvsig.cacheservice.TileNum;
23 21940 jcampos
import org.gvsig.gvsig3d.cacheservices.FLayerCacheService;
24 22470 jcampos
import org.gvsig.gvsig3d.cacheservices.OSGCacheService;
25 21940 jcampos
import org.gvsig.gvsig3d.cacheservices.VectorCacheService;
26 22662 afraile
import org.gvsig.gvsig3d.drivers.GvsigDriverOSG;
27 21940 jcampos
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
28 31057 jtorres
import org.gvsig.osgvp.core.osg.Image;
29
import org.gvsig.osgvp.core.osg.Matrix;
30
import org.gvsig.osgvp.core.osg.Node;
31
import org.gvsig.osgvp.core.osg.Vec3;
32
import org.gvsig.osgvp.core.osg.Vec4;
33 21095 jcampos
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
34 20893 jcampos
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
35 22171 jcampos
import org.gvsig.osgvp.exceptions.node.NodeException;
36 31642 mten
import org.gvsig.osgvp.terrain.DataLoader;
37
import org.gvsig.osgvp.terrain.Extent;
38
import org.gvsig.osgvp.terrain.HeightfieldLayer;
39
import org.gvsig.osgvp.terrain.JavaDataDriver;
40
import org.gvsig.osgvp.terrain.Layer;
41
import org.gvsig.osgvp.terrain.LayerManager;
42
import org.gvsig.osgvp.terrain.RasterLayer;
43
import org.gvsig.osgvp.terrain.RequestDataEvent;
44 31394 mten
import org.gvsig.osgvp.terrain.Terrain;
45
import org.gvsig.osgvp.terrain.TerrainViewer;
46 31642 mten
import org.gvsig.osgvp.terrain.UpdateDataEvent;
47 31652 mten
import org.gvsig.osgvp.terrain.VectorLayer;
48
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
49 20893 jcampos
import org.gvsig.osgvp.viewer.Camera;
50
import org.gvsig.osgvp.viewer.IViewerContainer;
51 21908 jcampos
import org.gvsig.osgvp.viewer.PrintUtilities;
52 15308 salva
53 22674 jcampos
import com.hardcode.driverManager.Driver;
54 15333 julio
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
55 22171 jcampos
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
56 15308 salva
import com.iver.andami.PluginServices;
57 20893 jcampos
import com.iver.andami.messages.NotificationManager;
58 25001 jcampos
import com.iver.andami.ui.mdiManager.IWindow;
59 15333 julio
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
60 14901 salva
import com.iver.cit.gvsig.fmap.MapContext;
61
import com.iver.cit.gvsig.fmap.ViewPort;
62 18328 jcampos
import com.iver.cit.gvsig.fmap.layers.FBitSet;
63 15264 julio
import com.iver.cit.gvsig.fmap.layers.FLayer;
64 14901 salva
import com.iver.cit.gvsig.fmap.layers.FLayers;
65 15308 salva
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
66 15322 salva
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
67 15441 julio
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
68 15236 julio
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
69 15308 salva
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
70
import com.iver.cit.gvsig.fmap.layers.LayerListener;
71 18954 jcampos
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
72 24882 jcampos
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
73 18328 jcampos
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
74
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
75 24882 jcampos
import com.iver.cit.gvsig.fmap.layers.SelectionSupport;
76 15264 julio
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
77 14901 salva
import com.iver.cit.gvsig.fmap.layers.XMLException;
78 15308 salva
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
79 18954 jcampos
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
80 25001 jcampos
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
81 14901 salva
import com.iver.utiles.XMLEntity;
82 20125 jcampos
import com.iver.utiles.swing.threads.Cancellable;
83 14901 salva
84 31642 mten
public class MapContext3D extends MapContext implements DataLoader,
85 20893 jcampos
                LayerListener, LegendListener, SelectionListener {
86 14901 salva
87 15333 julio
        // JOSG library objects
88 31669 rgaitan
        private Terrain _terrain;
89
        private IViewerContainer _canvas3d;
90
        private TerrainViewer _terrainViewer;
91
        private LayerManager _terrainLayerManager;
92
        private JavaDataDriver _terrainDataManager = null;
93 15308 salva
94 31669 rgaitan
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
95
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
96
97
        private IProjection _viewProjection;
98 31863 mten
        private float _verticalExaggeration;
99 31669 rgaitan
        private boolean _bEmptyView = true;
100
        private boolean _bListenToLegend = true;
101
        private boolean _bLoading = false;
102
        private TerrainViewer _canvasoff = null;
103
        private boolean _renewCanvasOff = false;
104
        private static Logger _logger = Logger.getLogger(MapContext3D.class
105
                        .getName());
106
        TerrainViewer _printViewer = null;
107
        Layer _testRasterLayer = null;
108
109 25845 jcampos
        private boolean visibilityChange = false;
110
111 20125 jcampos
        @Override
112
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
113
                        double scale) throws ReadDriverException {
114 21525 jcampos
115 22171 jcampos
                double x = getViewPort().getOffset().getX();
116
                double y = getViewPort().getOffset().getY();
117
                double w = image.getWidth();
118
                double h = image.getHeight();
119 21525 jcampos
120 31394 mten
                if (_canvasoff == null) {
121 22171 jcampos
                        try {
122 31394 mten
                                _canvasoff = new TerrainViewer();
123
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
124 31878 jtorres
125
126
                                Terrain planetView3D = ((TerrainViewer) _canvas3d.getOSGViewer()).getTerrain(0);
127
                                Terrain terrain = new Terrain();
128
                                terrain.setCoordinateSystemType(planetView3D
129
                                                .getCoordinateSystemType());
130
                                terrain.setCoordinateSystemName(planetView3D
131
                                                .getCoordinateSystemName());
132
                                terrain.setCoordinateSystemFormat(planetView3D
133
                                                .getCoordinateSystemFormat());
134
                                terrain.setExtent(planetView3D.getExtent());
135
                                terrain.setTerrainName(planetView3D.getTerrainName());
136
137
138
                                terrain.init();
139
                                terrain.setLayerManager(_terrainLayerManager);
140
141
142 31669 rgaitan
                                _canvasoff
143 31878 jtorres
                                                .addTerrain(terrain);
144 31669 rgaitan
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
145
                                                .getOSGViewer()).getFeatures()));
146 31394 mten
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
147 22470 jcampos
                                                .getClearColor();
148 31669 rgaitan
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(), color
149
                                                .w());
150 22171 jcampos
                                this.setRenewCanvasOff(false);
151
                        } catch (NodeException e) {
152
                                // TODO Auto-generated catch block
153
                                e.printStackTrace();
154
                        }
155 21525 jcampos
156 22171 jcampos
                }
157 20125 jcampos
158 31394 mten
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
159 22171 jcampos
                Matrix refView = refCam.getViewMatrix();
160
                Matrix refProy = refCam.getProjectionMatrix();
161
                Matrix.Perspective pers = refProy.getPerspective();
162
                Camera viewCam = new Camera();
163
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
164
                                pers.zFar);
165
                viewCam.setViewMatrix(refView);
166 31394 mten
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
167
                _canvasoff.setCamera(viewCam);
168
                _canvasoff.takeScreenshotToMemory();
169
                _canvasoff.frame();
170 21095 jcampos
171 31394 mten
                Image OSGimage = _canvasoff.getScreenshotImage();
172 21095 jcampos
173
                BufferedImage img = null;
174
                try {
175
                        img = OSGimage.getBufferedImage();
176
                } catch (ImageConversionException e1) {
177
                        // TODO Auto-generated catch block
178
                        e1.printStackTrace();
179
                } catch (IOException e1) {
180
                        // TODO Auto-generated catch block
181
                        e1.printStackTrace();
182
                }
183
184 20893 jcampos
                double scalex = w / img.getWidth(null);
185
                double scaley = h / img.getHeight(null);
186
                try {
187
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
188
                                        scaley);
189
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
190
                        xpos.concatenate(xform);
191
                        g.drawRenderedImage(img, xpos);
192
                } catch (ImagingOpException e) {
193
                        NotificationManager.addError("Dibujando FFramePicture", e);
194
                }
195
196 20125 jcampos
        }
197
198 21525 jcampos
        public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2)
199
                        throws ReadDriverException {
200 22350 jcampos
201 21525 jcampos
                int x = (int) getViewPort().getOffset().getX();
202
                int y = (int) getViewPort().getOffset().getY();
203
                int w = (int) g.getClipBounds().getWidth();
204
                int h = (int) g.getClipBounds().getHeight();
205 22350 jcampos
                System.err.println("x " + x + "; y " + y + "; w " + w + "; h" + h);
206 20125 jcampos
207 31394 mten
                Camera viewerCam = _canvas3d.getOSGViewer().getCamera();
208 22350 jcampos
                BufferedImage s = null;
209 22470 jcampos
210 22350 jcampos
                try {
211
                        int minw = (int) w / 10;
212
                        int minh = (int) h / 10;
213
                        System.out.println("minw" + minw + " minh" + minh);
214 21908 jcampos
215 31394 mten
                        _printViewer = new TerrainViewer();
216 31879 jtorres
//                        Terrain planetView3D = ((TerrainViewer) _canvas3d.getOSGViewer()).getTerrain(0);
217
//                        Terrain terrain = new Terrain();
218
//                        terrain.setCoordinateSystemType(planetView3D
219
//                                        .getCoordinateSystemType());
220
//                        terrain.setCoordinateSystemName(planetView3D
221
//                                        .getCoordinateSystemName());
222
//                        terrain.setCoordinateSystemFormat(planetView3D
223
//                                        .getCoordinateSystemFormat());
224
//                        terrain.setExtent(planetView3D.getExtent());
225
//                        terrain.setTerrainName(planetView3D.getTerrainName());
226
//
227
//
228
//                        terrain.init();
229
//                        terrain.setLayerManager(_terrainLayerManager);
230 31878 jtorres
231 31879 jtorres
                        _printViewer.addTerrain((((TerrainViewer) _canvas3d.getOSGViewer())
232
                                        .getTerrain(0)));
233 31669 rgaitan
                        _printViewer.addFeature((((TerrainViewer) _canvas3d.getOSGViewer())
234
                                        .getFeatures()));
235
                        Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
236
                                        .getClearColor();
237
                        _printViewer.setClearColor(color.x(), color.y(), color.z(), color
238
                                        .w());
239 31394 mten
                        _printViewer.setUpViewerInBackground(0, 0, minw, minh);
240 22350 jcampos
241
                        PrintUtilities util = new PrintUtilities();
242 31394 mten
                        util.setViewer(_printViewer);
243 22350 jcampos
                        s = util.getHighResolutionImage(viewerCam, w, h);
244
245
                        RenderedImage render = s;
246
                } catch (NodeException e1) {
247
                        // TODO Auto-generated catch block
248
                        e1.printStackTrace();
249 22470 jcampos
                }
250 22350 jcampos
251 22171 jcampos
                double scalex = w / s.getWidth(null);
252
                double scaley = h / s.getHeight(null);
253 21908 jcampos
                try {
254
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
255
                                        scaley);
256
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
257
                        xpos.concatenate(xform);
258 22171 jcampos
                        g.drawRenderedImage(s, xpos);
259 21908 jcampos
                        // g.drawRenderedImage(img, new AffineTransform());
260
                } catch (ImagingOpException e) {
261
                        NotificationManager.addError("Dibujando FFramePicture", e);
262
                }
263 31394 mten
                _printViewer.releaseGLContext();
264
                _printViewer.dispose();
265 22171 jcampos
                System.gc();
266 21525 jcampos
        }
267
268 14901 salva
        public MapContext3D(ViewPort vp) {
269
                super(vp);
270
        }
271
272
        public MapContext3D(FLayers fLayers, ViewPort vp) {
273
                super(fLayers, vp);
274
        }
275 15333 julio
276 31394 mten
        public void setTerrain(Terrain terrain) {
277 31669 rgaitan
                if (_terrain == terrain)
278
                        return;
279
280 31394 mten
                _terrain = terrain;
281 15264 julio
282 31683 rgaitan
                // add layers to terrain necessary when we are loading
283 31669 rgaitan
                addCurrentLayers();
284 15308 salva
        }
285
286 31394 mten
        public Terrain getTerrain() {
287
                return _terrain;
288 15308 salva
        }
289 31669 rgaitan
290 31642 mten
        public void setDataManager(JavaDataDriver manager) {
291
                _terrainDataManager = manager;
292
                _terrainDataManager.setDataLoader(this);
293
        }
294
295
        public JavaDataDriver getDataManager() {
296
                return _terrainDataManager;
297
        }
298 31669 rgaitan
299 31642 mten
        public void setLayerManager(LayerManager manager) {
300
                _terrainLayerManager = manager;
301
        }
302
303
        public LayerManager getLayerManager() {
304
                return _terrainLayerManager;
305
        }
306
307 15308 salva
        public void setViewer(IViewerContainer canvas) {
308 31394 mten
                _canvas3d = canvas;
309
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
310 15308 salva
        }
311 15333 julio
312 15308 salva
        public IProjection getViewProjection() {
313 31394 mten
                return _viewProjection;
314 15308 salva
        }
315
316
        public void setViewProjection(IProjection projection) {
317 31394 mten
                _viewProjection = projection;
318 15308 salva
        }
319 15333 julio
320 15308 salva
        public IViewerContainer getCanvas3d() {
321 31394 mten
                return _canvas3d;
322 15308 salva
        }
323 31863 mten
324
        public float getVerticalExaggeration() {
325
                return _verticalExaggeration;
326
        }
327 15308 salva
328 31863 mten
        public void setVerticalExaggeration(float verticalExaggeration) {
329
                _verticalExaggeration = verticalExaggeration;
330
        }
331
332 15308 salva
        public void setLoading(boolean bLoading) {
333 31394 mten
                _bLoading = bLoading;
334 15308 salva
        }
335 15333 julio
336 15308 salva
        public FLayers getNewGroupLayer(FLayers parent) {
337 15333 julio
                return new FLayers3D(this, parent, getViewPort());
338 15308 salva
        }
339
340 15333 julio
        /** * LAYER CHANGES called by FLayers3D ** */
341
342 31695 rgaitan
        public synchronized void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
343 15333 julio
                        int newPos) {
344
345 15308 salva
                if (layer instanceof FLayers) {
346 15333 julio
                        FLayers group = (FLayers) layer;
347 15308 salva
                        if (newPos > oldPos) {
348 15333 julio
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
349
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
350
                                                        oldPos, newPos);
351
                        } else {
352
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
353
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
354
                                                        oldPos, newPos);
355 15308 salva
                        }
356
                        return;
357
                }
358 31669 rgaitan
359 15308 salva
                Layer3DProps props3D = getLayer3DProps(layer);
360 31666 mten
                int type = props3D.getType();
361 31669 rgaitan
362 31666 mten
                // Now reorder in layer manager only for terrain layer types
363 31669 rgaitan
                if ((type == Layer3DProps.layer3DOSG)
364
                                || ((type == Layer3DProps.layer3DVector)))
365
                        return;
366
367 31666 mten
                // Obtain the old position in the layer
368
                Layer terrainLayer = _terrainFLayerMap.get(layer);
369 31669 rgaitan
                Vector<Integer> terrainOldPos = _terrainLayerManager
370
                                .getOrder(terrainLayer);
371
372 31666 mten
                int terrainNewPos = 0;
373 31669 rgaitan
                // Compute the new position.
374 31666 mten
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
375
                while (lyrIterator.hasNext()) {
376
                        FLayer auxLayer = lyrIterator.next();
377 31669 rgaitan
                        if (auxLayer == layer)
378
                                break;
379 31666 mten
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
380 31669 rgaitan
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
381
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
382 31666 mten
                                terrainNewPos++;
383 15333 julio
                        }
384 31669 rgaitan
385 15333 julio
                }
386 31669 rgaitan
387
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
388
                        return;
389 31692 mten
                if (terrainOldPos.get(0) != terrainNewPos)
390 31689 mten
                        _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
391 15333 julio
392 31669 rgaitan
                System.out.println("En el toc antes era el " + oldPos + " y ahora el "
393
                                + newPos);
394
                System.out.println("En el terrain antes era el " + terrainOldPos
395
                                + " y ahora el " + terrainNewPos);
396
397 15333 julio
                PrintDebugLayers();
398 15308 salva
        }
399 15333 julio
400 15308 salva
        public void layerAdded(FLayers3D parent, FLayer layer) {
401
402
                // to add group layers to 3D, just add recursively child data layers
403
                if (layer instanceof FLayers) {
404 15333 julio
                        FLayers group = (FLayers) layer;
405
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
406
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
407 15308 salva
                        }
408
                        getLayer3DProps(layer).setHooked(true);
409
                        return;
410
                }
411
412
                if (layer instanceof Classifiable) {
413
                        Classifiable legendLyr = (Classifiable) layer;
414 24882 jcampos
                        // legendLyr.addLegendListener((LegendListener) this);
415
                        this.addLayerListener(this);
416 15308 salva
                }
417 25001 jcampos
                layer.addLayerListener((LayerListener) this);
418 20125 jcampos
419 18328 jcampos
                // listener to manage the selection for the layers
420
                if (layer.getClass().equals(FLyrVect.class)) {
421
                        FLyrVect lyr = (FLyrVect) layer;
422
                        try {
423 24882 jcampos
                                SelectableDataSource recordSet = lyr.getRecordset();
424 25001 jcampos
                                if (recordSet != null) {
425
                                        SelectionSupport selectionSupport = recordSet
426
                                                        .getSelectionSupport();
427
                                        selectionSupport.addSelectionListener(this);
428
                                }
429 18328 jcampos
                        } catch (ReadDriverException e) {
430
                                // TODO Auto-generated catch block
431
                                e.printStackTrace();
432
                        }
433
                }
434 15308 salva
435 31394 mten
                if (!_bLoading)
436 31642 mten
                        addLayerToTerrain(layer, true);
437 31669 rgaitan
438 15308 salva
                // Only do this the first time to add layer
439 31652 mten
                if (_bEmptyView && !_bLoading) {
440 31666 mten
                        if (layers.getLayersCount() > 0) {
441
                                try {
442
                                        zoomToExtent(layer.getFullExtent());
443
                                } catch (ExpansionFileReadException e) {
444
                                        e.printStackTrace();
445
                                } catch (ReadDriverException e) {
446
                                        e.printStackTrace();
447 15308 salva
                                }
448 31394 mten
                                _bEmptyView = false;
449 15308 salva
                        }
450 31652 mten
                }
451 31642 mten
452 15308 salva
                PrintDebugLayers();
453
        }
454 15333 julio
455 15308 salva
        public void layerRemoved(FLayers3D parent, FLayer layer) {
456 15333 julio
457
                // to remove group layers to 3D, just remove recursively child data
458
                // layers
459 15308 salva
                if (layer instanceof FLayers) {
460 15333 julio
                        FLayers group = (FLayers) layer;
461
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
462
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
463 15308 salva
                        }
464
                        getLayer3DProps(layer).setHooked(false);
465
                        return;
466
                }
467 15333 julio
468 15308 salva
                if (layer instanceof Classifiable) {
469
                        Classifiable legendLyr = (Classifiable) layer;
470
                        legendLyr.removeLegendListener((LegendListener) this);
471
                }
472 31669 rgaitan
473 15308 salva
                layer.removeLayerListener((LayerListener) this);
474 15333 julio
475 31666 mten
                removeLayerToTerrain(layer);
476 15333 julio
477 15308 salva
                // All layers are removed
478 31666 mten
                if (layers.getLayersCount() == 0) {
479 31394 mten
                        _bEmptyView = true;
480 15308 salva
                }
481 15333 julio
482 15308 salva
                PrintDebugLayers();
483 15333 julio
        }
484
485 14949 salva
        /**
486 15308 salva
         * DOCUMENT ME!
487
         *
488
         * @param e
489
         *            DOCUMENT ME!
490
         */
491
        public void legendChanged(LegendChangedEvent e) {
492
493 31394 mten
                if (!_bListenToLegend)
494 15308 salva
                        return;
495 31669 rgaitan
                if ((e == null) && (!visibilityChange)) {
496 24882 jcampos
                        // find layer whose legend changed
497
                        FLayer found = null;
498
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
499
                        while (lyrIterator.hasNext()) {
500
                                FLayer lyr = lyrIterator.next();
501
                                if (lyr instanceof FLyrVect) {
502
                                        FLyrVect lyrVect = (FLyrVect) lyr;
503
                                        long newDrawVersion = lyrVect.getDrawVersion();
504
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
505 25001 jcampos
                                        if (newDrawVersion != props3D.drawVersion) {
506 24882 jcampos
                                                props3D.drawVersion = lyrVect.getDrawVersion();
507 31394 mten
                                                refreshLayerInTerrain(props3D, true);
508
                                                _bListenToLegend = false;
509
                                                props3D.VerifyLegend(_terrain.getTerrainName());
510
                                                _bListenToLegend = true;
511 15308 salva
                                        }
512
                                }
513
                        }
514 25001 jcampos
515
                        IWindow f = PluginServices.getMDIManager().getActiveWindow();
516
                        if (f instanceof BaseView) {
517
                                BaseView view3D = (BaseView) f;
518
                                view3D.getTOC().refresh();
519
                        }
520 15308 salva
                }
521 25845 jcampos
                visibilityChange = false;
522 15308 salva
        }
523
524
        public void visibilityChanged(LayerEvent e) {
525
                FLayer lyr = e.getSource();
526
527
                Layer3DProps props3D = getLayer3DProps(lyr);
528
529
                if (props3D.getType() == Layer3DProps.layer3DVector) {
530
                        refreshLayerVectorsVisibility(lyr);
531 25330 afraile
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
532
                        refreshLayer3DOSGVisibility(lyr);
533 31669 rgaitan
                } else {
534 15308 salva
                        refreshLayerVisibility(lyr);
535
                }
536 25845 jcampos
                visibilityChange = true;
537 15308 salva
        }
538
539 25330 afraile
        private void refreshLayer3DOSGVisibility(FLayer lyr) {
540 31394 mten
                if (_terrain == null || _viewProjection == null)
541 25330 afraile
                        return;
542
543
                Layer3DProps props3D = getLayer3DProps(lyr);
544 31669 rgaitan
545 25330 afraile
                OSGCacheService cacheService = (OSGCacheService) props3D
546
                                .getCacheService();
547
                if (cacheService != null) {
548 31394 mten
                        // use VectorCacheService to add features to terrain
549
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
550 25330 afraile
                }
551 31669 rgaitan
552 25330 afraile
        }
553 31394 mten
554 15308 salva
        private void refreshLayerVisibility(FLayer layer) {
555 31669 rgaitan
556 31666 mten
                Layer terrainLayer = _terrainFLayerMap.get(layer);
557
                terrainLayer.setEnabled(layer.isVisible());
558 31689 mten
                _terrainLayerManager.updateLayers();
559 31692 mten
560 15308 salva
        }
561 15333 julio
562 15308 salva
        private void refreshLayerVectorsVisibility(FLayer lyr) {
563 31394 mten
                if (_terrain == null || _viewProjection == null)
564 15308 salva
                        return;
565
566
                Layer3DProps props3D = getLayer3DProps(lyr);
567
568
                VectorCacheService cacheService = (VectorCacheService) props3D
569
                                .getCacheService();
570
                if (cacheService != null) {
571 31394 mten
                        // use VectorCacheService to add features to terrain
572
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
573 31819 jtorres
                        props3D.drawVersion = lyr.getDrawVersion();
574 15308 salva
                }
575
576
        }
577
578
        public void activationChanged(LayerEvent e) {
579 15405 julio
                // TODO Implement this method
580 15308 salva
        }
581
582
        public void nameChanged(LayerEvent e) {
583 15405 julio
                // TODO Implement this method
584 15308 salva
        }
585
586
        public void editionChanged(LayerEvent e) {
587 15405 julio
                // TODO Implement this method
588 20125 jcampos
589 15308 salva
        }
590
591 31394 mten
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
592 15308 salva
                if (props == null)
593
                        return;
594
595 31394 mten
                if (_terrain == null)
596 15308 salva
                        return; // view not opened yet
597
598 15333 julio
                // clear cache
599 15308 salva
600
                if (bRemoveCache) {
601
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
602 31394 mten
                                        + _terrain.getTerrainName() + "/" + props.getCacheName();
603 15308 salva
                        removeCache(layerCacheDir);
604
                }
605 15333 julio
606 31394 mten
                // refresh layer in terrain
607 15308 salva
                int type = props.getType();
608 31692 mten
                if ((type == Layer3DProps.layer3DImage)||(type == Layer3DProps.layer3DElevation)||
609
                                (type == Layer3DProps.layer3DVectorMR)) {
610
                        _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
611 15308 salva
                } else if (type == Layer3DProps.layer3DVector) {
612
                        invalidateVectorLayer(props);
613
                }
614
        }
615
616
        private void invalidateVectorLayer(Layer3DProps props) {
617
                // TODO Auto-generated method stub
618 31394 mten
                if (_terrain == null || _viewProjection == null)
619 15308 salva
                        return;
620
621
                VectorCacheService cacheService = (VectorCacheService) props
622
                                .getCacheService();
623
                if (cacheService != null) {
624 31394 mten
                        // use VectorCacheService to add features to terrain
625 31414 jtorres
                        cacheService.refreshFeaturesToTerrain();
626 15308 salva
                }
627
        }
628
629
        private boolean removeCache(String folder) {
630
                File dir = new File(folder);
631
                if (dir.isDirectory()) {
632
                        String[] children = dir.list();
633
                        for (int i = 0; i < children.length; i++) {
634
                                boolean success = removeCache(folder + "/" + children[i]);
635 15333 julio
                                // Do not interrupt if it can't delete one file
636
                                // if (!success) {
637
                                // return false;
638
                                // }
639 15308 salva
                        }
640
                }
641
642
                // The directory is now empty so delete it
643
                return dir.delete();
644
        }
645
646
        protected Layer3DProps getLayer3DProps(FLayer layer) {
647 31669 rgaitan
648 15308 salva
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
649 31669 rgaitan
650 31642 mten
                // Create instance of props for osg layers.
651 15308 salva
                if (props3D == null) {
652
                        props3D = new Layer3DProps();
653 22674 jcampos
                        if (layer instanceof FLyrVect) {
654
                                FLyrVect nLayer = (FLyrVect) layer;
655
                                Driver driver;
656
                                try {
657
                                        driver = nLayer.getRecordset().getDriver();
658
                                        if (driver instanceof GvsigDriverOSG) {
659
                                                props3D.setChooseType(false);
660 31736 jtorres
                                                props3D.setType(Layer3DProps.layer3DOSG);
661 22674 jcampos
                                        }
662
                                } catch (ReadDriverException e) {
663
                                        // TODO Auto-generated catch block
664
                                        e.printStackTrace();
665
                                }
666
667
                        }
668 31642 mten
                        // Set the properties
669 15308 salva
                        props3D.setLayer(layer);
670 24882 jcampos
671 31394 mten
                        props3D.initCacheName(_terrain.getCoordinateSystemType(),
672
                                        _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
673 15308 salva
                        FLyrDefault baseLayer = (FLyrDefault) layer;
674
                        baseLayer.setProperty("3DLayerExtension", props3D);
675 31863 mten
                        props3D.setVerticalEx(getVerticalExaggeration());
676 15308 salva
                } else {
677 31394 mten
                        if (_bLoading)
678 15308 salva
                                props3D.setChooseType(false);
679
                        props3D.setLayer(layer);
680
                }
681
682
                return props3D;
683
        }
684 15333 julio
685 31669 rgaitan
        public void addCurrentLayers() {
686
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
687
                while (lyrIterator.hasNext()) {
688
                        FLayer layer = lyrIterator.next();
689
                        Layer3DProps props = getLayer3DProps(layer);
690 31692 mten
                        // props.setTerrainOrder(props.getTocOrder());
691 31669 rgaitan
                        addLayerToTerrain(layer, false);
692 25619 rgaitan
                }
693 31669 rgaitan
        }
694 25619 rgaitan
695 31695 rgaitan
        public synchronized void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
696 15308 salva
                Layer3DProps props3D = getLayer3DProps(layer);
697 31669 rgaitan
698 22470 jcampos
                if (props3D.getType() == Layer3DProps.layer3DVector) {
699 15308 salva
                        CreateVectors(layer, props3D); // special case for now without
700 22470 jcampos
                        // disk cache
701
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
702
                        CreateOSGLayer(layer, props3D);
703
                } else {
704 15333 julio
                        Rectangle2D layerExtent = null;
705 15308 salva
                        try {
706 15333 julio
                                layerExtent = layer.getFullExtent();
707
                        } catch (ExpansionFileReadException e) {
708 15308 salva
                                e.printStackTrace();
709 15333 julio
                        } catch (ReadDriverException e) {
710
                                e.printStackTrace();
711 15308 salva
                        }
712 15333 julio
                        if (layerExtent == null) { // hack for missing extents
713 31642 mten
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
714 15333 julio
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
715
                                                        180.0);
716
                                else
717
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
718
                                                        -10000000.0, 40000000.0, 20000000.0);
719 15492 julio
                                // TODO toggle comment because this code use WCS extension. When
720
                                // WCS extension runs correctly uncoment!!!
721
722 15333 julio
                                if (layer instanceof FLyrWCS)
723
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
724
                        }
725 31669 rgaitan
726 31652 mten
                        Extent extent = null;
727 31669 rgaitan
                        if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
728
                                extent = new Extent(layerExtent.getMinX(), layerExtent
729
                                                .getMinY(), layerExtent.getMaxX(), layerExtent
730
                                                .getMaxY());
731 31652 mten
                        } else {
732 31669 rgaitan
                                extent = new Extent(Math.toRadians(layerExtent.getMinX()), Math
733
                                                .toRadians(layerExtent.getMinY()), Math
734
                                                .toRadians(layerExtent.getMaxX()), Math
735
                                                .toRadians(layerExtent.getMaxY()));
736 31652 mten
                        }
737 31669 rgaitan
738
                        if (props3D.getType() == Layer3DProps.layer3DImage) {
739 31642 mten
                                RasterLayer rlayer = new RasterLayer();
740 31669 rgaitan
                                rlayer.setEnabled(layer.isVisible());
741 31642 mten
                                rlayer.setExtent(extent);
742 31669 rgaitan
                                rlayer.setOpacity(props3D.getOpacity());
743 31642 mten
                                rlayer.setDataDriver(_terrainDataManager);
744
                                _terrainLayerManager.addLayer(rlayer);
745 31652 mten
                                _terrainFLayerMap.put(layer, rlayer);
746
                                _terrainLayerMap.put(rlayer.getLayerID(), layer);
747 31689 mten
                                props3D.setTerrainLayer(rlayer);
748 31669 rgaitan
                        } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
749 31642 mten
                                HeightfieldLayer hlayer = new HeightfieldLayer();
750 31669 rgaitan
                                hlayer.setEnabled(layer.isVisible());
751 31642 mten
                                hlayer.setExtent(extent);
752 31669 rgaitan
                                hlayer.setVerticalExaggeration(props3D.getVerticalEx());
753 31642 mten
                                hlayer.setDataDriver(_terrainDataManager);
754
                                _terrainLayerManager.addLayer(hlayer);
755 31652 mten
                                _terrainFLayerMap.put(layer, hlayer);
756
                                _terrainLayerMap.put(hlayer.getLayerID(), layer);
757 31689 mten
                                props3D.setTerrainLayer(hlayer);
758 31669 rgaitan
                        } else if (props3D.getType() == Layer3DProps.layer3DVectorMR) {
759 31652 mten
                                VectorLayer vlayer = new VectorLayer();
760
                                vlayer.setEnabled(true);
761
                                vlayer.setExtent(extent);
762
                                vlayer.setDensity(1.0f);
763
                                vlayer.setDataDriver(_terrainDataManager);
764
                                _terrainLayerManager.addLayer(vlayer);
765
                                _terrainFLayerMap.put(layer, vlayer);
766
                                _terrainLayerMap.put(vlayer.getLayerID(), layer);
767 31689 mten
                                props3D.setTerrainLayer(vlayer);
768 15333 julio
                        }
769 15308 salva
770
                        if (bVerifyLegend) {
771 31394 mten
                                _bListenToLegend = false;
772 31642 mten
                                props3D.VerifyLegend(_terrain.getTerrainName());
773 31394 mten
                                _bListenToLegend = true;
774 15308 salva
                        }
775
                }
776
        }
777
778 22470 jcampos
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
779 31394 mten
                if (_terrain == null || _viewProjection == null)
780 22470 jcampos
                        return;
781
782
                OSGCacheService cacheService = (OSGCacheService) props3D
783
                                .getCacheService();
784
                if (cacheService == null) {
785 31394 mten
                        cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
786
                                        .getCacheName(), layer, _viewProjection);
787 22470 jcampos
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
788
                        props3D.setCacheService(cacheService);
789
                }
790
791
                // use VectorCacheService to add features to planet
792 31394 mten
                cacheService.AddFeaturesToTerrain();
793 22470 jcampos
794
        }
795
796 25581 jcampos
        @Override
797
        public XMLEntity getXMLEntity() throws XMLException {
798
                // TODO Auto-generated method stub
799
                XMLEntity xml = super.getXMLEntity();
800 31669 rgaitan
801 25581 jcampos
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
802
                while (lyrIterator.hasNext()) {
803
                        FLayer lyr = lyrIterator.next();
804
                        Layer3DProps props3D = getLayer3DProps(lyr);
805
                        int type = props3D.getType();
806 31669 rgaitan
                        if (type == Layer3DProps.layer3DOSG) {
807
808 25581 jcampos
                                OSGCacheService cacheService = (OSGCacheService) props3D
809 31669 rgaitan
                                                .getCacheService();
810 25581 jcampos
                                if (cacheService != null) {
811
                                        // use VectorCacheService to add features to planet
812 31669 rgaitan
                                        if (props3D.isEditing()) {
813 25581 jcampos
                                                // TODO: PONER AKI EL CODIGO DE SALVAR
814
                                        }
815
                                }
816
                        }
817
                }
818 31669 rgaitan
819 25581 jcampos
                return xml;
820 31669 rgaitan
821 25581 jcampos
        }
822
823 15308 salva
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
824 31394 mten
                if (_terrain == null || _viewProjection == null)
825 15308 salva
                        return;
826
827
                VectorCacheService cacheService = (VectorCacheService) props3D
828
                                .getCacheService();
829
                if (cacheService == null) {
830 31394 mten
                        cacheService = new VectorCacheService(_canvas3d, _terrain, props3D
831
                                        .getCacheName(), layer, _viewProjection);
832 15308 salva
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
833
                        props3D.setCacheService(cacheService);
834
                }
835
836 31394 mten
                // use VectorCacheService to add features to terrain
837 31414 jtorres
                cacheService.addFeaturesToTerrain();
838 15308 salva
        }
839
840
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
841 31394 mten
                if (_terrain == null || _viewProjection == null)
842 15308 salva
                        return;
843
844
                VectorCacheService cacheService = (VectorCacheService) props3D
845
                                .getCacheService();
846
                if (cacheService != null) {
847 31394 mten
                        // use VectorCacheService to delete features to terrain
848 31414 jtorres
                        cacheService.deleteFeaturesToTerrain();
849 15308 salva
                }
850
        }
851
852
        /**
853 14949 salva
         * Sets the given zoom extent to the view
854 15264 julio
         *
855 14949 salva
         * @param extent
856
         *            The extent to zoom to.
857
         */
858 15308 salva
        public void zoomToExtent(Rectangle2D geoExtent) {
859
                double maxHeight = 0.0;
860
861
                // Getting extent positions
862
                double minLat = geoExtent.getMinY();
863
                double maxLat = geoExtent.getMaxY();
864
                double cenLon = geoExtent.getCenterX();
865
                double cenLat = geoExtent.getCenterY();
866
867
                double elevation = 0;
868
869
                // calculate altitude
870
                double avLat = 0;
871
                if (minLat > 0.0 || maxLat < 0.0)
872
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
873
                double avLon = Math.min(180.0, geoExtent.getWidth());
874
875 31394 mten
                double terrainRadius = _terrain.getRadiusEquatorial();
876
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
877 15308 salva
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
878
                                * (1 - Math.cos(Math.toRadians(avLon))));
879 31394 mten
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
880 15308 salva
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
881
882 15663 jcampos
                double zoomFactor = 1.5;
883 15308 salva
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
884
885
                // Calculate XYZ positions for camera.
886
887 31394 mten
                int terrainType = _terrain.getCoordinateSystemType();
888 15308 salva
889
                Vec3 eye = new Vec3();
890
                Vec3 center = new Vec3();
891
                Vec3 up = new Vec3();
892
                // Calculate positions for PLAIN MODE.
893 31394 mten
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
894 15308 salva
895
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
896
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
897
                        double height;
898
899
                        height = Math.sqrt(difx * difx + dify * dify);
900 25552 afraile
                        double fullWindowFactor = 1.7;
901 15308 salva
                        // EYE
902
                        eye.setX(cenLon);
903
                        eye.setY(cenLat);
904 25552 afraile
                        eye.setZ(height * fullWindowFactor);
905 15308 salva
                        // CENTER
906
                        center.setX(cenLon);
907
                        center.setY(cenLat);
908
                        center.setZ(0.0);
909
                        // UP
910
                        up.setX(0.0);
911
                        up.setY(1.0);
912
                        up.setZ(0.0);
913
                } else
914
                // Calculate positions for SPHERICAL MODE.
915 31394 mten
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
916 15308 salva
                        // EYE
917
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
918 31394 mten
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
919 15308 salva
                        // CENTER
920
                        center.setX(0.0);
921
                        center.setY(0.0);
922
                        center.setZ(0.0);
923
                        // UP
924
                        up.setX(0.0);
925
                        up.setY(0.0);
926
                        up.setZ(1.0);
927
                }
928
                Camera cam = new Camera();
929
                cam.setViewByLookAt(eye, center, up);
930
931 31394 mten
                _terrainViewer.setCamera(cam);
932 15333 julio
933 14949 salva
        }
934 15333 julio
935 15308 salva
        private void PrintDebugLayers() {
936 31669 rgaitan
                if (_terrainLayerManager != null) {
937
                        System.out.println("===========================");
938
                        System.out.println("Total terrain layers: "
939
                                        + _terrainLayerManager.getNumLayers());
940
                        System.out.println("===========================");
941
                }
942 31666 mten
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
943
                int pos = 0;
944
                while (lyrIterator.hasNext()) {
945
                        FLayer layer = lyrIterator.next();
946
                        System.out.println("  Layer " + layer.getName());
947
                        Layer3DProps props3D = getLayer3DProps(layer);
948
                        System.out.println("    Type " + props3D.getType());
949 31669 rgaitan
                        System.out.println("    Order " + pos);
950 31666 mten
                        pos++;
951 15308 salva
                }
952
        }
953
954 14901 salva
        /**
955
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
956 15264 julio
         *
957 14901 salva
         * @param xml
958
         *            XMLEntity
959 15264 julio
         *
960 14901 salva
         * @return Nuevo MapContext3D.
961 15264 julio
         *
962 14901 salva
         * @throws XMLException
963
         */
964
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
965 15333 julio
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
966 14901 salva
967
                FLayers layers = new FLayers3D(null, null, vp);
968
                layers.setXMLEntity(xml.getChild(1));
969
970 15264 julio
                MapContext fmap = layers.getMapContext();
971 14901 salva
972
                return fmap;
973
        }
974
975
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
976
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
977
978
                FLayers layers = new FLayers3D(null, null, vp);
979
                layers.setXMLEntity03(xml.getChild(1));
980
981 15264 julio
                MapContext fmap = layers.getMapContext();
982 14901 salva
983
                return fmap;
984
        }
985 15264 julio
986 15236 julio
        public GraphicLayer getGraphicsLayer() {
987 31394 mten
                GraphicLayer3D gra3D = new GraphicLayer3D(_terrainViewer, getTerrain());
988 15236 julio
                return gra3D;
989
        }
990 14901 salva
991 15308 salva
        public Node getSpecialNode() {
992 20893 jcampos
                Node specialNode = null;
993
                try {
994 31394 mten
                        specialNode = _terrainViewer.getFeature(0);
995 20893 jcampos
                } catch (ChildIndexOutOfBoundsExceptions e) {
996 31394 mten
                        _logger.error("Command: " + "Error child index out of bound.", e);
997 20893 jcampos
                }
998
                return specialNode;
999 15264 julio
        }
1000 15333 julio
1001 15317 julio
        public ViewPort getViewPort() {
1002 15333 julio
1003
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1004
1005 31394 mten
                if (_canvas3d != null)
1006 31669 rgaitan
                        vp.setImageSize(new Dimension(_terrainViewer.getWidth(),
1007
                                        _terrainViewer.getHeight()));
1008 31394 mten
                vp.setTerrain(this.getTerrain());
1009
                vp.setViewer(this._canvas3d);
1010 15333 julio
1011 15324 julio
                return vp;
1012 15317 julio
        }
1013 15333 julio
1014 15317 julio
        /**
1015 15587 rgaitan
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1016 31692 mten
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
1017
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
1018
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
1019 15317 julio
         */
1020 31394 mten
1021 31669 rgaitan
        /*
1022
         * public void invalidate() { ViewPort3D vp = (ViewPort3D)
1023
         * super.getViewPort(); if (vp.getDirty()) { vp.setDirty(false); } FLayer[]
1024
         * selectedExtent = getLayers().getActives();
1025
         *
1026
         * if (selectedExtent.length > 0) { for (int i = 0; i <
1027
         * selectedExtent.length; i++) { if (selectedExtent[0].isAvailable()) {
1028
         *
1029
         * FLayer lyr3D = selectedExtent[i]; Layer3DProps layer3DProps =
1030
         * Layer3DProps .getLayer3DProps(lyr3D);
1031
         *
1032
         * Layer terrainLayer = _terrainFLayerMap.get(lyr3D); float opacity =
1033
         * (((FLyrDefault) lyr3D).getTransparency()) / (float) 255; if()
1034
         * //_terrain.setTextureOpacityLayer(order, opacity); } }
1035
         *
1036
         * } }
1037
         */
1038 20125 jcampos
1039 18328 jcampos
        public void selectionChanged(SelectionEvent e) {
1040
                // TODO Auto-generated method stub
1041 31666 mten
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1042
                while (lyrIterator.hasNext()) {
1043
                        FLayer layer = lyrIterator.next();
1044
                        Layer3DProps props3D = getLayer3DProps(layer);
1045 31669 rgaitan
                        if (props3D.getType() != Layer3DProps.layer3DOSG) {
1046 18328 jcampos
                                if (layer.getClass().equals(FLyrVect.class)) {
1047
                                        FLyrVect lyr = (FLyrVect) layer;
1048 20125 jcampos
1049
                                        FBitSet selection = null;
1050
                                        try {
1051
                                                selection = lyr.getRecordset().getSelectionSupport()
1052
                                                                .getSelection();
1053
                                        } catch (ReadDriverException e1) {
1054
                                                // TODO Auto-generated catch block
1055
                                                e1.printStackTrace();
1056
                                        }
1057
1058
                                        if ((selection.cardinality() == 0)
1059
                                                        || (!(selection.isEmpty()))) {
1060
                                                Layer3DProps props = Layer3DProps
1061
                                                                .getLayer3DProps(layer);
1062 31394 mten
                                                refreshLayerInTerrain(props, true);
1063 24882 jcampos
                                                if (layer instanceof FLyrVect) {
1064
                                                        FLyrVect fvect = (FLyrVect) layer;
1065
                                                        props.drawVersion = fvect.getDrawVersion();
1066
                                                }
1067 20125 jcampos
                                        }
1068 18328 jcampos
                                }
1069
                        }
1070
                }
1071
        }
1072 20893 jcampos
1073 31695 rgaitan
        public synchronized void removeLayerToTerrain(FLayer layer) {
1074 21545 afraile
                // TODO Auto-generated method stub
1075
                Layer3DProps props3D = getLayer3DProps(layer);
1076
1077
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1078
                        DeleteVectors(layer, props3D);
1079 22470 jcampos
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1080
                        DeleteOSGLayer(layer, props3D);
1081 31652 mten
                } else {
1082
                        Layer terrainLayer = _terrainFLayerMap.get(layer);
1083 31669 rgaitan
                        if (terrainLayer != null) {
1084 31654 rgaitan
                                _terrainLayerMap.remove(terrainLayer.getLayerID());
1085
                                _terrainFLayerMap.remove(layer);
1086 31692 mten
1087 31689 mten
                                _terrainLayerManager.removeLayer(terrainLayer);
1088 31654 rgaitan
                        }
1089 21545 afraile
                }
1090
1091
        }
1092
1093 22470 jcampos
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1094 31394 mten
                if (_terrain == null || _viewProjection == null)
1095 22470 jcampos
                        return;
1096
1097
                OSGCacheService cacheService = (OSGCacheService) props3D
1098
                                .getCacheService();
1099
                if (cacheService != null) {
1100 31394 mten
                        // use VectorCacheService to delete features to terrain
1101
                        cacheService.DeleteFeaturesToTerrain();
1102 22470 jcampos
                }
1103
        }
1104
1105 22171 jcampos
        public boolean isRenewCanvasOff() {
1106 31394 mten
                return _renewCanvasOff;
1107 22171 jcampos
        }
1108
1109
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1110 31394 mten
                _renewCanvasOff = renewCanvasOff;
1111 22171 jcampos
        }
1112
1113 24239 rgaitan
        public void drawValueChanged(LayerEvent arg0) {
1114 24882 jcampos
                // TODO Auto-generated method stub
1115
1116 24239 rgaitan
        }
1117
1118 31726 rgaitan
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1119 31669 rgaitan
1120
                if (_terrainLayerMap.size() == 0)
1121
                        return null;
1122
                if (rde == null)
1123
                        return null;
1124
                if (rde.getExtent() == null)
1125
                        return null;
1126
                if (rde.getLayer() == null)
1127
                        return null;
1128
                if (rde.getLayerManager() == null)
1129
                        return null;
1130
1131 31642 mten
                UpdateDataEvent ude = new UpdateDataEvent();
1132
                ude.copyDataFromRequest(rde);
1133 31732 rgaitan
1134 31669 rgaitan
1135 31642 mten
                String layerID = rde.getLayer().getLayerID();
1136 31652 mten
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1137 31669 rgaitan
                if (layer == null)
1138
                        return null;
1139
                if (!layer.isVisible())
1140
                        return null;
1141
1142 31642 mten
                Layer3DProps props3D = getLayer3DProps(layer);
1143 31669 rgaitan
1144 31642 mten
                // get/create cache service
1145
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1146
                                .getCacheService();
1147
                if (cacheService == null) {
1148
                        cacheService = new FLayerCacheService(_terrain, props3D
1149
                                        .getCacheName(), layer, _viewProjection);
1150
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1151
                        props3D.setCacheService(cacheService);
1152
                }
1153
1154
                int dataType = props3D.getType();
1155
                Point tileIndices = new Point(rde.getTileX(), rde.getTileY());
1156
                TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
1157
1158 31692 mten
                String tileFileName = "";
1159 31669 rgaitan
1160 31652 mten
                double minX, minY, width, height;
1161 31669 rgaitan
1162
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1163 31652 mten
                        minX = rde.getExtent().xMin();
1164
                        minY = rde.getExtent().yMin();
1165
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1166
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1167
                } else {
1168
                        minX = Math.toDegrees(rde.getExtent().xMin());
1169
                        minY = Math.toDegrees(rde.getExtent().yMin());
1170 31669 rgaitan
                        width = Math.toDegrees(rde.getExtent().xMax()
1171
                                        - rde.getExtent().xMin());
1172
                        height = Math.toDegrees(rde.getExtent().yMax()
1173
                                        - rde.getExtent().yMin());
1174 31652 mten
                }
1175 31692 mten
                boolean failData = false;
1176 31642 mten
1177
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1178
                if (cacheService.intersectsLayer(extent)) { // extent test
1179
                        try {
1180
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1181 31726 rgaitan
                                if(tileFileName == null)
1182
                                        failData = true;
1183 31642 mten
                        } catch (Exception e) {
1184 31692 mten
                                failData = true;
1185 31726 rgaitan
                                NotificationManager.addInfo("Problem reading tile:" + tileNum, e);
1186
                                e.printStackTrace();
1187 31642 mten
                        }
1188 31669 rgaitan
1189 31692 mten
                        if (failData) {
1190 31732 rgaitan
                                return null;
1191
                                //ude.setFailData();
1192 31692 mten
                        } else {
1193
                                switch (dataType) {
1194
                                case Layer3DProps.layer3DImage:
1195
                                        ude.setRasterData(tileFileName, "gdal");
1196
                                        break;
1197
                                case Layer3DProps.layer3DElevation:
1198
                                        ude.setHeightfieldData(tileFileName, "gdal");
1199
                                        break;
1200
                                case Layer3DProps.layer3DVectorMR:
1201
                                        ude.setVectorData(tileFileName, "osg");
1202
                                        break;
1203
                                }
1204 31652 mten
                        }
1205 31669 rgaitan
                }
1206
1207 31642 mten
                return ude;
1208
        }
1209 14901 salva
}