Statistics
| Revision:

gvsig-3d / 2.1 / trunk / org.gvsig.gvsig3d / org.gvsig.gvsig3d.app / org.gvsig.gvsig3d.app.commons / src / main / java / org / gvsig / gvsig3d / app / extension / DefaultView3DPanel.java @ 385

History | View | Annotate | Download (12.4 KB)

1
/* gvSIG 3D extension for gvSIG
2
 *
3
 * Copyright (C) 2012 Prodevelop.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *   Prodevelop, S.L.
22
 *   Pza. Don Juan de Villarrasa, 14 - 5
23
 *   46001 Valencia
24
 *   Spain
25
 *
26
 *   +34 963 510 612
27
 *   +34 963 510 968
28
 *   prode@prodevelop.es
29
 *   http://www.prodevelop.es
30
 */
31
/*
32
 * AUTHORS:
33
 * 2012 AI2 - Instituto Universitario de Automatica e Informatica Industrial.
34
 * Universitat Politecnica de Valencia (UPV)
35
 * http://www.ai2.upv.es
36
 */
37

    
38

    
39
package org.gvsig.gvsig3d.app.extension;
40

    
41
import java.awt.BorderLayout;
42
import java.awt.Color;
43
import java.awt.Component;
44
import java.awt.Cursor;
45
import java.awt.Dimension;
46
import java.awt.Image;
47
import java.awt.Point;
48
import java.awt.Toolkit;
49
import java.beans.PropertyChangeEvent;
50
import java.beans.PropertyChangeListener;
51
import java.net.URL;
52

    
53
import javax.swing.ImageIcon;
54
import javax.swing.JPanel;
55
import javax.swing.JSplitPane;
56

    
57
import org.cresques.cts.IProjection;
58
import org.gvsig.andami.PluginServices;
59
import org.gvsig.andami.ui.mdiManager.WindowInfo;
60
import org.gvsig.app.project.documents.Document;
61
import org.gvsig.app.project.documents.view.MapOverview;
62
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
63
import org.gvsig.app.project.documents.view.toc.gui.TOC;
64
import org.gvsig.app.project.documents.view.toolListeners.InfoListener;
65
import org.gvsig.fmap.crs.CRSFactory;
66
import org.gvsig.fmap.geom.Geometry;
67
import org.gvsig.fmap.geom.GeometryLocator;
68
import org.gvsig.fmap.geom.GeometryManager;
69
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
70
import org.gvsig.fmap.geom.exception.CreateGeometryException;
71
import org.gvsig.fmap.geom.primitive.Envelope;
72
import org.gvsig.fmap.mapcontext.MapContextLocator;
73
import org.gvsig.fmap.mapcontext.ViewPort;
74
import org.gvsig.fmap.mapcontext.events.ColorEvent;
75
import org.gvsig.fmap.mapcontext.events.ExtentEvent;
76
import org.gvsig.fmap.mapcontext.events.ProjectionEvent;
77
import org.gvsig.fmap.mapcontext.events.listeners.ViewPortListener;
78
import org.gvsig.fmap.mapcontrol.MapControl.MapToolListener;
79
import org.gvsig.fmap.mapcontrol.MapControlLocator;
80
import org.gvsig.fmap.mapcontrol.MapControlManager;
81
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
82
import org.gvsig.fmap.mapcontrol.tools.Behavior.PointBehavior;
83
import org.gvsig.gvsig3d.Gvsig3DException;
84
import org.gvsig.gvsig3d.Gvsig3DLocator;
85
import org.gvsig.gvsig3d.Gvsig3DManager;
86
import org.gvsig.gvsig3d.app.listener.EditionListener;
87
import org.gvsig.gvsig3d.app.listener.PointSelectListener3D;
88
import org.gvsig.gvsig3d.app.resources.ResourcesFactory;
89
import org.gvsig.gvsig3d.map3d.MapContext3D;
90
import org.gvsig.gvsig3d.map3d.ViewPort3D;
91
import org.gvsig.gvsig3d.navigation.NavigationMode;
92
import org.gvsig.osgvp.terrain.JavaDataDriver;
93
import org.gvsig.osgvp.terrain.LayerManager;
94
import org.gvsig.osgvp.terrain.Terrain;
95
import org.gvsig.osgvp.viewer.Camera;
96
import org.gvsig.osgvp.viewer.DisplaySettings;
97
import org.gvsig.osgvp.viewer.IViewerContainer;
98
import org.gvsig.osgvp.viewer.OSGViewer;
99
import org.gvsig.osgvp.viewer.ViewerFactory;
100
import org.gvsig.tools.locator.LocatorException;
101

    
102
/**
103
 * @author Jesus Zarzoso- jzarzoso@ai2.upv.es
104
 * @version $Id$
105
 * 
106
 */
