Statistics
| Revision:

svn-gvsig-desktop / branches / gvSIG_19_ext3D_osgVP_2_2_0 / libraries / lib3DMap / src / org / gvsig / gvsig3d / cacheservices / VectorCacheService.java @ 31819

History | View | Annotate | Download (10.6 KB)

1
package org.gvsig.gvsig3d.cacheservices;
2

    
3
import java.awt.BasicStroke;
4
import java.awt.Color;
5
import java.awt.geom.Rectangle2D;
6
import java.util.ArrayList;
7
import java.util.List;
8
import java.util.Vector;
9

    
10
import org.apache.log4j.Logger;
11
import org.cresques.cts.IProjection;
12
import org.cresques.px.Extent;
13
import org.gvsig.cacheservice.CacheService;
14
import org.gvsig.gvsig3d.gui.FeatureFactory;
15
import org.gvsig.gvsig3d.labels3D.ILabel3D;
16
import org.gvsig.gvsig3d.labels3D.SimpleLabel3D;
17
import org.gvsig.gvsig3d.simbology3D.Line3DFeature;
18
import org.gvsig.gvsig3d.simbology3D.Point3DFeature;
19
import org.gvsig.gvsig3d.simbology3D.Polygon3DFeature;
20
import org.gvsig.gvsig3d.simbology3D.Symbology3DFactory;
21
import org.gvsig.gvsig3d.simbology3D.geometry3D.Point3DGeometryGenerator;
22
import org.gvsig.osgvp.core.osg.Group;
23
import org.gvsig.osgvp.core.osg.Node;
24
import org.gvsig.osgvp.core.osg.Vec3;
25
import org.gvsig.osgvp.core.osg.Vec4;
26
import org.gvsig.osgvp.core.osgtext.Text;
27
import org.gvsig.osgvp.core.osgtext.TextBase;
28
import org.gvsig.osgvp.exceptions.node.NodeException;
29
import org.gvsig.osgvp.features.PixelPoint;
30
import org.gvsig.osgvp.geometries.Geometry;
31
import org.gvsig.osgvp.geometries.Point3D;
32
import org.gvsig.osgvp.symbology.CircleSymbol;
33
import org.gvsig.osgvp.symbology.CompositeSymbol3D;
34
import org.gvsig.osgvp.symbology.FadeTextSymbol;
35
import org.gvsig.osgvp.symbology.PointSymbol3D;
36
import org.gvsig.osgvp.symbology.PolylineSymbol3D;
37
import org.gvsig.osgvp.symbology.TextSymbol;
38
import org.gvsig.osgvp.symbology.visitor.Symbol3DVisitor;
39
import org.gvsig.osgvp.terrain.Terrain;
40
import org.gvsig.osgvp.terrain.TerrainViewer;
41
import org.gvsig.osgvp.viewer.IViewerContainer;
42

    
43
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
44
import com.hardcode.gdbms.engine.values.NumericValue;
45
import com.hardcode.gdbms.engine.values.Value;
46
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
47
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
48
import com.iver.cit.gvsig.fmap.core.FShape;
49
import com.iver.cit.gvsig.fmap.core.IFeature;
50
import com.iver.cit.gvsig.fmap.core.IGeometry;
51
import com.iver.cit.gvsig.fmap.core.ILabelable;
52
import com.iver.cit.gvsig.fmap.core.symbols.ILineSymbol;
53
import com.iver.cit.gvsig.fmap.core.symbols.ISymbol;
54
import com.iver.cit.gvsig.fmap.core.v02.FTextLayout;
55
import com.iver.cit.gvsig.fmap.drivers.IFeatureIterator;
56
import com.iver.cit.gvsig.fmap.layers.FLayer;
57
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
58
import com.iver.cit.gvsig.fmap.layers.ISpatialDB;
59
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
60
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
61
import com.iver.cit.gvsig.fmap.rendering.IClassifiedVectorLegend;
62
import com.iver.cit.gvsig.fmap.rendering.IVectorLegend;
63
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.AttrInTableLabelingStrategy;
64
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.ILabelingStrategy;
65

    
66
public class VectorCacheService extends CacheService {
67

    
68
        private IViewerContainer _canvas3D;
69
        private TerrainViewer _terrainViewer;
70
        private Terrain _terrain;
71
        private Extent _extent;
72
        private Rectangle2D _lyrExtentRect;
73
        private FLayer _layer;
74
        private IProjection _viewProj;
75
        // vector caching for libJOSG
76
        private Group _layerNode;
77
        private Node _currentNode;
78
        private int _currentGeomType;
79
        private List<ILabel3D> _labels;
80
        private float _heigth = 5000;
81
        private int _fontSize = 14;
82
        private int _n = 0;
83
        // Create a hash table
84
        private int _option;
85
        private boolean _primera = true;
86
        private static Logger _logger = Logger.getLogger(VectorCacheService.class
87
                        .getName());
88
        protected int _layermode;
89

    
90
        public static class LayerMode {
91
                public static final int POINT = 0;
92
                public static final int POLYLINE = 1;
93
                public static final int POLYGON = 2;
94
        }
95

    
96
        private static Logger logger = Logger.getLogger(VectorCacheService.class
97
                        .getName());
98

    
99
        // private ISymbol _currentSymbol;
100

    
101
        public VectorCacheService(IViewerContainer canvas3D, Terrain terrain,
102
                        String name, FLayer layer, IProjection viewProj) {
103
                super(terrain.getTerrainName(), name);
104

    
105
                // getNames();
106

    
107
                _canvas3D = canvas3D;
108
                _terrainViewer = (TerrainViewer) canvas3D.getOSGViewer();
109
                _terrain = terrain;
110
                _layer = layer;
111
                _viewProj = viewProj;
112
                _layerNode = new Group();
113
                _layerNode.setNodeName("layer3DVector");
114
                try {
115
                        _terrainViewer.addFeature(_layerNode);
116
                } catch (NodeException e1) {
117
                        logger.error("Command: "
118
                                        + "Error adding new child node to the special node.", e1);
119
                }
120

    
121
                int cacheType = CacheService.GLOBAL;
122
                if (terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
123
                        cacheType += SPHERIC;
124
                else
125
                        cacheType += PLANE;
126
                setCacheType(cacheType);
127

    
128
                try {
129
                        _lyrExtentRect = _layer.getFullExtent();
130
                } catch (ExpansionFileReadException e) {
131
                        // TODO Auto-generated catch block
132
                        e.printStackTrace();
133
                } catch (ReadDriverException e) {
134
                        // TODO Auto-generated catch block
135
                        e.printStackTrace();
136
                }
137

    
138
                _extent = new Extent(_lyrExtentRect);
139

    
140
        }
141

    
142
        // uses a strategy to get all features from layer and their symbols
143
        // and add them to the planet
144

    
145
        public void addFeaturesToTerrain() {
146

    
147
                try {
148
                        newDraw();
149
                        getNames();
150
                        // _canvas3D.repaint();
151
                } catch (Exception e) {
152
                        e.printStackTrace();
153
                }
154
        }
155

    
156
        public void refreshFeaturesToTerrain() {
157

    
158
                if (_layerNode.getNumChildren() > 0) {
159
                        this.deleteFeaturesToTerrain();
160
                        _layerNode = new Group();
161
                }
162
                try {
163
                        _terrainViewer.addFeature(_layerNode);
164
                } catch (NodeException e1) {
165
                        logger.error("Command: "
166
                                        + "Error adding new child node to the special node.", e1);
167
                }
168
                _currentGeomType = -1;
169

    
170
                try {
171
                        newDraw();
172
                        getNames();
173
                } catch (Exception e) {
174
                        e.printStackTrace();
175
                }
176
        }
177

    
178
        public void deleteFeaturesToTerrain() {
179

    
180
                try {
181
                        _terrainViewer.removeFeature(_layerNode);
182
                        _layerNode = null;
183

    
184
                } catch (NodeException e) {
185
                        logger.error("Command: "
186
                                        + "Error removing new child node to the special node.", e);
187
                }
188
        }
189

    
190
        public void refreshFeaturesToTerrain(boolean visible) {
191
                _layerNode.setNodeMask(visible ? 0xffffffff : 0x00000000);
192
        }
193

    
194
        private void getNames() {
195
                Group root = new Group();
196
                createLabels(_layer);
197
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
198
                if ((_labels != null) && (_labels.size() > 0))
199
                        try {
200
                                this._layerNode.addChild(FeatureFactory.insertLabels(
201
                                                this._labels, this._terrain, props3D.getHeigth()));
202

    
203
                        } catch (NodeException e) {
204
                                logger.error("Command: " + "Error adding new child node.", e);
205
                        }
206
        }
207

    
208
        public void createLabels(FLayer lyrVect) {
209

    
210
                // If this layer had enable the labels, we would need to get its.
211
                if (lyrVect instanceof ILabelable && ((FLyrVect) lyrVect).isLabeled()) {
212
                        // Cleaning the m_label list
213
                        _labels = new ArrayList<ILabel3D>();
214
                        // Casting the layer to the interface
215
                        ILabelable lyrLable = (ILabelable) lyrVect;
216
                        // Getting the strategy
217
                        AttrInTableLabelingStrategy strategy = (AttrInTableLabelingStrategy) lyrLable
218
                                        .getLabelingStrategy();
219
                        // Getting the fields and Id to get after the values using the
220
                        // recorset.
221
                        try {
222
                                // Getting fields
223
                                // Text
224
                                int textFieldId = strategy.getTextFieldId();
225
                                // String textField = strategy.getTextField();
226

    
227
                                // Height
228
                                String heightField = strategy.getHeightField();
229
                                int heightFieldId = strategy.getHeightFieldId();
230

    
231
                                // Rotation
232
                                String rotationField = strategy.getRotationField();
233
                                int rotationFieldId = strategy.getRotationFieldId();
234

    
235
                                // Unit
236
                                int unit = strategy.getUnit();
237

    
238
                                // Getting the recordset
239
                                ReadableVectorial source = ((FLyrVect) lyrVect).getSource();
240
                                SelectableDataSource recordSet = source.getRecordset();
241

    
242
                                Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
243
                                float heigth = props3D.getHeigth();
244

    
245
                                // Iterate over all the rows.
246
                                for (int i = 0; i < recordSet.getRowCount(); i++) {
247

    
248
                                        // Getting the geometry from the source
249
                                        IGeometry geom = source.getShape(i);
250

    
251
                                        // Getting the row with all the fields relactionship.
252
                                        Value[] vv = recordSet.getRow(i);
253

    
254
                                        Value texto = vv[textFieldId];
255
                                        double size = 0;
256
                                        if (strategy.usesFixedSize()) {
257
                                                size = strategy.getFixedSize();
258
                                        } else {
259
                                                NumericValue altura = (NumericValue) vv[heightFieldId];
260
                                                size = altura.doubleValue();
261
                                        }
262

    
263
                                        SimpleLabel3D simpleLabel3DAux = new SimpleLabel3D(geom
264
                                                        .createLabels(0, true)[0]);
265

    
266
                                        Vec3 position = simpleLabel3DAux.getPosition();
267
                                        // Vec3 newPosition = new Vec3(position.x(), position.y(),
268
                                        // heigth);
269
                                        Vec3 newPosition = new Vec3(position.x(), position.y(),
270
                                                        heigth + 50);
271
                                        simpleLabel3DAux.setPosition(newPosition);
272

    
273
                                        simpleLabel3DAux.setTextField(texto.toString());
274

    
275
                                        simpleLabel3DAux.setHeightField(size);
276

    
277
                                        simpleLabel3DAux.setStrategy(strategy);
278

    
279
                                        Value rotacion;
280
                                        if (rotationField != null)
281
                                                rotacion = vv[rotationFieldId];
282

    
283
                                        simpleLabel3DAux.setUnits(unit);
284

    
285
                                        _labels.add(simpleLabel3DAux);
286
                                }
287

    
288
                        } catch (ReadDriverException e) {
289
                                e.printStackTrace();
290
                        }
291
                }
292

    
293
        }
294

    
295
        public void newDraw() {
296

    
297
                Node root;
298

    
299
                System.err.println("new Draw");
300
                FLyrVect fLyrVect = (FLyrVect) _layer;
301
                try {
302

    
303
                        IVectorLegend legend = (IVectorLegend) fLyrVect.getLegend();
304
                        ArrayList<String> fieldList = new ArrayList<String>();
305

    
306
                        // fields from legendn
307
                        String[] aux = null;
308

    
309
                        if (legend instanceof IClassifiedVectorLegend) {
310
                                aux = ((IClassifiedVectorLegend) legend)
311
                                                .getClassifyingFieldNames();
312
                                for (int i = 0; i < aux.length; i++) {
313
                                        fieldList.add(aux[i]);
314
                                }
315

    
316
                        }
317

    
318
                        FLyrVect lyrVect = null;
319
                        if (_layer.getClass().equals(FLyrVect.class)) {
320
                                lyrVect = (FLyrVect) _layer;
321
                        }
322
                        if (lyrVect != null) {
323
                                if (lyrVect.isLabeled()) {
324
                                        aux = lyrVect.getLabelingStrategy().getUsedFields();
325
                                        for (int i = 0; i < aux.length; i++) {
326
                                                fieldList.add(aux[i]);
327
                                        }
328
                                }
329
                        }
330
                        ILabelingStrategy labelStrategy = fLyrVect.getLabelingStrategy();
331
                        if (labelStrategy != null) {
332
                                String[] usetFields = labelStrategy.getUsedFields();
333
                        }
334
                        ReadableVectorial source = fLyrVect.getSource();
335
                        root = Symbology3DFactory.getNodeSymbol(_layer, source, fieldList
336
                                        .toArray(new String[fieldList.size()]), _viewProj, legend,
337
                                        _terrain);
338

    
339
                        try {
340

    
341
                                this._layerNode.addChild(root);
342
                        } catch (NodeException e) {
343
                                // TODO Auto-generated catch block
344
                                e.printStackTrace();
345
                        }
346

    
347
                } catch (ReadDriverException e) {
348
                        // TODO Auto-generated catch block
349
                        e.printStackTrace();
350
                }
351

    
352
        }
353

    
354
}