root / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / cacheservices / OSGCacheService.java @ 24105
History | View | Annotate | Download (9.34 KB)
1 | 22472 | jcampos | package org.gvsig.gvsig3d.cacheservices; |
---|---|---|---|
2 | |||
3 | import java.awt.geom.Rectangle2D; |
||
4 | 23017 | jcampos | import java.io.File; |
5 | 22472 | jcampos | |
6 | 23304 | jcampos | import javax.swing.JOptionPane; |
7 | |||
8 | 22472 | jcampos | 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 | 22629 | afraile | import org.gvsig.gvsig3d.drivers.GvsigDriverOSG; |
17 | 23304 | jcampos | import org.gvsig.gvsig3d.listener.EditorListener; |
18 | 22472 | jcampos | import org.gvsig.operations3D.Draw3DMultiSolid; |
19 | import org.gvsig.operations3D.context.Draw3DContext; |
||
20 | import org.gvsig.osgvp.Group; |
||
21 | 23017 | jcampos | import org.gvsig.osgvp.Node; |
22 | 22629 | afraile | import org.gvsig.osgvp.PositionAttitudeTransform; |
23 | 22472 | jcampos | import org.gvsig.osgvp.Vec3; |
24 | import org.gvsig.osgvp.exceptions.node.NodeException; |
||
25 | 23304 | jcampos | 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 | 22472 | jcampos | 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 | 23304 | jcampos | |
52 | 22629 | afraile | private boolean newLayerOSG = false; |
53 | 22472 | jcampos | |
54 | 23304 | jcampos | private EditionManager editionManager;
|
55 | |||
56 | private RemoveAllSelectionCommand command;
|
||
57 | |||
58 | 22472 | jcampos | 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 | 22661 | jcampos | _layerNode.setNodeName("layer3DOSG");
|
74 | 23304 | jcampos | |
75 | 22472 | jcampos | 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 | 23304 | jcampos | |
101 | 22659 | afraile | public Group getLayerNode() { |
102 | return _layerNode;
|
||
103 | } |
||
104 | 22472 | jcampos | |
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 | 22629 | afraile | |
110 | boolean newLayer = Layer3DProps.getLayer3DProps(_layer).isNewLayerOSG();
|
||
111 | 23304 | jcampos | |
112 | if (!newLayer) {
|
||
113 | GvsigDriverOSG osgD = (GvsigDriverOSG) ((FLyrVect) _layer) |
||
114 | .getSource().getDriver(); |
||
115 | 22629 | afraile | try {
|
116 | 23017 | jcampos | File file = osgD.getFile();
|
117 | 23304 | jcampos | 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 | 22629 | afraile | MultiGeometry root = osgD.getOSGDriver().getRootFeature(); |
126 | // Insert the geometry in the root node of the graph.
|
||
127 | Group g = new Group(); |
||
128 | 23304 | jcampos | buildGeometry(root, g); |
129 | // g.addChild(n);
|
||
130 | 22629 | afraile | _layerNode.addChild(g); |
131 | } catch (NodeException e) {
|
||
132 | // TODO Auto-generated catch block
|
||
133 | e.printStackTrace(); |
||
134 | } |
||
135 | } |
||
136 | 23017 | jcampos | this._canvas3D.repaint();
|
137 | 22472 | jcampos | } |
138 | |||
139 | public void RefreshFeaturesToPlanet() { |
||
140 | 22673 | jcampos | this.DeleteFeaturesToPlanet();
|
141 | this.AddFeaturesToPlanet();
|
||
142 | 22472 | jcampos | } |
143 | |||
144 | public void DeleteFeaturesToPlanet() { |
||
145 | 22661 | jcampos | 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 | 22472 | jcampos | } |
152 | |||
153 | public void refreshFeaturesToPlanet(boolean visible) { |
||
154 | } |
||
155 | |||
156 | 22629 | afraile | public void AddGeometryToLayer(MultiGeometry multiGeometry, Vec3 position, |
157 | Vec3 rotation, Vec3 scale) { |
||
158 | 22472 | jcampos | Group group = new Group(); |
159 | 22629 | afraile | PositionAttitudeTransform posAttTrasn = null;
|
160 | 22472 | jcampos | try {
|
161 | 22629 | afraile | posAttTrasn = new PositionAttitudeTransform();
|
162 | posAttTrasn.setPosition(position); |
||
163 | 22659 | afraile | posAttTrasn.setScale(scale); |
164 | 23304 | jcampos | // 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 | 22472 | jcampos | buildGeometry(multiGeometry, group); |
168 | 22629 | afraile | posAttTrasn.addChild(group); |
169 | 24105 | jcampos | |
170 | Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
|
||
171 | if (props3D.isEditing()){
|
||
172 | editionManager.setScene(posAttTrasn); |
||
173 | }else{
|
||
174 | _layerNode.addChild(posAttTrasn); |
||
175 | } |
||
176 | 23304 | jcampos | // _layerNode.addChild(group);
|
177 | 22629 | afraile | } catch (NodeException e1) {
|
178 | 22472 | jcampos | // TODO Auto-generated catch block
|
179 | 22629 | afraile | e1.printStackTrace(); |
180 | 22472 | jcampos | } |
181 | 22629 | afraile | |
182 | 22472 | jcampos | } |
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 | 23304 | jcampos | public void startEditing() { |
222 | 22629 | afraile | |
223 | 23304 | jcampos | try {
|
224 | Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
|
||
225 | if ((props3D.getType() == Layer3DProps.layer3DOSG)
|
||
226 | && (!props3D.isEditing())) { |
||
227 | props3D.setEditing(true);
|
||
228 | 24105 | jcampos | props3D.setNewLayerOSG(true);
|
229 | 23304 | jcampos | JOptionPane.showMessageDialog(null, |
230 | "la capa ha sido puesta en edicion automaticamente");
|
||
231 | 24105 | jcampos | |
232 | 23304 | jcampos | editionManager = new EditionManager();
|
233 | 24105 | jcampos | for (int i = 0; i < _layerNode.getNumChildren(); i++) { |
234 | Node node = _layerNode.getChild(i); |
||
235 | editionManager.setScene(node); |
||
236 | |||
237 | } |
||
238 | 23304 | jcampos | Group parent = _layerNode.getParent(0); |
239 | parent.removeChild(_layerNode); |
||
240 | parent.addChild(editionManager); |
||
241 | 24105 | jcampos | |
242 | // editionManager = new EditionManager();
|
||
243 | // editionManager.setScene(_layerNode);
|
||
244 | // Group parent = _layerNode.getParent(0);
|
||
245 | // parent.removeChild(_layerNode);
|
||
246 | // parent.addChild(editionManager);
|
||
247 | 23304 | jcampos | |
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 | 24105 | jcampos | |
272 | 23304 | jcampos | try {
|
273 | Layer3DProps props3D = Layer3DProps.getLayer3DProps(this._layer);
|
||
274 | if ((props3D.getType() == Layer3DProps.layer3DOSG)
|
||
275 | && (props3D.isEditing())) { |
||
276 | props3D.setEditing(false);
|
||
277 | 24105 | jcampos | |
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 | 23304 | jcampos | // 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 | 24105 | jcampos | |
303 | 23304 | jcampos | } |
304 | 24105 | jcampos | |
305 | 23304 | jcampos | public EditionManager getEditionManager() {
|
306 | return editionManager;
|
||
307 | } |
||
308 | |||
309 | public void setEditionManager(EditionManager editionManager) { |
||
310 | this.editionManager = editionManager;
|
||
311 | } |
||
312 | |||
313 | 22472 | jcampos | } |