107

    
108
// WAS VIEW3D////////////////////////////////////////////
109
public class DefaultView3DPanel extends AbstractViewPanel {
110

    
111
        /**
112
     * 
113
     */
114
        private static final long serialVersionUID = -4044661453954786519L;
115

    
116
        private IViewerContainer _canvas3d = null;
117
        private Terrain _terrain = null;
118
        private JavaDataDriver _terrainDataManager = null;
119
        private LayerManager _terrainLayerManager = null;
120
        private NavigationMode _navMode = null;
121
        private static MapControlManager mapControlManager = MapControlLocator
122
                        .getMapControlManager();
123

    
124
        private String buttonPath;
125

    
126
        public DefaultView3DPanel() {
127
                super();
128
                this.setName("View3D");
129
        }
130

    
131
        public void initialize() {
132
                super.initialize();
133
                initComponents();
134

    
135
        }
136

    
137
        public Document getDocument() {
138

    
139
                return this.modelo;
140
        }
141

    
142
        public void setDocument(Document document) {
143
                setModel((DefaultView3DDocument) document);
144

    
145
        }
146

    
147
        public void setModel(DefaultView3DDocument model) {
148

    
149
                this.modelo = model;
150

    
151
                MapContext3D mContext3D = (MapContext3D) modelo.getMapContext();
152

    
153
                // set projection for 3D view
154
                IProjection projection = null;
155
                ViewPort3D vPort3D = null;
156
                Envelope env;
157

    
158
                GeometryManager geoMan;
159

    
160
                geoMan = GeometryLocator.getGeometryManager();
161

    
162
                try {
163
                        env = geoMan.createEnvelope(Geometry.SUBTYPES.GEOM2D);
164

    
165
                        if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC) {
166
                                projection = CRSFactory.getCRS("EPSG:4326");
167

    
168
                                env.setLowerCorner(geoMan.createPoint(-180.0, -90.0,
169
                                                Geometry.SUBTYPES.GEOM2D));
170
                                env.setUpperCorner(geoMan.createPoint(180.0, 90.0,
171
                                                Geometry.SUBTYPES.GEOM2D));
172

    
173
                        } else {
174
                                if ((mContext3D != null)
175
                                                && (mContext3D.getProjection() != null))
176
                                        projection = mContext3D.getProjection();
177
                                else
178
                                        projection = CRSFactory.getCRS("EPSG:23030");
179

    
180
                                env.setLowerCorner(geoMan.createPoint(-20000000.0, -10000000.0,
181
                                                Geometry.SUBTYPES.GEOM2D));
182
                                env.setUpperCorner(geoMan.createPoint(20000000.0, 10000000.0,
183
                                                Geometry.SUBTYPES.GEOM2D));
184

    
185
                        }
186

    
187
                        vPort3D = Gvsig3DLocator.getManager()
188
                                        .createDefaultViewPort3DInstance(projection);
189
                        vPort3D.setEnvelope(env);
190
                        mContext3D.setViewPort((ViewPort) vPort3D);
191
                        vPort3D.setTerrain(_terrain);
192
                } catch (CreateEnvelopeException e1) {
193
                        // TODO Auto-generated catch block
194
                        e1.printStackTrace();
195
                } catch (CreateGeometryException e) {
196
                        // TODO Auto-generated catch block
197
                        e.printStackTrace();
198
                }
199

    
200
                // Add ViewPort3D listener to canvas3D. to refresh locator.
201
                // _canvas3d.addMouseListener((ViewPort3D) vp);
202

    
203
                // Pass JOSG objects to MapContext3D
204
                mContext3D.setViewer(_canvas3d);
205
                mContext3D.setViewProjection(projection);
206
                mContext3D.setDataManager(_terrainDataManager);
207
                mContext3D.setLayerManager(_terrainLayerManager);
208
                mContext3D.setTerrain(_terrain);
209

    
210
                // Se configura el mapControl
211

    
212
                MapToolListener mapToolListener = m_MapControl.getMapToolListener();
213
                _canvas3d.addMouseListener(mapToolListener);
214
                _canvas3d.addMouseMotionListener(mapToolListener);
215
                _canvas3d.addMouseWheelListener(mapToolListener);
216
                //
217
                m_MapControl.setMapContext(mContext3D);
218
                m_TOC.setMapContext(mContext3D);
219
                m_MapControl.setBackground(new Color(255, 255, 255));
220
                if (modelo.getMapOverViewContext() != null) {
221
                        m_MapLoc.setModel(modelo.getMapOverViewContext());
222
                }
223

    
224
                EditionListener editionListener = new EditionListener();
225

    
226
                _canvas3d.addKeyListener(editionListener);
227

    
228
                model.addPropertyChangeListener(new PropertyChangeListener() {
229

    
230
                        public void propertyChange(PropertyChangeEvent evt) {
231
                                if (evt.getPropertyName().equals("name")) {
232
                                        PluginServices
233
                                                        .getMDIManager()
234
                                                        .getWindowInfo(DefaultView3DPanel.this)
235
                                                        .setTitle(
236
                                                                        PluginServices.getText(this, "Vista3D")
237
                                                                                        + " : "
238
                                                                                        + (String) evt.getNewValue());
239
                                }
240
                        }
241
                });
242
                if (m_MapControl.getViewPort() != null) {
243
                        m_MapControl.getViewPort().addViewPortListener(
244

    
245
                        new ViewPortListener() {
246

    
247
                                public void extentChanged(ExtentEvent e) {
248
                                        // Esto viene de la version anterior, pero en principio no
249
                                        // es necesario hacerlo
250
                                        // ademas hace que al hacer zoom con la rueda del rat?n se
251
                                        // redibuje la capa vectorial
252

    
253
                                        // m_MapControl.getMapContext().callLegendChanged();
254
                                        //
255
                                        
256
                                        
257
                                        if (PluginServices.getMainFrame() != null) {
258
                                                PluginServices
259
                                                                .getMainFrame()
260
                                                                .getStatusBar()
261
                                                                .setControlValue(
262
                                                                                "scale",
263
                                                                                String.valueOf(m_MapControl
264
                                                                                                .getMapContext().getScaleView()));
265

    
266
                                                PluginServices
267
                                                                .getMainFrame()
268
                                                                .getStatusBar()
269
                                                                .setMessage(
270
                                                                                "projection",
271

    
272
                                                                                getMapControl().getViewPort()
273
                                                                                                .getProjection().getAbrev());
274
                                        }
275

    
276
                                }
277

    
278
                                public void backColorChanged(ColorEvent e) {
279
                                }
280

    
281
                                public void projectionChanged(ProjectionEvent e) {
282
                                        m_MapLoc.setProjection(e.getNewProjection());
283
                                }
284
                        });
285
                }
286

    
287
        }
