SegmenterWizard.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/qt/widgets/rp/SegmenterWizard.cpp
22 
23  \brief A Qt dialog that allows users to run a segmenter operation defined by RP module.
24 */
25 
26 // TerraLib
27 #include "../../../common/progress/ProgressManager.h"
28 #include "../../../dataaccess/dataset/DataSet.h"
29 #include "../../../dataaccess/utils/Utils.h"
30 #include "../../../raster/Raster.h"
31 #include "../../../rp/Segmenter.h"
32 #include "../../../rp/SegmenterRegionGrowingBaatzStrategy.h"
33 #include "../../../rp/SegmenterRegionGrowingMeanStrategy.h"
34 #include "../../../rp/Module.h"
35 #include "../../../maptools/Utils.h"
36 #include "../help/HelpPushButton.h"
37 #include "../layer/search/LayerSearchWidget.h"
38 #include "../layer/search/LayerSearchWizardPage.h"
39 #include "../progress/ProgressViewerDialog.h"
40 #include "SegmenterWizard.h"
42 #include "SegmenterWizardPage.h"
43 #include "../raster/RasterInfoWidget.h"
44 #include "RasterInfoWizardPage.h"
45 #include "ui_SegmenterAdvancedOptionsWizardPageForm.h"
46 #include "Utils.h"
47 
48 // STL
49 #include <cassert>
50 
51 // Qt
52 #include <QMessageBox>
53 #include <QFile>
54 #include <QFileInfo>
55 
56 // Boost
57 #include <boost/timer.hpp>
58 #include <boost/format.hpp>
59 
60 
62  : QWizard(parent)
63 {
64  //configure the wizard
65  this->setWizardStyle(QWizard::ModernStyle);
66  this->setWindowTitle(tr("Segmenter"));
67  //this->setFixedSize(640, 580);
68 
69  this->setOption(QWizard::HaveHelpButton, true);
70  this->setOption(QWizard::HelpButtonOnRight, false);
71 
73 
74  this->setButton(QWizard::HelpButton, helpButton);
75 
76  helpButton->setPageReference("plugins/rp/rp_segmenter.html");
77 
78  connect(this, SIGNAL(currentIdChanged(int)), SLOT(onPageChanged(int)));
79 
80  addPages();
81 }
82 
84 
86 {
87  if(currentPage() == m_layerSearchPage.get())
88  {
89  std::list<te::map::AbstractLayerPtr> list = m_layerSearchPage->getSearchWidget()->getSelecteds();
90 
91  if(list.empty() == false)
92  {
93  te::map::AbstractLayerPtr l = *list.begin();
94 
95  m_segmenterPage->set(l);
96  }
97 
98  return m_layerSearchPage->isComplete();
99  }
100  else if(currentPage() == m_segmenterPage.get())
101  {
102  bool res = m_segmenterPage->isComplete();
103 
104  if(!res)
105  QMessageBox::warning(this, tr("Warning"), tr("Select at least one band."));
106 
107  return res;
108  }
109  else if(currentPage() == m_rasterInfoPage.get())
110  {
111  if( m_rasterInfoPage->getWidget()->getFullName().empty() )
112  {
113  QMessageBox::warning(this, tr("Warning"), tr("Invalid file name"));
114  return false;
115  }
116 
117  if( m_rasterInfoPage->getWidget()->fileExists() )
118  {
119  QMessageBox::warning(this, tr("Warning"), tr("The output raster file already exists"));
120  return false;
121  }
122 
123  return execute();
124  }
125 
126  return true;
127 }
128 
129 void te::qt::widgets::SegmenterWizard::setList(std::list<te::map::AbstractLayerPtr>& layerList)
130 {
131  m_layerSearchPage->getSearchWidget()->setList(layerList);
132  m_layerSearchPage->getSearchWidget()->filterOnlyByRaster();
133 }
134 
136 {
137  removePage(m_layerSearchId);
138 
139  m_segmenterPage->set(layer);
140 }
141 
143 {
144  return m_outputLayer;
145 }
146 
148 {
153 
154  m_layerSearchId = addPage(m_layerSearchPage.get());
155  addPage(m_segmenterPage.get());
156  addPage(m_segmenterAdvOptPage.get());
157  addPage(m_rasterInfoPage.get());
158 
159  //for contrast only one layer can be selected
160  m_layerSearchPage->getSearchWidget()->enableMultiSelection(false);
161 }
162 
164 {
165  if(m_rasterInfoPage->getWidget()->fileExists())
166  {
167  QMessageBox::warning(this, tr("Segmenter"), tr("File already exists."));
168  return false;
169  }
170 
171  //get layer
173  std::unique_ptr<te::da::DataSet> ds(l->getData());
174 
175  //run contrast
176  te::rp::Segmenter algorithmInstance;
177 
178  te::rp::Segmenter::InputParameters algoInputParams = m_segmenterPage->getInputParams();
179 
180  algoInputParams.m_enableProgress = true;
181  algoInputParams.m_enableThreadedProcessing = m_segmenterAdvOptPage->getForm()->m_enableThreadedProcessingcheckBox->isChecked();
182  algoInputParams.m_maxSegThreads = m_segmenterAdvOptPage->getForm()->m_maximumThreadsNumberLineEdit->text().toUInt();
183  algoInputParams.m_enableBlockProcessing = m_segmenterAdvOptPage->getForm()->m_enableBlockProcessingcheckBox->isChecked();
184  algoInputParams.m_maxBlockSize = m_segmenterAdvOptPage->getForm()->m_maximumBlockSizeLineEdit->text().toUInt();
185  algoInputParams.m_blocksOverlapPercent = m_segmenterAdvOptPage->getForm()->m_blockOverlapPercentSpinBox->value();
186 
187  te::rp::Segmenter::OutputParameters algoOutputParams;
188  algoOutputParams.m_rType = m_rasterInfoPage->getWidget()->getType();
189  algoOutputParams.m_rInfo = m_rasterInfoPage->getWidget()->getInfo();
190 
191  //progress
193 
194  QApplication::setOverrideCursor(Qt::WaitCursor);
195 
196  try
197  {
198  if(algorithmInstance.initialize(algoInputParams))
199  {
200  boost::timer timer;
201 
202  if(algorithmInstance.execute(algoOutputParams))
203  {
204  algoOutputParams.reset();
205 
206  //set output layer
208  m_rasterInfoPage->getWidget()->getInfo());
209  std::string elapsedTimeStr = boost::str( boost::format( "%.2f" ) % timer.elapsed() );
210  QApplication::restoreOverrideCursor();
211  QMessageBox::information(this, tr("Segmenter"), tr("Segmenter ended sucessfully") + ( " (" + elapsedTimeStr + " " ).c_str() + tr("seconds") + ")" );
212 
214 
215  emit addLayer(m_outputLayer);
216 
218 
219  if(m_segmenterAdvOptPage->getForm()->m_applyVectorizationCheckBox->isChecked())
220  {
221  QFile file(m_rasterInfoPage->getWidget()->getFullName().c_str());
222 
223  QFileInfo info(file);
224 
225  m_segmenterAdvOptPage->setOutputLayerPath(info.absolutePath().toUtf8().data());
226  m_segmenterAdvOptPage->setOutputLayerName(info.baseName().toUtf8().data());
227 
228  try
229  {
230  m_segmenterAdvOptPage->applyVectorization();
231  emit addLayer(m_segmenterAdvOptPage->getOutputLayer());
232  }
233  catch(const std::exception& e)
234  {
235  QApplication::restoreOverrideCursor();
236  QMessageBox::warning(this, tr("Segmenter"), tr(e.what()));
237  }
238  }
239  }
240  else
241  {
242  QApplication::restoreOverrideCursor();
243  QMessageBox::critical(this, tr("Segmenter"), tr("Segmenter initialization error") +
244  (" " + algorithmInstance.getErrorMessage() ).c_str());
245 
246  return false;
247  }
248  }
249  else
250  {
251  QApplication::restoreOverrideCursor();
252  QMessageBox::critical(this, tr("Segmenter"), tr("Segmenter initialization error") +
253  ( " " + algorithmInstance.getErrorMessage() ).c_str());
254 
255 
256  return false;
257  }
258  }
259  catch(const std::exception& e)
260  {
261  QApplication::restoreOverrideCursor();
262  QMessageBox::warning(this, tr("Segmenter"), e.what());
263 
264  return false;
265  }
266  catch(...)
267  {
268  QApplication::restoreOverrideCursor();
269  QMessageBox::warning(this, tr("Segmenter"), tr("An exception has occurred!"));
270 
271  return false;
272  }
273 
274  QApplication::restoreOverrideCursor();
275 
276  return true;
277 }
278 
280 {
281  this->adjustSize();
282 }
std::unique_ptr< te::qt::widgets::RasterInfoWizardPage > m_rasterInfoPage
unsigned char m_blocksOverlapPercent
The percentage of blocks overlapped area (valid range:0-25, defaul:10).
Raster segmentation.
void addLayer(te::map::AbstractLayerPtr layer)
void setPageReference(const QString &ref)
Sets the documentation page reference.
std::unique_ptr< te::qt::widgets::SegmenterWizardPage > m_segmenterPage
std::unique_ptr< te::qt::widgets::LayerSearchWizardPage > m_layerSearchPage
std::string m_rType
Output raster data source type (as described in te::raster::RasterFactory ).
void setLayer(te::map::AbstractLayerPtr layer)
static te::dt::Date ds(2010, 01, 01)
This file defines a class for a Segmenter Advanced Options Wizard page.
This file defines a class for a Raster Info Wizard page.
unsigned int m_maxBlockSize
The input image will be split into blocks with this width for processing, this parameter tells the ma...
bool m_enableProgress
Enable/Disable the progress interface (default:false).
te::map::AbstractLayerPtr getOutputLayer()
void reset()
Clear all internal allocated resources and reset the parameters instance to its initial state...
This class is GUI used to define the segmenter advanced options parameters for the RP constast operat...
This class is GUI used to define the segmenter parameters for the RP constast operation.
This class is GUI used to define the raster info parameters for raster factory.
Utility functions for the data access module.
A Qt dialog that allows users to run a segmenter operation defined by RP module.
TEMAPEXPORT te::rst::Raster * GetRaster(AbstractLayer *layer)
It gets the raster referenced by the given data set layer.
std::map< std::string, std::string > m_rInfo
The necessary information to create the raster (as described in te::raster::RasterFactory).
std::unique_ptr< te::qt::widgets::SegmenterAdvancedOptionsWizardPage > m_segmenterAdvOptPage
TEQTWIDGETSEXPORT te::map::AbstractLayerPtr createLayer(const std::string &driverName, const te::core::URI &connInfo)
Push button that uses te::qt::widgets::HelpManager on its mouse pressed implementation.
bool m_enableThreadedProcessing
If true, threaded processing will be performed (best with multi-core or multi-processor systems (defa...
te::map::AbstractLayerPtr m_outputLayer
unsigned int m_maxSegThreads
The maximum number of concurrent segmenter threads (default:0 - automatically found).
This file defines a class for a Segmenter Wizard page.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void setList(std::list< te::map::AbstractLayerPtr > &layerList)
TEQTWIDGETSEXPORT void applyRasterMultiResolution(const QString &toolName, te::rst::Raster *raster)
file(WRITE ${CMAKE_BINARY_DIR}/config_qhelp.cmake"configure_file (${TERRALIB_ABSOLUTE_ROOT_DIR}/doc/qhelp/help.qhcp.in ${CMAKE_BINARY_DIR}/share/terraview/help/help.qhcp @ONLY)") add_custom_command(OUTPUT del_dir COMMAND $
bool m_enableBlockProcessing
If true, the original raster will be splitted into small blocks, each one will be segmented independe...