svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.symbology / org.gvsig.symbology.lib / org.gvsig.symbology.lib.impl / src / main / java / org / gvsig / symbology / fmap / mapcontext / rendering / legend / impl / DrawUtils.java @ 43510
History | View | Annotate | Download (7.46 KB)
1 |
package org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl; |
---|---|
2 |
|
3 |
import java.awt.Graphics2D; |
4 |
import java.awt.geom.AffineTransform; |
5 |
import java.awt.geom.PathIterator; |
6 |
import org.gvsig.fmap.dal.feature.Feature; |
7 |
import org.gvsig.fmap.geom.Geometry; |
8 |
import org.gvsig.fmap.geom.GeometryException; |
9 |
import org.gvsig.fmap.geom.GeometryLocator; |
10 |
import org.gvsig.fmap.geom.GeometryManager; |
11 |
import org.gvsig.fmap.geom.aggregate.Aggregate; |
12 |
import org.gvsig.fmap.geom.aggregate.MultiLine; |
13 |
import org.gvsig.fmap.geom.aggregate.MultiPolygon; |
14 |
import org.gvsig.fmap.geom.aggregate.MultiSurface; |
15 |
import org.gvsig.fmap.geom.exception.CreateGeometryException; |
16 |
import org.gvsig.fmap.geom.operation.GeometryOperationException; |
17 |
import org.gvsig.fmap.geom.primitive.Curve; |
18 |
import org.gvsig.fmap.geom.primitive.GeneralPathX; |
19 |
import org.gvsig.fmap.geom.primitive.Surface; |
20 |
import org.gvsig.fmap.geom.type.GeometryType; |
21 |
import org.gvsig.fmap.mapcontext.ViewPort; |
22 |
import org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport; |
23 |
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol; |
24 |
import org.gvsig.tools.task.Cancellable; |
25 |
|
26 |
public class DrawUtils { |
27 |
|
28 |
private static GeometryManager geometryManager = null; |
29 |
|
30 |
private static GeometryManager getGeometryManager() { |
31 |
if( geometryManager == null ) { |
32 |
geometryManager = GeometryLocator.getGeometryManager(); |
33 |
} |
34 |
return geometryManager;
|
35 |
} |
36 |
|
37 |
public static void drawInts(Graphics2D g, ViewPort viewPort, Cancellable cancel, double dpi, ISymbol symbol, Feature feature, Geometry geom) throws GeometryOperationException { |
38 |
|
39 |
try {
|
40 |
if( geom instanceof Aggregate ) { |
41 |
for( Geometry prim : (Aggregate) geom ) {
|
42 |
drawInts(g, viewPort, cancel, dpi, symbol, feature, prim); |
43 |
} |
44 |
return;
|
45 |
} |
46 |
|
47 |
double previousSize = ((CartographicSupport) symbol).toCartographicSize(viewPort, dpi, geom);
|
48 |
// draw it as normally
|
49 |
Geometry transformedGeometry; |
50 |
transformedGeometry = transformGeometry(geom.cloneGeometry(), viewPort.getAffineTransform()); |
51 |
|
52 |
// the AffineTransform has to be null because the transformToInts method reprojects the geometry
|
53 |
symbol.draw(g, null, transformedGeometry, feature, cancel);
|
54 |
|
55 |
// restore previous size
|
56 |
((CartographicSupport) symbol).setCartographicSize(previousSize, geom); |
57 |
} catch (GeometryException e) {
|
58 |
throw new GeometryOperationException(e); |
59 |
} |
60 |
} |
61 |
|
62 |
public static void drawInts(Graphics2D g, ViewPort viewPort, ISymbol symbol, Feature feature, Geometry geom) throws GeometryOperationException { |
63 |
|
64 |
try {
|
65 |
if( geom instanceof Aggregate ) { |
66 |
for( Geometry prim : (Aggregate) geom ) {
|
67 |
drawInts(g, viewPort, symbol, feature, prim); |
68 |
} |
69 |
return;
|
70 |
} |
71 |
Geometry transformedGeometry = transformGeometry(geom.cloneGeometry(), viewPort.getAffineTransform()); |
72 |
symbol.draw(g, viewPort.getAffineTransform(), transformedGeometry, feature, null);
|
73 |
|
74 |
} catch (GeometryException e) {
|
75 |
throw new GeometryOperationException(e); |
76 |
} |
77 |
} |
78 |
|
79 |
/**
|
80 |
* @param geom
|
81 |
* @param affineTransform
|
82 |
* @return
|
83 |
* @throws GeometryException
|
84 |
*/
|
85 |
private static Geometry transformGeometry(Geometry geom, AffineTransform affineTransform) throws GeometryException { |
86 |
if( geom.canBeTransformed(affineTransform) ) {
|
87 |
geom.transform(affineTransform); |
88 |
return geom;
|
89 |
} |
90 |
if( geom instanceof Curve || geom instanceof Curve ) { |
91 |
MultiLine lines = geom.toLines(); |
92 |
lines.transform(affineTransform); |
93 |
return lines;
|
94 |
} |
95 |
if( geom instanceof Surface || geom instanceof MultiSurface ) { |
96 |
MultiPolygon polygons = geom.toPolygons(); |
97 |
polygons.transform(affineTransform); |
98 |
return polygons;
|
99 |
} |
100 |
return null; |
101 |
} |
102 |
|
103 |
private static Geometry transformToInts(Geometry gp, AffineTransform at) throws CreateGeometryException { |
104 |
GeneralPathX newGp = new GeneralPathX();
|
105 |
double[] theData = new double[6]; |
106 |
double[] aux = new double[6]; |
107 |
|
108 |
// newGp.reset();
|
109 |
PathIterator theIterator;
|
110 |
int theType;
|
111 |
int numParts = 0; |
112 |
|
113 |
java.awt.geom.Point2D ptDst = new java.awt.geom.Point2D.Double();
|
114 |
java.awt.geom.Point2D ptSrc = new java.awt.geom.Point2D.Double();
|
115 |
boolean bFirst = true; |
116 |
int xInt, yInt, antX = -1, antY = -1; |
117 |
|
118 |
theIterator = gp.getPathIterator(null); //, flatness); |
119 |
int numSegmentsAdded = 0; |
120 |
while( !theIterator.isDone() ) {
|
121 |
theType = theIterator.currentSegment(theData); |
122 |
|
123 |
switch( theType ) {
|
124 |
case PathIterator.SEG_MOVETO: |
125 |
numParts++; |
126 |
ptSrc.setLocation(theData[0], theData[1]); |
127 |
at.transform(ptSrc, ptDst); |
128 |
antX = (int) ptDst.getX();
|
129 |
antY = (int) ptDst.getY();
|
130 |
newGp.moveTo(antX, antY); |
131 |
numSegmentsAdded++; |
132 |
bFirst = true;
|
133 |
break;
|
134 |
|
135 |
case PathIterator.SEG_LINETO: |
136 |
ptSrc.setLocation(theData[0], theData[1]); |
137 |
at.transform(ptSrc, ptDst); |
138 |
xInt = (int) ptDst.getX();
|
139 |
yInt = (int) ptDst.getY();
|
140 |
if( (bFirst) || ((xInt != antX) || (yInt != antY)) ) {
|
141 |
newGp.lineTo(xInt, yInt); |
142 |
antX = xInt; |
143 |
antY = yInt; |
144 |
bFirst = false;
|
145 |
numSegmentsAdded++; |
146 |
} |
147 |
break;
|
148 |
|
149 |
case PathIterator.SEG_QUADTO: |
150 |
at.transform(theData, 0, aux, 0, 2); |
151 |
newGp.quadTo(aux[0], aux[1], aux[2], aux[3]); |
152 |
numSegmentsAdded++; |
153 |
break;
|
154 |
|
155 |
case PathIterator.SEG_CUBICTO: |
156 |
at.transform(theData, 0, aux, 0, 3); |
157 |
newGp.curveTo(aux[0], aux[1], aux[2], aux[3], aux[4], aux[5]); |
158 |
numSegmentsAdded++; |
159 |
break;
|
160 |
|
161 |
case PathIterator.SEG_CLOSE: |
162 |
if( numSegmentsAdded < 3 ) { |
163 |
newGp.lineTo(antX, antY); |
164 |
} |
165 |
newGp.closePath(); |
166 |
|
167 |
break;
|
168 |
} //end switch
|
169 |
|
170 |
theIterator.next(); |
171 |
} //end while loop
|
172 |
|
173 |
Geometry geom = null;
|
174 |
GeometryType geometryType = gp.getGeometryType(); |
175 |
|
176 |
if( geometryType.isTypeOf(Geometry.TYPES.POINT) ) {
|
177 |
geom = getGeometryManager().createPoint(ptDst.getX(), ptDst.getY(), Geometry.SUBTYPES.GEOM2D); |
178 |
} else if( geometryType.isTypeOf(Geometry.TYPES.MULTIPOINT) ) { |
179 |
geom = getGeometryManager().createMultiPoint(newGp, Geometry.SUBTYPES.GEOM2D); |
180 |
} else if( geometryType.isTypeOf(Geometry.TYPES.CURVE) ) { |
181 |
geom = getGeometryManager().createCurve(newGp, Geometry.SUBTYPES.GEOM2D); |
182 |
} else if( geometryType.isTypeOf(Geometry.TYPES.MULTICURVE) ) { |
183 |
geom = getGeometryManager().createMultiCurve(newGp, Geometry.SUBTYPES.GEOM2D); |
184 |
} else if( geometryType.isTypeOf(Geometry.TYPES.SURFACE) ) { |
185 |
geom = getGeometryManager().createSurface(newGp, Geometry.SUBTYPES.GEOM2D); |
186 |
} else if( geometryType.isTypeOf(Geometry.TYPES.MULTISURFACE) ) { |
187 |
geom = getGeometryManager().createMultiSurface(newGp, Geometry.SUBTYPES.GEOM2D); |
188 |
} |
189 |
return geom;
|
190 |
} |
191 |
|
192 |
} |