288

    
289
        protected void initComponents() {
290

    
291
                Gvsig3DManager manager = Gvsig3DLocator.getManager();
292

    
293
                try {
294
                        m_MapControl = manager.createDefaultMapControl3DInstance();
295
                        m_MapControl.addExceptionListener(mapControlExceptionListener);
296
                        m_TOC = new TOC();
297
                        m_MapLoc = new MapOverview(m_MapControl);
298
                        m_MapLoc.setPreferredSize(new Dimension(150, 200));
299

    
300
                        removeAll();
301
                        tempMainSplit = new ViewSplitPane(JSplitPane.HORIZONTAL_SPLIT);
302

    
303
                        if (windowLayout == null) {
304
                                tempMainSplit.setPreferredSize(new Dimension(500, 300));
305
                        }
306

    
307
                        tempMainSplit.setLeftComponent(m_TOC);
308

    
309
                        m_TOC.setVisible(true);
310

    
311
                        JPanel panel = new JPanel();
312
                        panel.setLayout(new BorderLayout());
313
                        panel.add((Component) _canvas3d);
314
                        panel.setMinimumSize(new Dimension(100, 100));
315

    
316
                        tempMainSplit.setRightComponent(panel);
317

    
318
                        this.setLayout(new BorderLayout());
319
                        this.add(tempMainSplit, BorderLayout.CENTER);
320

    
321
                        // default cursor
322
                        String oldPath = ResourcesFactory.getExtPath();// Save the path.
323
                        ResourcesFactory
324
                                        .setExtPath("/gvSIG/extensiones/org.gvsig.gvsig3d.app.extension/images/");// my
325
                        // new
326
                        // path
327
                        buttonPath = ResourcesFactory.getResourcesPath();
328
                        ResourcesFactory.setExtPath(oldPath);// Restore the old path.
329

    
330
                        URL path;
331
                        path = this.getClass().getClassLoader().getResource("images/");
332
                        buttonPath = path.getPath();
333

    
334
                        Image navCursorImage = new ImageIcon(buttonPath
335
                                        + "/NavigationCursor.gif").getImage();
336

    
337
                        Cursor navCursor = Toolkit.getDefaultToolkit().createCustomCursor(
338
                                        navCursorImage, new Point(16, 16), "");
339
                        ((Component) _canvas3d).setCursor(navCursor);
340

    
341
                        // Seleccion por punto
342
                        PointSelectListener3D psl = new PointSelectListener3D(m_MapControl);
343
                        m_MapControl.addBehavior("pointSelection",
344
                                        new Behavior[] { new PointBehavior(psl) });
345
                        m_MapControl.setCurrentMapTool(new PointBehavior(psl));
346

    
347
                        // Info por punto
348
                        InfoListener il = new InfoListener(m_MapControl);
349
                        m_MapControl.addBehavior("info",
350
                                        new Behavior[] { new PointBehavior(il) });
351
                        // m_MapControl.setCurrentMapTool(new PointBehavior(il));
352

    
353
                        // // Selecci?n por rect?ngulo
354
                        // RectangleSelectListener3D rsl = new
355
                        // RectangleSelectListener3D(m_MapControl);
356
                        // m_MapControl.addMapTool("rectSelection", new Behavior[] { new
357
                        // RectangleBehavior3D(rsl) });
358
                        //
359

    
360
                } catch (Gvsig3DException e) {
361
                        // TODO Auto-generated catch block
362
                        e.printStackTrace();
363
                }
364

    
365
        }
