Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / cacheservices / OSGCacheService.java @ 25236

History | View | Annotate | Download (9.44 KB)

1
package org.gvsig.gvsig3d.cacheservices;
2

    
3
import java.awt.geom.Rectangle2D;
4
import java.io.File;
5
import java.io.FileNotFoundException;
6

    
7
import javax.swing.JOptionPane;
8

    
9
import org.apache.log4j.Logger;
10
import org.cresques.cts.IProjection;
11
import org.gvsig.cacheservice.CacheService;
12
import org.gvsig.fmap.geom.operation.GeometryOperationException;
13
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
14
import org.gvsig.fmap.geom.primitive.AbstractPrimitive;
15
import org.gvsig.geometries3D.MultiGeometry;
16
import org.gvsig.geometries3D.MultiSolid;
17
import org.gvsig.gvsig3d.drivers.GvsigDriverOSG;
18
import org.gvsig.gvsig3d.listener.EditorListener;
19
import org.gvsig.operations3D.Draw3DMultiSolid;
20
import org.gvsig.operations3D.context.Draw3DContext;
21
import org.gvsig.osgvp.Group;
22
import org.gvsig.osgvp.Node;
23
import org.gvsig.osgvp.PositionAttitudeTransform;
24
import org.gvsig.osgvp.Vec3;
25
import org.gvsig.osgvp.osgDB;
26
import org.gvsig.osgvp.exceptions.node.NodeException;
27
import org.gvsig.osgvp.manipulator.EditionManager;
28
import org.gvsig.osgvp.manipulator.ManipulatorHandler;
29
import org.gvsig.osgvp.manipulator.RemoveAllSelectionCommand;
30
import org.gvsig.osgvp.planets.Planet;
31
import org.gvsig.osgvp.planets.PlanetViewer;
32
import org.gvsig.osgvp.viewer.IViewerContainer;
33

    
34
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
35
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
36
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
37
import com.iver.cit.gvsig.fmap.layers.FLayer;
38
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
39

    
40
public class OSGCacheService extends CacheService {
41

    
42
        private IViewerContainer _canvas3D;
43

    
44
        private PlanetViewer _planetViewer;
45

    
46
        private Rectangle2D _lyrExtentRect;
47

    
48
        private FLayer _layer;
49

    
50
        // vector caching for libJOSG
51
        private Group _layerNode;
52

    
53
        private boolean newLayerOSG = false;
54

    
55
        private EditionManager editionManager;
56

    
57
        private RemoveAllSelectionCommand command;
58

    
59
        private static Logger logger = Logger.getLogger(OSGCacheService.class
60
                        .getName());
61
        
62
        // private ISymbol _currentSymbol;
63

    
64
        public OSGCacheService(IViewerContainer canvas3D, Planet planet,
65
                        String name, FLayer layer, IProjection viewProj) {
66
                super(planet.getPlanetName(), name);
67

    
68
                // getNames();
69

    
70
                _canvas3D = canvas3D;
71
                _planetViewer = (PlanetViewer) canvas3D.getOSGViewer();
72
                _layer = layer;
73
                _layerNode = new Group();
74
                _layerNode.setNodeName("layer3DOSG");
75

    
76
                try {
77
                        _planetViewer.addSpecialNode(_layerNode);
78
                } catch (NodeException e1) {
79
                        logger.error("Command: "
80
                                        + "Error adding new child node to the special node.", e1);
81
                }
82

    
83
                int cacheType = CacheService.GLOBAL;
84
                if (planet.getCoordinateSystemType() == Planet.CoordinateSystemType.GEOCENTRIC)
85
                        cacheType += SPHERIC;
86
                else
87
                        cacheType += PLANE;
88
                setCacheType(cacheType);
89

    
90
                try {
91
                        _lyrExtentRect = _layer.getFullExtent();
92
                } catch (ExpansionFileReadException e) {
93
                        // TODO Auto-generated catch block
94
                        e.printStackTrace();
95
                } catch (ReadDriverException e) {
96
                        // TODO Auto-generated catch block
97
                        e.printStackTrace();
98
                }
99

    
100
        }
101

    
102
        public Group getLayerNode() {
103
                return _layerNode;
104
        }
105

    
106
        // uses a strategy to get all features from layer and their symbols
107
        // and add them to the planet
108

    
109
        public void AddFeaturesToPlanet() {
110

    
111
                boolean newLayer = Layer3DProps.getLayer3DProps(_layer).isNewLayerOSG();
112

    
113
                if (!newLayer) {
114
                        GvsigDriverOSG osgD = (GvsigDriverOSG) ((FLyrVect) _layer)
115
                                        .getSource().getDriver();
116
                        try {
117
                                File file = osgD.getFile();
118
                                Node n = null;
119

    
120
                                 try {
121
                                        n = osgDB.readNodeFile(file.getAbsolutePath());
122
                                } catch (FileNotFoundException e) {
123
                                        // TODO Auto-generated catch block
124
                                        e.printStackTrace();
125
                                }
126
                                MultiGeometry root = osgD.getOSGDriver().getRootFeature();
127
                                // Insert the geometry in the root node of the graph.
128
//                                Group g = new Group();
129
//                                buildGeometry(root, g);
130
//                                 g.addChild(n);
131
//                                _layerNode.addChild(g);
132
                                _layerNode.addChild(n);
133
                        } catch (NodeException e) {
134
                                // TODO Auto-generated catch block
135
                                e.printStackTrace();
136
                        }
137
                }
138
                this._canvas3D.repaint();
139
        }
140

    
141
        public void RefreshFeaturesToPlanet() {
142
                this.DeleteFeaturesToPlanet();
143
                this.AddFeaturesToPlanet();
144
        }
145

    
146
        public void DeleteFeaturesToPlanet() {
147
                try {
148
                        endEditing();
149
                        _planetViewer.removeSpecialNode(_layerNode);
150
                } catch (NodeException e) {
151
                        logger.error("Command: "
152
                                        + "Error removing new child node to the special node.", e);
153
                }
154
        }
155

    
156
        public void refreshFeaturesToPlanet(boolean visible) {
157
        }
158

    
159
        public void AddGeometryToLayer(MultiGeometry multiGeometry, Vec3 position,
160
                        Vec3 rotation, Vec3 scale) {
161
                Group group = new Group();
162
                PositionAttitudeTransform posAttTrasn = null;
163
                try {
164
                        posAttTrasn = new PositionAttitudeTransform();
165
                        posAttTrasn.setPosition(position);
166
                        posAttTrasn.setScale(scale);
167
                        // posAttTrasn.setAttitude((float) rotation.x(), new Vec3(1,0,0));
168
                        // posAttTrasn.setAttitude((float) rotation.y(), new Vec3(0,1,0));
169
                        // posAttTrasn.setAttitude((float) rotation.z(), new Vec3(0,0,1));
170
                        buildGeometry(multiGeometry, group);
171
                        posAttTrasn.addChild(group);
172
                        
173
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
174
                        if (props3D.isEditing()){
175
                                editionManager.setScene(posAttTrasn);
176
                        }else{
177
                                _layerNode.addChild(posAttTrasn);
178
                        }
179
//                         _layerNode.addChild(group);
180
                } catch (NodeException e1) {
181
                        // TODO Auto-generated catch block
182
                        e1.printStackTrace();
183
                }
184

    
185
        }
186

    
187
        private void buildGeometry(AbstractPrimitive geom, Group group)
188
                        throws NodeException {
189

    
190
                int i;
191

    
192
                if (geom instanceof MultiGeometry) {
193
                        MultiGeometry multiGeometry = (MultiGeometry) geom;
194
                        for (i = 0; i < multiGeometry.getGeometries().size(); i++) {
195

    
196
                                Group child = new Group();
197
                                group.addChild(child);
198
                                buildGeometry(multiGeometry.getGeometries().get(i), child);
199
                        }
200
                } else if (geom instanceof MultiSolid) {
201
                        // Getting the geometry
202
                        MultiSolid multiSolid = (MultiSolid) geom;
203
                        // Creating the context and adding parameters
204
                        Draw3DContext ctx3D = new Draw3DContext();
205
                        ctx3D.setGroup(group);
206
                        // Creating the drawing operation
207
                        Draw3DMultiSolid d3DMultiSolid = new Draw3DMultiSolid();
208

    
209
                        try {
210
                                // Invoking the operation for the multisolid
211
                                multiSolid.invokeOperation(d3DMultiSolid.getOperationIndex(),
212
                                                ctx3D);
213
                        } catch (GeometryOperationNotSupportedException e) {
214
                                // TODO Auto-generated catch block
215
                                e.printStackTrace();
216
                        } catch (GeometryOperationException e) {
217
                                // TODO Auto-generated catch block
218
                                e.printStackTrace();
219
                        }
220
                }
221

    
222
        }
223

    
224
        public void startEditing() {
225

    
226
                try {
227
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
228
                        if ((props3D.getType() == Layer3DProps.layer3DOSG)
229
                                        && (!props3D.isEditing())) {
230
                                props3D.setEditing(true);
231
                                props3D.setNewLayerOSG(true);
232
                                JOptionPane.showMessageDialog(null,
233
                                                "La capa ha sido puesta en edicion");
234
                                
235
                                editionManager = new EditionManager();
236
                                for (int i = 0; i < _layerNode.getNumChildren(); i++) {
237
                                        Node node = _layerNode.getChild(i);
238
                                        editionManager.setScene(node);
239
                                        _layerNode.removeChild(node);
240
                                }
241
                                _layerNode.addChild(editionManager);
242
//                                Group parent = _layerNode.getParent(0);
243
//                                parent.removeChild(_layerNode);
244
//                                parent.addChild(editionManager);
245
                                
246

    
247
                                ManipulatorHandler manipulatorHandler = new ManipulatorHandler();
248
                                manipulatorHandler.setActive(true);
249

    
250
                                EditorListener editionListener = new EditorListener(
251
                                                editionManager, manipulatorHandler, _canvas3D);
252

    
253
                                _canvas3D.getOSGViewer().addEventHandler(manipulatorHandler);
254

    
255
                                // public void changeDragger(String draggerType)
256
                                //editionManager.changeDragger(DraggerType.ROTATE_SPHERE_DRAGGER
257
                                // );
258
                                // editionManager.changeDragger(DraggerType.TABBOX_DRAGGER);
259
                                //editionManager.changeDragger(DraggerType.TRANSLATE_AXIS_DRAGGER
260
                                // );
261

    
262
                        }
263
                } catch (NodeException e) {
264
                        // TODO Auto-generated catch block
265
                        e.printStackTrace();
266
                }
267
        }
268

    
269
        public void endEditing() {
270

    
271
                try {
272
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
273
                        if ((props3D.getType() == Layer3DProps.layer3DOSG)
274
                                        && (props3D.isEditing())) {
275
                                props3D.setEditing(false);
276

    
277
                                if (props3D.isNewLayerOSG()) 
278
                                        JOptionPane
279
                                                        .showMessageDialog(null,
280
                                                                        "La capa ha sido modificada, recuerde salvar los cambios.");
281

    
282
                                command = new RemoveAllSelectionCommand(editionManager);
283
                                command.execute();
284

    
285
                                Group scene = editionManager.getTransformedScene();
286
                                
287
                                for (int i = 0; i < _layerNode.getNumChildren(); i++) {
288
                                        Node node = _layerNode.getChild(i);
289
                                        _layerNode.removeChild(node);
290
                                        
291
                                }
292
                                _layerNode.addChild(scene);
293
                                
294
//                                Group parent = _layerNode.getParent(0);
295
//                                parent.removeChild(_layerNode);
296
//                                parent.addChild(scene);
297
                                // public void changeDragger(String draggerType)
298
                                //editionManager.changeDragger(DraggerType.ROTATE_SPHERE_DRAGGER
299
                                // );
300
                                // editionManager.changeDragger(DraggerType.TABBOX_DRAGGER);
301
                                //editionManager.changeDragger(DraggerType.TRANSLATE_AXIS_DRAGGER
302
                                // );
303

    
304
                        }
305
                } catch (NodeException e) {
306
                        // TODO Auto-generated catch block
307
                        e.printStackTrace();
308
                }
309

    
310
        }
311

    
312
        public EditionManager getEditionManager() {
313
                return editionManager;
314
        }
315

    
316
        public void setEditionManager(EditionManager editionManager) {
317
                this.editionManager = editionManager;
318
        }
319

    
320
}