pktools  2.6.7
Processing Kernel for geospatial data
mainwindow.cc
1 /**********************************************************************
2 mainwindow.cc: GUI for pktools
3 Copyright (C) 2008-2014 Pieter Kempeneers
4 
5 This file is part of pktools
6 
7 pktools is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 pktools is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with pktools. If not, see <http://www.gnu.org/licenses/>.
19 ***********************************************************************/
20 
21 #include "mainwindow.h"
22 #include "ui_mainwindow.h"
23 #include <QFileDialog>
24 #include <QProcess>
25 #include <QMessageBox>
26 #include <QProcess>
27 
28 MainWindow::MainWindow(QWidget *parent) :
29  QMainWindow(parent),
30  ui(new Ui::MainWindow)
31 {
32  ui->setupUi(this);
33  QStringList resamplelist;
34  resamplelist << "near" << "bilinear";
35  ui->resample->addItems(resamplelist);
36  QStringList interleavedlist;
37  interleavedlist << "BAND" << "LINE" << "PIXEL" <<"BSQ";
38  ui->interleaved->addItems(interleavedlist);
39  QStringList compressedlist;
40  compressedlist << "NONE" << "LZW" << "PACKBITS" <<"DEFLATE";
41  ui->compressed->addItems(compressedlist);
42  QStringList otypelist;
43  otypelist << "" << "Byte" << "Int16" << "UInt16" << "UInt32" << "Int32" << "Float32" << "Float64" << "CInt16" << "CInt32" << "CFloat32" << "CFloat64";
44  ui->otype->addItems(otypelist);
45  QStringList oformatlist;
46  oformatlist << "" << "GTiff" << "HFA" << "ENVI";
47  ui->oformat->addItems(oformatlist);
48 
49  setDefaults();
50 
51  ui->listWidget_input->setSelectionMode(QAbstractItemView::ExtendedSelection);
52 
53  //pressing DEL activates the slots only when list widget has focus
54  QShortcut* shortcutDel = new QShortcut(QKeySequence(Qt::Key_Delete), ui->listWidget_band);
55  connect(shortcutDel, SIGNAL(activated()), this, SLOT(deleteItem()));
56  //pressing Backspace activates the slots only when list widget has focus
57  QShortcut* shortcutBackspace = new QShortcut(QKeySequence(Qt::Key_Backspace), ui->listWidget_band);
58  connect(shortcutBackspace, SIGNAL(activated()), this, SLOT(deleteItem()));
59 }
60 
61 MainWindow::~MainWindow()
62 {
63  delete ui;
64 }
65 
66 void MainWindow::setDefaults()
67 {
68  m_as=false;
69  m_manual=false;
70  //input
71  ui->listWidget_input->clear();
72  ui->ulx->clear();
73  ui->uly->clear();
74  ui->lrx->clear();
75  ui->lry->clear();
76  ui->extent->clear();
77  ui->listWidget_band->clear();
78  //scaling
79  ui->resample->setCurrentIndex(0);
80  ui->as_from->clear();
81  ui->as_to->clear();
82  ui->scale->clear();
83  ui->offset->clear();
84  //output
85  ui->output->clear();
86  ui->a_srs->clear();
87  ui->otype->setCurrentIndex(0);
88  ui->oformat->setCurrentIndex(0);
89  ui->ct->clear();
90  ui->dx->clear();
91  ui->dy->clear();
92  ui->interleaved->setCurrentIndex(0);
93  ui->tiled->setChecked(false);
94  ui->compressed->setCurrentIndex(0);
95  ui->nodata->clear();
96 }
97 
98 void MainWindow::deleteItem()
99 {
100  qDeleteAll(ui->listWidget_band->selectedItems());
101 }
102 
103 void MainWindow::on_toolButton_input_clicked()
104 {
105  on_actionInput_triggered();
106 }
107 
108 
109 void MainWindow::on_toolButton_extent_clicked()
110 {
111  on_actionExtent_triggered();
112 }
113 
114 void MainWindow::on_toolButton_output_clicked()
115 {
116  on_actionOutput_triggered();
117 }
118 
119 void MainWindow::on_toolButton_defaults_clicked()
120 {
121  setDefaults();
122 }
123 
124 void MainWindow::on_toolButton_ct_clicked()
125 {
126  QString qsct = QFileDialog::getOpenFileName(this, "Color table ASCII");
127  ui->ct->setText(qsct);
128 }
129 
130 void MainWindow::on_actionInput_triggered()
131 {
132  QFileDialog dialog(this);
133  dialog.setDirectory(QDir::homePath());
134  dialog.setFileMode(QFileDialog::ExistingFiles);
135  QStringList fileNames;
136  if (dialog.exec())
137  fileNames = dialog.selectedFiles();
138  ui->listWidget_input->addItems(fileNames);
139  //fill in band list
140  ui->listWidget_band->clear();
141  QProcess *myProcess = new QProcess(this);
142  QString program="pkinfo -nb -i ";
143  //todo: loop over all filenames and get the minimum number of bands?
144  program+=fileNames[0];
145  myProcess->start(program);
146  this->setCursor(Qt::WaitCursor);
147  myProcess->waitForFinished(-1);
148  this->setCursor(Qt::ArrowCursor);
149  QString p_stdout=myProcess->readAll();
150  int nband=p_stdout.section(' ',1).toInt();
151  QStringList bandlist;
152  for(int iband=0;iband<nband;++iband){
153  QString qsband=QString::number(iband);
154  bandlist << qsband;
155  }
156  ui->listWidget_band->addItems(bandlist);
157  ui->listWidget_band->setSelectionMode(QAbstractItemView::ExtendedSelection);
158  ui->listWidget_band->selectAll();
159 }
160 
161 void MainWindow::on_actionExtent_triggered()
162 {
163  QString qsextent = QFileDialog::getOpenFileName(this, "extent");
164  ui->extent->setText(qsextent);
165 }
166 
167 void MainWindow::on_actionOutput_triggered()
168 {
169  QString outputfilename=QFileDialog::getSaveFileName(this,"Output image","","*.*");
170  ui->output->setText(outputfilename);
171 }
172 
173 void MainWindow::on_actionQuit_triggered()
174 {
175  close();
176 }
177 
178 void MainWindow::on_toolButton_Run_clicked()
179 {
180  try{
181  ui->commandLineEdit->clear();
182  ui->consoleEdit->clear();
183 
184  QString program = "pkcomposite";
185 
186  if(ui->listWidget_input->count()<1)
187  MainWindow::on_actionInput_triggered();
188  if(ui->listWidget_input->count()<1){
189  QString qsError="No input image file selected";
190  throw(qsError);
191  }
192 
193  for(int i = 0; i < ui->listWidget_input->count(); ++i)
194  {
195  QListWidgetItem* item = ui->listWidget_input->item(i);
196  program+=" --input "+item->text();
197  }
198 
199  for(int i = 0; i < ui->listWidget_band->count(); ++i)
200  {
201  QListWidgetItem* item = ui->listWidget_band->item(i);
202  program+=" --band "+item->text();
203  }
204 
205  if(ui->output->text().isEmpty())
206  MainWindow::on_actionOutput_triggered();
207  if(ui->output->text().isEmpty()){
208  QString qsError="No output image file selected";
209  throw(qsError);
210  }
211 
212  program+=" --resample "+ui->resample->currentText();
213  if(!ui->otype->currentText().isEmpty())
214  program+=" --otype "+ui->otype->currentText();
215  if(!ui->oformat->currentText().isEmpty())
216  program+=" --oformat "+ui->oformat->currentText();
217  program+=" -co COMPRESS="+ui->compressed->currentText();
218  program+=" -co INTERLEAVE="+ui->interleaved->currentText();
219  if(ui->tiled->isChecked())
220  program+=" -co TILED=YES";
221 
222  //todo: radiobuttons on scaling
223  if(m_as){
224  program+=" --autoscale ";
225  program+=ui->as_from->text();
226  program+=" --autoscale ";
227  program+=ui->as_to->text();
228  }
229  else if(m_manual){
230  program+=" --scale ";
231  program+=ui->scale->text();
232  program+=" ---offset ";
233  program+=ui->offset->text();
234  }
235 // QList<QCheckBox*> qcheckBoxList = this->findChildren<QCheckBox *>();
236 
237 // for(QList<QCheckBox*>::ConstIterator qcbit=qcheckBoxList.begin();qcbit!=qcheckBoxList.end();++qcbit){
238 // if((*qcbit)->isChecked()){
239 // QString qsOption;
240 // qsOption+=" --";
241 // qsOption+=(*qcbit)->objectName();
242 // program+=qsOption;
243 // }
244 // }
245 
246  QList<QLineEdit*> qlineEditList = this->findChildren<QLineEdit *>();
247 
248  for(QList<QLineEdit*>::ConstIterator qlbit=qlineEditList.begin();qlbit!=qlineEditList.end();++qlbit){
249  if(!((*qlbit)->text().isEmpty())){
250  QString qsOption;
251  qsOption+=" --";
252  qsOption+=(*qlbit)->objectName();
253  qsOption+=" ";
254  qsOption+=(*qlbit)->text();
255  program+=qsOption;
256  }
257  }
258 
259  ui->commandLineEdit->insert(program);
260 
261 // QProcess *myProcess = new QProcess(parent);
262  QProcess *myProcess = new QProcess(this);
263  myProcess->start(program);
264  myProcess->setProcessChannelMode(QProcess::MergedChannels);
265  this->setCursor(Qt::WaitCursor);
266  myProcess->waitForFinished(-1);
267 // QString p_stderr = myProcess->readyReadStandardError();
268 // if(!p_stderr.isEmpty()){
269 // QMessageBox msgBox;
270 // msgBox.setText(p_stderr);
271 // msgBox.exec();
272 // }
273  this->setCursor(Qt::ArrowCursor);
274  QString p_stdout = myProcess->readAll();
275  ui->consoleEdit->insertPlainText(p_stdout);
276  delete myProcess;
277  }
278  catch(QString qsError){
279  QMessageBox msgBox;
280  msgBox.setText(qsError);
281  msgBox.exec();
282  }
283 }
284 
285 void MainWindow::on_autoscale_clicked()
286 {
287  m_as=true;
288  m_manual=false;
289 }
290 
291 void MainWindow::on_manual_clicked()
292 {
293  m_as=false;
294  m_manual=true;
295 }
296 
297 void MainWindow::on_noscale_clicked()
298 {
299  m_as=false;
300  m_manual=false;
301 }
302 
303 void MainWindow::on_toolButton_clicked()
304 {
305  ui->listWidget_input->clear();
306 }
Definition: mainwindow.h:27