初步实现采集、图层和TOC联动

This commit is contained in:
tangchao0503
2026-02-12 16:10:17 +08:00
parent 631216dc66
commit e3b2d136d3
15 changed files with 387 additions and 199 deletions

View File

@ -3,113 +3,119 @@
#include <exception> #include <exception>
#include <QMessageBox> #include <QMessageBox>
#include <QFileInfo> // 新增,用于解析路径
#include "HPPA.h" #include "HPPA.h"
#include "ImageReaderWriter.h" #include "ImageReaderWriter.h"
#include "RasterLayer.h"
#include "LayerTreeLayerNode.h"
HPPA::HPPA(QWidget* parent) HPPA::HPPA(QWidget* parent)
: QMainWindow(parent) : QMainWindow(parent)
{ {
ui.setupUi(this); ui.setupUi(this);
QCoreApplication::setOrganizationName("IRIS"); // register MapLayer* metatype for queued signal/slot across threads
QCoreApplication::setOrganizationDomain("iris.com"); qRegisterMetaType<MapLayer*>("MapLayer*");
QCoreApplication::setApplicationName("HPPA");
//配置文件:如果没有,就创建配置文件 QCoreApplication::setOrganizationName("IRIS");
string HPPACfgFile = getPathofEXE() + "\\HPPA.cfg"; QCoreApplication::setOrganizationDomain("iris.com");
mConfigfile.setConfigfilePath(HPPACfgFile); QCoreApplication::setApplicationName("HPPA");
if (!mConfigfile.isConfigfileExist())
{
mConfigfile.createConfigFile();
qDebug() << "create: " << QString::fromStdString(HPPACfgFile);
}
mConfigfile.parseConfigfile();
qDebug() << "exist: " << QString::fromStdString(HPPACfgFile);
/*int max, min; //配置文件:如果没有,就创建配置文件
mConfigfile.getPositionRestriction(max, min); string HPPACfgFile = getPathofEXE() + "\\HPPA.cfg";
mConfigfile.setConfigfilePath(HPPACfgFile);
if (!mConfigfile.isConfigfileExist())
{
mConfigfile.createConfigFile();
qDebug() << "create: " << QString::fromStdString(HPPACfgFile);
}
mConfigfile.parseConfigfile();
qDebug() << "exist: " << QString::fromStdString(HPPACfgFile);
string sn; /*int max, min;
mConfigfile.getSN(sn); mConfigfile.getPositionRestriction(max, min);
int coarse, fine; string sn;
mConfigfile.getTuningStepSize(coarse, fine); mConfigfile.getSN(sn);
float fa, fb;
mConfigfile.getFitParams(fa, fb);
int max_FocusRange, min_FocusRange;
mConfigfile.getAutoFocusRange(max_FocusRange, min_FocusRange);
float StepAnglemar_x, Lead_x, ScaleFactor_x; int coarse, fine;
int SubdivisionMultiples_x; mConfigfile.getTuningStepSize(coarse, fine);
mConfigfile.getXMotorParm(StepAnglemar_x, Lead_x, SubdivisionMultiples_x, ScaleFactor_x); float fa, fb;
float StepAnglemar_y, Lead_y, ScaleFactor_y; mConfigfile.getFitParams(fa, fb);
int SubdivisionMultiples_y; int max_FocusRange, min_FocusRange;
mConfigfile.getYMotorParm(StepAnglemar_y, Lead_y, SubdivisionMultiples_y, ScaleFactor_y);*/ mConfigfile.getAutoFocusRange(max_FocusRange, min_FocusRange);
//状态栏 float StepAnglemar_x, Lead_x, ScaleFactor_x;
//xmotor_state_label1 = new QLabel(); int SubdivisionMultiples_x;
//ymotor_state_label1 = new QLabel(); mConfigfile.getXMotorParm(StepAnglemar_x, Lead_x, SubdivisionMultiples_x, ScaleFactor_x);
//xmotor_state_label1->setText("xMotor"); float StepAnglemar_y, Lead_y, ScaleFactor_y;
//ymotor_state_label1->setText("yMotor"); int SubdivisionMultiples_y;
//ui.statusBar->addPermanentWidget(xmotor_state_label1); mConfigfile.getYMotorParm(StepAnglemar_y, Lead_y, SubdivisionMultiples_y, ScaleFactor_y);*/
//ui.statusBar->addPermanentWidget(ymotor_state_label1);
//状态栏
//xmotor_state_label1 = new QLabel();
//ymotor_state_label1 = new QLabel();
//xmotor_state_label1->setText("xMotor");
//ymotor_state_label1->setText("yMotor");
//ui.statusBar->addPermanentWidget(xmotor_state_label1);
//ui.statusBar->addPermanentWidget(ymotor_state_label1);
connect(this->ui.action_exit, SIGNAL(triggered()), this, SLOT(onExit())); connect(this->ui.action_exit, SIGNAL(triggered()), this, SLOT(onExit()));
connect(this->ui.mActionOpenImg, SIGNAL(triggered()), this, SLOT(onOpenImg()));
//ui.cam_label->setScaledContents(true); //ui.cam_label->setScaledContents(true);
/*ui.splitter->setStretchFactor(0, 1); /*ui.splitter->setStretchFactor(0, 1);
ui.splitter->setStretchFactor(1, 1); ui.splitter->setStretchFactor(1, 1);
ui.splitter->setStretchFactor(2, 3);*/ ui.splitter->setStretchFactor(2, 3);*/
initMenubarToolbar();
//光谱仪操作
m_Imager = nullptr;
m_RecordState = 0;
connect(this->ui.action_connect_imager, SIGNAL(triggered()), this, SLOT(onconnect()));//信号与槽连接相机相机操作相关信号与槽绑定放在函数onconnect中
//设置相机可用帧率范围这些设置必须在slider的信号和槽连接connect前否则setMinimum会改变slider的值 initMenubarToolbar();
ui.FramerateSlider->setMinimum(1);
ui.FramerateSlider->setMaximum(250);
ui.GainSlider->setMinimum(0);
ui.GainSlider->setMaximum(24);
//相机参数控件设置为不可用
frame_number->setEnabled(false);
ui.framerate_lineEdit->setEnabled(false);
ui.integratioin_time_lineEdit->setEnabled(false);
ui.gain_lineEdit->setEnabled(false);
ui.FramerateSlider->setEnabled(false);
ui.IntegratioinTimeSlider->setEnabled(false);
ui.GainSlider->setEnabled(false);
startTimer(1000); //光谱仪操作
m_Imager = nullptr;
m_RecordState = 0;
connect(this->ui.action_connect_imager, SIGNAL(triggered()), this, SLOT(onconnect()));//信号与槽连接相机相机操作相关信号与槽绑定放在函数onconnect中
widthScale = 1; //设置相机可用帧率范围这些设置必须在slider的信号和槽连接connect前否则setMinimum会改变slider的值
heightScale = 1; ui.FramerateSlider->setMinimum(1);
ui.FramerateSlider->setMaximum(250);
ui.GainSlider->setMinimum(0);
ui.GainSlider->setMaximum(24);
//相机参数控件设置为不可用
frame_number->setEnabled(false);
//马达位置模拟 ui.framerate_lineEdit->setEnabled(false);
//connect(ui.graphicsView->imager, SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onimagerSimulatorMove(int, int))); ui.integratioin_time_lineEdit->setEnabled(false);
ui.gain_lineEdit->setEnabled(false);
initPanelToolbar(); ui.FramerateSlider->setEnabled(false);
setDockNestingEnabled(true); ui.IntegratioinTimeSlider->setEnabled(false);
connect(this->ui.action_about, SIGNAL(triggered()), this, SLOT(onAbout())); ui.GainSlider->setEnabled(false);
connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario()));
connect(this->ui.mActionPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(createPlantPhenotypeScenario()));
delete ui.centralWidget; startTimer(1000);
QString qss_DockWidget_contentWidget = R"( widthScale = 1;
heightScale = 1;
//马达位置模拟
//connect(ui.graphicsView->imager, SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onimagerSimulatorMove(int, int)));
initPanelToolbar();
setDockNestingEnabled(true);
connect(this->ui.action_about, SIGNAL(triggered()), this, SLOT(onAbout()));
connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario()));
connect(this->ui.mActionPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(createPlantPhenotypeScenario()));
delete ui.centralWidget;
QString qss_DockWidget_contentWidget = R"(
background: #0D1233; background: #0D1233;
/*border: 1px solid #2c586b;*/ /*border: 1px solid #2c586b;*/
@ -123,42 +129,42 @@ HPPA::HPPA(QWidget* parent)
)"; )";
//TOC //TOC
CustomDockWidgetBase* dock_layers = new CustomDockWidgetBase(QString::fromLocal8Bit("layers"), this); CustomDockWidgetBase* dock_layers = new CustomDockWidgetBase(QString::fromLocal8Bit("layers"), this);
dock_layers->setObjectName("mDockLayers"); dock_layers->setObjectName("mDockLayers");
dock_layers->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); dock_layers->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
mPanelMenu->addAction(dock_layers->toggleViewAction()); mPanelMenu->addAction(dock_layers->toggleViewAction());
addDockWidget(Qt::LeftDockWidgetArea, dock_layers); addDockWidget(Qt::LeftDockWidgetArea, dock_layers);
dock_layers->hideMaxButton(); dock_layers->hideMaxButton();
//1、没用 //1、没用
QWidget* dock_layersWidgetContents = new QWidget(); QWidget* dock_layersWidgetContents = new QWidget();
dock_layersWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents_2")); dock_layersWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents_2"));
QGridLayout* gridLayout_toc = new QGridLayout(dock_layersWidgetContents); QGridLayout* gridLayout_toc = new QGridLayout(dock_layersWidgetContents);
gridLayout_toc->setSpacing(6); gridLayout_toc->setSpacing(6);
gridLayout_toc->setContentsMargins(11, 11, 11, 11); gridLayout_toc->setContentsMargins(11, 11, 11, 11);
gridLayout_toc->setObjectName(QString::fromUtf8("gridLayout_toc")); gridLayout_toc->setObjectName(QString::fromUtf8("gridLayout_toc"));
gridLayout_toc->setVerticalSpacing(0); gridLayout_toc->setVerticalSpacing(0);
gridLayout_toc->setContentsMargins(0, 0, 0, 0); gridLayout_toc->setContentsMargins(0, 0, 0, 0);
ImagerPositionSimulation* graphicsView_delete = new ImagerPositionSimulation(dock_layersWidgetContents); ImagerPositionSimulation* graphicsView_delete = new ImagerPositionSimulation(dock_layersWidgetContents);
graphicsView_delete->setObjectName(QString::fromUtf8("graphicsView_delete")); graphicsView_delete->setObjectName(QString::fromUtf8("graphicsView_delete"));
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred); QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred);
sizePolicy1.setHorizontalStretch(0); sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0); sizePolicy1.setVerticalStretch(0);
sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidth()); sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidth());
graphicsView_delete->setSizePolicy(sizePolicy1); graphicsView_delete->setSizePolicy(sizePolicy1);
graphicsView_delete->setFrameShape(QFrame::NoFrame); graphicsView_delete->setFrameShape(QFrame::NoFrame);
graphicsView_delete->setFrameShadow(QFrame::Raised); graphicsView_delete->setFrameShadow(QFrame::Raised);
//gridLayout_toc->addWidget(graphicsView_delete, 0, 0, 1, 1); //gridLayout_toc->addWidget(graphicsView_delete, 0, 0, 1, 1);
//2、没用仅仅使用QTreeWidget实现的简略ui //2、没用仅仅使用QTreeWidget实现的简略ui
QTreeWidget* treeWidget = new QTreeWidget(); QTreeWidget* treeWidget = new QTreeWidget();
treeWidget->setColumnCount(1); treeWidget->setColumnCount(1);
treeWidget->setIndentation(18); treeWidget->setIndentation(18);
treeWidget->setRootIsDecorated(true); treeWidget->setRootIsDecorated(true);
treeWidget->header()->hide(); treeWidget->header()->hide();
treeWidget->setStyleSheet(R"( treeWidget->setStyleSheet(R"(
QTreeWidget QTreeWidget
{ {
color: #ACCDFF; color: #ACCDFF;
@ -181,47 +187,51 @@ HPPA::HPPA(QWidget* parent)
} }
)"); )");
//QList<QTreeWidgetItem*> items; //QList<QTreeWidgetItem*> items;
//for (int i = 0; i < 3; ++i) //for (int i = 0; i < 3; ++i)
// items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("tmp_image_%1").arg(i)))); // items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("tmp_image_%1").arg(i))));
//treeWidget->insertTopLevelItems(0, items); //treeWidget->insertTopLevelItems(0, items);
QTreeWidgetItem* group1 = new QTreeWidgetItem(treeWidget); QTreeWidgetItem* group1 = new QTreeWidgetItem(treeWidget);
group1->setText(0, "Raster"); group1->setText(0, "Raster");
group1->setExpanded(true); // 默认展开 group1->setExpanded(true); // 默认展开
QTreeWidgetItem* group2 = new QTreeWidgetItem(treeWidget); QTreeWidgetItem* group2 = new QTreeWidgetItem(treeWidget);
group2->setText(0, "Vector"); group2->setText(0, "Vector");
group2->setExpanded(true); group2->setExpanded(true);
QTreeWidgetItem* layerA = new QTreeWidgetItem(group1); QTreeWidgetItem* layerA = new QTreeWidgetItem(group1);
layerA->setText(0, "tmp_image_1"); layerA->setText(0, "tmp_image_1");
QTreeWidgetItem* layerB = new QTreeWidgetItem(group1); QTreeWidgetItem* layerB = new QTreeWidgetItem(group1);
layerB->setText(0, "tmp_image_2"); layerB->setText(0, "tmp_image_2");
//gridLayout_toc->addWidget(treeWidget, 0, 0, 1, 1); //gridLayout_toc->addWidget(treeWidget, 0, 0, 1, 1);
//3、正经TOC //3、正经TOC
LayerTree* tree = new LayerTree(); m_LayerTree = new LayerTree();
auto* model = new LayerTreeModel(tree, this, true); m_LayerTreeModel = new LayerTreeModel(m_LayerTree, this, true);
//auto* g1 = model->addGroup(model->root(), "Group A"); // 创建并保留 Raster 分组指针,后续添加 layer 使用它
//model->addLayer(g1, "Roads"); m_RasterGroup = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Raster");
//model->addLayer(g1, "Buildings"); {
auto* ln1 = new LayerTreeLayerNode(nullptr);
ln1->setName("tmp_image_1");
m_LayerTreeModel->addLayer(m_RasterGroup, ln1);
}
{
auto* ln2 = new LayerTreeLayerNode(nullptr);
ln2->setName("tmp_image_2");
m_LayerTreeModel->addLayer(m_RasterGroup, ln2);
}
auto* g2 = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Vector");
//model->addLayer(g2, "Rivers");
auto* g1 = model->addGroup(model->root(), "Raster"); QTreeView* LayerTreeView = new QTreeView();
model->addLayer(g1, "tmp_image_1"); LayerTreeView->setModel(m_LayerTreeModel);
model->addLayer(g1, "tmp_image_2"); LayerTreeView->setHeaderHidden(true);
LayerTreeView->setStyleSheet(R"(
auto* g2 = model->addGroup(model->root(), "Vector");
//model->addLayer(g2, "Rivers");
QTreeView* LayerTreeView = new QTreeView();
LayerTreeView->setModel(model);
LayerTreeView->setHeaderHidden(true);
LayerTreeView->setStyleSheet(R"(
QTreeView QTreeView
{ {
color: #ACCDFF; color: #ACCDFF;
@ -244,15 +254,15 @@ HPPA::HPPA(QWidget* parent)
} }
)"); )");
gridLayout_toc->addWidget(LayerTreeView, 0, 0, 1, 1); gridLayout_toc->addWidget(LayerTreeView, 0, 0, 1, 1);
dock_layers->setWidget(dock_layersWidgetContents); dock_layers->setWidget(dock_layersWidgetContents);
dock_layersWidgetContents->setStyleSheet(qss_DockWidget_contentWidget); dock_layersWidgetContents->setStyleSheet(qss_DockWidget_contentWidget);
//dock_layers->setMinimumWidth(449); //dock_layers->setMinimumWidth(449);
//dock_layers->setMaximumWidth(450); //dock_layers->setMaximumWidth(450);
//dock_layers->setMinimumHeight(497); //dock_layers->setMinimumHeight(497);
//dock_layers->setMaximumHeight(498); //dock_layers->setMaximumHeight(498);
//高光谱查看 //高光谱查看
@ -864,6 +874,7 @@ void HPPA::initPanelToolbar()
mToolbarMenu->addAction(ui.mainToolBar->toggleViewAction()); mToolbarMenu->addAction(ui.mainToolBar->toggleViewAction());
} }
//----------------------------------------------------
void HPPA::createScenarioActionGroup() void HPPA::createScenarioActionGroup()
{ {
m_ScenarioActionGroup = new QActionGroup(this); m_ScenarioActionGroup = new QActionGroup(this);
@ -1053,7 +1064,7 @@ void HPPA::onStartRecordStep1()
onCreateTab(0); onCreateTab(0);
ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集"));
ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}");
//应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号) //应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号)
m_Imager->setFileName2Save(imgPath); m_Imager->setFileName2Save(imgPath);
@ -1090,12 +1101,12 @@ void HPPA::onStartRecordStep1()
} }
else else
{ {
m_tmc->stop(); m_tmc->stop();
m_RecordState--; m_RecordState--;
ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
} }
return; return;
@ -1431,6 +1442,10 @@ void HPPA::onExit()
this->close(); this->close();
} }
void HPPA::onOpenImg()
{
}
void HPPA::onconnect() void HPPA::onconnect()
{ {
if (m_Imager != nullptr) if (m_Imager != nullptr)
@ -1494,7 +1509,6 @@ void HPPA::onconnect()
m_TestImagerStausThread = new WorkerThread(m_Imager); m_TestImagerStausThread = new WorkerThread(m_Imager);
connect(this->ui.action_auto_exposure, SIGNAL(triggered()), this, SLOT(onAutoExposure())); connect(this->ui.action_auto_exposure, SIGNAL(triggered()), this, SLOT(onAutoExposure()));
connect(this->ui.action_focus, SIGNAL(triggered()), this, SLOT(onFocus1())); connect(this->ui.action_focus, SIGNAL(triggered()), this, SLOT(onFocus1()));
connect(this, SIGNAL(StartFocusSignal()), m_Imager, SLOT(focus())); connect(this, SIGNAL(StartFocusSignal()), m_Imager, SLOT(focus()));
@ -1508,11 +1522,12 @@ void HPPA::onconnect()
connect(m_Imager, SIGNAL(RecordWhiteFinishSignal()), this, SLOT(recordWhiteFinish())); connect(m_Imager, SIGNAL(RecordWhiteFinishSignal()), this, SLOT(recordWhiteFinish()));
connect(m_Imager, SIGNAL(RecordDarlFinishSignal()), this, SLOT(recordDarkFinish())); connect(m_Imager, SIGNAL(RecordDarlFinishSignal()), this, SLOT(recordDarkFinish()));
// Connect LayerFileCreated from imager to HPPA slot
connect(m_Imager, SIGNAL(LayerFileCreated(QString,QString,int)), this, SLOT(onLayerCreatedFromFile(QString,QString,int)));
connect(this->ui.actionOpenDirectory, SIGNAL(triggered()), this, SLOT(onActionOpenDirectory())); connect(this->ui.actionOpenDirectory, SIGNAL(triggered()), this, SLOT(onActionOpenDirectory()));
connect(this->ui.framerate_lineEdit, SIGNAL(editingFinished()), this, SLOT(OnFramerateLineeditEditingFinished())); connect(this->ui.framerate_lineEdit, SIGNAL(editingFinished()), this, SLOT(OnFramerateLineeditEditingFinished()));
connect(this->ui.FramerateSlider, SIGNAL(valueChanged(double)), this, SLOT(OnFramerateSliderChanged(double))); connect(this->ui.FramerateSlider, SIGNAL(valueChanged(double)), this, SLOT(OnFramerateSliderChanged(double)));
connect(this->ui.integratioin_time_lineEdit, SIGNAL(editingFinished()), this, SLOT(OnIntegratioinTimeEditingFinished())); connect(this->ui.integratioin_time_lineEdit, SIGNAL(editingFinished()), this, SLOT(OnIntegratioinTimeEditingFinished()));
@ -1571,6 +1586,26 @@ void HPPA::testImagerStatus()
m_TestImagerStausThread->start(); m_TestImagerStausThread->start();
} }
void HPPA::onImageFileSaved(QString path, int fileIndex)
{
// 该槽在 UI 线程中执行Qt 会使用 queued connection可以安全操作 model
QFileInfo fi(path);
QString base = fi.completeBaseName(); // 去掉路径与扩展名(例如 tmp_image_0
// 将新的 layer 添加到 Raster 分组
if (!m_LayerTreeModel || !m_RasterGroup) return;
// layer 名称可根据需要调整,这里用文件名作为图层名
{
auto* ln = new LayerTreeLayerNode(nullptr);
ln->setName(base);
m_LayerTreeModel->addLayer(m_RasterGroup, ln);
}
// 可选:展开 TOC 或者做其他 UI 更新(目前不做动画,仅打印日志)
qDebug() << "ImageFileSaved -> add layer:" << base << " index:" << fileIndex;
}
void HPPA::onAutoExposure() void HPPA::onAutoExposure()
{ {
double ReturnedExposureTime = m_Imager->auto_exposure(); double ReturnedExposureTime = m_Imager->auto_exposure();
@ -1757,7 +1792,7 @@ void HPPA::PlotSpectral(int state)
//series->append(i, m_Imager->buffer[i + 5 * 900]); //series->append(i, m_Imager->buffer[i + 5 * 900]);
//series->append(i, m_Imager->buffer[900 * 150 + i]); //series->append(i, m_Imager->buffer[900 * 150 + i]);
series->append(i, m_Imager->buffer[1368 * 150 + i]); series->append(i, m_Imager->buffer[1368 * 150 + i]);
} }
QChart* chart = new QChart(); QChart* chart = new QChart();
chart->legend()->hide(); chart->legend()->hide();
@ -1868,3 +1903,20 @@ void WorkerThread3::run()
emit AutoFocusFinishedSignal(); emit AutoFocusFinishedSignal();
} }
void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex)
{
if (!m_LayerTreeModel || !m_RasterGroup) return;
// Create MapLayer first and attach it to a LayerTreeLayerNode
MapLayer* ml = new RasterLayer(baseName, filePath);
auto* layerNode = new LayerTreeLayerNode(ml);
LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
LayerTreeLayerNode* lnode = dynamic_cast<LayerTreeLayerNode*>(node);
if (!lnode) return;
// layerNode already holds the MapLayer pointer from constructor
qDebug() << "LayerFileCreated -> created layer:" << baseName << "path:" << filePath << "index:" << fileIndex;
}

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include <cstdio> #include <cstdio>
#include <iostream> #include <iostream>
@ -53,10 +53,11 @@
#include "LayerTreeModel.h" #include "LayerTreeModel.h"
#include "LayerTree.h" #include "LayerTree.h"
#include "MapLayer.h"
#define PI 3.1415926 #define PI 3.1415926
QT_CHARTS_USE_NAMESPACE//QChartView ʹ<EFBFBD><EFBFBD> <20><>Ҫ<EFBFBD>Ӻ꣬ <20><><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>ʹ<EFBFBD><CAB9> QT_CHARTS_USE_NAMESPACE//QChartView 使用 需要加宏, 否则无法使用
class WorkerThread : public QThread class WorkerThread : public QThread
{ {
@ -83,11 +84,11 @@ public:
// //double x = m_Imager->m_ResononImager.get_framerate(); // //double x = m_Imager->m_ResononImager.get_framerate();
// int x = m_Imager->m_ResononImager.get_band_count(); // int x = m_Imager->m_ResononImager.get_band_count();
// std::cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>slopeΪ<EFBFBD><EFBFBD>" << x << std::endl; // std::cout << "相机连接正常!slope为:" << x << std::endl;
// } // }
// catch (std::runtime_error *e)//CException *e // catch (std::runtime_error *e)//CException *e
// { // {
// std::cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>" << e->what() << std::endl; // std::cout << "相机断开连接!" << e->what() << std::endl;
// } // }
// Sleep(1000); // Sleep(1000);
// } // }
@ -142,9 +143,9 @@ class WidgetWithBackgroundPicture : public QWidget
public: public:
explicit WidgetWithBackgroundPicture(QWidget* parent = nullptr) explicit WidgetWithBackgroundPicture(QWidget* parent = nullptr)
: QWidget(parent), : QWidget(parent),
m_pixmap(".//icon//titile_bar_bgp.png") // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD> m_pixmap(".//icon//titile_bar_bgp.png") // 使用资源或绝对路径
{ {
// <EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><EFBFBD>С // 可选:设置初始大小
resize(800, 600); resize(800, 600);
} }
@ -168,9 +169,9 @@ public:
HPPA(QWidget *parent = Q_NULLPTR); HPPA(QWidget *parent = Q_NULLPTR);
~HPPA(); ~HPPA();
void CalculateIntegratioinTimeRange();//ͨ<EFBFBD><EFBFBD>֡<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>slider<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ void CalculateIntegratioinTimeRange();//通过帧率计算积分时间范围,设置slider最大值
WorkerThread * m_TestImagerStausThread;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> WorkerThread * m_TestImagerStausThread;//检测相机连接状态的线程
private: private:
Ui::HPPAClass ui; Ui::HPPAClass ui;
@ -192,11 +193,11 @@ private:
ImagerOperationBase* m_Imager;// ImagerOperationBase* m_Imager;//
int m_RecordState;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>ȡ2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 <20><> <20><><EFBFBD>ڲɼ<DAB2><C9BC><EFBFBD>0 <20><> ֹͣ<CDA3>ɼ<EFBFBD> int m_RecordState;//用来控制相机采集流程取2的余数1 → 正在采集0 → 停止采集
QThread * m_RecordThread;//Ӱ<EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><EFBFBD>߳<EFBFBD> QThread * m_RecordThread;//影像采集线程
QThread * m_RgbCameraThread;//rgb<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡͼ<EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> QThread * m_RgbCameraThread;//rgb相机获取图像线程
QThread * m_CopyFileThread;//Ӱ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD> QThread * m_CopyFileThread;//影像文件复制线程
FileOperation * m_FileOperation; FileOperation * m_FileOperation;
QChartView * m_chartView; QChartView * m_chartView;
@ -205,18 +206,18 @@ private:
//QLineSeries *series; //QLineSeries *series;
//QChart *chart; //QChart *chart;
QString operateWidget;//<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀؼ<EFBFBD><EFBFBD><EFBFBD> QString operateWidget;//当前操作的控件名
//ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD> //模拟相机位置
double widthScale;//QGraphicsView<EFBFBD><EFBFBD>viewport<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>widthScale = rect.width() / maxDistance; double widthScale;//QGraphicsViewviewport宽和真实距离比例:widthScale = rect.width() / maxDistance;
double heightScale;//QGraphicsView<EFBFBD><EFBFBD>viewport<EFBFBD>ߺ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>heightScale = rect.height() / maxDistance; double heightScale;//QGraphicsViewviewport高和真实距离比例:heightScale = rect.height() / maxDistance;
void setImagerSimulationPos(double x, double y);//ui.graphicsView->imager->setPos(x, y); void setImagerSimulationPos(double x, double y);//ui.graphicsView->imager->setPos(x, y);
//<EFBFBD>ɼ<EFBFBD><EFBFBD>߹滮 //采集线规划
int m_numberOfRecording;//<EFBFBD><EFBFBD>ʾui.recordLine_tableWidget<EFBFBD>еĵڼ<EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ڲɼ<DAB2><C9BC>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD> int m_numberOfRecording;//表示ui.recordLine_tableWidget中的第几行 → 正在采集第几条线
// //
int m_TabWidgetCurrentIndex;//<EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>ѡ<EFBFBD><EFBFBD>TabWidget<EFBFBD>ı<EFBFBD>ǩʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tab index int m_TabWidgetCurrentIndex;//当手动选择TabWidget的标签时,记录变化后的tab index
RgbCameraOperation *m_RgbCamera; RgbCameraOperation *m_RgbCamera;
void getRequest(QString str); void getRequest(QString str);
@ -254,6 +255,9 @@ private:
View3DModelManager* m_view3DModelManager; View3DModelManager* m_view3DModelManager;
LayerTree* m_LayerTree = nullptr;
LayerTreeModel* m_LayerTreeModel = nullptr;
LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer
public Q_SLOTS: public Q_SLOTS:
void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber); void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber);
@ -263,8 +267,9 @@ public Q_SLOTS:
void onsequenceComplete(); void onsequenceComplete();
void onExit(); void onExit();
void onconnect();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void onOpenImg();
void testImagerStatus();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> void onconnect();//连接相机
void testImagerStatus();//获取相机状态:连接是否正常
void onAutoExposure(); void onAutoExposure();
void onFocus1(); void onFocus1();
void onFocus2(int command); void onFocus2(int command);
@ -286,7 +291,7 @@ public Q_SLOTS:
void OnGainEditingFinished();// void OnGainEditingFinished();//
void OnGainSliderChanged(double Gain);// void OnGainSliderChanged(double Gain);//
void onLeftMouseButtonPressed(int x, int y);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> void onLeftMouseButtonPressed(int x, int y);//点击影像像元显示光谱
void setAxis(QValueAxis* axisX, QValueAxis* axisY); void setAxis(QValueAxis* axisX, QValueAxis* axisY);
@ -309,6 +314,11 @@ public Q_SLOTS:
void createPlantPhenotypeScenario(); void createPlantPhenotypeScenario();
void onCreated3DModelPlantPhenotype(); void onCreated3DModelPlantPhenotype();
void onCreated3DModelOneMotor(); void onCreated3DModelOneMotor();
void onImageFileSaved(QString path, int fileIndex);
void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex);
signals: signals:
void StartFocusSignal(); void StartFocusSignal();
void StartRecordSignal(); void StartRecordSignal();
@ -317,4 +327,3 @@ signals:
void RecordWhiteSignal(); void RecordWhiteSignal();
void RecordDarlSignal(); void RecordDarlSignal();
}; };

