Statistics
| Revision:

gvsig-3d / 2.1 / trunk / org.gvsig.view3d / org.gvsig.view3d.vector / org.gvsig.view3d.vector.lib / org.gvsig.view3d.vector.lib.impl / src / main / java / org / gvsig / view3d / vector / lib / impl / extrusion / DefaultVectorExtrusionLineRenderableLayer.java @ 772

History | View | Annotate | Download (5.65 KB)

1
package org.gvsig.view3d.vector.lib.impl.extrusion;
2

    
3
import java.awt.Color;
4
import java.util.ArrayList;
5
import java.util.List;
6

    
7
import org.apache.commons.lang3.StringUtils;
8
import org.cresques.cts.ICoordTrans;
9
import org.cresques.cts.IProjection;
10

    
11
import org.gvsig.fmap.crs.CRSFactory;
12
import org.gvsig.fmap.dal.exception.DataException;
13
import org.gvsig.fmap.dal.feature.Feature;
14
import org.gvsig.fmap.dal.feature.FeatureQuery;
15
import org.gvsig.fmap.dal.feature.FeatureStore;
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.Geometry.TYPES;
18
import org.gvsig.fmap.geom.aggregate.MultiLine;
19
import org.gvsig.fmap.geom.primitive.Curve;
20
import org.gvsig.fmap.geom.primitive.Line;
21
import org.gvsig.fmap.geom.primitive.Point;
22
import org.gvsig.fmap.mapcontext.layers.FLayer;
23
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
24
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
25
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
26
import org.gvsig.view3d.vector.lib.api.VectorElevationMode;
27
import org.gvsig.view3d.vector.lib.api.VectorExtrusionLoaderParameters;
28
import org.gvsig.view3d.vector.lib.api.VectorLoaderParameters;
29
import org.gvsig.view3d.vector.lib.impl.AbstractRenderableLayer;
30

    
31
import gov.nasa.worldwind.geom.Position;
32
import gov.nasa.worldwind.render.BasicShapeAttributes;
33
import gov.nasa.worldwind.render.Material;
34
import gov.nasa.worldwind.render.Path;
35
import gov.nasa.worldwind.render.Renderable;
36

    
37
public class DefaultVectorExtrusionLineRenderableLayer extends AbstractRenderableLayer {
38

    
39
    private BasicShapeAttributes normalShapeAttributes;
40

    
41
    public DefaultVectorExtrusionLineRenderableLayer(VectorLoaderParameters parameters, FeatureStore featureStore,
42
        IVectorLegend legend) {
43
        super(parameters, featureStore, legend);
44
    }
45

    
46
    @Override
47
    protected List<Renderable> getRenderables(Feature feature) {
48

    
49
        double heightFieldValue = 0;
50
        String heightField = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
51
        if (StringUtils.isNoneBlank(heightField)) {
52
            heightFieldValue = feature.getDouble(heightField);
53
        }
54

    
55
        Geometry geom = feature.getDefaultGeometry();
56
        List<Renderable> renderables = new ArrayList<>();
57
        if (geom.getGeometryType().isTypeOf(TYPES.MULTILINE)) {
58
            MultiLine multiLine = (MultiLine) geom;
59
            for (int i = 0; i < multiLine.getPrimitivesNumber(); i++) {
60
                if (multiLine.getCurveAt(i).getNumVertices() >= 2) {
61
                    renderables.add(getRenderable(multiLine.getCurveAt(i), heightFieldValue));
62
                }
63
            }
64
        } else {
65
            if (((Line) geom).getNumVertices() >= 2) {
66
                renderables.add(getRenderable((Line) geom, heightFieldValue));
67
            }
68
        }
69
        return renderables;
70
    }
71

    
72
    private Renderable getRenderable(Curve curve, double heightFieldValue) {
73
        boolean hasZ = curve.getDimension() > 2;
74
        double h = 0.0;
75

    
76
        if (VectorElevationMode.CLAMP_TO_GROUND.equals(parameters.getVectorElevationMode())) {
77
            hasZ = false;
78
        } else {
79
            if (VectorElevationMode.RELATIVE_TO_GROUND.equals(parameters.getVectorElevationMode())) {
80
                hasZ = false;
81
            }
82
            if (parameters.getConstantHeight() != null) {
83
                h = parameters.getConstantHeight();
84
            }
85
        }
86

    
87
        h += heightFieldValue;
88
        h *= ((VectorExtrusionLoaderParameters) parameters).getVerticalExaggeration();
89
        ICoordTrans coordTrans = getCoordTrans(this.parameters.getLayer().getProjection());
90
        List<Position> verticesList = getVertices(curve, h, hasZ, coordTrans);
91
        Path path = new Path(verticesList);
92
        path.setAltitudeMode(getAltitudeMode(this.parameters.getVectorElevationMode()));
93
        path.setAttributes(getNormalShapAttributes(legend));
94
        path.setExtrude(true);
95
        return path;
96
    }
97

    
98
    private BasicShapeAttributes getNormalShapAttributes(IVectorLegend legend) {
99
        
100
        if(normalShapeAttributes != null) {
101
            return this.normalShapeAttributes;
102
        }
103

    
104
        Material outlineMaterial;
105
        double outlineOpacity = 1.0;
106
        double outlineWidth = 3.0;
107

    
108
        ISymbol symbol = legend.getDefaultSymbol();
109
        if (symbol instanceof ILineSymbol) {
110
            ILineSymbol lineSymbol = (ILineSymbol) symbol;
111
            Color lineColor = lineSymbol.getColor();
112
            int lineAlpha = lineSymbol.getAlpha();
113
            outlineMaterial = new Material(lineColor);
114
            outlineOpacity = lineAlpha / 255.0;
115
            outlineWidth = lineSymbol.getLineWidth();
116
        } else {
117
            outlineMaterial = new Material(this.parameters.getDefaultColor());
118
            outlineOpacity = 1.0;
119
            outlineWidth = 3.0;
120
        }
121
        normalShapeAttributes = new BasicShapeAttributes();
122
        normalShapeAttributes.setOutlineMaterial(outlineMaterial);
123
        normalShapeAttributes.setOutlineWidth(outlineWidth);
124
        normalShapeAttributes.setOutlineOpacity(outlineOpacity);
125
        return normalShapeAttributes;
126
    }
127
    
128
    @Override
129
    protected FeatureQuery getFeatureQuery() throws DataException {
130
        FeatureQuery featureQuery = super.getFeatureQuery();
131
        // Add field height to feature query
132
        String fieldHeight = ((VectorExtrusionLoaderParameters) parameters).getHeightField();
133
        if (StringUtils.isNotBlank(fieldHeight)) {
134
            featureQuery.addAttributeName(fieldHeight);
135
        }
136
        return featureQuery;
137
    }
138

    
139
    @Override
140
    protected void clearRenderAttributes() {
141
        // Sets normal shape attributes to null to force create it again
142
        this.normalShapeAttributes = null;
143
    }
144
}