Statistics
| Revision:

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

History | View | Annotate | Download (9.5 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(n);
132
//                                _layerNode.addChild(g);
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
                _layerNode.setNodeMask(visible ? 0xffffffff : 0x00000000);
158
        }
159

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

    
186
        }
187

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

    
191
                int i;
192

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

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

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

    
223
        }
224

    
225
        public void startEditing() {
226

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

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

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

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

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

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

    
270
        public void endEditing() {
271

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

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

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

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

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

    
311
        }
312

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

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

    
321
}