View File

@ -70,8 +70,7 @@ color:white;
<property name="title"> <property name="title">
<string>文件</string> <string>文件</string>
</property> </property>
<addaction name="action_9"/> <addaction name="mActionOpenImg"/>
<addaction name="action_10"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="action_11"/> <addaction name="action_11"/>
<addaction name="action_exit"/> <addaction name="action_exit"/>
@ -1024,7 +1023,7 @@ QPushButton:pressed
<string>三脚架(旋转平台)</string> <string>三脚架(旋转平台)</string>
</property> </property>
</action> </action>
<action name="action_9"> <action name="mActionOpenImg">
<property name="text"> <property name="text">
<string>打开影像</string> <string>打开影像</string>
</property> </property>

View File

@ -14,16 +14,16 @@
<ProjectGuid>{E7886664-B69E-4781-BCBE-804574FB4033}</ProjectGuid> <ProjectGuid>{E7886664-B69E-4781-BCBE-804574FB4033}</ProjectGuid>
<Keyword>QtVS_v304</Keyword> <Keyword>QtVS_v304</Keyword>
<QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild> <QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
<WindowsTargetPlatformVersion>10.0.22000.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc> <UseOfMfc>false</UseOfMfc>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -119,11 +119,13 @@
<ClCompile Include="LayerTreeLayerNode.cpp" /> <ClCompile Include="LayerTreeLayerNode.cpp" />
<ClCompile Include="LayerTreeModel.cpp" /> <ClCompile Include="LayerTreeModel.cpp" />
<ClCompile Include="LayerTreeNode.cpp" /> <ClCompile Include="LayerTreeNode.cpp" />
<ClCompile Include="MapLayer.cpp" />
<ClCompile Include="OneMotorControl.cpp" /> <ClCompile Include="OneMotorControl.cpp" />
<ClCompile Include="path_tc.cpp" /> <ClCompile Include="path_tc.cpp" />
<ClCompile Include="PowerControl.cpp" /> <ClCompile Include="PowerControl.cpp" />
<ClCompile Include="QDoubleSlider.cpp" /> <ClCompile Include="QDoubleSlider.cpp" />
<ClCompile Include="QMotorDoubleSlider.cpp" /> <ClCompile Include="QMotorDoubleSlider.cpp" />
<ClCompile Include="RasterLayer.cpp" />
<ClCompile Include="resononImager.cpp" /> <ClCompile Include="resononImager.cpp" />
<ClCompile Include="ResononNirImager.cpp" /> <ClCompile Include="ResononNirImager.cpp" />
<ClCompile Include="RgbCameraOperation.cpp" /> <ClCompile Include="RgbCameraOperation.cpp" />
@ -190,6 +192,8 @@
<QtMoc Include="LayerTree.h" /> <QtMoc Include="LayerTree.h" />
<QtMoc Include="LayerTreeGroupNode.h" /> <QtMoc Include="LayerTreeGroupNode.h" />
<QtMoc Include="LayerTreeLayerNode.h" /> <QtMoc Include="LayerTreeLayerNode.h" />
<QtMoc Include="MapLayer.h" />
<QtMoc Include="RasterLayer.h" />
<ClInclude Include="utility_tc.h" /> <ClInclude Include="utility_tc.h" />
<QtMoc Include="aboutWindow.h" /> <QtMoc Include="aboutWindow.h" />
<ClInclude Include="hppaConfigFile.h" /> <ClInclude Include="hppaConfigFile.h" />

