gvsig-geoprocess / org.gvsig.geoprocess / trunk / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / core / PostProcessTaskRunnable.java @ 466
History | View | Annotate | Download (16.9 KB)
1 | 237 | cordinyana | /**
|
---|---|---|---|
2 | * gvSIG. Desktop Geographic Information System.
|
||
3 | *
|
||
4 | 245 | cordinyana | * Copyright (C) 2007-2012 gvSIG Association.
|
5 | 237 | cordinyana | *
|
6 | * This program is free software; you can redistribute it and/or
|
||
7 | * modify it under the terms of the GNU General Public License
|
||
8 | * as published by the Free Software Foundation; either version 2
|
||
9 | * of the License, or (at your option) any later version.
|
||
10 | *
|
||
11 | * This program is distributed in the hope that it will be useful,
|
||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
14 | * GNU General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU General Public License
|
||
17 | * along with this program; if not, write to the Free Software
|
||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||
19 | * MA 02110-1301, USA.
|
||
20 | 245 | cordinyana | *
|
21 | * For any additional information, do not hesitate to contact us
|
||
22 | * at info AT gvsig.com, or visit our website www.gvsig.com.
|
||
23 | 237 | cordinyana | */
|
24 | 220 | cordinyana | package org.gvsig.geoprocess.lib.sextante.core; |
25 | |||
26 | import java.awt.Component; |
||
27 | import java.util.List; |
||
28 | |||
29 | import javax.swing.BorderFactory; |
||
30 | import javax.swing.JOptionPane; |
||
31 | import javax.swing.JScrollPane; |
||
32 | import javax.swing.JTextPane; |
||
33 | import javax.swing.ScrollPaneConstants; |
||
34 | import javax.swing.SwingUtilities; |
||
35 | import javax.swing.border.BevelBorder; |
||
36 | |||
37 | 415 | nbrodin | import org.cresques.cts.IProjection; |
38 | import org.gvsig.andami.PluginServices; |
||
39 | import org.gvsig.andami.ui.mdiManager.IWindow; |
||
40 | import org.gvsig.app.ApplicationLocator; |
||
41 | import org.gvsig.app.extension.ProjectExtension; |
||
42 | import org.gvsig.app.project.Project; |
||
43 | import org.gvsig.app.project.ProjectManager; |
||
44 | import org.gvsig.app.project.documents.Document; |
||
45 | import org.gvsig.app.project.documents.table.TableDocument; |
||
46 | import org.gvsig.app.project.documents.view.ViewDocument; |
||
47 | import org.gvsig.app.project.documents.view.ViewManager; |
||
48 | import org.gvsig.app.project.documents.view.gui.IView; |
||
49 | import org.gvsig.fmap.dal.coverage.RasterLocator; |
||
50 | 466 | nbrodin | import org.gvsig.fmap.dal.coverage.dataset.Buffer; |
51 | 415 | nbrodin | import org.gvsig.fmap.dal.coverage.datastruct.NoData; |
52 | import org.gvsig.fmap.mapcontext.MapContext; |
||
53 | import org.gvsig.fmap.mapcontext.exceptions.ReloadLayerException; |
||
54 | import org.gvsig.fmap.mapcontext.layers.FLayer; |
||
55 | import org.gvsig.fmap.mapcontext.layers.FLayers; |
||
56 | import org.gvsig.fmap.mapcontext.layers.LayersIterator; |
||
57 | import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect; |
||
58 | import org.gvsig.geoprocess.lib.sextante.dataObjects.FileTools; |
||
59 | import org.gvsig.raster.fmap.layers.FLyrRaster; |
||
60 | |||
61 | 220 | cordinyana | import es.unex.sextante.core.GeoAlgorithm; |
62 | import es.unex.sextante.core.ObjectAndDescription; |
||
63 | import es.unex.sextante.core.OutputObjectsSet; |
||
64 | import es.unex.sextante.core.ParametersSet; |
||
65 | import es.unex.sextante.core.Sextante; |
||
66 | import es.unex.sextante.dataObjects.ILayer; |
||
67 | import es.unex.sextante.dataObjects.IRasterLayer; |
||
68 | import es.unex.sextante.dataObjects.IVectorLayer; |
||
69 | import es.unex.sextante.gui.additionalResults.AdditionalResults; |
||
70 | import es.unex.sextante.gui.algorithm.iterative.SingleFeatureVectorLayer; |
||
71 | import es.unex.sextante.gui.core.SextanteGUI; |
||
72 | import es.unex.sextante.gui.settings.SextanteGeneralSettings; |
||
73 | import es.unex.sextante.outputs.FileOutputChannel; |
||
74 | import es.unex.sextante.outputs.IOutputChannel; |
||
75 | import es.unex.sextante.outputs.NullOutputChannel; |
||
76 | import es.unex.sextante.outputs.Output; |
||
77 | import es.unex.sextante.outputs.Output3DRasterLayer; |
||
78 | import es.unex.sextante.outputs.OutputRasterLayer; |
||
79 | import es.unex.sextante.outputs.OutputTable; |
||
80 | import es.unex.sextante.outputs.OutputText; |
||
81 | import es.unex.sextante.outputs.OutputVectorLayer; |
||
82 | import es.unex.sextante.outputs.OverwriteOutputChannel; |
||
83 | import es.unex.sextante.parameters.Parameter; |
||
84 | import es.unex.sextante.parameters.RasterLayerAndBand; |
||
85 | |||
86 | 225 | cordinyana | public class PostProcessTaskRunnable implements Runnable { |
87 | 220 | cordinyana | |
88 | private MapContext m_MapContext;
|
||
89 | private final GeoAlgorithm m_Algorithm; |
||
90 | private final OutputObjectsSet m_Output; |
||
91 | private final boolean m_bShowResultsWindows; |
||
92 | |||
93 | 225 | cordinyana | public PostProcessTaskRunnable(final GeoAlgorithm algorithm, |
94 | 220 | cordinyana | final boolean bShowResultsWindow) { |
95 | |||
96 | m_Output = algorithm.getOutputObjects(); |
||
97 | m_Algorithm = algorithm; |
||
98 | m_bShowResultsWindows = bShowResultsWindow; |
||
99 | |||
100 | } |
||
101 | |||
102 | public void run() { |
||
103 | |||
104 | if (m_Output.hasLayers()) {
|
||
105 | setOutputView(); |
||
106 | } |
||
107 | |||
108 | addResults(); |
||
109 | |||
110 | } |
||
111 | |||
112 | private void setOutputView() { |
||
113 | |||
114 | ViewDocument view = null;
|
||
115 | final ParametersSet parameters = m_Algorithm.getParameters();
|
||
116 | for (int i = 0; i < parameters.getNumberOfParameters(); i++) { |
||
117 | final Parameter param = parameters.getParameter(i);
|
||
118 | final Object object = param.getParameterValueAsObject(); |
||
119 | if (object instanceof ILayer) { |
||
120 | view = getViewFromLayer((ILayer) object); |
||
121 | m_MapContext = view.getMapContext(); |
||
122 | return;
|
||
123 | } else
|
||
124 | if (object instanceof List) { |
||
125 | final List list = (List) object; |
||
126 | for (int j = 0; j < list.size(); j++) { |
||
127 | final Object obj = list.get(j); |
||
128 | if (obj instanceof ILayer) { |
||
129 | view = getViewFromLayer((ILayer) obj); |
||
130 | m_MapContext = view.getMapContext(); |
||
131 | return;
|
||
132 | } else
|
||
133 | if (obj instanceof RasterLayerAndBand) { |
||
134 | final RasterLayerAndBand rlab =
|
||
135 | (RasterLayerAndBand) obj; |
||
136 | view = getViewFromLayer(rlab.getRasterLayer()); |
||
137 | m_MapContext = view.getMapContext(); |
||
138 | return;
|
||
139 | } |
||
140 | } |
||
141 | } |
||
142 | } |
||
143 | |||
144 | // if there is no input view, ask the user
|
||
145 | final Project project =
|
||
146 | ((ProjectExtension) PluginServices |
||
147 | .getExtension(ProjectExtension.class)).getProject(); |
||
148 | final List<Document> views = project.getDocuments(ViewManager.TYPENAME); |
||
149 | final Object[] options = new Object[views.size() + 1]; |
||
150 | options[0] = Sextante.getText("Create_new_view"); |
||
151 | for (int i = 0; i < views.size(); i++) { |
||
152 | options[i + 1] = views.get(i);
|
||
153 | } |
||
154 | |||
155 | final Object selectedObject = |
||
156 | JOptionPane.showInputDialog(null, |
||
157 | Sextante.getText("Select_output_view"),
|
||
158 | Sextante.getText("Output_view"), JOptionPane.PLAIN_MESSAGE, |
||
159 | null, options, null); |
||
160 | |||
161 | if (selectedObject instanceof IView) { |
||
162 | m_MapContext = |
||
163 | ((IView) selectedObject).getMapControl().getMapContext(); |
||
164 | } else {
|
||
165 | final Document newView = |
||
166 | ProjectManager.getInstance().createDocument( |
||
167 | ViewManager.TYPENAME, |
||
168 | "SEXTANTE (" + m_Algorithm.getName() + ")"); |
||
169 | ((ProjectExtension) PluginServices |
||
170 | .getExtension(ProjectExtension.class)).getProject() |
||
171 | .add(newView); |
||
172 | final IWindow window = newView.getFactory().getMainWindow(newView);
|
||
173 | final Runnable doWorkRunnable = new Runnable() { |
||
174 | |||
175 | public void run() { |
||
176 | PluginServices.getMDIManager().addWindow(window); |
||
177 | m_MapContext = ((ViewDocument) newView).getMapContext(); |
||
178 | } |
||
179 | }; |
||
180 | try {
|
||
181 | SwingUtilities.invokeAndWait(doWorkRunnable);
|
||
182 | } catch (final Exception e) { |
||
183 | Sextante.addErrorToLog(e); |
||
184 | } |
||
185 | } |
||
186 | |||
187 | } |
||
188 | |||
189 | private ViewDocument getViewFromLayer(ILayer layer) {
|
||
190 | |||
191 | if (layer instanceof SingleFeatureVectorLayer) { |
||
192 | layer = ((SingleFeatureVectorLayer) layer).getOriginalLayer(); |
||
193 | } |
||
194 | |||
195 | final FLayer gvSIGBaseLayer = (FLayer) layer.getBaseDataObject();
|
||
196 | final Project project =
|
||
197 | ((ProjectExtension) PluginServices |
||
198 | .getExtension(ProjectExtension.class)).getProject(); |
||
199 | final List<Document> docs = project.getDocuments(ViewManager.TYPENAME); |
||
200 | |||
201 | for (int i = 0; i < docs.size(); i++) { |
||
202 | final ViewDocument viewDoc = (ViewDocument) docs.get(i);
|
||
203 | final FLayers layers = viewDoc.getMapContext().getLayers();
|
||
204 | final LayersIterator iter = new LayersIterator(layers); |
||
205 | while (iter.hasNext()) {
|
||
206 | final FLayer gvSIGLayer = iter.nextLayer();
|
||
207 | if (gvSIGLayer.equals(gvSIGBaseLayer)) {
|
||
208 | return viewDoc;
|
||
209 | } |
||
210 | } |
||
211 | |||
212 | } |
||
213 | |||
214 | return null; |
||
215 | |||
216 | } |
||
217 | |||
218 | private void addResults() { |
||
219 | |||
220 | final boolean bUseInternalNames = |
||
221 | new Boolean( |
||
222 | SextanteGUI |
||
223 | .getSettingParameterValue(SextanteGeneralSettings.USE_INTERNAL_NAMES)) |
||
224 | .booleanValue(); |
||
225 | final boolean bModiFyResultsNames = |
||
226 | new Boolean( |
||
227 | SextanteGUI |
||
228 | .getSettingParameterValue(SextanteGeneralSettings.MODIFY_NAMES)) |
||
229 | .booleanValue(); |
||
230 | |||
231 | String sDescription;
|
||
232 | boolean bInvalidate = false; |
||
233 | boolean bShowAdditionalPanel = false; |
||
234 | |||
235 | if (m_MapContext != null) { |
||
236 | m_MapContext.beginAtomicEvent(); |
||
237 | } |
||
238 | |||
239 | for (int i = 0; i < m_Output.getOutputObjectsCount(); i++) { |
||
240 | |||
241 | final Output out = m_Output.getOutput(i);
|
||
242 | sDescription = out.getDescription(); |
||
243 | final IOutputChannel channel = out.getOutputChannel();
|
||
244 | final Object object = out.getOutputObject(); |
||
245 | |||
246 | if ((out instanceof OutputRasterLayer) |
||
247 | || (out instanceof Output3DRasterLayer)
|
||
248 | || (out instanceof OutputTable)
|
||
249 | || (out instanceof OutputVectorLayer)) {
|
||
250 | if (bUseInternalNames) {
|
||
251 | sDescription = out.getName(); |
||
252 | } else
|
||
253 | if (bModiFyResultsNames) {
|
||
254 | sDescription = |
||
255 | SextanteGUI.modifyResultName(sDescription); |
||
256 | } |
||
257 | if ((channel instanceof NullOutputChannel) || (channel == null)) { |
||
258 | continue;
|
||
259 | } |
||
260 | } |
||
261 | if (out instanceof OutputVectorLayer) { |
||
262 | String sFilename = null; |
||
263 | if (channel instanceof FileOutputChannel) { |
||
264 | sFilename = ((FileOutputChannel) channel).getFilename(); |
||
265 | final FLyrVect flayer =
|
||
266 | (FLyrVect) FileTools.openLayer(sFilename, sDescription, |
||
267 | (IProjection) m_Algorithm.getOutputCRS()); |
||
268 | if (flayer != null) { |
||
269 | flayer.setName(sDescription); |
||
270 | m_MapContext.getLayers().addLayer(flayer); |
||
271 | bInvalidate = true;
|
||
272 | } |
||
273 | |||
274 | } else
|
||
275 | if (channel instanceof OverwriteOutputChannel) { |
||
276 | // TODO:add support for non file based layer
|
||
277 | final FLyrVect flayer =
|
||
278 | (FLyrVect) ((OverwriteOutputChannel) channel) |
||
279 | .getLayer().getBaseDataObject(); |
||
280 | try {
|
||
281 | flayer.reload(); |
||
282 | bInvalidate = true;
|
||
283 | } catch (final ReloadLayerException e) { |
||
284 | |||
285 | } |
||
286 | } |
||
287 | |||
288 | if (object != null) { |
||
289 | ((IVectorLayer) object).close(); |
||
290 | } |
||
291 | |||
292 | } else
|
||
293 | if (out instanceof OutputTable) { |
||
294 | try {
|
||
295 | final String sFilename = |
||
296 | ((FileOutputChannel) channel).getFilename(); |
||
297 | final TableDocument table =
|
||
298 | FileTools.openTable(sFilename, sDescription); |
||
299 | if (table != null) { |
||
300 | table.setName(sDescription); |
||
301 | ApplicationLocator.getManager().getProjectManager() |
||
302 | .getCurrentProject().add(table); |
||
303 | |||
304 | // final JScrollPane jScrollPane =
|
||
305 | // TableTools
|
||
306 | // .getScrollableTablePanelFromITable((ITable)
|
||
307 | // object);
|
||
308 | // AdditionalResults
|
||
309 | // .addComponent(new ObjectAndDescription(
|
||
310 | // sDescription, jScrollPane));
|
||
311 | // bShowAdditionalPanel = true;
|
||
312 | } |
||
313 | } catch (final Exception e) { |
||
314 | Sextante.addErrorToLog(e); |
||
315 | } |
||
316 | } else
|
||
317 | if (out instanceof OutputRasterLayer) { |
||
318 | final IRasterLayer rasterLayer = (IRasterLayer) object;
|
||
319 | if (channel instanceof FileOutputChannel) { |
||
320 | final String sFilename = |
||
321 | ((FileOutputChannel) channel).getFilename(); |
||
322 | final FLyrRaster flayer =
|
||
323 | (FLyrRaster) FileTools.openLayer( |
||
324 | sFilename, |
||
325 | sDescription, |
||
326 | (IProjection) m_Algorithm.getOutputCRS()); |
||
327 | if (flayer != null) { |
||
328 | if (rasterLayer != null) { |
||
329 | try {
|
||
330 | 415 | nbrodin | NoData nodata = RasterLocator.getManager().getDataStructFactory().createNoData( |
331 | rasterLayer.getNoDataValue(), |
||
332 | null,
|
||
333 | sFilename); |
||
334 | 466 | nbrodin | if(flayer.getDataStore().getDataType()[0] == Buffer.TYPE_BYTE) |
335 | nodata.setNoDataTransparent(false);
|
||
336 | 220 | cordinyana | flayer.setNoDataValue(nodata); |
337 | nodata.save(); |
||
338 | |||
339 | rasterLayer.close(); |
||
340 | } catch (final Exception e) { |
||
341 | Sextante.addErrorToLog(e); |
||
342 | } |
||
343 | } |
||
344 | flayer.setName(sDescription); |
||
345 | m_MapContext.getLayers().addLayer(flayer); |
||
346 | bInvalidate = true;
|
||
347 | |||
348 | } |
||
349 | } |
||
350 | } else
|
||
351 | if (out instanceof OutputText) { |
||
352 | JTextPane jTextPane;
|
||
353 | JScrollPane jScrollPane;
|
||
354 | jTextPane = new JTextPane(); |
||
355 | jTextPane.setEditable(false);
|
||
356 | jTextPane.setContentType("text/html");
|
||
357 | jTextPane.setText((String) object);
|
||
358 | jScrollPane = new JScrollPane(); |
||
359 | jScrollPane.setViewportView(jTextPane); |
||
360 | jScrollPane |
||
361 | .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
|
||
362 | jTextPane.setBorder(BorderFactory
|
||
363 | .createEtchedBorder(BevelBorder.LOWERED));
|
||
364 | AdditionalResults |
||
365 | .addComponent(new ObjectAndDescription(
|
||
366 | sDescription, jScrollPane)); |
||
367 | bShowAdditionalPanel = true;
|
||
368 | } else
|
||
369 | if (object instanceof Component) { |
||
370 | AdditionalResults |
||
371 | .addComponent(new ObjectAndDescription(
|
||
372 | sDescription, object)); |
||
373 | bShowAdditionalPanel = true;
|
||
374 | } else
|
||
375 | if (out instanceof Output3DRasterLayer) { |
||
376 | JOptionPane.showMessageDialog(
|
||
377 | SextanteGUI.getMainFrame(), |
||
378 | Sextante.getText("3d_not_supported"),
|
||
379 | Sextante.getText("Warning"),
|
||
380 | JOptionPane.WARNING_MESSAGE);
|
||
381 | } |
||
382 | |||
383 | } |
||
384 | |||
385 | if (m_MapContext != null) { |
||
386 | m_MapContext.endAtomicEvent(); |
||
387 | } |
||
388 | |||
389 | if (bInvalidate) {
|
||
390 | m_MapContext.invalidate(); |
||
391 | } |
||
392 | |||
393 | if (bShowAdditionalPanel && m_bShowResultsWindows) {
|
||
394 | AdditionalResults.showPanel(); |
||
395 | } |
||
396 | |||
397 | } |
||
398 | } |