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 | 764 | llmarques | 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 | 767 | llmarques | import org.cresques.cts.ICoordTrans; |
9 | import org.cresques.cts.IProjection; |
||
10 | 764 | llmarques | |
11 | 767 | llmarques | import org.gvsig.fmap.crs.CRSFactory; |
12 | 766 | llmarques | import org.gvsig.fmap.dal.exception.DataException; |
13 | 764 | llmarques | import org.gvsig.fmap.dal.feature.Feature; |
14 | 766 | llmarques | import org.gvsig.fmap.dal.feature.FeatureQuery; |
15 | 764 | llmarques | 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 | 767 | llmarques | import org.gvsig.fmap.mapcontext.layers.FLayer; |
23 | 764 | llmarques | 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 | 772 | llmarques | super(parameters, featureStore, legend);
|
44 | 764 | llmarques | } |
45 | |||
46 | @Override
|
||
47 | 767 | llmarques | protected List<Renderable> getRenderables(Feature feature) { |
48 | 764 | llmarques | |
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 | 767 | llmarques | ICoordTrans coordTrans = getCoordTrans(this.parameters.getLayer().getProjection());
|
90 | List<Position> verticesList = getVertices(curve, h, hasZ, coordTrans); |
||
91 | 764 | llmarques | Path path = new Path(verticesList);
|
92 | path.setAltitudeMode(getAltitudeMode(this.parameters.getVectorElevationMode()));
|
||
93 | 772 | llmarques | path.setAttributes(getNormalShapAttributes(legend)); |
94 | 764 | llmarques | path.setExtrude(true);
|
95 | return path;
|
||
96 | } |
||
97 | |||
98 | private BasicShapeAttributes getNormalShapAttributes(IVectorLegend legend) {
|
||
99 | 772 | llmarques | |
100 | if(normalShapeAttributes != null) { |
||
101 | return this.normalShapeAttributes; |
||
102 | } |
||
103 | 764 | llmarques | |
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 | 766 | llmarques | |
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 | 764 | llmarques | |
139 | 772 | llmarques | @Override
|
140 | protected void clearRenderAttributes() { |
||
141 | // Sets normal shape attributes to null to force create it again
|
||
142 | this.normalShapeAttributes = null; |
||
143 | } |
||
144 | 764 | llmarques | } |