View File

@ -154,6 +154,12 @@
<ClCompile Include="LayerTreeLayerNode.cpp"> <ClCompile Include="LayerTreeLayerNode.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="MapLayer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="RasterLayer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="fileOperation.h"> <QtMoc Include="fileOperation.h">
@ -243,6 +249,12 @@
<QtMoc Include="LayerTreeLayerNode.h"> <QtMoc Include="LayerTreeLayerNode.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="MapLayer.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="RasterLayer.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="imageProcessor.h"> <ClInclude Include="imageProcessor.h">

View File

@ -218,9 +218,9 @@ void ImagerOperationBase::record_white()
void ImagerOperationBase::start_record() void ImagerOperationBase::start_record()
{ {
using namespace std; using namespace std;
//std::cout << "------------------------------------------------------" << std::endl; //std::cout << "------------------------------------------------------" << std::endl;
m_iFrameCounter = 0; m_iFrameCounter = 0;
m_RgbImage->m_iFrameCounter = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rgbͼ<62><CDBC><EFBFBD>ĵ<EFBFBD>0<EFBFBD><30> m_RgbImage->m_iFrameCounter = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rgbͼ<62><CDBC><EFBFBD>ĵ<EFBFBD>0<EFBFBD><30>
@ -233,7 +233,15 @@ void ImagerOperationBase::start_record()
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; // <20>ڿ<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2>UI <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD> MapLayer <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// prepare file name that will be used for saving
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil";
QString baseName = QString::fromStdString(removeFileExtension(m_FileName2Save2));
QString filePath = QString::fromStdString(m_FileName2Save2);
emit LayerFileCreated(baseName, filePath, m_FileSavedCounter);
}
FILE* m_fImage = fopen(m_FileName2Save2.c_str(), "w+b"); FILE* m_fImage = fopen(m_FileName2Save2.c_str(), "w+b");
size_t x; size_t x;
@ -312,10 +320,15 @@ void ImagerOperationBase::start_record()
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD>ͼǰ<CDBC><C7B0>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD>ͼǰ<CDBC><C7B0>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//m_RgbImage //m_RgbImage
emit PlotSignal(m_FileSavedCounter, -1);//<2F><>1<EFBFBD><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Է<EFBFBD><D4B7>ɼ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>ʵı<CAB5><C4B1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ȫ<EFBFBD><C8AB>2<EFBFBD><32>ʹ<EFBFBD>û<EFBFBD>е<EFBFBD>۲ɼ<DBB2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>ʼ<E4BFAA>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><E1B5BC><EFBFBD>ϴβɼ<CEB2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>źŵ<C5BA><C5B5>õIJۺ<C4B2><DBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˼<EFBFBD><CBBC>ݣ<EFBFBD>ע<EFBFBD>͵<EFBFBD> emit PlotSignal(m_FileSavedCounter, -1);
m_bRecordControlState = false; m_bRecordControlState = false;
WriteHdr(); WriteHdr();
// <20><><EFBFBD><EFBFBD> ImageFileSaved <20>źţ<C5BA>֪ͨ UI <20><><EFBFBD>Ѹ<EFBFBD><D1B8>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// m_FileName2Save2 <20><><EFBFBD><EFBFBD><EFBFBD>˱<EFBFBD><CBB1><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD> .bil <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "tmp_image_0.bil"<22><>
emit ImageFileSaved(QString::fromStdString(m_FileName2Save2), m_FileSavedCounter);
m_FileSavedCounter++; m_FileSavedCounter++;
if (m_iFrameCounter >= m_iFrameNumber) if (m_iFrameCounter >= m_iFrameNumber)

View File

@ -9,6 +9,8 @@
#include "ImagerOperationBase.h" #include "ImagerOperationBase.h"
#include "utility_tc.h" #include "utility_tc.h"
class MapLayer; // forward declaration
class ImagerOperationBase :public QObject class ImagerOperationBase :public QObject
{ {
Q_OBJECT Q_OBJECT
@ -112,4 +114,10 @@ signals:
void testImagerStatus();//<2F><>ʾ<EFBFBD><CABE><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> void testImagerStatus();//<2F><>ʾ<EFBFBD><CABE><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ӱ<EFBFBD><D3B0><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>.bil/.hdr<64><72>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ɺ󷢳<C9BA><F3B7A2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳɼ<D3B2><C9BC>̷߳<DFB3><CCB7><EFBFBD><EFBFBD><EFBFBD>Qt <20><><EFBFBD><EFBFBD> queued connection<6F><6E>
void ImageFileSaved(const QString& path, int fileIndex);
// <20>޸ģ<DEB8><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> MapLayer*<2A><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>UI <20><EFBFBD>𴴽<EFBFBD> MapLayer <20><><EFBFBD>󲢹<EFBFBD><F3B2A2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void LayerFileCreated(const QString& baseName, const QString& filePath, int fileIndex);
}; };

View File

@ -1,6 +1,6 @@
#include "LayerTreeLayerNode.h" #include "LayerTreeLayerNode.h"
LayerTreeLayerNode::LayerTreeLayerNode(const QString& name, QObject* parent) LayerTreeLayerNode::LayerTreeLayerNode(MapLayer* layer, QObject* parent)
: LayerTreeNode(name, parent) : LayerTreeNode(layer ? layer->name() : QString(), parent), m_layer(layer)
{ {
} }

View File

@ -1,15 +1,23 @@
#pragma once #pragma once
#include "LayerTreeNode.h" #include "LayerTreeNode.h"
#include "MapLayer.h"
/** Layer <20>ڵ<EFBFBD> */ /** Layer <20>ڵ<EFBFBD> */
class LayerTreeLayerNode : public LayerTreeNode class LayerTreeLayerNode : public LayerTreeNode
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LayerTreeLayerNode(const QString& name, explicit LayerTreeLayerNode(MapLayer* layer,
QObject* parent = nullptr); QObject* parent = nullptr);
Type type() const override { return Type::Layer; } Type type() const override { return Type::Layer; }
// <20>Ժ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>layerId / pointer / legendItems <20><EFBFBD> // <20><><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> MapLayer ָ<><EFBFBD><EBA3A8>ӵ<EFBFBD>У<EFBFBD>
void setMapLayer(MapLayer* layer) { m_layer = layer; }
MapLayer* mapLayer() const { return m_layer; }
private:
MapLayer* m_layer = nullptr;
// <20><><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>layerId / pointer / legendItems <20><>
}; };

