pktools  2.6.7
Processing Kernel for geospatial data
mainwindow.cpp
1 /**********************************************************************
2 mainwindow.cpp: 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 #include "mainwindow.h"
21 #include "ui_mainwindow.h"
22 #include <QFileDialog>
23 #include <QStandardItemModel>
24 #include <QMessageBox>
25 #include <QProcess>
26 
27 MainWindow::MainWindow(QWidget *parent) :
28  QMainWindow(parent),
29  ui(new Ui::MainWindow)
30 {
31  ui->setupUi(this);
32  QStringList svmlist;
33  svmlist << "C_SVC" << "nu_SVC" << "one_class" << "epsilon_SVR" << "nu_SVR";
34  ui->svmtype->addItems(svmlist);
35  QStringList kernellist;
36  kernellist << "radial" << "linear" << "polynomial" << "sigmoid";
37  ui->kerneltype->addItems(kernellist);
38  setDefaults();
39 }
40 
41 MainWindow::~MainWindow()
42 {
43  delete ui;
44 }
45 
46 void MainWindow::setDefaults()
47 {
48  //tab training
49  //m_training="d:\\osgeo\\course\\openstreetmap\\training2.sqlite";
50 // ui->training->setText(m_training);
51  ui->cv->setText("0");
52  ui->training->clear();
53  ui->tln->clear();
54  ui->label->setText("label");
55  QStringList labels;
56  setClassTable(labels);
57  ui->nclass->clear();
58 
59  //tab input/output
60  ui->input->clear();
61  ui->msknodata->setText("0");
62  ui->output->clear();
63  ui->nodata->setText("0");
64  ui->ct->clear();
65  //tab classifier
66  ui->coef0->setText("0");
67  ui->nu->setText("0.5");
68  ui->kd->setText("3");
69  ui->label->setText("label");
70  ui->cv->setText("0");
71  ui->gamma->setText("1");
72  ui->ccost->setText("1000");
73 }
74 
75 void MainWindow::on_actionTraining_triggered()
76 {
77  QString qstraining = QFileDialog::getOpenFileName(this, "Training");
78  ui->training->setText(qstraining);
79  this->on_training_returnPressed();
80 }
81 
82 void MainWindow::on_actionMask_triggered()
83 {
84  QString qsmask = QFileDialog::getOpenFileName(this, "Mask");
85  ui->mask->setText(qsmask);
86 }
87 
88 void MainWindow::on_actionOutput_triggered()
89 {
90  QString qsoutput = QFileDialog::getSaveFileName(this,"Output image","","*.*");
91  ui->output->setText(qsoutput);
92 }
93 
94 void MainWindow::on_actionInput_triggered()
95 {
96  QString qsinput = QFileDialog::getOpenFileName(this, "Input");
97  ui->input->setText(qsinput);
98 }
99 
100 
101 void MainWindow::on_actionColor_table_triggered()
102 {
103  QString qsct = QFileDialog::getOpenFileName(this, "Color table");
104  ui->ct->setText(qsct);
105 }
106 
107 void MainWindow::on_toolButton_input_clicked()
108 {
109  on_actionInput_triggered();
110 }
111 
112 void MainWindow::on_toolButton_mask_clicked()
113 {
114  on_actionMask_triggered();
115 }
116 
117 void MainWindow::on_toolButton_output_clicked()
118 {
119  on_actionOutput_triggered();
120 }
121 
122 void MainWindow::on_toolButton_training_clicked()
123 {
124  on_actionTraining_triggered();
125 }
126 
127 void MainWindow::on_toolButton_ct_clicked()
128 {
129  on_actionColor_table_triggered();
130 }
131 
132 void MainWindow::on_training_returnPressed()
133 {
134  //eventually read classes from vector file to fill in table...
135 }
136 
137 void MainWindow::setClassTable(const QStringList &labels)
138 {
139  QStandardItemModel *model = new QStandardItemModel(labels.size(),4,this); //nlabel rows and 4 columns
140  model->setHorizontalHeaderItem(0, new QStandardItem(QString("label name")));
141  model->setHorizontalHeaderItem(1, new QStandardItem(QString("class nr")));
142  model->setHorizontalHeaderItem(2, new QStandardItem(QString("prior prob")));
143  model->setHorizontalHeaderItem(3, new QStandardItem(QString("balance (optional)")));
144  for(int ilabel=0;ilabel<labels.size();++ilabel){
145  QStandardItem *firstCol = new QStandardItem(QString(labels[ilabel]));
146  model->setItem(ilabel,0,firstCol);
147  QStandardItem *secondCol = new QStandardItem(QString::number(ilabel+1));
148  model->setItem(ilabel,1,secondCol);
149  QStandardItem *thirdCol = new QStandardItem(QString::number(1.0/labels.size()));
150  model->setItem(ilabel,2,thirdCol);
151  }
152  ui->tableView_labels->setModel(model);
153 }
154 
155 void MainWindow::on_pushButton_run_clicked()
156 {
157  try{
158  ui->commandLineEdit->clear();
159  ui->consoleEdit->clear();
160  QString program = "pksvm";
161  if(ui->training->text().isEmpty())
162  MainWindow::on_actionTraining_triggered();
163  if(ui->training->text().isEmpty()){
164  QString qsError="No training vector file selected";
165  throw(qsError);
166  }
167  if(!ui->input->text().isEmpty()){
168  if(ui->output->text().isEmpty())
169  MainWindow::on_actionOutput_triggered();
170  if(ui->output->text().isEmpty()){
171  QString qsError="No training vector file selected";
172  throw(qsError);
173  }
174  }
175 
176 // QList<QCheckBox*> qcheckBoxList = this->findChildren<QCheckBox *>();
177 
178 // for(QList<QCheckBox*>::ConstIterator qcbit=qcheckBoxList.begin();qcbit!=qcheckBoxList.end();++qcbit){
179 // if((*qcbit)->isChecked()){
180 // QString qsOption;
181 // qsOption+=" --";
182 // qsOption+=(*qcbit)->objectName();
183 // program+=qsOption;
184 // }
185 // }
186 
187  QStringList qslBalance;
188  for(int irow=0;irow<ui->tableView_labels->model()->rowCount();++irow){
189  QString qsOption;
190  qsOption+=" --class ";
191  qsOption+=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,0)).toString();
192  qsOption+=" --reclass ";
193  qsOption+=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,1)).toString();
194  qsOption+=" --prior ";
195  qsOption+=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,2)).toString();
196  program+=qsOption;
197  if(ui->tableView_labels->model()->columnCount()>3){
198  QString qsbalance=ui->tableView_labels->model()->data(ui->tableView_labels->model()->index(irow,3)).toString();
199  if(!qsbalance.isEmpty())
200  qslBalance << qsbalance;
201  }
202  }
203  if(qslBalance.size()){
204  for(int irow=0;irow<ui->tableView_labels->model()->rowCount();++irow){
205  QString qsOption;
206  qsOption+=" --balance ";
207  if(qslBalance.size()==ui->tableView_labels->model()->rowCount())
208  qsOption+=qslBalance[irow];
209  else
210  qsOption+=qslBalance[0];
211  program+=qsOption;
212  }
213  }
214 
215  QList<QComboBox*> qcomboBoxList = this->findChildren<QComboBox *>();
216 
217  for(QList<QComboBox*>::ConstIterator qcbit=qcomboBoxList.begin();qcbit!=qcomboBoxList.end();++qcbit){
218  QString qsOption;
219  qsOption+=" --";
220  qsOption+=(*qcbit)->objectName();
221  program+=qsOption;
222  program+=" ";
223  program+=(*qcbit)->currentText();
224  }
225 
226  QList<QLineEdit*> qlineEditList = this->findChildren<QLineEdit *>();
227 
228  for(QList<QLineEdit*>::ConstIterator qlbit=qlineEditList.begin();qlbit!=qlineEditList.end();++qlbit){
229  if(!((*qlbit)->text().isEmpty())){
230  QString qsOption;
231  qsOption+=" --";
232  qsOption+=(*qlbit)->objectName();
233  qsOption+=" ";
234  qsOption+=(*qlbit)->text();
235  program+=qsOption;
236  }
237  }
238 
239  ui->commandLineEdit->setText(program);
240 
241 // QProcess *myProcess = new QProcess(parent);
242  QProcess *myProcess = new QProcess(this);
243  myProcess->start(program);
244  myProcess->setProcessChannelMode(QProcess::MergedChannels);
245  this->setCursor(Qt::WaitCursor);
246  myProcess->waitForFinished(-1);
247  this->setCursor(Qt::ArrowCursor);
248  QMessageBox msgBox;
249  QString p_stderr = myProcess->readAllStandardError();
250  if(!p_stderr.isEmpty()){
251  msgBox.setText(p_stderr);
252  msgBox.exec();
253  }
254  QString p_stdout = myProcess->readAll();
255  ui->consoleEdit->insertPlainText(p_stdout);
256  delete myProcess;
257  }
258  catch(QString qsError){
259  QMessageBox msgBox;
260  msgBox.setText(qsError);
261  msgBox.exec();
262  }
263 }
264 
265 void MainWindow::on_pushButton_restore_clicked()
266 {
267  setDefaults();
268 }
269 
270 void MainWindow::on_commandLinkButtonPrepareTable_clicked()
271 {
272  int nclass=ui->nclass->text().toInt();
273  QStringList labels;
274  for(int iclass=1;iclass<=nclass;++iclass){
275  QString lstring="label";
276  lstring+=QString::number(iclass);
277  labels << lstring;
278  }
279  setClassTable(labels);
280 }
Definition: mainwindow.h:27