Statistics
| Revision:

root / trunk / extensions / ext3Dgui / src / org / gvsig / gvsig3dgui / ProjectView3D.java @ 24516

History | View | Annotate | Download (23.4 KB)

1
package org.gvsig.gvsig3dgui;
2

    
3
import java.awt.Color;
4
import java.awt.geom.Rectangle2D;
5
import java.util.Comparator;
6
import java.util.HashMap;
7
import java.util.Iterator;
8
import java.util.TreeMap;
9
import java.util.Map.Entry;
10
import java.util.prefs.Preferences;
11

    
12
import org.apache.log4j.Logger;
13
import org.gvsig.cacheservice.CacheService;
14
import org.gvsig.gvsig3d.gui.FeatureFactory;
15
import org.gvsig.gvsig3d.gui.Hud;
16
import org.gvsig.gvsig3d.map3d.MapContext3D;
17
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
18
import org.gvsig.gvsig3d.navigation.NavigationMode;
19
import org.gvsig.gvsig3dgui.view.View3D;
20
import org.gvsig.gvsig3dgui.view.ViewProperties3D;
21
import org.gvsig.osgvp.Vec3;
22
import org.gvsig.osgvp.exceptions.node.NodeException;
23
import org.gvsig.osgvp.planets.Planet;
24
import org.gvsig.osgvp.planets.PlanetViewer;
25
import org.gvsig.osgvp.planets.exceptions.PlanetExtentException;
26
import org.gvsig.osgvp.viewer.Camera;
27
import org.gvsig.osgvp.viewer.CanvasViewer;
28
import org.gvsig.osgvp.viewer.DisplaySettings;
29
import org.gvsig.osgvp.viewer.IViewerContainer;
30
import org.gvsig.osgvp.viewer.ViewerFactory;
31
import org.gvsig.osgvp.viewer.ViewerStateListener;
32

    
33
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
34
import com.hardcode.gdbms.engine.data.driver.DriverException;
35
import com.iver.ai2.gvsig3d.camera.ProjectCamera;
36
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
37
import com.iver.andami.PluginServices;
38
import com.iver.andami.ui.mdiManager.IWindow;
39
import com.iver.cit.gvsig.fmap.MapContext;
40
import com.iver.cit.gvsig.fmap.layers.FLayer;
41
import com.iver.cit.gvsig.fmap.layers.FLayers;
42
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
43
import com.iver.cit.gvsig.fmap.layers.XMLException;
44
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
45
import com.iver.cit.gvsig.project.Project;
46
import com.iver.cit.gvsig.project.documents.ProjectDocument;
47
import com.iver.cit.gvsig.project.documents.ProjectDocumentFactory;
48
import com.iver.cit.gvsig.project.documents.exceptions.OpenException;
49
import com.iver.cit.gvsig.project.documents.exceptions.SaveException;
50
import com.iver.cit.gvsig.project.documents.table.ProjectTable;
51
import com.iver.cit.gvsig.project.documents.table.ProjectTableFactory;
52
import com.iver.cit.gvsig.project.documents.view.ProjectViewBase;
53
import com.iver.cit.gvsig.project.documents.view.ProjectViewFactory;
54
import com.iver.utiles.IPersistence;
55
import com.iver.utiles.StringUtilities;
56
import com.iver.utiles.XMLEntity;
57

    
58
/**
59
 * Clase que representa una vista del proyecto
60
 * 
61
 * @author Fernando Gonz�lez Cort�s
62
 */
