Statistics
| Revision:

gvsig-derived-geometries / org.gvsig.derivedgeometries / trunk / org.gvsig.derivedgeometries / org.gvsig.derivedgeometries.swing / org.gvsig.derivedgeometries.swing.impl / src / main / java / org / gvsig / derivedgeometries / swing / impl / processes / LineToClosedPolylineDerivedGeometriesProcess.java @ 52

History | View | Annotate | Download (6.94 KB)

1
/*
2
 * Copyright 2014 DiSiD Technologies S.L.L. All rights reserved.
3
 * 
4
 * Project  : DiSiD org.gvsig.derivedgeometries.swing.impl 
5
 * SVN Id   : $Id$
6
 */
7
package org.gvsig.derivedgeometries.swing.impl.processes;
8

    
9
import java.util.List;
10

    
11
import javax.swing.JOptionPane;
12

    
13
import org.cresques.cts.IProjection;
14
import org.slf4j.Logger;
15
import org.slf4j.LoggerFactory;
16

    
17
import org.gvsig.derivedgeometries.swing.api.DerivedGeometriesParameters;
18
import org.gvsig.derivedgeometries.swing.impl.AbstractDerivedGeometriesProcess;
19
import org.gvsig.fmap.dal.feature.FeatureReference;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.dal.feature.FeatureType;
22
import org.gvsig.fmap.geom.Geometry;
23
import org.gvsig.fmap.geom.GeometryLocator;
24
import org.gvsig.fmap.geom.GeometryManager;
25
import org.gvsig.fmap.geom.primitive.Curve;
26
import org.gvsig.fmap.geom.primitive.Point;
27
import org.gvsig.fmap.geom.primitive.Polygon;
28
import org.gvsig.fmap.geom.type.GeometryType;
29
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
30
import org.gvsig.tools.swing.api.ToolsSwingLocator;
31
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
32
import org.gvsig.tools.task.SimpleTaskStatus;
33

    
34
public class LineToClosedPolylineDerivedGeometriesProcess extends
35
    AbstractDerivedGeometriesProcess {
36

    
37
    private static final Logger logger = LoggerFactory
38
        .getLogger(LineToClosedPolylineDerivedGeometriesProcess.class);
39

    
40
    public LineToClosedPolylineDerivedGeometriesProcess(
41
        DerivedGeometriesParameters parameters) {
42
        super("Line to polyline process", parameters);
43
    }
44

    
45
    public void run() {
46
        SimpleTaskStatus status = null;
47

    
48
        try {
49
            status = (SimpleTaskStatus) this.getTaskStatus();
50

    
51
            if (status.isCancellationRequested()) {
52

    
53
                status.cancel();
54
                return;
55
            }
56

    
57
            // Get data process
58
            DerivedGeometriesParameters parameters = super.getParameters();
59
            String outputLayerName = parameters.getOutPutLayerName();
60
            String outputLayerPath = parameters.getOutPutLayerPath();
61
            int outputLayerType = parameters.getOutPutLayerType();
62
            boolean addLayer = parameters.getAddLayer();
63
            boolean createNewFeatureStore =
64
                parameters.getCreateNewFeatureStore();
65
            FLyrVect sourceLayer = parameters.getSourceLayer();
66
            IProjection projection = sourceLayer.getProjection();
67
            FeatureType sourceFeatureType =
68
                sourceLayer.getFeatureStore().getDefaultFeatureType();
69
            List<FeatureReference> selectedFeatures =
70
                parameters.getSelectedFeatures();
71

    
72
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
73
            GeometryType sourceGeomType =
74
                sourceLayer.getFeatureStore().getDefaultFeatureType()
75
                    .getDefaultGeometryAttribute().getGeomType();
76
            Polygon polygon =
77
                geomManager.createPolygon(sourceGeomType.getSubType());
78
            Point vertexAnt = null;
79

    
80
            status.setRangeOfValues(1, selectedFeatures.size());
81

    
82
            // Iterate over features getting geometries to create polygon
83
            for (int i = 0; i < selectedFeatures.size(); i++) {
84

    
85
                // Si ha sido solicitada la cancelacion de la tarea
86
                // la marcamos como cancelada y salimos del proceso.
87
                if (status.isCancellationRequested()) {
88

    
89
                    status.cancel();
90
                    return;
91
                }
92

    
93
                // Informamos del progreso de la tarea
94
                status.setCurValue(i);
95

    
96
                FeatureReference featureReference = selectedFeatures.get(i);
97
                Geometry geom =
98
                    featureReference.getFeature().getDefaultGeometry();
99
                for (int j = 0; j < ((Curve) geom).getNumVertices(); j++) {
100
                    Point point = ((Curve) geom).getVertex(j);
101

    
102
                    if (vertexAnt == null || !vertexAnt.equals(point)) {
103
                        polygon.addVertex(point);
104
                        vertexAnt = point;
105
                    }
106

    
107
                }
108

    
109
            }
110

    
111
            // Close polygon if it is necessary
112
            closeSurfaceIfNecessary(polygon);
113

    
114
            if (status.isCancellationRequested()) {
115
                status.cancel();
116

    
117
                return;
118
            }
119

    
120
            if (createNewFeatureStore) {
121
                // Creating new feature store
122
                createNewFeatureStore(sourceFeatureType, outputLayerType,
123
                    outputLayerPath, projection);
124

    
125
                // Set createNewFeatureStore false to avoid create new feature
126
                // if process is started again
127
                parameters.setCreateNewFeatureStore(false);
128
            }
129

    
130
            // Open the new feature store
131
            FeatureStore featureStore = parameters.getFeatureStore();
132
            if (featureStore == null) {
133
                featureStore = getFeatureStore(outputLayerPath, projection);
134
            }
135

    
136
            // Set feature store in edit mode
137
            setEditingMode(featureStore);
138

    
139
            // Add line
140
            insertGeometryIntoFeauteStore(featureStore, polygon);
141

    
142
            // Save changes and finish editing
143
            endEditingMode(featureStore);
144

    
145
            if (status.isCancellationRequested()) {
146
                status.cancel();
147

    
148
                return;
149
            }
150

    
151
            if (addLayer) {
152
                //Dispose feature store to liberate resources
153
                featureStore.dispose();
154
                
155
                // Add layer to MapControl
156
                featureStore =
157
                    addLayerToMapContex(outputLayerName, outputLayerPath,
158
                        projection);
159
                parameters.setAddLayer(false);
160
                parameters.setFeatureStore(featureStore);
161
            }
162

    
163
            this.postProcess();
164

    
165
        } catch (Exception e) {
166
            ThreadSafeDialogsManager dlgManager =
167
                ToolsSwingLocator.getThreadSafeDialogsManager();
168

    
169
            dlgManager.messageDialog("_process_error", "_error",
170
                JOptionPane.ERROR_MESSAGE);
171

    
172
            logger.info("Error in line to closed process", e);
173
            if (status != null) {
174
                status.abort();
175
            }
176

    
177
        } finally {
178
            if (status != null) {
179
                // Mark process as terminate if it is running.
180
                if (status.isRunning()) {
181
                    status.terminate();
182
                }
183
            }
184
        }
185
    }
186

    
187
    private void postProcess() {
188

    
189
        ThreadSafeDialogsManager dlgManager =
190
            ToolsSwingLocator.getThreadSafeDialogsManager();
191

    
192
        String message = "_process_finished_successfully";
193
        String title = "_information";
194
        dlgManager.messageDialog(message, title,
195
            JOptionPane.INFORMATION_MESSAGE);
196

    
197
        // Repaint mapContext to view new derived geometries added.
198
        getParameters().getMapControl().getMapContext().invalidate();
199
    }
200

    
201
}