001: /*
002: * The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
003: * for visualizing and manipulating spatial features with geometry and attributes.
004: *
005: * Copyright (C) 2003 Vivid Solutions
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: *
021: * For more information, contact:
022: *
023: * Vivid Solutions
024: * Suite #1A
025: * 2328 Government Street
026: * Victoria BC V8T 5G5
027: * Canada
028: *
029: * (250)385-6040
030: * www.vividsolutions.com
031: */
032: package com.vividsolutions.jump.plugin.edit;
033:
034: import java.awt.Color;
035: import javax.swing.ImageIcon;
036: import javax.swing.JCheckBox;
037: import javax.swing.JComboBox;
038:
039: import java.util.*;
040:
041: import com.vividsolutions.jump.I18N;
042: import com.vividsolutions.jump.workbench.*;
043: import com.vividsolutions.jump.workbench.model.*;
044: import com.vividsolutions.jump.workbench.plugin.*;
045: import com.vividsolutions.jump.workbench.ui.*;
046: import com.vividsolutions.jump.workbench.ui.plugin.*;
047: import com.vividsolutions.jump.feature.*;
048: import com.vividsolutions.jts.util.*;
049: import com.vividsolutions.jts.geom.*;
050: import com.vividsolutions.jts.operation.linemerge.LineMerger;
051: import com.vividsolutions.jump.geom.*;
052: import com.vividsolutions.jump.task.*;
053:
054: public class ExtractSegmentsPlugIn extends ThreadedBasePlugIn {
055:
056: private static Collection toLineStrings(Collection segments) {
057: GeometryFactory fact = new GeometryFactory();
058: List lineStringList = new ArrayList();
059: for (Iterator i = segments.iterator(); i.hasNext();) {
060: LineSegment seg = (LineSegment) i.next();
061: LineString ls = LineSegmentUtil.asGeometry(fact, seg);
062: lineStringList.add(ls);
063: }
064: return lineStringList;
065: }
066:
067: private static Collection toMergedLineStrings(Collection segments) {
068: GeometryFactory fact = new GeometryFactory();
069: LineMerger lineMerger = new LineMerger();
070: for (Iterator i = segments.iterator(); i.hasNext();) {
071: LineSegment seg = (LineSegment) i.next();
072: lineMerger.add(LineSegmentUtil.asGeometry(fact, seg));
073: }
074: return lineMerger.getMergedLineStrings();
075: }
076:
077: private MultiInputDialog dialog;
078: private String layerName;
079: private boolean uniqueSegmentsOnly;
080: private boolean mergeResultingSegments;
081: private int inputEdgeCount = 0;
082: private int uniqueSegmentCount = 0;
083:
084: public ExtractSegmentsPlugIn() {
085: }
086:
087: /**
088: * Returns a very brief description of this task.
089: * @return the name of this task
090: */
091: public String getName() {
092: return I18N
093: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Extract-Segments");
094: }
095:
096: public EnableCheck createEnableCheck(
097: WorkbenchContext workbenchContext) {
098: EnableCheckFactory checkFactory = new EnableCheckFactory(
099: workbenchContext);
100: return new MultiEnableCheck()
101: .add(
102: checkFactory
103: .createWindowWithLayerManagerMustBeActiveCheck())
104: .add(checkFactory.createAtLeastNLayersMustExistCheck(1));
105: }
106:
107: public boolean execute(PlugInContext context) throws Exception {
108: dialog = new MultiInputDialog(context.getWorkbenchFrame(),
109: getName(), true);
110: setDialogValues(dialog, context);
111: GUIUtil.centreOnWindow(dialog);
112: dialog.setVisible(true);
113: if (!dialog.wasOKPressed()) {
114: return false;
115: }
116: getDialogValues(dialog);
117: return true;
118: }
119:
120: public void run(TaskMonitor monitor, PlugInContext context)
121: throws Exception {
122: monitor.allowCancellationRequests();
123:
124: monitor
125: .report(I18N
126: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Extracting-Segments"));
127:
128: Layer layer = dialog.getLayer(LAYER);
129: FeatureCollection lineFC = layer.getFeatureCollectionWrapper();
130: inputEdgeCount = lineFC.size();
131:
132: //UniqueSegmentsExtracter extracter = new UniqueSegmentsExtracter(monitor);
133: SegmentsExtracter extracter = new SegmentsExtracter(monitor);
134: extracter.add(lineFC);
135: Collection uniqueFSList = uniqueSegmentsOnly ? extracter
136: .getSegments(1, 1) : extracter.getSegments();
137: uniqueSegmentCount = uniqueFSList.size();
138: Collection linestringList = mergeResultingSegments ? toMergedLineStrings(uniqueFSList)
139: : toLineStrings(uniqueFSList);
140:
141: if (monitor.isCancelRequested())
142: return;
143: createLayers(context, linestringList);
144: }
145:
146: private void createLayers(PlugInContext context,
147: Collection linestringList) throws Exception {
148:
149: FeatureCollection lineStringFC = FeatureDatasetFactory
150: .createFromGeometry(linestringList);
151: context
152: .addLayer(
153: StandardCategoryNames.RESULT,
154: layerName
155: + " "
156: + I18N
157: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Extracted-Segs"),
158: lineStringFC);
159:
160: createOutput(context);
161:
162: }
163:
164: private void createOutput(PlugInContext context) {
165: context.getOutputFrame().createNewDocument();
166: context
167: .getOutputFrame()
168: .addHeader(
169: 1,
170: I18N
171: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Extract-Segments"));
172: context.getOutputFrame().addField(
173: I18N.get("ui.MenuNames.LAYER") + ":", layerName);
174:
175: context.getOutputFrame().addText(" ");
176: context
177: .getOutputFrame()
178: .addField(
179: I18N
180: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Number-of-unique-segments-extracted"),
181: "" + uniqueSegmentCount);
182: }
183:
184: private final static String LAYER = I18N.get("ui.MenuNames.LAYER");
185:
186: private void setDialogValues(MultiInputDialog dialog,
187: PlugInContext context) {
188: dialog.setSideBarImage(new ImageIcon(getClass().getResource(
189: "ExtractSegments.png")));
190: dialog
191: .setSideBarDescription(I18N
192: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Extracts-all-unique-line-segments-from-a-dataset"));
193: JComboBox layerComboBox = dialog.addLayerComboBox(LAYER,
194: context.getCandidateLayer(0), null, context
195: .getLayerManager());
196: JCheckBox oneTimeCheckBox = dialog
197: .addCheckBox(
198: I18N
199: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Remove-doubled-segments"),
200: false);
201: JCheckBox mergeCheckBox = dialog
202: .addCheckBox(
203: I18N
204: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Merge-resulting-segments"),
205: false);
206: }
207:
208: private void getDialogValues(MultiInputDialog dialog) {
209: Layer layer = dialog.getLayer(LAYER);
210: layerName = layer.getName();
211: uniqueSegmentsOnly = dialog
212: .getBoolean(I18N
213: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Remove-doubled-segments"));
214: mergeResultingSegments = dialog
215: .getBoolean(I18N
216: .get("jump.plugin.edit.ExtractSegmentsPlugIn.Merge-resulting-segments"));
217: }
218: }
|