63
public class ProjectView3D extends ProjectViewBase {
64
        // public static int numViews = 0;
65

    
66
        private IViewerContainer m_canvas3d = null;
67

    
68
        private PlanetViewer m_planetViewer = null;
69

    
70
        private Planet m_planet = null;
71

    
72
        private ProjectCamera projectCamera = null;
73

    
74
        private int m_planetType = Planet.CoordinateSystemType.PROJECTED; // spheric
75
                                                                                                                                                // or
76
                                                                                                                                                // plane
77

    
78
        private Color backgroundColor;
79

    
80
        private float verticalExaggeration = 5;
81

    
82
        private FeatureFactory g;
83

    
84
        private View3D m_view = null;
85

    
86
        private static Preferences prefs = Preferences.userRoot().node(
87
                        "gvsig.configuration.3D");
88

    
89
        private boolean prespectiveMode = true;
90

    
91
        private static Logger logger = Logger.getLogger(ProjectView3D.class
92
                        .getName());
93

    
94
        // private Satelite runnable;
95

    
96
        public ProjectView3D() {
97
                super();
98
                backgroundColor = new Color(0, 0, 0, 255);
99
        }
100

    
101
        /**
102
         * DOCUMENT ME!
103
         * 
104
         * @return DOCUMENT ME!
105
         * @throws XMLException
106
         * @throws SaveException
107
         */
108
        public XMLEntity getXMLEntity() throws SaveException {
109
                XMLEntity xml = super.getXMLEntity();
110
                // xml.putProperty("nameClass", this.getClass().getName());
111
                try {
112
                        // Persistiendo la posicion actual de la camara
113
                        // TODO: remove this line where planet viewer will be test
114
                        // if (m_canvas3d != null) {
115
                        // projectCamera = new ProjectCamera();
116
                        // projectCamera.setDescription("Camera");
117
                        // projectCamera.setCamera(m_canvas3d.getOSGViewer().getCamera());
118
                        //
119
                        // xml.addChild(projectCamera.getXMLEntity());
120
                        // }
121

    
122
                        if (this.m_planetViewer != null) {
123
                                projectCamera = new ProjectCamera();
124
                                projectCamera.setDescription("Camera");
125
                                projectCamera.setCamera(this.m_planetViewer.getCamera());
126

    
127
                                xml.addChild(projectCamera.getXMLEntity());
128
                        }
129

    
130
                        int numViews = ((Integer) ProjectDocument.NUMS
131
                                        .get(ProjectView3DFactory.registerName)).intValue();
132
                        xml.putProperty("numViews", numViews);
133
                        xml.putProperty("m_selectedField", m_selectedField);
134
                        xml.putProperty("m_typeLink", m_typeLink);
135
                        xml.putProperty("m_extLink", m_extLink);
136

    
137
                        // 3D properties
138
                        xml.putProperty("planetType", m_planetType);
139
                        xml.putProperty("verticalExaggeration", verticalExaggeration);
140

    
141
                        xml.putProperty("backgroundColor", StringUtilities
142
                                        .color2String(backgroundColor));
143

    
144
                        xml.addChild(mapContext.getXMLEntity());
145

    
146
                        if (mapOverViewContext != null) {
147
                                if (mapOverViewContext.getViewPort() != null) {
148
                                        xml.putProperty("mapOverView", true);
149
                                        xml.addChild(mapOverViewContext.getXMLEntity());
150
                                } else {
151
                                        xml.putProperty("mapOverView", false);
152
                                }
153
                        } else {
154
                                xml.putProperty("mapOverView", false);
155
                        }
156
                } catch (Exception e) {
157
                        throw new SaveException(e, this.getClass().getName());
158
                }
159

    
160
                return xml;
161
        }
162

    
163
        /**
164
         * DOCUMENT ME!
165
         * 
166
         * @param xml
167
         *            DOCUMENT ME!
168
         * @param p
169
         *            DOCUMENT ME!
170
         * @throws XMLException
171
         * @throws DriverException
172
         * @see com.iver.cit.gvsig.project.documents.ProjectDocument#setXMLEntity(com.iver.utiles.XMLEntity)
173
         */
174
        public void setXMLEntity03(XMLEntity xml, Project p) throws XMLException {
175
                try {
176
                        super.setXMLEntity03(xml);
177
                } catch (ReadDriverException e) {
178
                        // TODO Auto-generated catch block
179
                        e.printStackTrace();
180
                }
181
                int numViews = xml.getIntProperty("numViews");
182
                ProjectDocument.NUMS.put(ProjectView3DFactory.registerName,
183
                                new Integer(numViews));
184

    
185
                m_selectedField = xml.getStringProperty("m_selectedField");
186
                m_typeLink = xml.getIntProperty("m_typeLink");
187
                m_extLink = xml.getStringProperty("m_extLink");
188
                setMapContext(MapContext3D.createFromXML03(xml.getChild(0)));
189

    
190
                if (xml.getBooleanProperty("mapOverView")) {
191
                        setMapOverViewContext(MapContext.createFromXML03(xml.getChild(1)));
192
                }
193

    
194
        }
195

    
196
        /**
197
         * DOCUMENT ME!
198
         * 
199
         * @param xml
200
         *            DOCUMENT ME!
201
         * @param p
202
         *            DOCUMENT ME!
203
         * @throws XMLException
204
         * @throws OpenException
205
         * 
206
         * @see com.iver.cit.gvsig.project.documents.ProjectDocument#setXMLEntity(com.iver.utiles.XMLEntity)
207
         */
208
        public void setXMLEntity(XMLEntity xml) throws XMLException, OpenException {
209
                try {
210
                        super.setXMLEntity(xml);
211
                        int currentChild = 0;
212

    
213
                        // Read last child
214
                        int childNumber = currentChild;
215

    
216
                        // Get camera
217
                        XMLEntity xmlProp = xml.getChild(childNumber);
218
                        if (xmlProp.contains("eyeX")) {
219
                                try {
220
                                        String className = xmlProp.getStringProperty("className");
221
                                        Class classProp = Class.forName(className);
222
                                        Object obj = classProp.newInstance();
223
                                        IPersistence objPersist = (IPersistence) obj;
224
                                        objPersist.setXMLEntity(xmlProp);
225
                                        projectCamera = (ProjectCamera) obj;
226
                                } catch (Exception e) {
227

    
228
                                }
229
                                currentChild++;
230
                        }
231

    
232
                        int numViews = xml.getIntProperty("numViews");
233
                        ProjectDocument.NUMS.put(ProjectView3DFactory.registerName,
234
                                        new Integer(numViews));
235

    
236
                        m_selectedField = xml.getStringProperty("m_selectedField");
237
                        m_typeLink = xml.getIntProperty("m_typeLink");
238
                        m_extLink = xml.getStringProperty("m_extLink");
239

    
240
                        // 3D properties
241
                        m_planetType = xml.getIntProperty("planetType");
242
                        verticalExaggeration = xml.getFloatProperty("verticalExaggeration");
243

    
244
                        backgroundColor = StringUtilities.string2Color((xml
245
                                        .getStringProperty("backgroundColor")));
246

    
247
                        setMapContext(MapContext3D
248
                                        .createFromXML(xml.getChild(currentChild)));
249
                        currentChild++;
250
                        if (xml.getBooleanProperty("mapOverView")) {
251
                                setMapOverViewContext(MapContext.createFromXML(xml
252
                                                .getChild(currentChild)));
253
                                currentChild++;
254
                        }
255
                        showErrors();
256
                } catch (Exception e) {
257
                        throw new OpenException(e, this.getClass().getName());
258
                }
259

    
260
        }
261

    
262
        public String getFrameName() {
263
                return PluginServices.getText(this, "Vista3D");
264
        }
265

    
266
        public IWindow createWindow() {
267

    
268
                // View allready exits. Return it.
269
                if (m_view != null)
270
                        return m_view;
271

    
272
                // create libJOSG objects
273
                if (m_canvas3d == null) {
274
                        // AI2 objects
275
                        try {
276
                                m_planetViewer = new PlanetViewer();
277
                        } catch (NodeException e1) {
278
                        logger.error("Command: " + "Error creating planer viewer.", e1);
279
                        }
280

    
281
                        // Getting 3D preferences
282
                        boolean compatibilitySwing = false;
283
                        compatibilitySwing = prefs.getBoolean("compatibilitySwing",
284
                                        compatibilitySwing);
285

    
286
                        if (compatibilitySwing) {
287
                                m_canvas3d = ViewerFactory.getInstance()
288
                                                .createViewer(ViewerFactory.VIEWER_TYPE.JPANEL_VIEWER,
289
                                                                m_planetViewer);
290
                        } else {
291
                                m_canvas3d = ViewerFactory.getInstance()
292
                                                .createViewer(ViewerFactory.VIEWER_TYPE.CANVAS_VIEWER,
293
                                                                m_planetViewer);
294
                        }
295

    
296
                        this.configureProjectionViewMode();
297
                        // m_canvas3d = ViewerFactory.getInstance().createViewer(
298
                        // ViewerFactory.VIEWER_TYPE.CANVAS_VIEWER, m_planetViewer);
299
                        m_canvas3d.addKeyListener(new ViewerStateListener(m_canvas3d
300
                                        .getOSGViewer()));
301

    
302
                        // ViewerFactory.getInstance().startAnimator();
303
                        
304
                        //
305
                        m_canvas3d.getOSGViewer().setDisplaySettings(new DisplaySettings());
306
                        
307
                        //
308
                        m_planetViewer.setEnabledLighting(false);
309
                        ViewerFactory.getInstance().startAnimator();
310

    
311
                        m_canvas3d.repaint();
312
                        if (getBackGroundColor() != null) {
313
                                float r, g, b, a;
314
                                r = ((float) backgroundColor.getRed()) / 255.0f;
315
                                g = ((float) backgroundColor.getGreen()) / 255.0f;
316
                                b = ((float) backgroundColor.getBlue()) / 255.0f;
317
                                a = ((float) backgroundColor.getAlpha()) / 255.0f;
318
                                m_planetViewer.setClearColor(r, g, b, a);
319
                        }
320
                        try {
321
                                m_planet = new Planet();
322
                        m_planet.setCoordinateSystemType(m_planetType);
323
                        if (m_planetType == Planet.CoordinateSystemType.PROJECTED) {
324
                                m_planet.setCoordinateSystemName("EPSG:23030");
325
                                double extent[] = new double[4];
326
                                extent[0] = CacheService.planeGlobalBounds.getMinX();
327
                                extent[1] = CacheService.planeGlobalBounds.getMinY();
328
                                extent[2] = CacheService.planeGlobalBounds.getMaxX();
329
                                extent[3] = CacheService.planeGlobalBounds.getMaxY();
330
                                m_planet.setExtent(extent);
331
                        }
332
                        } catch (NodeException e2) {
333
                                // TODO Auto-generated catch block
334
                                e2.printStackTrace();
335
                        } catch (PlanetExtentException e) {
336
                                // TODO Auto-generated catch block
337
                                e.printStackTrace();
338
                        }
339

    
340
                        // canvasListener lis = new canvasListener();
341
                        // lis.setCanvas(m_canvas3d);
342
                        // m_canvas3d.addKeyListener(lis);
343
                        /*
344
                         * CODIGO DE PRUEBA PARA LA INCLUSION DE TEXTOS, POLIGONOS, LINEAS,
345
                         * ETC...
346
                         */
347

    
348
                        double radiusEarth = m_planet.getRadiusEquatorial();
349
                        g = new FeatureFactory(radiusEarth, m_planet);
350

    
351
                        // g.setNodeName("VECTOR");
352
                        // Group root = new Group();
353

    
354
                        // root.addChild(g);
355
                        // root.addChild(m_planet);
356
                        // PositionAttitudeTransform nt = new PositionAttitudeTransform();
357
                        // nt.addChild(m_canvas3d.readNodeFile("c:/modelos3d/spaceship.osg"));
358
                        // nt.addChild(m_canvas3d.readNodeFile("c:/modelos3d/axes.osg"));
359
                        // nt.addChild(m_canvas3d.readNodeFile("c:/modelos3d/cow.osg"));
360
                        // nt.addChild(m_canvas3d.readNodeFile("c:/modelos3d/cessna.osg"));
361
                        // nt.setPosition(new Vec3 (0,0,0) );
362
                        // nt.setScale(new Vec3 (1,1,1));
363
                        // m_canvas3d.addSpecialNode(nt);
364
                        // m_canvas3d.addSpecialNode(m_canvas3d.readNodeFile("c:/modelos3d/axes.osg"));
365
                        // m_canvas3d.addSpecialNode(m_canvas3d.readNodeFile("c:/modelos3d/spaceship.osg"));
366
                        // m_canvas3d.addSpecialNode(m_canvas3d.readNodeFile("c:/modelos3d/cow.osg"));
367
                        // root.addChild(m_canvas3d.readNodeFile("c:/modelos3d/cow.osg"));
368
                        // root.addChild(m_canvas3d.readNodeFile("c:/modelos3d/cessna.osg"));
369
                        // m_canvas3d.setSceneData(root);
370

    
371
                        // float cenLat = (float) ((-1) *(40 * 2 * Math.PI)/360),
372
                        // cenLon= (float) ( (-1) *(3 * 2* Math.PI)/360);
373
                        //                         
374
                        // PositionAttitudeTransform rot1 = new PositionAttitudeTransform();
375
                        // PositionAttitudeTransform rot2 = new PositionAttitudeTransform();
376
                        // // cargando la bandera
377
                        // String name = ResourcesFactory.getResourcePath("flag.ive");
378
                        // rot1.addChild(this.m_canvas3d.getOSGViewer().readNodeFile(name));
379
                        //
380
                        // rot1.setAttitude(cenLon, new Vec3(0.0, 1.0, 0.0));
381
                        // rot1.setScale(new Vec3(600, 600, 600));
382
                        //                
383
                        //
384
                        // rot2.addChild(rot1);
385
                        // rot2.setAttitude(cenLat, new Vec3(1.0, 0.0, 0.0));
386
                        // rot2.setPosition( new Vec3(0.0, 0.0, 0.0));
387
                        //
388
                        // root.addChild(rot2);
389
                        /* ************************************************************************* */
390

    
391
                        // m_planetViewer.addSpecialNode(g);
392
                        // List posi = new ArrayList();
393
                        // for (int i = 0; i < 10; i++) {
394
                        // Vec3 pos1 = m_planet.convertLatLongHeightToXYZ(new Vec3(0, Math
395
                        // .toRadians(i * 10), 0));
396
                        //
397
                        // // Vec3 pos1 = new Vec3(0, i * 10, 0);
398
                        // posi.add(pos1);
399
                        // }
400
                        // Vec4 rgba = new Vec4(1.0, 1.0, 1.0, 1.0);
401
                        // float lineWidth = 8;
402
                        // g.addChild(FeatureFactory.insertLine(posi, rgba, lineWidth));
403
                        // m_planetViewer.addSpecialNode(FeatureFactory.insertLine(posi,
404
                        // rgba,
405
                        // lineWidth));
406
                        // m_planetViewer.addSpecialNode(osgDB.readNodeFile(ResourcesFactory
407
                        // .getResourcesPath()
408
                        // + "../images/flag.ive"));
409
                        // m_canvas3d.getOSGViewer().addSpecialNode(root);
410
                        // Cargando el satelite
411
                        // m_canvas3d.addSpecialNode(sat);
412
                        try {
413
                                m_planetViewer.addPlanet(m_planet);
414
                        } catch (NodeException e1) {
415
                                logger.error("Command: " + "Error adding new child node.", e1);
416
                        }
417

    
418
                        Camera cam;
419
                        cam = new Camera();
420
                        if (this.projectCamera == null) {
421

    
422
                                if (m_planetType == Planet.CoordinateSystemType.PROJECTED) {
423
                                        Rectangle2D e = m_planet.getExtent();
424
                                        // double difx = (e[1] - e[0]) / 2.0d;
425
                                        // double dify = (e[3] - e[2]) / 2.0d;
426
                                        // double posx = e[0] + difx;
427
                                        // double posy = e[2] + dify;
428

    
429
                                        double height;
430
                                        height = Math.sqrt(e.getWidth() * e.getWidth()
431
                                                        + e.getHeight() * e.getHeight()) * 10f;
432
                                        cam.setViewByLookAt((float) e.getCenterX(), (float) e
433
                                                        .getCenterY(), (float) height, (float) e
434
                                                        .getCenterX(), (float) e.getCenterY(), 0f, 0f, 1f,
435
                                                        0f);
436
                                        cam.setViewByLookAt(0, 0, 5000000 * 4.6, 0, 0, 0, 0, 1, 0);
437
                                        m_planetViewer.getCustomTerrainManipulator()
438
                                                        .setMinCameraDistance(10);
439
                                        m_planetViewer.getCustomTerrainManipulator()
440
                                                        .setMaxCameraDistance(5000000 * 10);
441
                                        // m_planet.setSubdivisionFactor((float) 0.45);
442
                                } else {
443
                                        // cam.setViewByLookAt(m_planet.getRadiusEquatorial() * 3.0,
444
                                        // 0, 0, 0, 0, 0, 0, 0, 1);
445
                                        cam.setViewByLookAt(m_planet.getRadiusEquatorial() * 8.0,
446
                                                        0, 0, 0, 0, 0, 0, 0, 1);
447
                                        m_planetViewer.getCustomTerrainManipulator()
448
                                                        .setMinCameraDistance(100);
449
                                        // m_planetViewer.getCustomTerrainManipulator()
450
                                        // .setMaxCameraDistance(
451
                                        // m_planet.getRadiusEquatorial() * 3.0);
452
                                        m_planetViewer.getCustomTerrainManipulator()
453
                                                        .setMaxCameraDistance(
454
                                                                        m_planet.getRadiusEquatorial() * 10.0);
455
                                        // cam.setViewByLookAt(100 * 2.0,
456
                                        // 0, 0, 0, 0, 0, 0, 0, 1);
457
                                        // m_planet.setSubdivisionFactor((float) 0.65);
458
                                }
459

    
460
                        } else {
461
                                cam = projectCamera.getCamera();
462
                        }
463

    
464
                        // m_canvas3d.getOSGViewer().setCameraManipulator(new
465
                        // TrackballManipulator());
466

    
467
                        m_planetViewer.setCamera(cam);
468

    
469
                        Hud hud = new Hud(m_canvas3d, m_planet);
470
                        try {
471
                                m_planetViewer.addNodeToHUD(hud);
472
                        } catch (NodeException e) {
473
                                logger.error("Command: " + "Error adding node to hud.", e);
474
                        }
475

    
476
                        m_planetViewer.setEnabledLighting(true);
477
                }
478
                m_view = new View3D();
479

    
480
                m_view.setCanvas3d(m_canvas3d);
481

    
482
                m_view.setPlanet(m_planet);
483
                m_view.setModel(this);
484

    
485
                m_view.setNavMode(new NavigationMode(((PlanetViewer) m_planetViewer)
486
                                .getCustomTerrainManipulator()));
487

    
488
                ((MapContext3D) getMapContext())
489
                                .setVerticalExageration(verticalExaggeration);
490
                setVerticalEx(verticalExaggeration);
491
                return m_view;
492
        }
493

    
494
        protected void finalize() throws Throwable {
495
                if (m_canvas3d != null) {
496
                        // runnable.end();
497
                        ViewerFactory.getInstance().stopAnimator();
498
                        m_planet.dispose();
499
                        m_planetViewer.dispose();
500
                }
501
        }
502

    
503
        public IWindow getProperties() {
504
                return new ViewProperties3D(this, false); // new ViewProperties(this);
505
                // TODO
506
        }
507

    
508
        public void exportToXML(XMLEntity root, Project project)
509
                        throws SaveException {
510
                XMLEntity viewsRoot = project.getExportXMLTypeRootNode(root,
511
                                ProjectViewFactory.registerName);
512
                viewsRoot.addChild(this.getXMLEntity());
513
                this.exportToXMLLayerDependencies(this.getMapContext().getLayers(),
514
                                root, project);
515
                if (this.getMapOverViewContext() != null) {
516
                        this.exportToXMLLayerDependencies(this.getMapOverViewContext()
517
                                        .getLayers(), root, project);
518
                }
519
        }
520

    
521
        private void exportToXMLLayerDependencies(FLayer layer, XMLEntity root,
522
                        Project project) throws SaveException {
523

    
524
                if (layer instanceof FLayers) {
525
                        FLayers layers = (FLayers) layer;
526
                        for (int i = 0; i < layers.getLayersCount(); i++) {
527
                                this.exportToXMLLayerDependencies(layers.getLayer(i), root,
528
                                                project);
529
                        }
530
                } else {
531
                        if (layer instanceof AlphanumericData) {
532

    
533
                                try {
534
                                        project
535
                                                        .exportToXMLDataSource(root,
536
                                                                        ((AlphanumericData) layer).getRecordset()
537
                                                                                        .getName());
538
                                } catch (ReadDriverException e) {
539
                                        // TODO Auto-generated catch block
540
                                        e.printStackTrace();
541
                                }
542

    
543
                                ProjectTable pt = project.getTable((AlphanumericData) layer);
544
                                if (pt != null) {
545
                                        pt.exportToXML(root, project);
546
                                }
547
                        }
548
                }
549
        }
550

    
551
        public void importFromXML(XMLEntity root, XMLEntity typeRoot,
552
                        int elementIndex, Project project, boolean removeDocumentsFromRoot)
553
                        throws XMLException, OpenException {
554
                XMLEntity element = typeRoot.getChild(elementIndex);
555

    
556
                this.setXMLEntity(element);
557
                project.addDocument(this);
558
                if (removeDocumentsFromRoot) {
559
                        typeRoot.removeChild(elementIndex);
560
                }
561

    
562
                // Cargamos las tables vinculadas:
563

    
564
                // Recuperamos todos los nombres
565
                XMLEntity tablesRoot = project.getExportXMLTypeRootNode(root,
566
                                ProjectTableFactory.registerName);
567
                int childIndex;
568
                XMLEntity child;
569
                // Lo hacemos en un map por si una vista se usa varias veces
570
                HashMap tablesName = new HashMap();
571
                Iterator iterTables = tablesRoot.findChildren("viewName", this
572
                                .getName());
573
                while (iterTables.hasNext()) {
574
                        child = (XMLEntity) iterTables.next();
575
                        tablesName.put(child.getStringProperty("name"), child
576
                                        .getStringProperty("name"));
577
                }
578

    
579
                XMLEntity tableXML;
580

    
581
                // Construimos un diccionario ordenado inversamente por el indice
582
                // del elemento (por si se van eliminando elementos al importar) y
583
                // como valor el nombre de la vista
584
                TreeMap tablesToImport = new TreeMap(new Comparator() {
585

    
586
                        public int compare(Object o1, Object o2) {
587

    
588
                                if (((Integer) o1).intValue() > ((Integer) o2).intValue()) {
589
                                        return -1; // o1 first
590
                                } else if (((Integer) o1).intValue() < ((Integer) o2)
591
                                                .intValue()) {
592
                                        return 1; // o1 second
593
                                }
594
                                return 0;
595
                        }
596

    
597
                });
598
                Iterator iterTablesName = tablesName.keySet().iterator();
599
                int tableIndex;
600
                String tableName;
601
                while (iterTablesName.hasNext()) {
602
                        tableName = (String) iterTablesName.next();
603
                        tableIndex = tablesRoot.firstIndexOfChild("name", tableName);
604
                        tablesToImport.put(new Integer(tableIndex), tableName);
605
                }
606

    
607
                ProjectTable table;
608
                ProjectDocumentFactory tableFactory = project
609
                                .getProjectDocumentFactory(ProjectTableFactory.registerName);
610

    
611
                Iterator iterTablesToImport = tablesToImport.entrySet().iterator();
612
                Entry entry;
613
                // Nos recorremos las vistas a importar
614
                while (iterTablesToImport.hasNext()) {
615
                        entry = (Entry) iterTablesToImport.next();
616
                        tableName = (String) entry.getValue();
617
                        tableIndex = ((Integer) entry.getKey()).intValue();
618
                        table = (ProjectTable) tableFactory.create(project);
619
                        try {
620
                                table.importFromXML(root, tablesRoot, tableIndex, project,
621
                                                removeDocumentsFromRoot);
622
                        } catch (ReadDriverException e) {
623
                                // TODO Auto-generated catch block
624
                                e.printStackTrace();
625
                        }
626
                }
627
        }
628

    
629
        public int getPlanetType() {
630
                return m_planetType;
631
        }
632

    
633
        public void setPlanetType(int type) {
634
                m_planetType = type;
635
        }
636

    
637
        public float getVerticalExaggeration() {
638
                return verticalExaggeration;
639
        }
640

    
641
        public void setVerticalExaggeration(float exaggeration) {
642
                verticalExaggeration = exaggeration;
643
        }
644

    
645
        public Color getBackGroundColor() {
646
                return backgroundColor;
647
        }
648

    
649
        public void setBackGroundColor(Color backGroundColor) {
650
                this.backgroundColor = backGroundColor;
651
        }
652

    
653
        /**
654
         * Method to insert text points in a position with a especific text
655
         * 
656
         * @param nombre
657
         *            The text
658
         * @param posicion
659
         *            the position
660
         */
661
        public void insertaText(String nombre, Vec3 posicion) {
662
                // Group root = (Group) m_canvas3d.getSceneData();
663
                //                
664
                // Group vector = (Group) root.getChild(0);
665
                //
666
                // if (vector.getNodeName(null).equals("VECTOR")) {
667
                // VectorTest vaux = (VectorTest) vector;
668
                // System.out.println("Numero de hijos " + vaux.getNumChildren());
669
                // vaux.insertText(nombre, posicion);
670
                // // vaux.insertPoint(posicion, new Vec4(1.0,1.0,1.0,1.0));
671
                // System.out.println("Numero de hijos despues "
672
                // + vaux.getNumChildren());
673
                // }
674

    
675
                // g.insertText(nombre, posicion);
676

    
677
                // System.out.println("Nombre del nodo leido " +
678
                // vector.getNodeName(null)) ;
679

    
680
        }
681

    
682
        public Planet getPlanet() {
683
                return m_planet;
684
        }
685

    
686
        public void setPlanet(Planet m_planet) {
687
                this.m_planet = m_planet;
688
        }
689

    
690
        public IViewerContainer getCanvas3d() {
691
                return m_canvas3d;
692
        }
693

    
694
        public void setCanvas3d(CanvasViewer m_canvas3d) {
695
                this.m_canvas3d = m_canvas3d;
696
        }
697

    
698
        private void setVerticalEx(float exa) {
699

    
700
                SingleLayerIterator lyrIterator = new SingleLayerIterator(
701
                                (FLayers3D) getMapContext().getLayers());
702
                while (lyrIterator.hasNext()) {
703
                        FLayer lyr = lyrIterator.next();
704

    
705
                        Layer3DProps props = Layer3DProps.getLayer3DProps(lyr);
706
                        int type = props.getType();
707
                        if (exa != props.getVerticalEx()) {
708
                                if (type == Layer3DProps.layer3DElevation) {
709
                                        int order = props.getPlanetOrder();
710
                                        props.setVerticalEx(exa);
711
                                        m_planet.setVerticalExaggerationLayer(order, props
712
                                                        .getVerticalEx());
713
                                } else if (type == Layer3DProps.layer3DVector) {
714
                                        int order = props.getPlanetOrder();
715
                                        props.setVerticalEx(exa);
716
                                }
717
                        }
718

    
719
                }
720
        }
721

    
722
        public boolean isPrespectiveModeActive() {
723
                return prespectiveMode;
724
        }
725

    
726
        /**
727
         * Active the prespective mode. If we disable the prespective mode, the
728
         * ortho mode will be active
729
         * 
730
         * @param prespectiveMode
731
         *            enable/disable
732
         */
733
        public void setActivePrespectiveMode(boolean prespectiveMode) {
734
                this.prespectiveMode = prespectiveMode;
735
        }
736

    
737
        private void configureProjectionViewMode() {
738
                if (prespectiveMode) {
739
                        System.out.println("Setting up prespective projection");
740
                        // this.m_canvas3d.getOSGViewer().setProjectionMatrixAsPerspective(
741
                        // arg0, arg1, arg2, arg3);
742
                } else {
743
                        System.out.println("Setting up prespective projection");
744
                        this.m_canvas3d.getOSGViewer().setProjectionMatrixAsOrtho(-10, 10,
745
                                        -10, 10, 1, 1000);
746
                }
747
        }
748

    
749
}