366

    
367
        public IViewerContainer getCanvas3d() {
368
                return _canvas3d;
369
        }
370

    
371
        public void setCanvas3d(IViewerContainer canvas3d) {
372
                _canvas3d = canvas3d;
373
        }
374

    
375
        public DisplaySettings getDisplaySettings() {
376

    
377
                return ((OSGViewer) getCanvas3d().getOSGViewer()).getDisplaySettings();
378

    
379
        }
380

    
381
        public Object getWindowProfile() {
382
                return WindowInfo.EDITOR_PROFILE;
383
        }
384

    
385
        public Terrain getTerrain() {
386
                return _terrain;
387
        }
388

    
389
        public void setTerrain(Terrain terrain) {
390
                if (_canvas3d == null)
391
                        return;
392
                _terrain = terrain;
393
        }
394

    
395
        public Camera getCamera() {
396
                return getCanvas3d().getOSGViewer().getCamera();
397
        }
398

    
399
        public void setCamera(Camera camera) {
400
                getCanvas3d().getOSGViewer().setCamera(camera);
401
        }
402

    
403
        public JavaDataDriver getDataManager() {
404
                return _terrainDataManager;
405
        }
406

    
407
        public void setDataManager(JavaDataDriver manager) {
408
                _terrainDataManager = manager;
409
        }
410

    
411
        public LayerManager getLayerManager() {
412
                return _terrainLayerManager;
413
        }
414

    
415
        public void setLayerManager(LayerManager manager) {
416
                _terrainLayerManager = manager;
417
        }
418

    
419
        public NavigationMode getNavMode() {
420
                return _navMode;
421
        }
422

    
423
        public void setNavMode(NavigationMode navMode) {
424
                _navMode = navMode;
425
        }
426

    
427
        @Override
428
        public void windowClosed() {
429

    
430
                if (movp != null) {
431
                        PluginServices.getMDIManager().closeWindow(movp);
432
                }
433
                if (modelo != null) {
434
                        modelo.setWindowLayout(this.getWindowLayout());
435
                }
436

    
437
                ViewerFactory.getInstance().removeViewerFromAnimator(_canvas3d);
438

    
439
        }
440

    
441
}