Statistics
| Revision:

root / trunk / extensions / extCAD / src / com / iver / cit / gvsig / gui / cad / tools / AutoCompletePolygon.java @ 27976

History | View | Annotate | Download (4.34 KB)

1
package com.iver.cit.gvsig.gui.cad.tools;
2

    
3
import java.awt.Graphics;
4
import java.awt.Graphics2D;
5
import java.awt.geom.Point2D;
6

    
7
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
8
import com.iver.andami.PluginServices;
9
import com.iver.andami.messages.NotificationManager;
10
import com.iver.cit.gvsig.exceptions.visitors.VisitorException;
11
import com.iver.cit.gvsig.fmap.core.FGeometryCollection;
12
import com.iver.cit.gvsig.fmap.core.FShape;
13
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
14
import com.iver.cit.gvsig.fmap.core.Handler;
15
import com.iver.cit.gvsig.fmap.core.IGeometry;
16
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
17
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
18
import com.iver.cit.gvsig.fmap.edition.UtilFunctions;
19
import com.iver.cit.gvsig.fmap.layers.FBitSet;
20
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
21
import com.iver.cit.gvsig.fmap.operations.strategies.DefaultStrategy;
22
import com.iver.cit.gvsig.gui.cad.DefaultCADTool;
23
import com.iver.cit.gvsig.gui.cad.tools.PolylineCADTool;
24
import com.iver.cit.gvsig.gui.cad.tools.smc.PolylineCADToolContext.PolylineCADToolState;
25
import com.vividsolutions.jts.geom.Geometry;
26

    
27
public class AutoCompletePolygon extends PolylineCADTool {
28

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

    
55
                gpxGeom.closePath();
56
                IGeometry newGeom = ShapeFactory.createPolygon2D(gpxGeom);
57
                newGeom.draw((Graphics2D) g,
58
                                getCadToolAdapter().getMapControl().getViewPort(),
59
                                DefaultCADTool.geometrySelectSymbol);
60
        }
61
    }
62

    
63

    
64
        private IGeometry autoComplete(IGeometry digitizedGeom) {
65
                Geometry jtsGeom = digitizedGeom.toJTSGeometry();
66
                FLyrVect lyrVect = (FLyrVect) getVLE().getLayer();
67
                // Se supone que debe ser r?pido, ya que est? indexado
68
                try {
69
                        FBitSet selected = lyrVect.queryByShape(digitizedGeom,
70
                                        DefaultStrategy.INTERSECTS);
71
                        for (int i = selected.nextSetBit(0); i >= 0; i = selected
72
                                        .nextSetBit(i + 1)) {
73
                                IGeometry aux = lyrVect.getSource().getShape(i);
74
                                Geometry jtsAux = aux.toJTSGeometry();
75
                                jtsGeom = jtsGeom.difference(jtsAux);
76
                        }
77

    
78
                } catch (ReadDriverException e) {
79
                        NotificationManager.showMessageError(
80
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
81
                                        + " " + e.getLocalizedMessage(),
82
                                        e);
83
                } catch (VisitorException e) {
84
                        NotificationManager.showMessageError(
85
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
86
                                        + " " + e.getLocalizedMessage(),
87
                                        e);
88
                } catch (com.vividsolutions.jts.geom.TopologyException e) {
89
                        NotificationManager.showMessageError(
90
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
91
                                        + " " + e.getLocalizedMessage(),
92
                                        e);
93
                } catch (Exception e) {
94
                        NotificationManager.showMessageError(
95
                                        PluginServices.getText(this, "Error_in_Autocomplete_Polygon_Tool_")
96
                                        + " " + e.getLocalizedMessage(),
97
                                        e);
98
                }
99

    
100
                return FConverter.jts_to_igeometry(jtsGeom);
101
        }
102

    
103
        @Override
104
        public void addGeometry(IGeometry geometry) {
105
                IGeometry newGeom = autoComplete(geometry);
106
                super.addGeometry(newGeom);
107
        }
108
         public boolean isApplicable(int shapeType) {
109
                switch (shapeType) {
110
                case FShape.POLYGON:
111
                    return true;
112
                }
113
                return false;
114
            }
115
}