View File

@ -133,13 +133,14 @@ LayerTreeNode* LayerTreeModel::addGroup(LayerTreeNode* parent, const QString& na
return g; return g;
} }
LayerTreeNode* LayerTreeModel::addLayer(LayerTreeNode* parent, const QString& name, const QIcon& icon) LayerTreeNode* LayerTreeModel::addLayer(LayerTreeNode* parent, LayerTreeLayerNode* layerNode, const QIcon& icon)
{ {
if (!parent) parent = m_tree->root(); if (!parent) parent = m_tree->root();
if (!layerNode) return nullptr;
const int row = parent->childCount(); const int row = parent->childCount();
beginInsertRows(indexFromNode(parent), row, row); beginInsertRows(indexFromNode(parent), row, row);
LayerTreeNode* l = m_tree->insertNode(parent, row, new LayerTreeLayerNode(name)); LayerTreeNode* l = m_tree->insertNode(parent, row, layerNode);
endInsertRows(); endInsertRows();
return l; return l;

View File

@ -3,6 +3,8 @@
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include "LayerTree.h" #include "LayerTree.h"
class LayerTreeLayerNode; // forward declare
/** /**
* LayerTreeModel<65><6C>Qt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3A8><EFBFBD>ٹ<EFBFBD><D9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * LayerTreeModel<65><6C>Qt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3A8><EFBFBD>ٹ<EFBFBD><D9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* - 1 <20>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>ͼ<EFBFBD>꣩+ checkbox * - 1 <20>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>ͼ<EFBFBD>꣩+ checkbox
@ -32,7 +34,7 @@ public:
LayerTreeNode* root() const; LayerTreeNode* root() const;
LayerTreeNode* addGroup(LayerTreeNode* parent, const QString& name, const QIcon& icon = QIcon()); LayerTreeNode* addGroup(LayerTreeNode* parent, const QString& name, const QIcon& icon = QIcon());
LayerTreeNode* addLayer(LayerTreeNode* parent, const QString& name, const QIcon& icon = QIcon()); LayerTreeNode* addLayer(LayerTreeNode* parent, LayerTreeLayerNode* layerNode, const QIcon& icon = QIcon());
void setCascadeCheckEnabled(bool enabled); void setCascadeCheckEnabled(bool enabled);
bool cascadeCheckEnabled() const; bool cascadeCheckEnabled() const;

26
HPPA/MapLayer.cpp Normal file
View File

@ -0,0 +1,26 @@
#include "MapLayer.h"
MapLayer::MapLayer(const QString& name, const QString& uri)
: QObject(nullptr), m_name(name), m_uri(uri)
{
}
QString MapLayer::name() const
{
return m_name;
}
void MapLayer::setName(const QString& n)
{
m_name = n;
}
QString MapLayer::dataPath() const
{
return m_uri;
}
void MapLayer::setDataPath(const QString& p)
{
m_uri = p;
}

28
HPPA/MapLayer.h Normal file
View File

@ -0,0 +1,28 @@
#pragma once
#include <QObject>
#include <QString>
#include <QMetaType>
class MapLayer : public QObject
{
Q_OBJECT
public:
enum class LayerType { Raster, Vector };
explicit MapLayer(const QString& name, const QString& uri);
virtual ~MapLayer() override = default;
QString name() const;
void setName(const QString& n);
QString dataPath() const;
void setDataPath(const QString& p);
virtual LayerType layerType() const = 0;
private:
QString m_name;
QString m_uri;
};

12
HPPA/RasterLayer.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "RasterLayer.h"
RasterLayer::RasterLayer(const QString& name, const QString& uri)
: MapLayer(name, uri)
{
}
MapLayer::LayerType RasterLayer::layerType() const
{
return MapLayer::LayerType::Raster;
}

14
HPPA/RasterLayer.h Normal file
View File

@ -0,0 +1,14 @@
#pragma once
#include "MapLayer.h"
class RasterLayer : public MapLayer
{
Q_OBJECT
public:
explicit RasterLayer(const QString& name, const QString& uri);
LayerType layerType() const override;
// future: renderer, data provider, etc.
};