#include "DEM_GeneRas.h" #include #include #include #include VegePredict::VegePredict() { //ui.setupUi(this); } VegePredict::~VegePredict() { } QString VegePredict::PannelName() { return QString::fromLocal8Bit(""); } QString VegePredict::CategoryName() { return QString::fromLocal8Bit("DEM模块"); } QString VegePredict::EnglishName() { return QString::fromLocal8Bit("DEM_Module"); } QString VegePredict::ChineseName() { return QString::fromLocal8Bit("植被预测"); } QString VegePredict::Information() { return QString::fromLocal8Bit("植被预测"); } QString VegePredict::IconPath() { return ":/DEM_GeneRas/resources/dem_ras.svg"; } QWidget* VegePredict::CenterWidget() { //QString str = QString("%1->%2,thread id:%3").arg(__FILE__).arg(__FUNCTION__).arg((int)QThread::currentThreadId()); //qDebug() << str; QString gdal_path = qApp->applicationDirPath().toLocal8Bit() + "/share/gdal"; QString pro_lib_path = qApp->applicationDirPath().toLocal8Bit() + "/share/proj"; qputenv("GDAL_DATA", gdal_path.toLocal8Bit()); qputenv("PROJ_LIB", pro_lib_path.toLocal8Bit()); bool showWin = false; if (myWidget == nullptr) { myWidget = new QDialog(); showWin = true; qDebug() << "new QDialog()"; } else { qDebug() << "already have myWidget"; //激活窗口并提升至顶层 myWidget->activateWindow(); myWidget->raise(); return myWidget; } ui.setupUi(myWidget); myWidget->setWindowTitle(QString::fromLocal8Bit("植被预测")); myWidget->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint); myWidget->setWindowIcon(QIcon(":/DEM_GeneRas/resources/dem_ras.svg")); myWidget->setAttribute(Qt::WA_QuitOnClose, false); myWidget->setAttribute(Qt::WA_DeleteOnClose); connect(myWidget, &QDialog::destroyed, this, [=]() { qDebug() << "----DEM Predict window close----"; QDir pluginsDir = QDir(qApp->applicationDirPath()); if (pluginsDir.cd("srsplugins\\DemModel")) { QString strConfigPath = pluginsDir.absoluteFilePath("dem_config.ini"); QFile f(strConfigPath); if (f.exists()) { WriteConfigPaths(strConfigPath); f.close(); } } if (mWorkThread != nullptr) { mWorkThread->requestInterruption();//请求线程中断 mWorkThread->quit(); mWorkThread->wait();//调用wait后先调用finished信号对应的槽函数,执行完成后再往下走 mWorker->on_cancel(); mWorkThread = nullptr;//mWorkThread, &QThread::finished, mWorkThread, &QObject::deleteLater,不需要delete mWorker = nullptr;//mWorkThread, &QThread::finished, mWorker, &QObject::deleteLater } myWidget->close(); myWidget = nullptr; //qDebug() << "--destroyed"; }); connect(ui.pbt_DOM, &QPushButton::clicked, this, &VegePredict::chooseDomPath); connect(ui.pbt_DSM, &QPushButton::clicked, this, &VegePredict::chooseDsmPath); //connect(ui.pbt_Label, &QPushButton::pressed, this, &VegePredict::chooseLabelPath); connect(ui.pbt_PRE, &QPushButton::clicked, this, &VegePredict::choosePreDir); connect(ui.pbt_Moudle, &QPushButton::clicked, this, &VegePredict::chooseMouleFile); connect(ui.pushButton_ok, &QPushButton::clicked, this, &VegePredict::readAndStart); connect(ui.pushButton_cancel, &QPushButton::clicked, this, &VegePredict::pbCancel); ui.progressBar->setTextVisible(true); ui.progressBar->setRange(0, 100); QFile qssFile(":/DEM_GeneRas/DEM_GeneRas.qss"); qssFile.open(QFile::ReadOnly); //以只读方式打开 if (qssFile.isOpen()) { QString qss = QLatin1String(qssFile.readAll()); myWidget->setStyleSheet(qss); qssFile.close(); } else qDebug() << "无法打开文件"; QDir pluginsDir = QDir(qApp->applicationDirPath()); if (pluginsDir.cd("srsplugins\\DemModel")) { QString strConfigPath = pluginsDir.absoluteFilePath("dem_config.ini"); QFile f(strConfigPath); if (f.exists()) { ReadConfigHistoryPaths(strConfigPath); f.close(); } } if (showWin) myWidget->show(); return myWidget; } void VegePredict::startWorkThread() { if (mWorker != nullptr) { return; } mWorkThread = new QThread(); mWorker = new WorkThreadObject(); mWorker->moveToThread(mWorkThread); connect(mWorkThread, &QThread::finished, mWorkThread, &QObject::deleteLater); connect(mWorkThread, &QThread::finished, mWorker, &QObject::deleteLater); connect(mWorker, &WorkThreadObject::process, myWidget, [=](int value) {ui.progressBar->setValue(value); }); connect(mWorker, &WorkThreadObject::addDataToMap, this, &VegePredict::addMap); connect(mWorker, &WorkThreadObject::addShpDataToMap, this, &VegePredict::openResultData); connect(this, &VegePredict::killChildThread, mWorker, &WorkThreadObject::on_cancel); connect(this, &VegePredict::startTiffToShp, mWorker, &WorkThreadObject::runFormatConvert); connect(this, &VegePredict::start, mWorker, &WorkThreadObject::runPredictWork); mWorkThread->start(); } void VegePredict::chooseDomPath() { QString dirDom = QFileDialog::getExistingDirectory(ui.pbt_DOM, QString::fromLocal8Bit("选择输入DOM文件路径"), ""); if (dirDom != "") ui.line_DOM->setText(dirDom); } void VegePredict::chooseDsmPath() { QString dirDsm = QFileDialog::getExistingDirectory(ui.pbt_DSM, QString::fromLocal8Bit("选择输入Slope文件路径"), ""); if (dirDsm != "") ui.line_DSM->setText(dirDsm); } void VegePredict::choosePreDir() { QString dirPre = QFileDialog::getExistingDirectory(ui.pbt_PRE, QString::fromLocal8Bit("选择预测结果输出文件路径"), ""); if (dirPre != "") ui.line_PRE->setText(dirPre); } void VegePredict::chooseMouleFile() { QString dirPre = QFileDialog::getOpenFileName(ui.pbt_Moudle, QString::fromLocal8Bit("选择模型文件"), "", "*.pth"); if (dirPre != "") ui.line_Moudle->setText(dirPre); } void VegePredict::addMap() { QMessageBox mess(QMessageBox::NoIcon, QString::fromLocal8Bit("植被预测结束"), QString::fromLocal8Bit("将对如下路径中结果进行转矢量处理:\n") + ui.line_PRE->text(), QMessageBox::Ok, NULL); mess.setWindowFlags(Qt::Drawer); mess.setButtonText(QMessageBox::Ok, QString::fromLocal8Bit("确认")); int result = mess.exec(); switch (result) { case QMessageBox::Ok: emit startTiffToShp(ui.line_PRE->text(), ui.line_DSM->text()); ui.label_process->setText(QString::fromLocal8Bit("转矢量进度:")); ui.progressBar->setValue(0); break; default: break; } } void VegePredict::ReadConfigHistoryPaths(QString strPath) { QSettings configIni(strPath, QSettings::IniFormat); //打开标题为:[DemPredict] 的组 configIni.beginGroup("DemPredict"); ui.line_DOM->setText(configIni.value("SrcDom").toString()); ui.line_DSM->setText(configIni.value("SrcDsm").toString()); ui.line_PRE->setText(configIni.value("PredictResult").toString()); configIni.endGroup();//关闭组 } void VegePredict::WriteConfigPaths(QString strPath) { QSettings configIni(strPath, QSettings::IniFormat); configIni.setIniCodec("utf-8"); //打开标题为:[DemPredict] 的组 configIni.beginGroup("DemPredict"); //更新输入DOM路径 QString temp = ui.line_DOM->text(); if (temp != "") configIni.setValue("SrcDom", temp); //更新输入DSM路径 temp = ui.line_DSM->text(); if (temp != "") configIni.setValue("SrcDsm", temp); //更新输出结果路径 temp = ui.line_PRE->text(); if (temp != "") configIni.setValue("PredictResult", temp); configIni.endGroup();//关闭组 } void VegePredict::readAndStart() { QString dirDOM = ui.line_DOM->text(); QString dirDSM = ui.line_DSM->text(); QString dirPRE = ui.line_PRE->text(); QString fileMoudle = ui.line_Moudle->text(); ui.progressBar->setValue(0); if (dirDOM == "" || dirDSM == "" || dirPRE == "" || fileMoudle == "") { QMessageBox mess(QMessageBox::NoIcon, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("请检查输入输出文件或路径")); mess.setWindowFlags(Qt::Drawer); int result = mess.exec(); return; } //startObjThread(); if (mWorkThread == nullptr) { qDebug() << "--startThread"; startWorkThread(); } //std::functionprocessCallback = [=](int val) { // ui.progressBar->setValue(val); // qDebug() << val << endl; //};//类间回调函数; ///////////////////////////////////////////////////////////////////// //emit startTiffToShp(ui.line_PRE->text(), ui.line_Label->text()); ///////////////////////////////////////////////////////////////////// ui.label_process->setText(QString::fromLocal8Bit("预测进度:")); emit start(fileMoudle, dirDOM, dirDSM, dirPRE);//, processCallback } void VegePredict::pbCancel() { delete myWidget;//调起&QDialog::destroyed } void VegePredict::openResultData(QStringList string_list) { if (string_list.isEmpty()) return; QgsRasterLayer* rastLayer; QgsVectorLayer* vecLayer; for each (QString layerPath in string_list) { QFileInfo fileInfo(layerPath); QString layerBaseName = fileInfo.baseName(); // 图层名称 if ("tif" == fileInfo.suffix() || "tiff" == fileInfo.suffix()) { rastLayer = new QgsRasterLayer(fileInfo.filePath(), layerPath, "gdal"); if (!rastLayer) return; QgsMapLayer* mapLayer = rastLayer; QgsRectangle myRectangle; rastLayer->setContrastEnhancement(QgsContrastEnhancement::StretchToMinimumMaximum , QgsRasterMinMaxOrigin::StdDev, myRectangle); QList mapLayers; mapLayers << mapLayer; QgsProject::instance()->addMapLayers(mapLayers); //zoomToSelectedLayer(mapLayer); } else if ("shp" == fileInfo.suffix()) { vecLayer = new QgsVectorLayer(fileInfo.filePath(), layerPath); if (!vecLayer) return; QgsMapLayer* mapLayer = vecLayer; QList mapLayers; mapLayers << mapLayer; QgsProject::instance()->addMapLayers(mapLayers); } } }