DianLi/DEM_GeneRas/ThreadObject.cpp
2023-03-13 16:13:20 +08:00

117 lines
3.3 KiB
C++
Raw Permalink Blame History

#include <QProcess>
#include <QDir>
#include <QApplication>
#include <QDebug>
#include <QTimer>
#include <windows.h>
#include "DEM_GeneRas.h"
#include "ThreadObject.h"
#include "im2shp.h"
using namespace std;
WorkThreadObject::WorkThreadObject(QObject* parent) :QObject(parent)
{
qRegisterMetaType<std::function<void(int)> >("std::function<void(int)>");
}
WorkThreadObject::~WorkThreadObject()
{
}
void WorkThreadObject::runPredictWork(QString Moudle, QString DOM, QString DSM, QString PRE)//, std::function<void(int)>func
{
QString str = QString("%1->%2,thread id:%3").arg(__FILE__).arg(__FUNCTION__).arg((int)QThread::currentThreadId());
QDir pluginsDir = QDir(qApp->applicationDirPath());
qDebug() << str << "----" << pluginsDir.currentPath();
if (!pluginsDir.cd("models\\envs"))
{
qDebug() << "no folder models\\envs";
return;
}
QString exeDirName = pluginsDir.absoluteFilePath("predict_4c_vegetation.exe");
qDebug() << "----" << exeDirName;
QString model = " --model_path " + Moudle;
QString dom_path = " --dom_path " + DOM + "/";
QString dsm_path = " --dsm_path " + DSM + "/";
QString pre_dir = " --pre_path " + PRE + "/";
QString ss = exeDirName + model + dom_path + dsm_path + pre_dir;
qDebug() << ss;
QProcess* pProces = new QProcess(this);
connect(pProces, SIGNAL(readyReadStandardOutput()), this, SLOT(on_read()));
pProces->start(ss);
emit process(2);
}
void WorkThreadObject::on_read()
{
mProces = (QProcess*)sender();
QString output = QString::fromLocal8Bit(mProces->readAllStandardOutput());
if (output.toFloat() > 0)
{
qDebug() << "exe out:" << output.toFloat();
emit process(output.toFloat());
if (output.toFloat() == 100.0)
emit addDataToMap();
}
else
qDebug() << "Unresolved exe out:" << output;
}
void WorkThreadObject::runFormatConvert(QString pre_path, QString DSM)
{
QDir dir(pre_path);
QStringList nameFilters;
nameFilters << "*.tif" << "*.tiff";
QStringList pre_tiff_files = dir.entryList(nameFilters, QDir::Files | QDir::Readable, QDir::Name);
int list_len = pre_tiff_files.size();
for (int i = 0; i < list_len; i++)
{
emit process(float(i) / float(list_len) * 95);
qDebug() << "TiffToShp progress:" << float(i) / float(list_len) * 100;
QString file_path = pre_path + "\\" + pre_tiff_files[i];
QString dsm_path = DSM + "\\" + pre_tiff_files[i];
string path_preTiff = file_path.toStdString();
string pathPureName = path_preTiff.substr(0, path_preTiff.rfind("."));
string shp_path = pathPureName + ".shp";
//<2F><><EFBFBD><EFBFBD>դ<EFBFBD><D5A4>תʸ<D7AA><CAB8>
img2shp cc;
QtGDALProcessBar* gb = new QtGDALProcessBar();
bool returnval = cc.ImagePolygonize(path_preTiff.c_str(), shp_path.c_str(), "ESRI Shapefile", 1, gb, gb);
if (returnval == true)
{
QStringList list;
list << dsm_path << QString::fromStdString(shp_path);
emit addShpDataToMap(list);
}
else
{
//QMessageBox mess(QMessageBox::NoIcon, QString::fromLocal8Bit("<22><><EFBFBD><EFBFBD>"), QString::fromLocal8Bit("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
//mess.setWindowFlags(Qt::Drawer);
//int result = mess.exec();
//return;
}
}
emit process(100);
}
void WorkThreadObject::on_cancel()
{
if (mProces == nullptr)
{
qDebug() << "--mProces null";
}
else
{
//py<70><79><EFBFBD><EFBFBD>exe<78>ļ<EFBFBD><C4BC><EFBFBD>
QString KillStr = "taskkill /f /im predict_4c_vegetation.exe";
mProces->startDetached(KillStr);
qDebug() << "--kill Proces";
}
}