Statistics
| Revision:

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

History | View | Annotate | Download (8.69 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
                        _layerNode.addChild(posAttTrasn);
170
                        // _layerNode.addChild(group);
171
                } catch (NodeException e1) {
172
                        // TODO Auto-generated catch block
173
                        e1.printStackTrace();
174
                }
175

    
176
        }
177

    
178
        private void buildGeometry(AbstractPrimitive geom, Group group)
179
                        throws NodeException {
180

    
181
                int i;
182

    
183
                if (geom instanceof MultiGeometry) {
184
                        MultiGeometry multiGeometry = (MultiGeometry) geom;
185
                        for (i = 0; i < multiGeometry.getGeometries().size(); i++) {
186

    
187
                                Group child = new Group();
188
                                group.addChild(child);
189
                                buildGeometry(multiGeometry.getGeometries().get(i), child);
190
                        }
191
                } else if (geom instanceof MultiSolid) {
192
                        // Getting the geometry
193
                        MultiSolid multiSolid = (MultiSolid) geom;
194
                        // Creating the context and adding parameters
195
                        Draw3DContext ctx3D = new Draw3DContext();
196
                        ctx3D.setGroup(group);
197
                        // Creating the drawing operation
198
                        Draw3DMultiSolid d3DMultiSolid = new Draw3DMultiSolid();
199

    
200
                        try {
201
                                // Invoking the operation for the multisolid
202
                                multiSolid.invokeOperation(d3DMultiSolid.getOperationIndex(),
203
                                                ctx3D);
204
                        } catch (GeometryOperationNotSupportedException e) {
205
                                // TODO Auto-generated catch block
206
                                e.printStackTrace();
207
                        } catch (GeometryOperationException e) {
208
                                // TODO Auto-generated catch block
209
                                e.printStackTrace();
210
                        }
211
                }
212

    
213
        }
214

    
215
        public void startEditing() {
216

    
217
                try {
218
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
219
                        if ((props3D.getType() == Layer3DProps.layer3DOSG)
220
                                        && (!props3D.isEditing())) {
221
                                props3D.setEditing(true);
222
                                JOptionPane.showMessageDialog(null,
223
                                                "la capa ha sido puesta en edicion automaticamente");
224
                                editionManager = new EditionManager();
225
                                editionManager.setScene(_layerNode);
226
                                Group parent = _layerNode.getParent(0);
227
                                parent.removeChild(_layerNode);
228
                                parent.addChild(editionManager);
229

    
230
                                ManipulatorHandler manipulatorHandler = new ManipulatorHandler();
231
                                manipulatorHandler.setActive(true);
232

    
233
                                EditorListener editionListener = new EditorListener(
234
                                                editionManager, manipulatorHandler, _canvas3D);
235

    
236
                                _canvas3D.getOSGViewer().addEventHandler(manipulatorHandler);
237

    
238
                                // public void changeDragger(String draggerType)
239
                                //editionManager.changeDragger(DraggerType.ROTATE_SPHERE_DRAGGER
240
                                // );
241
                                // editionManager.changeDragger(DraggerType.TABBOX_DRAGGER);
242
                                //editionManager.changeDragger(DraggerType.TRANSLATE_AXIS_DRAGGER
243
                                // );
244

    
245
                        }
246
                } catch (NodeException e) {
247
                        // TODO Auto-generated catch block
248
                        e.printStackTrace();
249
                }
250
        }
251

    
252
        public void endEditing() {
253
                
254
                try {
255
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
256
                        if ((props3D.getType() == Layer3DProps.layer3DOSG)
257
                                        && (props3D.isEditing())) {
258
                                props3D.setEditing(false);
259
                                
260
                                 command = new RemoveAllSelectionCommand(editionManager);
261
                                 command.execute();
262
                                 
263
                                 Group scene = editionManager.getTransformedScene();
264
                                 Group parent = _layerNode.getParent(0);
265
                                 parent.removeChild(_layerNode);
266
                                 parent.addChild(scene);
267
                                 
268
                                // public void changeDragger(String draggerType)
269
                                //editionManager.changeDragger(DraggerType.ROTATE_SPHERE_DRAGGER
270
                                // );
271
                                // editionManager.changeDragger(DraggerType.TABBOX_DRAGGER);
272
                                //editionManager.changeDragger(DraggerType.TRANSLATE_AXIS_DRAGGER
273
                                // );
274

    
275
                        }
276
                } catch (NodeException e) {
277
                        // TODO Auto-generated catch block
278
                        e.printStackTrace();
279
                }
280
                
281
        }
282
        public EditionManager getEditionManager() {
283
                return editionManager;
284
        }
285

    
286
        public void setEditionManager(EditionManager editionManager) {
287
                this.editionManager = editionManager;
288
        }
289

    
290

    
291
}