Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extEditing / src / org / gvsig / editing / gui / cad / tools / AutoCompletePolygon.java @ 33205

History | View | Annotate | Download (4.44 KB)

1
package org.gvsig.editing.gui.cad.tools;
2

    
3
import java.awt.Graphics2D;
4

    
5
import org.gvsig.andami.PluginServices;
6
import org.gvsig.andami.messages.NotificationManager;
7
import org.gvsig.editing.gui.cad.DefaultCADTool;
8
import org.gvsig.fmap.dal.exception.ReadException;
9
import org.gvsig.tools.dispose.DisposableIterator;
10
import org.gvsig.fmap.dal.feature.Feature;
11
import org.gvsig.fmap.dal.feature.FeatureSet;
12
import org.gvsig.fmap.geom.Geometry;
13
import org.gvsig.fmap.geom.exception.CreateGeometryException;
14
import org.gvsig.fmap.geom.operation.Draw;
15
import org.gvsig.fmap.geom.operation.DrawOperationContext;
16
import org.gvsig.fmap.geom.operation.GeometryOperationException;
17
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
18
import org.gvsig.fmap.geom.operation.tojts.ToJTS;
19
import org.gvsig.fmap.geom.primitive.Curve;
20
import org.gvsig.fmap.geom.primitive.GeneralPathX;
21
import org.gvsig.fmap.geom.util.Converter;
22
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
23
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
24

    
25

    
26
public class AutoCompletePolygon extends PolylineCADTool {
27

    
28
        @Override
29
         /**
30
     * M?todo para dibujar la lo necesario para el estado en el que nos
31
     * encontremos.
32
     *
33
     * @param g Graphics sobre el que dibujar.
34
     * @param selectedGeometries BitSet con las geometr?as seleccionadas.
35
     * @param x par?metro x del punto que se pase para dibujar.
36
     * @param y par?metro x del punto que se pase para dibujar.
37
     */
38
    public void drawOperation(MapControlDrawer renderer, double x,
39
        double y) {
40
        Geometry geom=getGeometry();
41
        if (geom.getHandlers(Geometry.SELECTHANDLER).length ==0 && firstPoint!=null) {
42
                GeneralPathX gpx = new GeneralPathX();
43
                gpx.moveTo(firstPoint.getX(), firstPoint.getY());
44
                gpx.lineTo(x, y);
45
                  renderer.draw(createCurve(gpx), mapControlManager.getGeometrySelectionSymbol());
46
        }
47
        else if (geom.getHandlers(Geometry.SELECTHANDLER).length > 1) {
48
                GeneralPathX gpxGeom=new GeneralPathX();
49
                gpxGeom.moveTo(x,y);
50
                gpxGeom.append(geom.getPathIterator(null, geomManager.getFlatness()), true);
51
                gpxGeom.closePath();
52
                   renderer.draw(createCurve(gpxGeom), mapControlManager.getGeometrySelectionSymbol());
53
        }
54
    }
55

    
56

    
57
        private Geometry autoComplete(Geometry digitizedGeom) throws CreateGeometryException {
58
                com.vividsolutions.jts.geom.Geometry jtsGeom = null;
59
                FeatureSet selected = null;
60
                DisposableIterator iterator = null;
61
                try {
62
                        jtsGeom = (com.vividsolutions.jts.geom.Geometry)digitizedGeom.invokeOperation(ToJTS.CODE, null);
63
                        FLyrVect lyrVect = (FLyrVect) getVLE().getLayer();
64
                        // Se supone que debe ser r?pido, ya que est? indexado
65

    
66
                        selected =
67
                                        lyrVect.queryByGeometry(digitizedGeom,
68
                                        lyrVect.getFeatureStore().getDefaultFeatureType());
69
                        iterator = selected.iterator();
70
                        while (iterator.hasNext()) {
71
                                Feature feature = (Feature) iterator.next();
72
                                Geometry aux = feature.getDefaultGeometry();
73
                                com.vividsolutions.jts.geom.Geometry jtsAux = (com.vividsolutions.jts.geom.Geometry)aux.invokeOperation(ToJTS.CODE, null);
74
                                jtsGeom = jtsGeom.difference(jtsAux);
75
                        }
76
                } catch (ReadException e) {
77
                        NotificationManager.showMessageError(
78
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
79
                                        + " " + e.getLocalizedMessage(),
80
                                        e);
81
                } catch (com.vividsolutions.jts.geom.TopologyException e) {
82
                        NotificationManager.showMessageError(
83
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
84
                                        + " " + e.getLocalizedMessage(),
85
                                        e);
86
                } catch (Exception e) {
87
                        NotificationManager.showMessageError(
88
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
89
                                        + " " + e.getLocalizedMessage(),
90
                                        e);
91
                } finally {
92
                        if (iterator != null) {
93
                                iterator.dispose();
94
                        }
95
                        if (selected != null) {
96
                                selected.dispose();
97
                        }
98
                }
99

    
100
                return Converter.jtsToGeometry(jtsGeom);
101
        }
102

    
103
        @Override
104
        public Feature insertGeometry(Geometry geometry) {
105
                Geometry newGeom;
106
                try {
107
                        newGeom = autoComplete(geometry);
108
                        return super.insertGeometry(newGeom);
109
                } catch (CreateGeometryException e) {
110
                        NotificationManager.addError(e);
111
                }
112
                return null;
113
        }
114
        
115
         public boolean isApplicable(int shapeType) {
116
                switch (shapeType) {
117
                case Geometry.TYPES.SURFACE:
118
                    return true;
119
                }
120
                return false;
121
            }
122
}