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 | 43510 | jjdelcerro | 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 | } |