Statistics
| Revision:

gvsig-3d / 1.10 / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / cacheservices / VectorCacheService.java @ 77

History | View | Annotate | Download (10.7 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
                        _layerNode.removeChildren();
182
                        _terrainViewer.removeFeature(_layerNode);
183
                        _layerNode = null;
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
                // Cleaning the m_label list
211
                _labels = new ArrayList<ILabel3D>();
212

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

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

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

    
237
                                // Unit
238
                                int unit = strategy.getUnit();
239

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

    
244
                                Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
245
                                float heigth = props3D.getHeigth();
246

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

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

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

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

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

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

    
275
                                        simpleLabel3DAux.setTextField(texto.toString());
276

    
277
                                        simpleLabel3DAux.setHeightField(size);
278

    
279
                                        simpleLabel3DAux.setStrategy(strategy);
280

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

    
285
                                        simpleLabel3DAux.setUnits(unit);
286

    
287
                                        _labels.add(simpleLabel3DAux);
288
                                }
289

    
290
                        } catch (ReadDriverException e) {
291
                                e.printStackTrace();
292
                        }
293
                }
294

    
295
        }
296

    
297
        public void newDraw() {
298

    
299
                Node root = new Node();
300

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

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

    
308
                        // fields from legendn
309
                        String[] aux = null;
310

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

    
318
                        }
319

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

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

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

    
353
        }
354

    
355
}