Files
HPPA/HPPA/HPPA.cpp
tangchao0503 5dc589aee0 add,单反相机2:
1、实现3s拍照;
2、设置照片保存路径;
3、轮播看板:显示单反实时视频流;
2026-05-27 16:03:16 +08:00

2795 lines
84 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
//#include <afx.h>
#include <exception>
#include <memory>
#include <vector>
#include <QMessageBox>
#include <QFileInfo> // 新增,用于解析路径
#include "HPPA.h"
#include "RasterLayer.h"
#include "RasterImageLayer.h"
#include "RasterRenderParams.h"
#include "LayerTreeLayerNode.h"
#include "MapTool.h"
#include "MapToolPan.h"
#include "MapToolSpectral.h"
#include "MapTools.h"
#include <algorithm>
#include <cmath>
HPPA* HPPA::s_instance = nullptr;
HPPA* HPPA::instance()
{
return s_instance;
}
LayerTreeNode* HPPA::rasterGroupNode() const
{
return m_RasterGroup;
}
HPPA::HPPA(QWidget* parent)
: QMainWindow(parent)
{
s_instance = this;
ui.setupUi(this);
setWindowFlags(Qt::FramelessWindowHint);
// register MapLayer* metatype for queued signal/slot across threads
qRegisterMetaType<MapLayer*>("MapLayer*");
QCoreApplication::setOrganizationName("IRIS");
QCoreApplication::setOrganizationDomain("iris.com");
QCoreApplication::setApplicationName("HPPA");
//配置文件:如果没有,就创建配置文件
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);
// Create MapLayerStore early so created layers are managed
m_MapLayerStore = new MapLayerStore(this);
/*int max, min;
mConfigfile.getPositionRestriction(max, min);
string sn;
mConfigfile.getSN(sn);
int coarse, fine;
mConfigfile.getTuningStepSize(coarse, fine);
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 SubdivisionMultiples_x;
mConfigfile.getXMotorParm(StepAnglemar_x, Lead_x, SubdivisionMultiples_x, ScaleFactor_x);
float StepAnglemar_y, Lead_y, ScaleFactor_y;
int SubdivisionMultiples_y;
mConfigfile.getYMotorParm(StepAnglemar_y, Lead_y, SubdivisionMultiples_y, ScaleFactor_y);*/
//状态栏
//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);
m_recordFrameCounter = new recordFrameCounter(this);
ui.statusBar->addWidget(m_recordFrameCounter);
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.splitter->setStretchFactor(0, 1);
ui.splitter->setStretchFactor(1, 1);
ui.splitter->setStretchFactor(2, 3);*/
initMenubarToolbar();
startTimer(1000);
widthScale = 1;
heightScale = 1;
//马达位置模拟
//connect(ui.graphicsView->imager, SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onimagerSimulatorMove(int, int)));
initPanelToolbar();
setDockNestingEnabled(true);
connect(this->ui.mSetting, SIGNAL(triggered()), this, SLOT(settingWindow()));
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()));
connect(this->ui.mAction3DPlantPhenotypeScenario, SIGNAL(triggered()), this, SLOT(create3DPlantPhenotypeScenario()));
connect(this->ui.mActionMicroscopicMotionControlScenario, SIGNAL(triggered()), this, SLOT(createMicroscopicMotionControlScenario()));
delete ui.centralWidget;
QString qss_DockWidget_contentWidget = R"(
background: #0D1233;
/*border: 1px solid #2c586b;*/
border-top: 1px solid #2c586b;
border-left: 1px solid #2c586b;
border-right: 1px solid #2c586b;
border-bottom: 1px solid #2c586b;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
)";
//TOC
CustomDockWidgetBase* dock_layers = new CustomDockWidgetBase(QString::fromLocal8Bit("layers"), this);
dock_layers->setObjectName("mDockLayers");
dock_layers->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
mPanelMenu->addAction(dock_layers->toggleViewAction());
addDockWidget(Qt::LeftDockWidgetArea, dock_layers);
dock_layers->hideMaxButton();
//1、没用
QWidget* dock_layersWidgetContents = new QWidget();
dock_layersWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents_2"));
QGridLayout* gridLayout_toc = new QGridLayout(dock_layersWidgetContents);
gridLayout_toc->setSpacing(6);
gridLayout_toc->setContentsMargins(11, 11, 11, 11);
gridLayout_toc->setObjectName(QString::fromUtf8("gridLayout_toc"));
gridLayout_toc->setVerticalSpacing(0);
gridLayout_toc->setContentsMargins(0, 0, 0, 0);
ImagerPositionSimulation* graphicsView_delete = new ImagerPositionSimulation(dock_layersWidgetContents);
graphicsView_delete->setObjectName(QString::fromUtf8("graphicsView_delete"));
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Preferred);
sizePolicy1.setHorizontalStretch(0);
sizePolicy1.setVerticalStretch(0);
sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidth());
graphicsView_delete->setSizePolicy(sizePolicy1);
graphicsView_delete->setFrameShape(QFrame::NoFrame);
graphicsView_delete->setFrameShadow(QFrame::Raised);
//gridLayout_toc->addWidget(graphicsView_delete, 0, 0, 1, 1);
//3、正经TOC
m_LayerTree = new LayerTree();
m_LayerTreeModel = new LayerTreeModel(m_LayerTree, this, true);
// 创建并保留 Raster 分组指针,后续添加 layer 使用它
m_RasterGroup = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Raster");
//{
// 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");
m_layerTreeView = new LayerTreeView();
m_layerTreeView->setMenuProvider(new LayerTreeViewMenuProvider(m_layerTreeView));
m_layerTreeView->setModel(m_LayerTreeModel);
m_layerTreeView->setHeaderHidden(true);
m_layerTreeView->setStyleSheet(R"(
QTreeView
{
color: #ACCDFF;
}
QTreeView::branch {
background: transparent;
}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings
{
border-image: none;
image: url(:/svg/resources/icons/svg/tree_tri_right.svg);
}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings
{
border-image: none;
image: url(:/svg/resources/icons/svg/tree_tri_down.svg);
}
)");
gridLayout_toc->addWidget(m_layerTreeView, 0, 0, 1, 1);
// Connect TOC selection change to populate ImageControl
connect(m_layerTreeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(onLayerTreeSelectionChanged(QItemSelection,QItemSelection)));
dock_layersWidgetContents->setStyleSheet(qss_DockWidget_contentWidget);
dock_layers->setWidget(tmp(dock_layersWidgetContents));
//dock_layers->setMinimumWidth(449);
//dock_layers->setMaximumWidth(450);
//dock_layers->setMinimumHeight(497);
//dock_layers->setMaximumHeight(498);
//高光谱查看
QDockWidget* dock_hyperimgViewer = new CustomDockWidgetBase(QString::fromLocal8Bit("hyimgViewer"), this);
dock_hyperimgViewer->setObjectName("hyimgViewer");
QWidget* dock_hyperimgViewerWidgetContents = new QWidget();
dock_hyperimgViewerWidgetContents->setObjectName(QString::fromUtf8("dock_hyperimgViewerWidgetContents"));
QGridLayout* gridLayout_hyperimgViewer = new QGridLayout(dock_hyperimgViewerWidgetContents);
gridLayout_hyperimgViewer->setSpacing(6);
gridLayout_hyperimgViewer->setObjectName(QString::fromUtf8("gridLayout_hyperimgViewer"));
gridLayout_hyperimgViewer->setVerticalSpacing(6);
gridLayout_hyperimgViewer->setContentsMargins(1, 2, 1, 2);
m_imageViewerTabWidget = new QTabWidget();
//m_imageViewerTabWidget->tabBar()->setFixedHeight(40);//没有效果在qss中设置高度才有效果为啥
m_imageViewerTabWidget->clear();//必须放在最前面首先删除所有的tab
QToolButton* maxButton = new QToolButton();
maxButton->setIcon(style()->standardIcon(QStyle::SP_TitleBarMaxButton));
connect(maxButton, SIGNAL(clicked()), dock_hyperimgViewer, SLOT(toggleMaximize()));
m_imageViewerTabWidget->setCornerWidget(maxButton, Qt::TopRightCorner);
//onCreateTab(0);
//m_imageViewerTabWidget->setTabsClosable(true);//这样每页都会有关闭按钮
connect(m_imageViewerTabWidget, SIGNAL(currentChanged(int)), this, SLOT(onTabWidgetCurrentChanged(int)));
m_imageViewerTabWidget->setStyleSheet(R"(
QTabBar::tab {
background: #0E1C4C;
color: white;
padding: 6px 12px;
border: none;
border-bottom: 1px solid #27376C;
height: 18;
}
QTabBar::tab:selected {
background: #0D1233;
color: white;
border: none;
}
/*QTabBar::tab:hover {
background: #141A45;
}*/
QTabWidget::pane {
border: none;
border-top: 1px solid #27376C;
background: #0D1233;
top: -1px;
}
QTabWidget QWidget {
background: #0D1233;
}
)");
QWidget* imageViewerTabWidgetContainer = new QWidget();
QGridLayout* gridLayout_imageViewerTabWidgetContainer = new QGridLayout(imageViewerTabWidgetContainer);
gridLayout_imageViewerTabWidgetContainer->setSpacing(6);
gridLayout_imageViewerTabWidgetContainer->setObjectName(QString::fromUtf8("gridLayout_imageViewerTabWidgetContainer"));
gridLayout_imageViewerTabWidgetContainer->setVerticalSpacing(6);
gridLayout_imageViewerTabWidgetContainer->setContentsMargins(0, 0, 0, 0);
gridLayout_imageViewerTabWidgetContainer->addWidget(m_imageViewerTabWidget, 0, 0, 1, 1);
imageViewerTabWidgetContainer->setStyleSheet(R"(
background: #0E1C4C;
)");
QFrame* line = new QFrame();
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Plain);
line->setStyleSheet(R"(
QWidget {
color: #2c586b;
}
)");
m_chartView = new QChartView();
m_chartView->setRenderHint(QPainter::Antialiasing);
m_chartView->setStyleSheet(R"(
background: #0D1233;
)");
//m_chartView->setBackgroundBrush(QColor("#0D1233"));
m_chart = new QChart();
m_chart->setBackgroundBrush(QColor("#0D1233"));
m_chart->legend()->hide();
//m_chart->setTitle("Simple line chart example");
QValueAxis* axisX = new QValueAxis();
QValueAxis* axisY = new QValueAxis();
setAxis(axisX, axisY);
m_chart->addAxis(axisX, Qt::AlignBottom);
m_chart->addAxis(axisY, Qt::AlignLeft);
m_chartView->setChart(m_chart);
gridLayout_hyperimgViewer->addWidget(imageViewerTabWidgetContainer, 0, 0, 1, 1);
gridLayout_hyperimgViewer->addWidget(line, 1, 0, 1, 1);
gridLayout_hyperimgViewer->addWidget(m_chartView, 2, 0, 1, 1);
gridLayout_hyperimgViewer->setRowStretch(0, 3);
gridLayout_hyperimgViewer->setRowStretch(1, 1);
gridLayout_hyperimgViewer->setRowStretch(2, 2);
dock_hyperimgViewerWidgetContents->setStyleSheet(R"(
QWidget #dock_hyperimgViewerWidgetContents{
background: #0D1233;
/*border: 1px solid #2c586b;*/
border-top: 2px solid #2c586b;
border-left: 1px solid #2c586b;
border-right: 1px solid #2c586b;
border-bottom: 2px solid #2c586b;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
)");
mPanelMenu->addAction(dock_hyperimgViewer->toggleViewAction());
QWidget* tmp6 = new QWidget();
dock_hyperimgViewer->setTitleBarWidget(tmp6);
dock_hyperimgViewer->setWidget(tmp(dock_hyperimgViewerWidgetContents));
//轮播看板
m_dock_carousel = new CustomDockWidgetBase(QString::fromLocal8Bit("轮播"), this);
m_dock_carousel->setObjectName("mDockCarousel");
m_dock_carousel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
mPanelMenu->addAction(m_dock_carousel->toggleViewAction());
//addDockWidget(Qt::LeftDockWidgetArea, m_dock_carousel);
QWidget* carouselContainer = new QWidget();
carouselContainer->setObjectName("carouselContainer");
carouselContainer->setStyleSheet(R"(
QWidget #carouselContainer
{
background-color: #0D1233;
border-top: 1px solid #2c586b;
border-left: 1px solid #2c586b;
border-right: 1px solid #2c586b;
border-bottom: 1px solid #2c586b;
border-top-left-radius: 0px;
border-top-right-radius: 0px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
)");
QGridLayout* gridLayout_carouselContainer = new QGridLayout(carouselContainer);
gridLayout_carouselContainer->setSpacing(0);
gridLayout_carouselContainer->setObjectName(QString::fromUtf8("gridLayout_carouselContainer"));
gridLayout_carouselContainer->setVerticalSpacing(0);
gridLayout_carouselContainer->setContentsMargins(2, 2, 2, 2);
m_carousel = new MyCarousel();
m_carousel->setObjectName(QString::fromUtf8("carousel"));
//---------------------------------------------------------------------
QScrollArea* sa = new QScrollArea();
sa->setObjectName("sa");
sa->setStyleSheet(R"(
border: none;
background-color: #0D1233;
)");
QGridLayout* gridLayout_sa = new QGridLayout(sa);
gridLayout_sa->setSpacing(6);
gridLayout_sa->setObjectName(QString::fromUtf8("gridLayout_sa"));
gridLayout_sa->setVerticalSpacing(0);
gridLayout_sa->setContentsMargins(0, 0, 0, 0);
m_cam_label = new QLabel();
m_cam_label->setAlignment(Qt::AlignHCenter);
m_cam_label->setStyleSheet(R"(
background-color: #0D1233;
)");
gridLayout_sa->addWidget(m_cam_label);
m_carousel->addWidget(sa);
m_carousel->setContentsMargins(0, 0, 0, 0);
//---------------------------------------------------------------------
QScrollArea* sa_depthCamera = new QScrollArea();
sa_depthCamera->setObjectName("sa_depthCamera");
sa_depthCamera->setStyleSheet(R"(
border: none;
background-color: #0D1233;
)");
QGridLayout* gridLayout_sa_depthCamera = new QGridLayout(sa_depthCamera);
gridLayout_sa_depthCamera->setSpacing(6);
gridLayout_sa_depthCamera->setObjectName(QString::fromUtf8("gridLayout_sa_depthCamera"));
gridLayout_sa_depthCamera->setVerticalSpacing(0);
gridLayout_sa_depthCamera->setContentsMargins(0, 0, 0, 0);
m_depthCamera_label = new QLabel();
m_depthCamera_label->setAlignment(Qt::AlignHCenter);
m_depthCamera_label->setStyleSheet(R"(
background-color: #0D1233;
)");
gridLayout_sa_depthCamera->addWidget(m_depthCamera_label);
m_carousel->addWidget(sa_depthCamera);
m_carousel->setContentsMargins(0, 0, 0, 0);
//---------------------------------------------------------------------
QScrollArea* sa_SingleLensReflexCamera = new QScrollArea();
sa_SingleLensReflexCamera->setObjectName("sa_SingleLensReflexCamera");
sa_SingleLensReflexCamera->setStyleSheet(R"(
border: none;
background-color: #0D1233;
)");
QGridLayout* gridLayout_sa_SingleLensReflexCamera = new QGridLayout(sa_SingleLensReflexCamera);
gridLayout_sa_SingleLensReflexCamera->setSpacing(6);
gridLayout_sa_SingleLensReflexCamera->setObjectName(QString::fromUtf8("gridLayout_sa_SingleLensReflexCamera"));
gridLayout_sa_SingleLensReflexCamera->setVerticalSpacing(0);
gridLayout_sa_SingleLensReflexCamera->setContentsMargins(0, 0, 0, 0);
m_SingleLensReflexCamera_label = new QLabel();
m_SingleLensReflexCamera_label->setAlignment(Qt::AlignHCenter);
m_SingleLensReflexCamera_label->setStyleSheet(R"(
background-color: #0D1233;
)");
gridLayout_sa_SingleLensReflexCamera->addWidget(m_SingleLensReflexCamera_label);
m_carousel->addWidget(sa_SingleLensReflexCamera);
m_carousel->setContentsMargins(0, 0, 0, 0);
m_carousel->play();
gridLayout_carouselContainer->addWidget(m_carousel);
m_dock_carousel->setWidget(tmp(carouselContainer));
//控制看板
ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("控制"));
//ui.mDockWidgetSpectrometer->show();
initControlTabwidget();
m_tabManager = new TabManager(ui.controlTabWidget, this);
ui.mDockWidgetSpectrometer->setWidget(tmp(ui.controlContents));
//3D模型看板
ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3D模型"));
//ui.mDockWidgetSimulator->show();
m_view3DModelManager = new View3DModelManager(this);
QWidget* modelWidgetContainer = new QWidget();
modelWidgetContainer->setObjectName("modelWidgetContainer");
modelWidgetContainer->setStyleSheet(R"(
QWidget #modelWidgetContainer
{
background-color: #0E1C4C;
border-top: 1px solid #2c586b;
border-left: 1px solid #2c586b;
border-right: 1px solid #2c586b;
border-bottom: 1px solid #2c586b;
border-top-left-radius: 0px;
border-top-right-radius: 0px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
)");
QGridLayout* gridLayout_modelWidgetContainer = new QGridLayout(modelWidgetContainer);
gridLayout_modelWidgetContainer->setSpacing(0);
gridLayout_modelWidgetContainer->setObjectName(QString::fromUtf8("gridLayout_modelWidgetContainer"));
gridLayout_modelWidgetContainer->setVerticalSpacing(0);
gridLayout_modelWidgetContainer->setContentsMargins(2, 2, 2, 2);
gridLayout_modelWidgetContainer->addWidget(m_view3DModelManager);
connect(m_view3DModelManager, SIGNAL(created3DModelPlantPhenotype()), this, SLOT(onCreated3DModelPlantPhenotype()));
connect(m_view3DModelManager, SIGNAL(created3DModelMicroscopicMotion()), this, SLOT(onCreated3DModelMicroscopicMotion()));
connect(m_view3DModelManager, SIGNAL(created3DModelOneMotor()), this, SLOT(onCreated3DModelOneMotor()));
ui.mDockWidgetSimulator->setWidget(tmp(modelWidgetContainer));
//看板排版
splitDockWidget(dock_layers, dock_hyperimgViewer, Qt::Horizontal);
splitDockWidget(dock_hyperimgViewer, m_dock_carousel, Qt::Horizontal);
//m_dock_carousel->show();
//ui.mDockWidgetRGBCamera->setMinimumWidth(449);
//ui.mDockWidgetRGBCamera->setMaximumWidth(450);
//ui.mDockWidgetRGBCamera->setMinimumHeight(497);
//ui.mDockWidgetRGBCamera->setMaximumHeight(498);
splitDockWidget(dock_layers, ui.mDockWidgetSimulator, Qt::Vertical);
splitDockWidget(m_dock_carousel, ui.mDockWidgetSpectrometer, Qt::Vertical);
setStyleSheet(R"(
QMainWindow::separator{
width: 16px;
height: 16px;
background: #040125; /* 可以添加背景色 */
/*border: 1px solid #808080;*/ /* 可以添加边框 */
}
QDockWidget {
border: 2px solid #2a347a; /* 深蓝色边框 */
background-color: red; /* 主体背景色 */
color: white; /* 标题文字颜色 */
border-radius: 4px;
}
/* 标题栏 */
QDockWidget::title {
background-color: #0E1C4C; /* 标题栏背景色 */
text-align: left; /* 标题文字居中 */
/*padding: 4px;*/
}
/* 可选:控制 DockWidget 的关闭按钮样式 */
QDockWidget::close-button, QDockWidget::float-button {
background: transparent;
border: none;
}
QDockWidget::close-button:hover, QDockWidget::float-button:hover {
background: rgba(255,255,255,0.2);
}
)");
//光谱仪操作
m_Imager = nullptr;
m_RecordThread = nullptr;
m_CopyFileThread = nullptr;
m_FileOperation = nullptr;
m_TestImagerStausThread = nullptr;
m_RecordState = 0;
connect(this->ui.action_connect_imager, SIGNAL(triggered()), this, SLOT(onconnect()));//信号与槽连接相机相机操作相关信号与槽绑定放在函数onconnect中
createActionGroups();
connect(mImagerGroup, &QActionGroup::triggered, this, &HPPA::selectingImager);
createMoveplatformActionGroup();
connect(moveplatformActionGroup, &QActionGroup::triggered, this, &HPPA::selectingMoveplatform);
createScenarioActionGroup();
connect(m_ScenarioActionGroup, &QActionGroup::triggered, this, &HPPA::selectScenario);
ui.mDockWidgetSimulator->setFeatures(QDockWidget::DockWidgetClosable);
initMapTools();
QString strPath = QCoreApplication::applicationDirPath() + "/UILayout.ini";
QFile file(strPath);
if (file.open(QIODevice::ReadOnly))
{
QByteArray ba;
QDataStream in(&file);
in >> ba;
file.close();
this->restoreState(ba);
}
this->showMaximized();
}
void HPPA::initMenubarToolbar()
{
//自定义菜单栏和工具栏
QWidget* menuWidget = new WidgetWithBackgroundPicture();
//menuWidget->setFixedWidth(200);
menuWidget->setFixedHeight(66);
QHBoxLayout* hLayout_menuWidget = new QHBoxLayout(menuWidget);
//auto menuBar_tmp = menuBar();
auto menuBar_tmp = ui.menuBar;
hLayout_menuWidget->addWidget(menuBar_tmp);
menuBar_tmp->setAutoFillBackground(false);
menuBar_tmp->setStyleSheet(R"(
QMenuBar {
background: transparent;/*transparent*/
border: none;
}
QMenuBar::item {
background: transparent;
color: white; /* 根据你的背景调整文字颜色 */
padding: 4px 8px;
padding-top: 8px;
padding-bottom: 8px;
}
QMenuBar::item:selected {
background: rgba(255, 255, 255, 50); /* 轻微高亮 */
}
QMenu {
background-color: #0A1245; /* 菜单背景色 */
border: 1px solid gray; /* 可选,边框样式 */
color: white; /* 根据你的背景调整文字颜色 */
}
QMenu::item:selected {
background-color: rgba(255, 255, 255, 50); /* 选中时的背景色 */
color: white; /* 选中项字体颜色,可选 */
}
)");
hLayout_menuWidget->addStretch();
QPushButton* closeBtn = new QPushButton(QString::fromLocal8Bit("退出平台"));
connect(closeBtn, SIGNAL(released()), this, SLOT(onExit()));
closeBtn->setStyleSheet(R"(
QPushButton {
background: #002CE0;
color: white;
font-size: 14px;
border: none;
padding: 8px;
}
QPushButton:hover {
background: #34495e;
}
)");
hLayout_menuWidget->addWidget(closeBtn);
QWidget* toolBarWidget = new QWidget();
toolBarWidget->setStyleSheet("background-color: #0D1233;");
QHBoxLayout* hLayout_toolBarWidget = new QHBoxLayout(toolBarWidget);
//QToolBar* toolBar = this->findChild<QToolBar*>("mainToolBar");
QToolBar* toolBar = ui.mainToolBar;
hLayout_toolBarWidget->addWidget(toolBar);
toolBar->setAttribute(Qt::WA_TranslucentBackground, true);
toolBar->setAutoFillBackground(false);
toolBar->setIconSize(QSize(56, 56));
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
//在工具栏上添加输入框QLineEdit
frame_number = new QLineEdit(ui.mainToolBar);
frame_number->setStyleSheet("QLineEdit{background-color:rgb(255,255,255);}");
frame_number->setMaximumWidth(100);
frame_number->setText("5000");
frame_number->setStyleSheet(R"(
QLineEdit {
background-color: #142D7F;
color: #e6eeff;
border: 1px solid #2f6bff;
border-radius: 6px;
padding: 4px 8px;
min-width: 70px;
min-height: 20px;
font-size: 13px;
}
QLineEdit:hover {
border: 1px solid #4d8dff;
}
QLineEdit:focus {
border: 1px solid #6aa2ff;
background-color: #23345c;
}
)");
QAction* action = ui.mainToolBar->insertWidget(ui.action_start_recording, frame_number);
frame_number->setEnabled(false);
m_FilenameLineEdit = new FileNameLineEdit(ui.mainToolBar);
m_FilenameLineEdit->setMaximumWidth(100);
m_FilenameLineEdit->setStyleSheet(R"(
QLineEdit {
background-color: #142D7F;
color: #e6eeff;
border: 1px solid #2f6bff;
border-radius: 6px;
padding: 4px 8px;
min-width: 70px;
min-height: 20px;
font-size: 13px;
}
QLineEdit:hover {
border: 1px solid #4d8dff;
}
QLineEdit:focus {
border: 1px solid #6aa2ff;
background-color: #23345c;
}
)");
QAction* action1 = ui.mainToolBar->insertWidget(ui.action_start_recording, m_FilenameLineEdit);
QWidget* spacer = new QWidget();
spacer->setFixedWidth(10); // 间距大小自己调
ui.mainToolBar->insertWidget(action1, spacer);
QAction* sepAction = ui.mainToolBar->insertSeparator(ui.mActionPan);
QWidget* sepWidget = ui.mainToolBar->widgetForAction(sepAction);
if (sepWidget) {
//sepWidget->setFixedWidth(15); // 调整宽度
sepWidget->setStyleSheet("background-color: #2C586C;"); // 调整颜色
}
ui.action_connect_imager->setIcon(QIcon(":/svg/resources/icons/svg/connect_imager.svg"));
ui.action_auto_exposure->setIcon(QIcon(":/svg/resources/icons/svg/exposure.svg"));
ui.action_focus->setIcon(QIcon(":/svg/resources/icons/svg/focus.svg"));
ui.action_dark->setIcon(QIcon(":/svg/resources/icons/svg/dark.svg"));
ui.action_reference->setIcon(QIcon(":/svg/resources/icons/svg/reference.svg"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record.svg"));
ui.actionOpenDirectory->setIcon(QIcon(":/svg/resources/icons/svg/openDirectory.svg"));
ui.mActionPan->setIcon(QIcon(":/svg/resources/icons/svg/pan.svg"));
ui.mActionSpectral->setIcon(QIcon(":/svg/resources/icons/svg/spectral.svg"));
connect(ui.mActionPan, &QAction::toggled, this, [=](bool checked) {
if (checked)
ui.mActionPan->setIcon(QIcon(":/svg/resources/icons/svg/pan_done.svg"));
else
ui.mActionPan->setIcon(QIcon(":/svg/resources/icons/svg/pan.svg"));
});
connect(ui.mActionSpectral, &QAction::toggled, this, [=](bool checked) {
if (checked)
ui.mActionSpectral->setIcon(QIcon(":/svg/resources/icons/svg/spectral_done.svg"));
else
ui.mActionSpectral->setIcon(QIcon(":/svg/resources/icons/svg/spectral.svg"));
});
// 使用样式表设置透明背景
toolBar->setStyleSheet(R"(
QToolBar {
background: #0D1233;/*transparent*/
border: 1px solid #2C586C;
border-radius: 6px;
}
QToolButton {
background: transparent;
color: white; /* 可根据背景调整文字颜色 */
padding: 4px;
margin: 0 0 0 6px;
}
QToolButton:hover {
background: rgba(255,255,255,50); /* 悬停时轻微高亮 */
}
)");
QWidget* topWidget = new QWidget();
topWidget->setStyleSheet("background-color: #040125;");
QVBoxLayout* verticalLayout_topWidget = new QVBoxLayout(topWidget);
verticalLayout_topWidget->addWidget(menuWidget);
verticalLayout_topWidget->addWidget(toolBarWidget);
setMenuWidget(topWidget);
}
QWidget* HPPA::tmp(QWidget* a)
{
QWidget* Background = new QWidget(this);
Background->setObjectName("Background");
QGridLayout* layout_Background = new QGridLayout(Background);
layout_Background->setContentsMargins(0, 0, 0, 0);
Background->setStyleSheet(R"(
QWidget #Background{
background: #040125;
}
)");
layout_Background->addWidget(a);
return Background;
}
void HPPA::initControlTabwidget()
{
ui.controlTabWidget->removeTab(0);//首先删除默认的tab
m_hic = new HyperImagerControl();
m_hic->setDisabled(true);
ui.controlTabWidget->addTab(m_hic, QString::fromLocal8Bit("光谱仪"));
ui.controlTabWidget->setCurrentIndex(0);
//图像控制
m_ic = new ImageControl();
m_ic->setWindowFlags(Qt::Widget);
connect(m_ic, SIGNAL(bandSelectionChanged(double, double, double)),
this, SLOT(onBandSelectionChanged(double, double, double)));
ui.controlTabWidget->addTab(m_ic, QString::fromLocal8Bit("图像控制"));//?????????????????????????????????????????????????????????????????????????????????????????????????
//深度相机
m_depthCameraWindow = new DepthCameraWindow();
ui.controlTabWidget->addTab(m_depthCameraWindow, QString::fromLocal8Bit("深度相机"));
//单反相机
m_singleLensReflexCameraWindow = new SingleLensReflexCameraWindow();
connect(m_singleLensReflexCameraWindow, &SingleLensReflexCameraWindow::LiveViewImageReady, this, &HPPA::onLiveViewImageReady);
connect(m_singleLensReflexCameraWindow, &SingleLensReflexCameraWindow::LiveViewStopped, this, &HPPA::onLiveViewStopped);
ui.controlTabWidget->addTab(m_singleLensReflexCameraWindow, QString::fromLocal8Bit("单反相机"));
//rgb相机
m_rgbCameraControlWindow = new rgbCameraWindow();
connect(m_rgbCameraControlWindow, &rgbCameraWindow::PlotRgbImageSignal, this, &HPPA::onPlotRgbImage);
connect(m_rgbCameraControlWindow, &rgbCameraWindow::CamClosedSignal, this, &HPPA::onClearLabel);
connect(m_depthCameraWindow, &DepthCameraWindow::PlotDepthImageSignal, this, &HPPA::onPlotDepthImage);
connect(m_depthCameraWindow, &DepthCameraWindow::DepthCamClosedSignal, this, &HPPA::onClearDepthLabel);
ui.controlTabWidget->addTab(m_rgbCameraControlWindow, QString::fromLocal8Bit("rgb相机"));
//升降桌dock
m_adt = new adjustTable();
m_adt->setWindowFlags(Qt::Widget);
ui.controlTabWidget->addTab(m_adt, QString::fromLocal8Bit("升降桌"));
//电源控制
m_pc = new PowerControl();
m_pc->setWindowFlags(Qt::Widget);
ui.controlTabWidget->addTab(m_pc, QString::fromLocal8Bit("电源控制"));
//机械臂控制
m_rac = new RobotArmControl();
connect(m_rac->robotController, SIGNAL(hsiRecordSignal(int)), this, SLOT(recordFromRobotArm(int)));
m_rac->setWindowFlags(Qt::Widget);
ui.controlTabWidget->addTab(m_rac, QString::fromLocal8Bit("机械臂控制"));
//1轴马达控制
m_omc = new OneMotorControl();
m_omc->setWindowFlags(Qt::Widget);
ui.controlTabWidget->addTab(m_omc, QString::fromLocal8Bit("1轴马达控制"));
//2轴马达控制
m_tmc = new TwoMotorControl(this);
//connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int)));
connect(m_tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete()));
m_tmc->setWindowFlags(Qt::Widget);
ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2轴控制"));
// Connect ImageControl band change to re-render (m_ic created in initControlTabwidget)
//connect(m_ic, SIGNAL(bandSelectionChanged(double, double, double)),
// this, SLOT(onBandSelectionChanged(double, double, double)));
}
void HPPA::recordFromRobotArm(int fileCounter)
{
if (!testImagerVality())
{
showMessageBox(QString::fromLocal8Bit("找不到光谱仪!"));
return;
}
//qDebug() << "recordFromRobotArm" << fileCounter;
if (fileCounter == -1)
{
m_Imager->setRecordControlState(false);
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
//qDebug() << "recordFromRobotArm: 1111111111111111111111";
return;
}
if (fileCounter - 1 == 0)
{
//m_imageViewerTabWidget->clear();
removeAllLayersInRasterGroup();
}
onCreateTab("img");
emit StartRecordSignal();
ui.action_start_recording->setText(QString::fromLocal8Bit("采集中"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_ing.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}");
//qDebug() << "recordFromRobotArm: 2222222222222222222222";
}
void HPPA::createActionGroups()
{
// Imager Tool Group
mImagerGroup = new QActionGroup(this);
mImagerGroup->addAction(ui.mActionPica_L);
mImagerGroup->addAction(ui.mActionPika_XC2);
mImagerGroup->addAction(ui.mActionCorning_410);
mImagerGroup->addAction(ui.mActionPica_NIR);
// 读取上次选择的结果
QSettings settings;
QString lastSelectedAction = settings.value("LastSelectedImagerAction").toString();
// 恢复上次选择的结果
if (lastSelectedAction == "mActionPica_L")
{
ui.mActionPica_L->setChecked(true);
}
else if (lastSelectedAction == "mActionPica_NIR")
{
ui.mActionPica_NIR->setChecked(true);
}
else if (lastSelectedAction == "mActionPika_XC2")
{
ui.mActionPika_XC2->setChecked(true);
}
else if (lastSelectedAction == "mActionCorning_410")
{
ui.mActionCorning_410->setChecked(true);
}
updateImagerPicture(lastSelectedAction);
}
void HPPA::selectingImager(QAction* selectedAction)
{
QSettings settings;
settings.setValue("LastSelectedImagerAction", selectedAction->objectName());
settings.sync();
updateImagerPicture(selectedAction->objectName());
}
void HPPA::updateImagerPicture(const QString& actionName)
{
QString picPath;
if (actionName == "mActionPica_L")
picPath = ":/imagerPicture/resources/icons/imagerPicture/L.png";
else if (actionName == "mActionPica_NIR")
picPath = ":/imagerPicture/resources/icons/imagerPicture/IR.png";
else if (actionName == "mActionPika_XC2")
picPath = ":/imagerPicture/resources/icons/imagerPicture/XC2.png";
else if (actionName == "mActionCorning_410")
picPath = ":/imagerPicture/resources/icons/imagerPicture/corning410.png";
if (!picPath.isEmpty())
{
QPixmap pixmap(picPath);
if (!pixmap.isNull())
{
QImage img = pixmap.toImage().convertToFormat(QImage::Format_ARGB32);
const int threshold = 240;
for (int y = 0; y < img.height(); ++y)
{
QRgb* line = reinterpret_cast<QRgb*>(img.scanLine(y));
for (int x = 0; x < img.width(); ++x)
{
if (qRed(line[x]) >= threshold && qGreen(line[x]) >= threshold && qBlue(line[x]) >= threshold)
{
line[x] = qRgba(qRed(line[x]), qGreen(line[x]), qBlue(line[x]), 0);
}
}
}
m_hic->imagerPictureLabel()->setAttribute(Qt::WA_TranslucentBackground);
m_hic->imagerPictureLabel()->setOriginalPixmap(QPixmap::fromImage(img));
}
}
}
void HPPA::createMoveplatformActionGroup()
{
moveplatformActionGroup = new QActionGroup(this);
moveplatformActionGroup->addAction(ui.mAction_is_no_motor);
moveplatformActionGroup->addAction(ui.mAction_RobotArm);
moveplatformActionGroup->addAction(ui.mAction_1AxisMotor);
moveplatformActionGroup->addAction(ui.mAction_2AxisMotor_new);
// 读取上次选择的结果
QSettings settings;
QString lastSelectedAction = settings.value("LastSelectedMoveplatform").toString();
// 恢复上次选择的结果
if (lastSelectedAction == "mAction_is_no_motor")
{
ui.mAction_is_no_motor->setChecked(true);
}
else if (lastSelectedAction == "mAction_RobotArm")
{
ui.mAction_RobotArm->setChecked(true);
}
else if (lastSelectedAction == "mAction_1AxisMotor")
{
ui.mAction_1AxisMotor->setChecked(true);
}
else if (lastSelectedAction == "mAction_2AxisMotor_new")
{
ui.mAction_2AxisMotor_new->setChecked(true);
}
}
void HPPA::selectingMoveplatform(QAction* selectedAction)
{
QSettings settings;
settings.setValue("LastSelectedMoveplatform", selectedAction->objectName());
settings.sync();
}
HPPA::~HPPA()
{
QString strPath = QCoreApplication::applicationDirPath() + "/UILayout.ini";
QFile file(strPath);
if (file.open(QIODevice::WriteOnly)) {
QDataStream outfile(&file);
QByteArray ba = this->saveState();
outfile << ba;
file.close();
}
disconnectImagerAndCleanup();
if (s_instance == this)
{
s_instance = nullptr;
}
}
void HPPA::removeLayerByTreeIndex()
{
QModelIndex currentIndexTmp = m_layerTreeView->currentIndex();
if (!currentIndexTmp.isValid()) return;
LayerTreeModel* model = const_cast<LayerTreeModel*>(static_cast<const LayerTreeModel*>(currentIndexTmp.model()));
if (!model) return;
LayerTreeNode* node = static_cast<LayerTreeNode*>(currentIndexTmp.internalPointer());
if (!node || node->type() != LayerTreeNode::Type::Layer) return;
removeLayerByNode(node);
}
void HPPA::removeLayerByNode(LayerTreeNode* node)
{
if (!node || node->type() != LayerTreeNode::Type::Layer) return;
auto* layerNode = static_cast<LayerTreeLayer*>(node);
MapLayer* mapLayer = layerNode->mapLayer();
if (!mapLayer || !m_MapLayerStore) return;
// 获取该 mapLayer 对应的所有 widget 并从 tab 中移除
std::vector<QWidget*> widgets = m_MapLayerStore->widgetsForMapLayer(mapLayer);
for (QWidget* widget : widgets)
{
if (widget && m_imageViewerTabWidget)
{
const int tabIndex = m_imageViewerTabWidget->indexOf(widget);
if (tabIndex >= 0)
{
if (m_recordFrameCounter)
{
m_recordFrameCounter->removeCounter(widget);
}
m_imageViewerTabWidget->removeTab(tabIndex);
}
widget->deleteLater();
}
}
// 删除 MapLayerStore 中的 mapLayer
m_MapLayerStore->removeLayer(mapLayer);
// 删除树模型中的节点
LayerTreeNode* parent = node->parentNode();
int row = node->rowInParent();
LayerTreeNode* removed = m_LayerTreeModel->removeNode(parent, row);
if (removed)
{
delete removed;
}
}
void HPPA::showColorImageByTreeIndex()
{
QModelIndex currentIndexTmp = m_layerTreeView->currentIndex();
if (!currentIndexTmp.isValid()) return;
LayerTreeModel* model = const_cast<LayerTreeModel*>(static_cast<const LayerTreeModel*>(currentIndexTmp.model()));
if (!model) return;
LayerTreeNode* node = static_cast<LayerTreeNode*>(currentIndexTmp.internalPointer());
if (!node || node->type() != LayerTreeNode::Type::Layer) return;
auto* layerNode = static_cast<LayerTreeLayer*>(node);
RasterLayer* mapLayer = static_cast<RasterLayer*>(layerNode->mapLayer());
newImage(mapLayer, RasterImageLayer::RendererType::Multiband, node);
}
void HPPA::removeImageByTreeIndex()
{
QModelIndex currentIndexTmp = m_layerTreeView->currentIndex();
if (!currentIndexTmp.isValid()) return;
LayerTreeModel* model = const_cast<LayerTreeModel*>(static_cast<const LayerTreeModel*>(currentIndexTmp.model()));
if (!model) return;
LayerTreeNode* node = static_cast<LayerTreeNode*>(currentIndexTmp.internalPointer());
if (!node || node->type() != LayerTreeNode::Type::Image) return;
auto* layerNode = static_cast<LayerTreeImageNode*>(node);
RasterImageLayer* rasterImageLayer = layerNode->imageLayer();
QWidget* layerWidget = nullptr;
if (rasterImageLayer && m_MapLayerStore)
{
layerWidget = m_MapLayerStore->widgetForImageLayer(rasterImageLayer);
m_MapLayerStore->removeImageLayer(rasterImageLayer);
}
if (layerWidget && m_imageViewerTabWidget)
{
const int tabIndex = m_imageViewerTabWidget->indexOf(layerWidget);
if (tabIndex >= 0)
{
if (m_recordFrameCounter)
{
m_recordFrameCounter->removeCounter(layerWidget);
}
m_imageViewerTabWidget->removeTab(tabIndex);
}
layerWidget->deleteLater();
}
LayerTreeNode* parent = node->parentNode();
int row = node->rowInParent();
LayerTreeNode* removed = model->removeNode(parent, row);
if (removed)
{
delete removed;
}
}
void HPPA::removeAllLayersInRasterGroup()
{
if (!m_LayerTreeModel || !m_RasterGroup) return;
QVector<LayerTreeNode*> pending;
for (int i = 0; i < m_RasterGroup->childCount(); ++i)
{
pending.push_back(m_RasterGroup->childAt(i));
}
while (!pending.isEmpty())
{
LayerTreeNode* node = pending.back();
pending.pop_back();
if (!node) continue;
removeLayerByNode(node);
}
}
void HPPA::initPanelToolbar()
{
mPanelMenu = new QMenu(QString::fromLocal8Bit("面板"), this);//create panel menu
mPanelMenu->setObjectName(QStringLiteral("mPanelMenu"));
mToolbarMenu = new QMenu(QString::fromLocal8Bit("工具栏"), this);//create toolbar menu
mToolbarMenu->setObjectName(QStringLiteral("mToolbarMenu"));
ui.mWindowsMenu->addSeparator();
ui.mWindowsMenu->addMenu(mPanelMenu);
ui.mWindowsMenu->addMenu(mToolbarMenu);
mPanelMenu->setStyleSheet(R"(
QMenu {
background-color: #0A1245; /* 菜单背景色 */
border: 1px solid gray; /* 可选,边框样式 */
color: white; /* 根据你的背景调整文字颜色 */
}
QMenu::item:selected {
background-color: rgba(255, 255, 255, 50); /* 选中时的背景色 */
color: white; /* 选中项字体颜色,可选 */
}
)");
mToolbarMenu->setStyleSheet(R"(
QMenu {
background-color: #0A1245; /* 菜单背景色 */
border: 1px solid gray; /* 可选,边框样式 */
color: white; /* 根据你的背景调整文字颜色 */
}
QMenu::item:selected {
background-color: rgba(255, 255, 255, 50); /* 选中时的背景色 */
color: white; /* 选中项字体颜色,可选 */
}
)");
mPanelMenu->addAction(ui.mDockWidgetSpectrometer->toggleViewAction());
mPanelMenu->addAction(ui.mDockWidgetSimulator->toggleViewAction());
mToolbarMenu->addAction(ui.mainToolBar->toggleViewAction());
}
void HPPA::initMapTools()
{
ui.mActionPan->setCheckable(true);
ui.mActionSpectral->setCheckable(true);
m_mapToolActionGroup = new QActionGroup(this);
m_mapToolActionGroup->addAction(ui.mActionPan);
m_mapToolActionGroup->addAction(ui.mActionSpectral);
m_mapToolActionGroup->setExclusive(true);
m_mapTools = new MapTools(this);
m_mapTools->mapToolPan()->setAction(ui.mActionPan);
m_mapTools->mapToolSpectral()->setAction(ui.mActionSpectral);
connect(m_mapTools->mapToolSpectral(), SIGNAL(spectralClicked(int,int,QVector<double>,QVector<double>)),
this, SLOT(onLeftMouseButtonPressed(int,int,QVector<double>,QVector<double>)));
connect(ui.mActionPan, SIGNAL(triggered()), this, SLOT(onMapToolPanTriggered()));
connect(ui.mActionSpectral, SIGNAL(triggered()), this, SLOT(onMapToolSpectralTriggered()));
// Default tool: pan
ui.mActionPan->trigger();
}
void HPPA::onMapToolPanTriggered()
{
m_mapTools->setActiveTool(m_mapTools->mapToolPan());
setMapTool();
}
void HPPA::onMapToolSpectralTriggered()
{
m_mapTools->setActiveTool(m_mapTools->mapToolSpectral());
setMapTool();
}
void HPPA::setMapTool()
{
int tmp = m_imageViewerTabWidget->count();
if (tmp == 0) return;
int currentIndex = m_imageViewerTabWidget->currentIndex();
onTabWidgetCurrentChanged(currentIndex);
}
//----------------------------------------------------
void HPPA::createScenarioActionGroup()
{
m_ScenarioActionGroup = new QActionGroup(this);
m_ScenarioActionGroup->addAction(ui.mActionOneMotorScenario);
m_ScenarioActionGroup->addAction(ui.mActionPlantPhenotypeScenario);
m_ScenarioActionGroup->addAction(ui.mAction3DPlantPhenotypeScenario);
m_ScenarioActionGroup->addAction(ui.mActionMicroscopicMotionControlScenario);
// 读取上次选择的结果
QSettings settings;
QString lastSelectedAction = settings.value("LastSelectedScenario").toString();
// 恢复上次选择的结果
if (lastSelectedAction == "mActionOneMotorScenario")
{
ui.mActionOneMotorScenario->setChecked(true);
ui.mActionOneMotorScenario->trigger();
}
else if (lastSelectedAction == "mActionPlantPhenotypeScenario")
{
ui.mActionPlantPhenotypeScenario->setChecked(true);
ui.mActionPlantPhenotypeScenario->trigger();
}
else if (lastSelectedAction == "mAction3DPlantPhenotypeScenario")
{
ui.mAction3DPlantPhenotypeScenario->setChecked(true);
ui.mAction3DPlantPhenotypeScenario->trigger();
}
else if (lastSelectedAction == "mActionMicroscopicMotionControlScenario")
{
ui.mActionMicroscopicMotionControlScenario->setChecked(true);
ui.mActionMicroscopicMotionControlScenario->trigger();
}
}
void HPPA::selectScenario(QAction* selectedAction)
{
QSettings settings;
settings.setValue("LastSelectedScenario", selectedAction->objectName());
settings.sync();
}
void HPPA::onCreated3DModelOneMotor()
{
connect(m_omc, SIGNAL(broadcastLocationSignal(std::vector<double>)), m_view3DModelManager->m_viewMotor, SLOT(setLoc(std::vector<double>)));
}
void HPPA::createOneMotorScenario()
{
//if (ui.mActionOneMotorScenario->isChecked())
// return;
//清除所有DockWidget
//QList<QDockWidget*> dockWidgets = this->findChildren<QDockWidget*>();
//for (QDockWidget* dock : dockWidgets)
//{
// dock->hide();
//}
//在菜单中选择移动平台
ui.mAction_1AxisMotor->setChecked(true);
//右下角控制tab
m_tabManager->hideAllTabs();
m_tabManager->showTab(m_hic);
m_tabManager->showTab(m_ic);
m_tabManager->showTab(m_omc);
m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::OneMotor);
//右上角轮播
}
void HPPA::onCreated3DModelPlantPhenotype()
{
connect(m_tmc, SIGNAL(broadcastLocationSignal(std::vector<double>)), m_view3DModelManager->m_viewPlant, SLOT(setLoc(std::vector<double>)));
}
void HPPA::onCreated3DModelMicroscopicMotion()
{
connect(m_tmc, SIGNAL(broadcastLocationSignal(std::vector<double>)), m_view3DModelManager->m_viewMicroscopicMotionControlModel, SLOT(setLoc(std::vector<double>)));
}
void HPPA::createPlantPhenotypeScenario()
{
//if (ui.mActionPlantPhenotypeScenario->isChecked())
// return;
//在菜单中选择移动平台
ui.mAction_2AxisMotor_new->setChecked(true);
//右下角控制tab
m_tabManager->hideAllTabs();
m_tabManager->showTab(m_hic);
m_tabManager->showTab(m_ic);
m_tabManager->showTab(m_rgbCameraControlWindow);
m_tabManager->showTab(m_adt);
m_tabManager->showTab(m_pc);
m_tabManager->showTab(m_tmc);
m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::PlantPhenotype);
//右上角轮播
}
void HPPA::create3DPlantPhenotypeScenario()
{
//if (ui.mAction3DPlantPhenotypeScenario->isChecked())
// return;
//在菜单中选择移动平台
ui.mAction_2AxisMotor_new->setChecked(true);
//右下角控制tab
m_tabManager->hideAllTabs();
m_tabManager->showTab(m_hic);
m_tabManager->showTab(m_ic);
m_tabManager->showTab(m_depthCameraWindow);
m_tabManager->showTab(m_singleLensReflexCameraWindow);
//m_tabManager->showTab(m_rgbCameraControlWindow);
m_tabManager->showTab(m_adt);
m_tabManager->showTab(m_pc);
m_tabManager->showTab(m_tmc);
m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::PlantPhenotype);
//右上角轮播
}
void HPPA::createMicroscopicMotionControlScenario()
{
//if (ui.mActionMicroscopicMotionControl->isChecked())
// return;
//在菜单中选择移动平台
ui.mAction_2AxisMotor_new->setChecked(true);
//右下角控制tab
m_tabManager->hideAllTabs();
m_tabManager->showTab(m_hic);
m_tabManager->showTab(m_ic);
m_tabManager->showTab(m_tmc);
m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::MicroscopicMotionControl);
//右上角轮播
}
bool HPPA::testImagerVality()
{
try
{
if (m_Imager == nullptr)
{
return false;
}
double framerate = m_Imager->getFramerate();
m_Imager->setFramerate(framerate);
return true;
}
catch (const std::exception& e)
{
disconnectImagerAndCleanup();
return false;
}
catch (int e)//ximea相机异常
{
disconnectImagerAndCleanup();
return false;
}
catch (...)
{
disconnectImagerAndCleanup();
return false;
}
}
void HPPA::showMessageBox(QString msg, QString title)
{
QMessageBox msgBox(this);
msgBox.setWindowTitle(title);
msgBox.setText(msg);
msgBox.setStyleSheet(R"(
QMessageBox {
background-color: #0D1233;
}
QMessageBox QLabel {
color: #ACCDFF;
font-size: 14px;
}
QPushButton {
background-color: #142D7F;
color: #e6eeff;
border: 1px solid #2f6bff;
border-radius: 6px;
padding: 6px 20px;
min-width: 60px;
font-size: 13px;
}
QPushButton:hover {
border: 1px solid #4d8dff;
background-color: red;
}
QPushButton:pressed {
background-color: #23345c;
}
)");
msgBox.exec();
}
bool HPPA::showResultMessageBox(QString title, QString msg)
{
QMessageBox msgBox(this);
msgBox.setWindowTitle(title);
msgBox.setText(msg);
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
msgBox.setStyleSheet(R"(
QMessageBox {
background-color: #0D1233;
}
QMessageBox QLabel {
color: #ACCDFF;
font-size: 14px;
}
QPushButton {
background-color: #142D7F;
color: #e6eeff;
border: 1px solid #2f6bff;
border-radius: 6px;
padding: 6px 20px;
min-width: 60px;
font-size: 13px;
}
QPushButton:hover {
border: 1px solid #4d8dff;
background-color: red;
}
QPushButton:pressed {
background-color: #23345c;
}
)");
QMessageBox::StandardButton ret = static_cast<QMessageBox::StandardButton>(msgBox.exec());
if (ret == QMessageBox::Yes)
{
return true;
}
else
{
return false;
}
}
void HPPA::onStartRecordStep1()
{
//判断移动平台
QAction* checked = moveplatformActionGroup->checkedAction();
if (!checked)
{
showMessageBox(QString::fromLocal8Bit("请选择扫描平台!"));
return;
}
QString checkedName = checked->objectName();
if (checkedName == "mAction_is_no_motor")
{
}
else if (checkedName == "mAction_1AxisMotor")
{
if (!m_omc->getMotorsConnectionStatus())
{
showMessageBox(QString::fromLocal8Bit("找不到马达!"));
return;
}
}
else if (checkedName == "mAction_2AxisMotor_new")
{
if (!m_tmc->getMotorsConnectionStatus())
{
showMessageBox(QString::fromLocal8Bit("找不到马达!"));
return;
}
}
else if (checkedName == "mAction_RobotArm")
{
}
//判断光谱仪
if(!testImagerVality())
{
showMessageBox(QString::fromLocal8Bit("找不到光谱仪!"));
return;
}
//判断是否覆盖存在的文件
string imgPath = (AppSettings::instance().dataFolder() + QDir::separator() + AppSettings::instance().fileName()).toStdString();
string x_location = removeFileExtension(imgPath) + "_x_location.pos";
m_RecordState += 1;
if (m_RecordState % 2 == 1)
{
m_RecordState -= 1;
string tmp = imgPath + "_" + std::to_string(0) + ".bil";
int x = _access(tmp.c_str(), 0);
if (!x)//如果文件存在就执行此if的代码
{
bool res = showResultMessageBox(QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("文件存在!是否覆盖?"));
if (!res)
{
return;
}
}
}
else
{
m_RecordState -= 1;
}
if (checkedName == "mAction_is_no_motor")
{
m_RecordState += 1;
if (m_RecordState % 2 == 1)
{
//m_imageViewerTabWidget->clear();
removeAllLayersInRasterGroup();
emit updateRecordingFileInfoSignal(AppSettings::instance().dataFolder(), AppSettings::instance().fileName(), this->frame_number->text().toInt());
emit StartRecordSignal();//发射开始采集信号
ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_ing.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}");
}
else
{
m_Imager->setRecordControlState(false);//光谱仪停止采集
m_RecordState -= 1;
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
return;
}
else if (checkedName == "mAction_1AxisMotor")
{
m_RecordState += 1;
if (m_RecordState % 2 == 1)
{
//m_imageViewerTabWidget->clear();
removeAllLayersInRasterGroup();
ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_ing.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}");
//应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号)
emit updateRecordingFileInfoSignal(AppSettings::instance().dataFolder(), AppSettings::instance().fileName(), this->frame_number->text().toInt());
m_omc->setImager(m_Imager);
m_omc->run();
}
else
{
m_omc->stop();
m_RecordState -= 1;
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
return;
}
else if (checkedName == "mAction_2AxisMotor_new")
{
m_RecordState += 1;
if (m_RecordState % 2 == 1)
{
//m_imageViewerTabWidget->clear();
removeAllLayersInRasterGroup();
ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_ing.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}");
emit updateRecordingFileInfoSignal(AppSettings::instance().dataFolder(), AppSettings::instance().fileName(), this->frame_number->text().toInt());
m_tmc->setImager(m_Imager);
m_tmc->setPosFileName(QString::fromStdString(x_location));
m_tmc->run();
}
else
{
m_tmc->stop();
m_RecordState--;
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
return;
}
else if (checkedName == "mAction_RobotArm")
{
//先判断是否选择了任务执行函数RobotArmControl::executeTask修复界面显示bug
emit updateRecordingFileInfoSignal(AppSettings::instance().dataFolder(), AppSettings::instance().fileName(), this->frame_number->text().toInt());
m_rac->executeTaskWithHyperImager();
return;
}
}
QWidget* HPPA::onCreateTab(QString tabName)
{
QWidget* tabTmp = new QWidget();
QGridLayout* GridLayout = new QGridLayout();
GridLayout->addWidget(new Mapcavas(tabTmp));
tabTmp->setLayout(GridLayout);
m_imageViewerTabWidget->addTab(tabTmp, tabName);
m_imageViewerTabWidget->setCurrentIndex(m_imageViewerTabWidget->count() - 1);
if (m_recordFrameCounter)
{
m_recordFrameCounter->addCounter(tabTmp);
}
return tabTmp;
}
void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab会调用onTabWidgetCurrentChanged函数
{
if (index < 0)//当删除所有tab时index=-1
{
return;
}
//记录当前
m_TabWidgetCurrentIndex = index;
if (m_recordFrameCounter)
{
QWidget* currentWidget = m_imageViewerTabWidget->widget(index);
m_recordFrameCounter->switchTo(currentWidget);
}
//获取绘图控件
QWidget* currentWidget = m_imageViewerTabWidget->widget(index);
QList<Mapcavas*> currentImageViewer = currentWidget->findChildren<Mapcavas*>();
// Re-apply the current active map tool to the new canvas
Mapcavas* canvas = currentImageViewer[0];
m_mapTools->setMapcavas(canvas);
MapTool* activeTool = m_mapTools->activeTool();
if (activeTool)
{
canvas->setMapTool(activeTool);
}
// Sync layer tree view selection with the current tab
if (m_MapLayerStore && m_layerTreeView && m_LayerTreeModel && m_RasterGroup)
{
MapLayer* layer = m_MapLayerStore->mapLayerForWidget(currentWidget);
if (layer)
{
// Find the LayerTreeLayer node in m_RasterGroup that matches this layer
for (int i = 0; i < m_RasterGroup->childCount(); ++i)
{
LayerTreeNode* child = m_RasterGroup->childAt(i);
if (child && child->type() == LayerTreeNode::Type::Layer)
{
auto* layerNode = static_cast<LayerTreeLayer*>(child);
if (layerNode->mapLayer() == layer)
{
QModelIndex nodeIndex = m_LayerTreeModel->index(i, 0,
m_LayerTreeModel->index(m_RasterGroup->rowInParent(), 0));
// Block signals to avoid infinite loop with onLayerTreeSelectionChanged
m_layerTreeView->selectionModel()->blockSignals(true);
m_layerTreeView->setCurrentIndex(nodeIndex);
m_layerTreeView->selectionModel()->blockSignals(false);
// Manually update ImageControl since we blocked the signal
QList<Mapcavas*> mapcavas = currentWidget->findChildren<Mapcavas*>();
if (!mapcavas.isEmpty()) {
m_ic->setActiveLayer(mapcavas[0]->imageLayer());
}
break;
}
}
}
}
}
}
void HPPA::onActionOpenDirectory()
{
FileOperation* fileOperation = new FileOperation();
string directory = fileOperation->getDirectoryFromString();
QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(directory)));
}
void HPPA::onFramerateChanged(double framerate)
{
if (!m_Imager) return;
m_Imager->setFramerate(framerate);
m_hic->setFrameRate(m_Imager->getFramerate());
}
void HPPA::onIntegrationTimeChanged(double integrationTime)
{
if (!m_Imager) return;
m_Imager->setIntegrationTime(integrationTime);
m_hic->setIntegrationTime(m_Imager->getIntegrationTime());
}
void HPPA::onGainChanged(double gain)
{
if (!m_Imager) return;
m_Imager->setGain(gain);
m_hic->setGain(m_Imager->getGain());
}
void HPPA::onLeftMouseButtonPressed(int x, int y, QVector<double> wavelengths, QVector<double> spectrum)
{
Q_UNUSED(x);
Q_UNUSED(y);
try
{
//正在采集时,不能显示光谱曲线
if (m_RecordState % 2 == 1)
{
return;
}
if (spectrum.isEmpty())
{
return;
}
QLineSeries* series = new QLineSeries();
const int count = qMin(wavelengths.size(), spectrum.size());
if (count > 0)
{
for (int i = 0; i < count; ++i)
{
series->append(wavelengths[i], spectrum[i]);
}
}
else
{
for (int i = 0; i < spectrum.size(); ++i)
{
series->append(i, spectrum[i]);
}
}
series->setPen(QPen(QColor("#FF928A"), 2));
m_chart->removeAllSeries();
m_chart->addSeries(series);
m_chart->createDefaultAxes();
QValueAxis* axisX = qobject_cast<QValueAxis*>(m_chart->axisX());
QValueAxis* axisY = qobject_cast<QValueAxis*>(m_chart->axisY());
setAxis(axisX, axisY);
}
catch (const std::exception&)
{
std::cout << "显示光谱有错误!" << std::endl;
}
}
void HPPA::setAxis(QValueAxis* axisX, QValueAxis* axisY)
{
if (axisX && axisY)
{
QPen axisPen(QColor("#ACCDFF"));
axisPen.setWidth(1);
// 坐标轴线颜色
axisX->setLinePen(axisPen);
axisY->setLinePen(axisPen);
// 坐标标签颜色
axisX->setLabelsColor(QColor("#ACCDFF"));
axisY->setLabelsColor(QColor("#ACCDFF"));
// 网格线颜色
QPen gridPen(QColor("#262A4C"));
gridPen.setStyle(Qt::DashLine);
gridPen.setWidth(2);
axisX->setGridLinePen(gridPen);
axisY->setGridLinePen(gridPen);
}
}
void HPPA::timerEvent(QTimerEvent* event)
{
}
void HPPA::setImagerSimulationPos(double x, double y)
{
x = widthScale * x;
y = heightScale * y;
//ui.graphicsView->imager->setPos(x, y);
}
void HPPA::onimagerSimulatorMove(int x, int y)
{
}
void HPPA::OnSendLogToCallClass(QString str)
{
qDebug() << str;
}
void HPPA::onPlotRgbImage()
{
//std::cout << "显示视频+++++++++++++++++++++++++++++++++++++++++++" << std::endl;
QPixmap pixmap = QPixmap::fromImage(m_rgbCameraControlWindow->m_RgbCamera->m_qImage);
int width = m_cam_label->width();
int height = m_cam_label->height();
QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); //按比例缩放
m_cam_label->setPixmap(fitpixmap);
}
void HPPA::onClearLabel()
{
m_cam_label->clear();
m_cam_label->setText("closed");
}
void HPPA::onLiveViewImageReady(const QImage& image)
{
if (m_SingleLensReflexCamera_label && !image.isNull())
{
// 缩放图像以适应标签大小
QPixmap pixmap = QPixmap::fromImage(image);
pixmap = pixmap.scaled(m_SingleLensReflexCamera_label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_SingleLensReflexCamera_label->setPixmap(pixmap);
}
}
void HPPA::onLiveViewStopped()
{
m_SingleLensReflexCamera_label->clear();
}
void HPPA::onPlotDepthImage()
{
QPixmap pixmap = QPixmap::fromImage(m_depthCameraWindow->m_DepthCameraOperation->m_depthImage);
int width = m_depthCamera_label->width();
int height = m_depthCamera_label->height();
QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_depthCamera_label->setPixmap(fitpixmap);
}
void HPPA::onClearDepthLabel()
{
m_depthCamera_label->clear();
m_depthCamera_label->setText("closed");
}
void HPPA::onCopyFinished()
{
this->setEnabled(true);
}
void HPPA::getRequest(QString str)
{
QNetworkRequest request;
QNetworkAccessManager* naManager = new QNetworkAccessManager(this);
QMetaObject::Connection connRet = QObject::connect(naManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(requestFinished(QNetworkReply*)));
Q_ASSERT(connRet);
request.setUrl(QUrl(str));
QNetworkReply* reply = naManager->get(request);
}
void HPPA::requestFinished(QNetworkReply* reply) {
// 获取http状态码
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode.isValid())
qDebug() << "status code=" << statusCode.toInt();
QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
if (reason.isValid())
qDebug() << "reason=" << reason.toString();
QNetworkReply::NetworkError err = reply->error();
if (err != QNetworkReply::NoError) {
qDebug() << "Failed: " << reply->errorString();
}
else {
// 获取返回内容
qDebug() << reply->readAll();
}
}
void HPPA::onExit()
{
this->close();
}
void HPPA::closeEvent(QCloseEvent* event)
{
bool res = showResultMessageBox(QString::fromLocal8Bit("退出确认"), QString::fromLocal8Bit("确定要退出程序吗?"));
if (res)
{
event->accept(); // 允许关闭
}
else
{
event->ignore(); // 取消关闭
}
}
void HPPA::onOpenImg()
{
// 1) 弹出文件对话框获取uri
QString uri = QFileDialog::getOpenFileName(this, tr("Open Image"), QString(), tr("Raster Files (*.bil *.bip *.tif *.tiff *.img *.bsq);;All Files (*)"));
if (uri.isEmpty())
return;
//判断是否已经打开
if (m_MapLayerStore->containsLayer(uri))
return;
// 2) 创建 RasterLayer然后添加到图层管理器
if (!m_LayerTreeModel || !m_RasterGroup)
{
QMessageBox::warning(this, tr("Error"), tr("Layer model is not initialized."));
return;
}
QFileInfo fi(uri);
QString baseName = fi.completeBaseName();
addLayer(baseName, uri, true);
}
void HPPA::disconnectImagerAndCleanup()
{
if (m_Imager == nullptr)
return;
// 如果正在采集,先停止
if (m_RecordState % 2 == 1)
{
m_Imager->setRecordControlState(false);
m_RecordState = 0;
}
// 断开所有与 m_Imager 相关的信号槽
disconnect(m_Imager, nullptr, this, nullptr);
disconnect(this, SIGNAL(StartFocusSignal()), m_Imager, SLOT(focus()));
disconnect(this, SIGNAL(StartRecordSignal()), m_Imager, SLOT(start_record()));
disconnect(this, &HPPA::updateRecordingFileInfoSignal, m_Imager, &ImagerOperationBase::updateRecordingFileInfo);
disconnect(this, SIGNAL(RecordWhiteSignal()), m_Imager, SLOT(record_white()));
disconnect(this, SIGNAL(RecordDarlSignal()), m_Imager, SLOT(record_dark()));
// 断开 UI 控件与本类槽的连接(它们在 onconnect 中绑定,避免重复连接)
disconnect(ui.action_auto_exposure, SIGNAL(triggered()), this, SLOT(onAutoExposure()));
disconnect(ui.action_focus, SIGNAL(triggered()), this, SLOT(onFocus1()));
disconnect(ui.action_dark, SIGNAL(triggered()), this, SLOT(onDark()));
disconnect(ui.action_reference, SIGNAL(triggered()), this, SLOT(onReference()));
disconnect(ui.action_start_recording, SIGNAL(triggered()), this, SLOT(onStartRecordStep1()));
disconnect(ui.actionOpenDirectory, SIGNAL(triggered()), this, SLOT(onActionOpenDirectory()));
disconnect(m_hic, SIGNAL(framerateChanged(double)), this, SLOT(onFramerateChanged(double)));
disconnect(m_hic, SIGNAL(integrationTimeChanged(double)), this, SLOT(onIntegrationTimeChanged(double)));
disconnect(m_hic, SIGNAL(gainChanged(double)), this, SLOT(onGainChanged(double)));
// 停止采集线程
if (m_RecordThread)
{
m_RecordThread->quit();
m_RecordThread->wait(3000);
delete m_RecordThread;
m_RecordThread = nullptr;
}
// 停止文件拷贝线程
if (m_CopyFileThread)
{
if (m_FileOperation)
{
disconnect(this, SIGNAL(CopyFileThreadSignal(QString, QString)), m_FileOperation, SLOT(copyFile(QString, QString)));
disconnect(m_FileOperation, SIGNAL(CopyFinishedSignal()), this, SLOT(onCopyFinished()));
}
m_CopyFileThread->quit();
m_CopyFileThread->wait(3000);
delete m_FileOperation;
m_FileOperation = nullptr;
delete m_CopyFileThread;
m_CopyFileThread = nullptr;
}
// 删除 imager 对象
try
{
m_Imager->disconnectImager();
}
catch (...)
{
// 断连时忽略异常
}
delete m_Imager;
m_Imager = nullptr;
// 禁用相机参数控件
frame_number->setEnabled(false);
m_hic->setDisabled(true);
// 重置图标
ui.action_connect_imager->setIcon(QIcon(":/svg/resources/icons/svg/connect_imager.svg"));
ui.action_auto_exposure->setIcon(QIcon(":/svg/resources/icons/svg/exposure.svg"));
ui.action_dark->setIcon(QIcon(":/svg/resources/icons/svg/dark.svg"));
ui.action_reference->setIcon(QIcon(":/svg/resources/icons/svg/reference.svg"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record.svg"));
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
}
void HPPA::onconnect()
{
if (!testImagerVality())
{
disconnectImagerAndCleanup();
}
else
{
bool res = showResultMessageBox(QString::fromLocal8Bit("相机连接"), QString::fromLocal8Bit("确定要重连相机吗?"));
if (res)
{
disconnectImagerAndCleanup();
}
else
{
return;
}
}
try
{
//采集影像线程放入新线程中采集以免在采集过程中界面卡死https://www.cnblogs.com/xia-weiwen/p/10306089.html
m_RecordThread = new QThread();
//根据选择的相机类型创建对象mImagerGroup
QString imagerSelected = mImagerGroup->checkedAction()->objectName();
if (imagerSelected == "mActionPica_L")
{
m_Imager = new ResononPicaLImager();
}
else if (imagerSelected == "mActionPica_NIR")
{
m_Imager = new ResononNirImager();
}
else if (imagerSelected == "mActionPika_XC2")
{
m_Imager = new ResononPicaLImager();
}
else if (imagerSelected == "mActionCorning_410")
{
m_Imager = new Corning410Imager();
}
else
{
showMessageBox(QString::fromLocal8Bit("请选择相机类型!"));
return;
}
ui.action_connect_imager->setIcon(QIcon(":/svg/resources/icons/svg/connect_imager_ing.svg"));
m_Imager->moveToThread(m_RecordThread);
m_RecordThread->start();
connect(m_Imager, SIGNAL(PlotSignal(int, int, QString)), this, SLOT(onPlotHyperspectralImageRgbImage(int, int, QString)));
connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberMeet()));
connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberNotMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberNotMeet()));
connect(m_Imager, SIGNAL(SpectralSignal(int)), this, SLOT(focusPlotSpectralImg(int)));
connect(m_Imager, SIGNAL(testImagerStatus()), this, SLOT(testImagerStatus()));
connect(m_Imager, &ImagerOperationBase::autoExposureSignal, this, &HPPA::autoExposureFinished);
m_Imager->connect_imager(frame_number->text().toInt());
//文件拷贝
m_CopyFileThread = new QThread();
m_FileOperation = new FileOperation();
m_FileOperation->moveToThread(m_CopyFileThread);
m_CopyFileThread->start();
connect(this, SIGNAL(CopyFileThreadSignal(QString, QString)), m_FileOperation, SLOT(copyFile(QString, QString)));
connect(m_FileOperation, SIGNAL(CopyFinishedSignal()), this, SLOT(onCopyFinished()));
//检测光谱仪连接状态
m_TestImagerStausThread = new WorkerThread(m_Imager);
connect(this->ui.action_auto_exposure, SIGNAL(triggered()), this, SLOT(onAutoExposure()));
connect(this->ui.action_focus, SIGNAL(triggered()), this, SLOT(onFocus1()));
connect(this, SIGNAL(StartFocusSignal()), m_Imager, SLOT(focus()));
connect(this->ui.action_dark, SIGNAL(triggered()), this, SLOT(onDark()));
connect(this->ui.action_reference, SIGNAL(triggered()), this, SLOT(onReference()));
connect(this->ui.action_start_recording, SIGNAL(triggered()), this, SLOT(onStartRecordStep1()));
connect(this, SIGNAL(StartRecordSignal()), m_Imager, SLOT(start_record()));
connect(this, &HPPA::updateRecordingFileInfoSignal, m_Imager, &ImagerOperationBase::updateRecordingFileInfo);
connect(this, SIGNAL(RecordWhiteSignal()), m_Imager, SLOT(record_white()));
connect(this, SIGNAL(RecordDarlSignal()), m_Imager, SLOT(record_dark()));
connect(m_Imager, SIGNAL(RecordWhiteFinishSignal()), this, SLOT(recordWhiteFinish()));
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(m_hic, SIGNAL(framerateChanged(double)), this, SLOT(onFramerateChanged(double)));
connect(m_hic, SIGNAL(integrationTimeChanged(double)), this, SLOT(onIntegrationTimeChanged(double)));
connect(m_hic, SIGNAL(gainChanged(double)), this, SLOT(onGainChanged(double)));
//相机参数控件设置为可用 + 输入控制
frame_number->setEnabled(true);
m_hic->setDisabled(false);
/*QRegExp rx("\\d{0,3}[1-9]$");
ui.framerate_lineEdit->setValidator(new QRegExpValidator(rx));
frame_number->setValidator(new QRegExpValidator(rx));
ui.integratioin_time_lineEdit->setValidator(new QRegExpValidator(rx));
ui.gain_lineEdit->setValidator(new QRegExpValidator(rx));*/
//获取相机参数并显示到界面中
m_hic->setFrameRate(AppSettings::instance().frameRate());
m_hic->setIntegrationTime(AppSettings::instance().integrationTime());
m_hic->setGain(AppSettings::instance().gain());
}
catch (std::exception const& e)
{
ui.action_connect_imager->setIcon(QIcon(":/svg/resources/icons/svg/connect_imager.svg"));
std::cerr << "Error: " << e.what() << std::endl;
delete m_Imager;
m_Imager = nullptr;
showMessageBox(QString::fromLocal8Bit("请连接相机!"));
}
catch (int e)//ximea相机异常
{
ui.action_connect_imager->setIcon(QIcon(":/svg/resources/icons/svg/connect_imager.svg"));
delete m_Imager;
m_Imager = nullptr;
showMessageBox(QString::fromLocal8Bit("请连接相机!"));
}
}
void HPPA::testImagerStatus()
{
ui.action_connect_imager->setIcon(QIcon(":/svg/resources/icons/svg/connect_imager_done.svg"));
//m_TestImagerStausThread->start();
}
void HPPA::autoExposureFinished()
{
ui.action_auto_exposure->setIcon(QIcon(":/svg/resources/icons/svg/exposure_done.svg"));
}
void HPPA::onAutoExposure()
{
if (!testImagerVality())
{
showMessageBox(QString::fromLocal8Bit("找不到光谱仪!"));
return;
}
ui.action_auto_exposure->setIcon(QIcon(":/svg/resources/icons/svg/exposure_ing.svg"));
double ReturnedExposureTime = m_Imager->auto_exposure();
//将自动曝光所得的值显示到界面
m_hic->setIntegrationTime(ReturnedExposureTime);
//ui.mainToolBar->widgetForAction(ui.action_auto_exposure)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
void HPPA::onFocus1()
{
if (!testImagerVality())
{
showMessageBox(QString::fromLocal8Bit("找不到光谱仪!"));
return;
}
focusWindow* w = new focusWindow(this, m_Imager);
connect(w, SIGNAL(StartManualFocusSignal(int)), this, SLOT(onFocus2(int)));
connect(w, SIGNAL(closeSignal()), this, SLOT(onFocusWindowClosed()));
w->setModal(true);//设置窗口为模态:只能操作当前窗口
w->show();
w->exec();
//disconnect(w, SIGNAL(StartManualFocusSignal(int)), this, SLOT(onFocus2(int)));
}
void HPPA::onFocus2(int command)
{
if (command == 1)
{
if (m_focusTab)
{
emit StartFocusSignal();
return;
}
//创建影像显示窗口
m_focusTab = new QWidget();
QGridLayout* GridLayout = new QGridLayout();
GridLayout->addWidget(new Mapcavas(m_focusTab));
m_focusTab->setLayout(GridLayout);
m_imageViewerTabWidget->addTab(m_focusTab, QString::fromLocal8Bit("调焦"));
//m_imageViewerTabWidget->setCurrentIndex(trackNumber);
m_imageViewerTabWidget->setCurrentWidget(m_focusTab);
//开始调焦
emit StartFocusSignal();
}
else if (command == 0)
{
if (m_Imager)
m_Imager->setFocusControlState(false);
}
}
void HPPA::onFocusWindowClosed()
{
//关闭调焦窗口时,停止调焦功能
if (m_Imager)
m_Imager->setFocusControlState(false);
//关闭调焦窗口tab
int index = m_imageViewerTabWidget->indexOf(m_focusTab);
if (index != -1)
{
m_imageViewerTabWidget->removeTab(index);
}
m_focusTab = nullptr;
}
void HPPA::onAbout()
{
aboutWindow about;
about.show();
about.exec();
}
void HPPA::settingWindow()
{
setWindow w;
w.show();
w.exec();
}
void HPPA::onDark()
{
if (!testImagerVality())
{
showMessageBox(QString::fromLocal8Bit("找不到光谱仪!"));
return;
}
showMessageBox(QString::fromLocal8Bit("采集暗电流,请确保镜头盖盖上!"));
ui.action_dark->setIcon(QIcon(":/svg/resources/icons/svg/dark_ing.svg"));
QAction* checked = moveplatformActionGroup->checkedAction();
QString checkedName = checked->objectName();
if (checkedName == "mAction_is_no_motor" || checkedName == "mAction_RobotArm")
{
emit RecordDarlSignal();
}
else if (checkedName == "mAction_1AxisMotor")
{
m_omc->setImager(m_Imager);
m_omc->record_dark();
}
else if (checkedName == "mAction_2AxisMotor_new")
{
m_tmc->setImager(m_Imager);
m_tmc->record_dark();
return;
}
}
void HPPA::recordDarkFinish()
{
ui.action_dark->setIcon(QIcon(":/svg/resources/icons/svg/dark_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_dark)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
void HPPA::onReference()
{
if (!testImagerVality())
{
showMessageBox(QString::fromLocal8Bit("找不到光谱仪!"));
return;
}
showMessageBox(QString::fromLocal8Bit("请确保白板放置正确!"));
ui.action_reference->setIcon(QIcon(":/svg/resources/icons/svg/reference_ing.svg"));
QAction* checked = moveplatformActionGroup->checkedAction();
QString checkedName = checked->objectName();
if (checkedName == "mAction_is_no_motor" || checkedName == "mAction_RobotArm")
{
emit RecordWhiteSignal();
}
else if (checkedName == "mAction_1AxisMotor")
{
m_omc->setImager(m_Imager);
m_omc->record_white();
}
else if (checkedName == "mAction_2AxisMotor_new")
{
m_tmc->setImager(m_Imager);
m_tmc->record_white();
return;
}
}
void HPPA::recordWhiteFinish()
{
ui.action_reference->setIcon(QIcon(":/svg/resources/icons/svg/reference_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_reference)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QString filePath)
{
if (!m_Imager) return;
//使用机械臂采集时,会在停止采集后的瞬间又开始采集,会导致上次采集最后发射的信号调用此槽函数报错
QAction* checked = moveplatformActionGroup->checkedAction();
QString checkedName = checked->objectName();
if (frameNumber == -1 && checkedName == "mAction_RobotArm")
{
return;
}
if (ui.mAction3DPlantPhenotypeScenario->isChecked())
return;
//return;
//获取绘图控件
QWidget* currentWidget = m_MapLayerStore->widgetForLayer(filePath);
//QWidget* currentWidget = m_imageViewerTabWidget->widget(fileNumber);
QList<Mapcavas*> currentImageViewer = currentWidget->findChildren<Mapcavas*>();
currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//界面中显示已经采集的帧数
if (m_recordFrameCounter)
{
m_recordFrameCounter->updateFrameCount(currentWidget, m_Imager->getFrameCounter());
}
//创建需要显示的图像--opencv版本
ImageProcessor imageProcessor;
//cv::Mat rgbImage(*m_Imager->getRgbImage()->m_matRgbImage, cv::Range(0, m_Imager->getFrameCounter()), cv::Range::all());//2022.3.18重构的
cv::Mat rgbImage(*m_Imager->getMatRgbImage(), cv::Range(0, m_Imager->getFrameCounter()), cv::Range::all());
cv::Mat rgbImageStretched = imageProcessor.CStretch(rgbImage, 0.02);
//在界面中显示图像
currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(rgbImageStretched)));//绘制图像
//20241225
//保存拉伸后的rgb
//FileOperation* fileOperation = new FileOperation();
//string directory = fileOperation->getDirectoryOfExe();
//string rgbFilePathNoStrech = directory + "\\tmp_image_no_strech.png";//未拉伸图片
//string rgbFilePathStrech = directory + "\\tmp_image_strech.png";//拉伸图片
//cv::imwrite(rgbFilePathNoStrech, rgbImage);
//cv::imwrite(rgbFilePathStrech, rgbImageStretched);
//创建需要显示的图像--qt版本
//QRect CuttedRect = m_Imager->getRgbImage()->m_matRgbImage->rect();//先获取image整个rect
//CuttedRect.setHeight(m_Imager->getFrameCounter() - 1);//裁剪rect
//QImage CuttedImage = m_Imager->getRgbImage()->m_matRgbImage->copy(CuttedRect);
//currentImageViewer[0]->SetImage(&QPixmap::fromImage(CuttedImage));//绘制图像
}
void HPPA::focusPlotSpectralImg(int state)
{
if (!m_Imager) return;
if (state == 1)
{
//显示影像
QWidget* currentWidget = m_imageViewerTabWidget->currentWidget();
QList<Mapcavas*> currentImageViewer = currentWidget->findChildren<Mapcavas*>();
currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数
ImageProcessor imageProcessor;
//cv::Mat grayImage(*m_Imager->getRgbImage()->m_matFocusGrayImage, cv::Range::all(), cv::Range::all());//2022.3.18重构的
//cv::Mat grayImage(*m_Imager->getMatFocusGrayImage(), cv::Range::all(), cv::Range::all());
//currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//绘制图像
currentImageViewer[0]->SetImage(&QPixmap::fromImage(m_Imager->getQImageFocusGrayImage()));//绘制图像
//绘制光谱
QLineSeries* series = new QLineSeries();
//series->clear();//////////////////////////////
int sampleCount = m_Imager->getSampleCount();
for (size_t i = 0; i < sampleCount; i++)
{
//malloc申请的内存用法1可以当做数组用
//series->append(i, m_Imager->buffer[i + 5 * 900]);
//series->append(i, m_Imager->buffer[900 * 150 + i]);
series->append(i, m_Imager->buffer[1368 * 150 + i]);
}
series->setPen(QPen(QColor("#FF928A"), 2));
m_chart->removeAllSeries();
m_chart->addSeries(series);
m_chart->createDefaultAxes();
QValueAxis* axisX = qobject_cast<QValueAxis*>(m_chart->axisX());
QValueAxis* axisY = qobject_cast<QValueAxis*>(m_chart->axisY());
setAxis(axisX, axisY);
}
else
{
//改变界面上的按钮文字
}
////显示影像
//QWidget* currentWidget = m_imageViewerTabWidget->currentWidget();
//QList<ImageViewer *> currentImageViewer = currentWidget->findChildren<ImageViewer *>();
//
//ImageProcessor imageProcessor;
//
////绘制光谱
//QLineSeries *series = new QLineSeries();
////series->clear();//////////////////////////////
//int sampleCount = m_Imager->getSampleCount();
//
//QChart *chart = new QChart();
//chart->legend()->hide();
//chart->addSeries(series);
//chart->createDefaultAxes();
////chart->setTitle("Simple line chart example");
//m_chartView->setChart(chart);
//while (state)
//{
// currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数
// cv::Mat grayImage(*m_Imager->getMatFocusGrayImage(), cv::Range::all(), cv::Range::all());
// currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//绘制图像
// for (size_t i = 0; i < sampleCount; i++)
// {
// //malloc申请的内存用法1可以当做数组用
// //series->append(i, m_Imager->buffer[i + 5 * 900]);
// series->append(i, m_Imager->buffer[900 * 150 + i]);
// }
// std::cout << "-----------------------------------------------" << std::endl;
//}
}
void HPPA::onRecordFinishedSignal_WhenFrameNumberMeet()
{
QAction* checked = moveplatformActionGroup->checkedAction();
QString checkedName = checked->objectName();
if (checkedName == "mAction_2AxisMotor_new")//会有多条采集线,中间的某条采集线完成后不代表整个采集过程完成
{
return;
}
std::cout << "停止采集原因:帧数采集完了。" << std::endl;
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
m_RecordState++;//当自动停止采集
}
void HPPA::onRecordFinishedSignal_WhenFrameNumberNotMeet()
{
QAction* checked = moveplatformActionGroup->checkedAction();
QString checkedName = checked->objectName();
if (checkedName == "mAction_RobotArm")//机械臂会在停止采集后的瞬间又开始采集导致ui.action_start_recording显示异常
{
return;
}
if (checkedName == "mAction_2AxisMotor_new")//会有多条采集线,中间的某条采集线完成后不代表整个采集过程完成
{
return;
}
std::cout << "停止采集原因1帧数没有采集够时马达到达最大位置2手动停止采集。" << std::endl;
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
m_RecordState++;
}
void HPPA::onsequenceComplete()
{
ui.action_start_recording->setText(QString::fromLocal8Bit("采集"));
ui.action_start_recording->setIcon(QIcon(":/svg/resources/icons/svg/record_done.svg"));
//ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
m_RecordState++;
}
WorkerThread3::WorkerThread3(CFocusMotorControl* ctrlFocusMotor)
{
m_ctrlFocusMotor = ctrlFocusMotor;
}
void WorkerThread3::run()
{
m_ctrlFocusMotor->StartAutoFocus(820, 910, 20, 2);
emit AutoFocusFinishedSignal();
}
void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex)
{
if (!m_LayerTreeModel || !m_RasterGroup) return;
if (ui.mAction3DPlantPhenotypeScenario->isChecked())
{
addLayer(baseName, filePath, false, false);
}
else
{
addLayer(baseName, filePath, false);
}
}
void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refresh, bool isAddImage)
{
// Create MapLayer first and attach it to a LayerTreeLayerNode
RasterLayer* ml = new RasterLayer(baseName, filePath);
auto* layerNode = new LayerTreeLayer(ml);
LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
if (m_MapLayerStore) m_MapLayerStore->addLayer(ml);
if (isAddImage)
{
newImage(ml, RasterImageLayer::RendererType::Multiband, node);
}
}
void HPPA::newImage(RasterLayer* ml, RasterImageLayer::RendererType type, LayerTreeNode* parent, bool refresh)
{
QWidget* mapcavasContainer = onCreateTab(ml->name());
RasterImageLayer* rasterImageLayer = new RasterImageLayer(ml, type);
QList<Mapcavas*> mapcavas = mapcavasContainer->findChildren<Mapcavas*>();
mapcavas[0]->setImageLayer(rasterImageLayer);
QString title = ml->name();
if (type == RasterImageLayer::RendererType::Multiband)
{
title = title + "-RGB";
}
else if(type == RasterImageLayer::RendererType::Singleband)
{
title = title + "-GreyScale";
}
LayerTreeImageNode* imageNode = new LayerTreeImageNode(rasterImageLayer, title);
LayerTreeNode* node2 = m_LayerTreeModel->addLayer(parent, imageNode);
if (m_MapLayerStore) m_MapLayerStore->addImageLayer(ml, rasterImageLayer, mapcavasContainer);
if (refresh)
{
mapcavas[0]->freshmap();
}
}
void HPPA::onLayerTreeSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
{
Q_UNUSED(deselected);
if (selected.indexes().isEmpty())
{
m_ic->setActiveLayer(nullptr);
return;
}
QModelIndex idx = selected.indexes().first();
if (!idx.isValid())
{
m_ic->setActiveLayer(nullptr);
return;
}
LayerTreeNode* node = static_cast<LayerTreeNode*>(idx.internalPointer());
if (!node || node->type() == LayerTreeNode::Type::Group)
{
m_ic->setActiveLayer(nullptr);
return;
}
//后续工作:当选择图层树中的图层时,应该显示此图层的元数据
if (!node || node->type() == LayerTreeNode::Type::Layer)
{
m_ic->setActiveLayer(nullptr);
return;
}
if (!node || node->type() == LayerTreeNode::Type::Image)
{
auto* imageNode = static_cast<LayerTreeImageNode*>(node);
RasterImageLayer* imageLayer = imageNode->imageLayer();
MapLayer* mapLayer = imageLayer->layer();
if (!mapLayer || mapLayer->layerType() != MapLayer::LayerType::Raster) {
m_ic->setActiveLayer(nullptr);
return;
}
if (m_MapLayerStore && m_imageViewerTabWidget)
{
QWidget* widget = m_MapLayerStore->widgetForImageLayer(imageLayer);
if (widget)
{
int tabIndex = m_imageViewerTabWidget->indexOf(widget);
if (tabIndex >= 0)
{
m_imageViewerTabWidget->setCurrentIndex(tabIndex);
}
}
QList<Mapcavas*> mapcavas = widget->findChildren<Mapcavas*>();
if (!mapcavas.isEmpty())
{
m_ic->setActiveLayer(mapcavas[0]->imageLayer());
}
else
{
m_ic->setActiveLayer(nullptr);
}
}
else
{
m_ic->setActiveLayer(nullptr);
}
}
}
void HPPA::onBandSelectionChanged(double rWave, double gWave, double bWave)
{
RasterImageLayer* imageLayer = m_ic->activeLayer();
if (!imageLayer) return;
auto params = imageLayer->multibandParams();
params.rWave = rWave;
params.gWave = gWave;
params.bWave = bWave;
imageLayer->setMultibandParams(params);
if (!m_MapLayerStore) return;
MapLayer* mapLayer = imageLayer->layer();
QWidget* container = m_MapLayerStore->widgetForImageLayer(imageLayer);
if (!container) return;
QList<Mapcavas*> mapcavas = container->findChildren<Mapcavas*>();
if (mapcavas.isEmpty()) return;
mapcavas[0]->freshmap();
}