Statistics
| Revision:

root / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / cacheservices / OSGCacheService.java @ 24105

History | View | Annotate | Download (9.34 KB)

1
package org.gvsig.gvsig3d.cacheservices;
2

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

    
6
import javax.swing.JOptionPane;
7

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

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

    
39
public class OSGCacheService extends CacheService {
40

    
41
        private IViewerContainer _canvas3D;
42

    
43
        private PlanetViewer _planetViewer;
44

    
45
        private Rectangle2D _lyrExtentRect;
46

    
47
        private FLayer _layer;
48

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

    
52
        private boolean newLayerOSG = false;
53

    
54
        private EditionManager editionManager;
55

    
56
        private RemoveAllSelectionCommand command;
57

    
58
        private static Logger logger = Logger.getLogger(OSGCacheService.class
59
                        .getName());
60

    
61
        // private ISymbol _currentSymbol;
62

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

    
67
                // getNames();
68

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

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

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

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

    
99
        }
100

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

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

    
108
        public void AddFeaturesToPlanet() {
109

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

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

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

    
139
        public void RefreshFeaturesToPlanet() {
140
                this.DeleteFeaturesToPlanet();
141
                this.AddFeaturesToPlanet();
142
        }
143

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

    
153
        public void refreshFeaturesToPlanet(boolean visible) {
154
        }
155

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

    
182
        }
183

    
184
        private void buildGeometry(AbstractPrimitive geom, Group group)
185
                        throws NodeException {
186

    
187
                int i;
188

    
189
                if (geom instanceof MultiGeometry) {
190
                        MultiGeometry multiGeometry = (MultiGeometry) geom;
191
                        for (i = 0; i < multiGeometry.getGeometries().size(); i++) {
192

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

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

    
219
        }
220

    
221
        public void startEditing() {
222

    
223
                try {
224
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
225
                        if ((props3D.getType() == Layer3DProps.layer3DOSG)
226
                                        && (!props3D.isEditing())) {
227
                                props3D.setEditing(true);
228
                                props3D.setNewLayerOSG(true);
229
                                JOptionPane.showMessageDialog(null,
230
                                                "la capa ha sido puesta en edicion automaticamente");
231
                                
232
                                editionManager = new EditionManager();
233
                                for (int i = 0; i < _layerNode.getNumChildren(); i++) {
234
                                        Node node = _layerNode.getChild(i);
235
                                        editionManager.setScene(node);
236
                                        
237
                                }
238
                                Group parent = _layerNode.getParent(0);
239
                                parent.removeChild(_layerNode);
240
                                parent.addChild(editionManager);
241
                                
242
//                                editionManager = new EditionManager();
243
//                                editionManager.setScene(_layerNode);
244
//                                Group parent = _layerNode.getParent(0);
245
//                                parent.removeChild(_layerNode);
246
//                                parent.addChild(editionManager);
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
                                Group parent = _layerNode.getParent(0);
288
                                parent.removeChild(_layerNode);
289
                                parent.addChild(scene);
290
                                // public void changeDragger(String draggerType)
291
                                //editionManager.changeDragger(DraggerType.ROTATE_SPHERE_DRAGGER
292
                                // );
293
                                // editionManager.changeDragger(DraggerType.TABBOX_DRAGGER);
294
                                //editionManager.changeDragger(DraggerType.TRANSLATE_AXIS_DRAGGER
295
                                // );
296

    
297
                        }
298
                } catch (NodeException e) {
299
                        // TODO Auto-generated catch block
300
                        e.printStackTrace();
301
                }
302

    
303
        }
304

    
305
        public EditionManager getEditionManager() {
306
                return editionManager;
307
        }
308

    
309
        public void setEditionManager(EditionManager editionManager) {
310
                this.editionManager = editionManager;
311
        }
312

    
313
}