初步统一了多航线采集和打开影像功能

This commit is contained in:
tangchao0503
2026-03-03 13:46:31 +08:00
parent bdf956ed99
commit 8d2fe91043
14 changed files with 249 additions and 108 deletions

View File

@ -33,6 +33,9 @@ HPPA::HPPA(QWidget* parent)
mConfigfile.parseConfigfile(); mConfigfile.parseConfigfile();
qDebug() << "exist: " << QString::fromStdString(HPPACfgFile); qDebug() << "exist: " << QString::fromStdString(HPPACfgFile);
// Create MapLayerStore early so created layers are managed
m_MapLayerStore = new MapLayerStore(this);
/*int max, min; /*int max, min;
mConfigfile.getPositionRestriction(max, min); mConfigfile.getPositionRestriction(max, min);
@ -73,7 +76,6 @@ HPPA::HPPA(QWidget* parent)
initMenubarToolbar(); initMenubarToolbar();
@ -214,16 +216,16 @@ sizePolicy1.setHeightForWidth(graphicsView_delete->sizePolicy().hasHeightForWidt
// 创建并保留 Raster 分组指针,后续添加 layer 使用它 // 创建并保留 Raster 分组指针,后续添加 layer 使用它
m_RasterGroup = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Raster"); m_RasterGroup = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Raster");
{ //{
auto* ln1 = new LayerTreeLayerNode(nullptr); // auto* ln1 = new LayerTreeLayerNode(nullptr);
ln1->setName("tmp_image_1"); // ln1->setName("tmp_image_1");
m_LayerTreeModel->addLayer(m_RasterGroup, ln1); // m_LayerTreeModel->addLayer(m_RasterGroup, ln1);
} //}
{ //{
auto* ln2 = new LayerTreeLayerNode(nullptr); // auto* ln2 = new LayerTreeLayerNode(nullptr);
ln2->setName("tmp_image_2"); // ln2->setName("tmp_image_2");
m_LayerTreeModel->addLayer(m_RasterGroup, ln2); // m_LayerTreeModel->addLayer(m_RasterGroup, ln2);
} //}
auto* g2 = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Vector"); auto* g2 = m_LayerTreeModel->addGroup(m_LayerTreeModel->root(), "Vector");
//model->addLayer(g2, "Rivers"); //model->addLayer(g2, "Rivers");
@ -724,7 +726,7 @@ void HPPA::initControlTabwidget()
//2轴马达控制 //2轴马达控制
m_tmc = new TwoMotorControl(this); m_tmc = new TwoMotorControl(this);
connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int))); //connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int)));
connect(m_tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete())); connect(m_tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete()));
m_tmc->setWindowFlags(Qt::Widget); m_tmc->setWindowFlags(Qt::Widget);
ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2轴控制")); ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2轴控制"));
@ -750,7 +752,7 @@ void HPPA::recordFromRobotArm(int fileCounter)
m_imageViewerTabWidget->clear(); m_imageViewerTabWidget->clear();
} }
onCreateTab(fileCounter - 1); onCreateTab("img");
emit StartRecordSignal(); emit StartRecordSignal();
ui.action_start_recording->setText(QString::fromLocal8Bit("采集中")); ui.action_start_recording->setText(QString::fromLocal8Bit("采集中"));
@ -1029,8 +1031,6 @@ void HPPA::onStartRecordStep1()
{ {
m_imageViewerTabWidget->clear(); m_imageViewerTabWidget->clear();
onCreateTab(0);
m_Imager->setFileName2Save(imgPath); m_Imager->setFileName2Save(imgPath);
m_Imager->setFrameNumber(this->frame_number->text().toInt()); m_Imager->setFrameNumber(this->frame_number->text().toInt());
emit StartRecordSignal();//发射开始采集信号 emit StartRecordSignal();//发射开始采集信号
@ -1056,10 +1056,8 @@ void HPPA::onStartRecordStep1()
{ {
m_imageViewerTabWidget->clear(); m_imageViewerTabWidget->clear();
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);
@ -1117,24 +1115,20 @@ void HPPA::onStartRecordStep1()
} }
} }
void HPPA::onCreateTab(int trackNumber) QWidget* HPPA::onCreateTab(QString tabName)
{ {
if (trackNumber >= 0) QWidget* tabTmp = new QWidget();
{
m_numberOfRecording = trackNumber;
QWidget* tabTmp = new QWidget(); QGridLayout* GridLayout = new QGridLayout();
GridLayout->addWidget(new Mapcavas(tabTmp));
QGridLayout* GridLayout = new QGridLayout(); tabTmp->setLayout(GridLayout);
GridLayout->addWidget(new mapcavas(tabTmp));
tabTmp->setLayout(GridLayout); m_imageViewerTabWidget->addTab(tabTmp, tabName);
m_imageViewerTabWidget->addTab(tabTmp, QString::number(trackNumber + 1)); m_imageViewerTabWidget->setCurrentIndex(m_imageViewerTabWidget->count() - 1);
m_imageViewerTabWidget->setCurrentIndex(trackNumber);
}
return tabTmp;
} }
void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab会调用onTabWidgetCurrentChanged函数 void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab会调用onTabWidgetCurrentChanged函数
@ -1149,7 +1143,7 @@ void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab会调
//获取绘图控件 //获取绘图控件
QWidget* currentWidget = m_imageViewerTabWidget->widget(index); QWidget* currentWidget = m_imageViewerTabWidget->widget(index);
QList<mapcavas*> currentImageViewer = currentWidget->findChildren<mapcavas*>(); QList<Mapcavas*> currentImageViewer = currentWidget->findChildren<Mapcavas*>();
//先disconnect然后再connect否则每次切换一次都会connect一次会累积connect很多次 //先disconnect然后再connect否则每次切换一次都会connect一次会累积connect很多次
disconnect(currentImageViewer[0], SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onLeftMouseButtonPressed(int, int))); disconnect(currentImageViewer[0], SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onLeftMouseButtonPressed(int, int)));
@ -1425,38 +1419,16 @@ void HPPA::onOpenImg()
QFileInfo fi(uri); QFileInfo fi(uri);
QString baseName = fi.completeBaseName(); QString baseName = fi.completeBaseName();
// Create RasterLayer and wrap in LayerTreeLayerNode RasterLayer* rl = new RasterLayer(baseName, uri);
RasterLayer* rl = new RasterLayer(baseName, uri);
auto* layerNode = new LayerTreeLayerNode(rl);
m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
// 3) 渲染一副图像并保存到 C:\2 auto* layerNode = new LayerTreeLayerNode(rl);
RasterLayer::RenderParams params; // use defaults m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
QImage img = rl->render(params);
if (img.isNull())
{
QMessageBox::warning(this, tr("Render failed"), tr("Failed to render image from %1").arg(uri));
return;
}
QDir outDir("C:/2"); QWidget* mapcavasContainer = onCreateTab(baseName);
if (!outDir.exists()) if (m_MapLayerStore) m_MapLayerStore->addLayer(rl, mapcavasContainer);
{ QList<Mapcavas*> mapcavas = mapcavasContainer->findChildren<Mapcavas*>();
if (!outDir.mkpath(".")) mapcavas[0]->setLayers(rl);
{ mapcavas[0]->freshmap();
QMessageBox::warning(this, tr("Save failed"), tr("Failed to create output directory C:/2"));
return;
}
}
QString outPath = outDir.filePath(baseName + "_render.png");
if (!img.save(outPath))
{
QMessageBox::warning(this, tr("Save failed"), tr("Failed to save rendered image to %1").arg(outPath));
return;
}
QMessageBox::information(this, tr("Saved"), tr("Rendered image saved to %1").arg(outPath));
} }
void HPPA::onconnect() void HPPA::onconnect()
@ -1504,7 +1476,7 @@ void HPPA::onconnect()
m_Imager->connect_imager(frame_number->text().toInt()); m_Imager->connect_imager(frame_number->text().toInt());
m_Imager->setFileName2Save(m_FilenameLineEdit->text().toStdString()); m_Imager->setFileName2Save(m_FilenameLineEdit->text().toStdString());
connect(m_Imager, SIGNAL(PlotSignal(int, int)), this, SLOT(onPlotHyperspectralImageRgbImage(int, int))); 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_WhenFrameNumberMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberMeet()));
connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberNotMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberNotMeet())); connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberNotMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberNotMeet()));
connect(m_Imager, SIGNAL(SpectralSignal(int)), this, SLOT(PlotSpectral(int))); connect(m_Imager, SIGNAL(SpectralSignal(int)), this, SLOT(PlotSpectral(int)));
@ -1651,7 +1623,7 @@ void HPPA::onFocus2(int command)
QWidget* tabTmp = new QWidget(); QWidget* tabTmp = new QWidget();
QGridLayout* GridLayout = new QGridLayout(); QGridLayout* GridLayout = new QGridLayout();
GridLayout->addWidget(new mapcavas(tabTmp)); GridLayout->addWidget(new Mapcavas(tabTmp));
tabTmp->setLayout(GridLayout); tabTmp->setLayout(GridLayout);
@ -1737,7 +1709,7 @@ void HPPA::recordWhiteFinish()
ui.mainToolBar->widgetForAction(ui.action_reference)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); ui.mainToolBar->widgetForAction(ui.action_reference)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
} }
void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber) void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QString filePath)
{ {
//使用机械臂采集时,会在停止采集后的瞬间又开始采集,会导致上次采集最后发射的信号调用此槽函数报错 //使用机械臂采集时,会在停止采集后的瞬间又开始采集,会导致上次采集最后发射的信号调用此槽函数报错
QAction* checked = moveplatformActionGroup->checkedAction(); QAction* checked = moveplatformActionGroup->checkedAction();
@ -1749,8 +1721,10 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber)
//return; //return;
//获取绘图控件 //获取绘图控件
QWidget* currentWidget = m_imageViewerTabWidget->widget(fileNumber); QWidget* currentWidget = m_MapLayerStore->widgetForLayer(filePath);
QList<mapcavas*> currentImageViewer = currentWidget->findChildren<mapcavas*>(); //QWidget* currentWidget = m_imageViewerTabWidget->widget(fileNumber);
QList<Mapcavas*> currentImageViewer = currentWidget->findChildren<Mapcavas*>();
currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//界面中显示已经采集的帧数 currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//界面中显示已经采集的帧数
//创建需要显示的图像--opencv版本 //创建需要显示的图像--opencv版本
@ -1785,7 +1759,7 @@ void HPPA::PlotSpectral(int state)
{ {
//显示影像 //显示影像
QWidget* currentWidget = m_imageViewerTabWidget->currentWidget(); QWidget* currentWidget = m_imageViewerTabWidget->currentWidget();
QList<mapcavas*> currentImageViewer = currentWidget->findChildren<mapcavas*>(); QList<Mapcavas*> currentImageViewer = currentWidget->findChildren<Mapcavas*>();
currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数 currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数
ImageProcessor imageProcessor; ImageProcessor imageProcessor;
@ -1921,10 +1895,15 @@ void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePa
{ {
if (!m_LayerTreeModel || !m_RasterGroup) return; if (!m_LayerTreeModel || !m_RasterGroup) return;
// Create MapLayer first and attach it to a LayerTreeLayerNode QWidget* mapcavasContainer = onCreateTab(baseName);
MapLayer* ml = new RasterLayer(baseName, filePath);
auto* layerNode = new LayerTreeLayerNode(ml);
// Create MapLayer first and attach it to a LayerTreeLayerNode
RasterLayer* ml = new RasterLayer(baseName, filePath);
if (m_MapLayerStore) m_MapLayerStore->addLayer(ml, mapcavasContainer);
QList<Mapcavas*> mapcavas = mapcavasContainer->findChildren<Mapcavas*>();
mapcavas[0]->setLayers(ml);
auto* layerNode = new LayerTreeLayerNode(ml);
LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode); LayerTreeNode* node = m_LayerTreeModel->addLayer(m_RasterGroup, layerNode);
LayerTreeLayerNode* lnode = dynamic_cast<LayerTreeLayerNode*>(node); LayerTreeLayerNode* lnode = dynamic_cast<LayerTreeLayerNode*>(node);
if (!lnode) return; if (!lnode) return;

View File

@ -54,6 +54,7 @@
#include "LayerTreeModel.h" #include "LayerTreeModel.h"
#include "LayerTree.h" #include "LayerTree.h"
#include "MapLayer.h" #include "MapLayer.h"
#include "MapLayerStore.h"
#define PI 3.1415926 #define PI 3.1415926
@ -259,8 +260,10 @@ private:
LayerTreeModel* m_LayerTreeModel = nullptr; LayerTreeModel* m_LayerTreeModel = nullptr;
LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer LayerTreeNode* m_RasterGroup = nullptr; // 指向 "Raster" 分组,便于后续添加 layer
MapLayerStore* m_MapLayerStore = nullptr;
public Q_SLOTS: public Q_SLOTS:
void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber); void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QString filePath);
void PlotSpectral(int state); void PlotSpectral(int state);
void onRecordFinishedSignal_WhenFrameNumberMeet(); void onRecordFinishedSignal_WhenFrameNumberMeet();
void onRecordFinishedSignal_WhenFrameNumberNotMeet(); void onRecordFinishedSignal_WhenFrameNumberNotMeet();
@ -279,7 +282,7 @@ public Q_SLOTS:
void onReference(); void onReference();
void recordWhiteFinish(); void recordWhiteFinish();
void onStartRecordStep1(); void onStartRecordStep1();
void onCreateTab(int trackNumber); QWidget* onCreateTab(QString tabName);
void onTabWidgetCurrentChanged(int index); void onTabWidgetCurrentChanged(int index);
void onActionOpenDirectory(); void onActionOpenDirectory();

View File

@ -120,6 +120,7 @@
<ClCompile Include="LayerTreeModel.cpp" /> <ClCompile Include="LayerTreeModel.cpp" />
<ClCompile Include="LayerTreeNode.cpp" /> <ClCompile Include="LayerTreeNode.cpp" />
<ClCompile Include="MapLayer.cpp" /> <ClCompile Include="MapLayer.cpp" />
<ClCompile Include="MapLayerStore.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" />
@ -196,6 +197,7 @@
<QtMoc Include="LayerTreeLayerNode.h" /> <QtMoc Include="LayerTreeLayerNode.h" />
<QtMoc Include="MapLayer.h" /> <QtMoc Include="MapLayer.h" />
<QtMoc Include="RasterLayer.h" /> <QtMoc Include="RasterLayer.h" />
<QtMoc Include="MapLayerStore.h" />
<ClInclude Include="RasterDataProvider.h" /> <ClInclude Include="RasterDataProvider.h" />
<ClInclude Include="RasterRenderer.h" /> <ClInclude Include="RasterRenderer.h" />
<ClInclude Include="utility_tc.h" /> <ClInclude Include="utility_tc.h" />

View File

@ -166,6 +166,9 @@
<ClCompile Include="RasterRenderer.cpp"> <ClCompile Include="RasterRenderer.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="MapLayerStore.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="fileOperation.h"> <QtMoc Include="fileOperation.h">
@ -261,6 +264,9 @@
<QtMoc Include="RasterLayer.h"> <QtMoc Include="RasterLayer.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<QtMoc Include="MapLayerStore.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="imageProcessor.h"> <ClInclude Include="imageProcessor.h">

View File

@ -12,7 +12,7 @@
#define VIEW_WIDTH viewport()->rect().width() #define VIEW_WIDTH viewport()->rect().width()
#define VIEW_HEIGHT viewport()->rect().height() #define VIEW_HEIGHT viewport()->rect().height()
mapcavas::mapcavas(QWidget* pParent) :QGraphicsView(pParent) Mapcavas::Mapcavas(QWidget* pParent) :QGraphicsView(pParent)
{ {
setRenderHint(QPainter::Antialiasing); setRenderHint(QPainter::Antialiasing);
setRenderHint(QPainter::SmoothPixmapTransform); setRenderHint(QPainter::SmoothPixmapTransform);
@ -49,18 +49,18 @@ mapcavas::mapcavas(QWidget* pParent) :QGraphicsView(pParent)
setFrameShape(QFrame::NoFrame); setFrameShape(QFrame::NoFrame);
} }
mapcavas::~mapcavas() Mapcavas::~Mapcavas()
{ {
} }
void mapcavas::DisplayFrameNumber(int frameNumber) void Mapcavas::DisplayFrameNumber(int frameNumber)
{ {
m_framNumberLabel->setText(QString::number(frameNumber)); m_framNumberLabel->setText(QString::number(frameNumber));
m_framNumberLabel->adjustSize(); m_framNumberLabel->adjustSize();
} }
void mapcavas::SetImage(QPixmap *image) void Mapcavas::SetImage(QPixmap *image)
{ {
if (!HasImage()) if (!HasImage())
{ {
@ -73,7 +73,7 @@ void mapcavas::SetImage(QPixmap *image)
ensureSceneVisible(); ensureSceneVisible();
} }
void mapcavas::ensureSceneVisible() void Mapcavas::ensureSceneVisible()
{ {
resetTransform(); resetTransform();
@ -90,7 +90,7 @@ void mapcavas::ensureSceneVisible()
centerOn(scene_rect.center()); centerOn(scene_rect.center());
} }
bool mapcavas::HasImage() bool Mapcavas::HasImage()
{ {
if (m_GraphicsPixmapItemHandle == nullptr) if (m_GraphicsPixmapItemHandle == nullptr)
{ {
@ -102,7 +102,7 @@ bool mapcavas::HasImage()
} }
} }
void mapcavas::wheelEvent(QWheelEvent *event) void Mapcavas::wheelEvent(QWheelEvent *event)
{ {
if (HasImage()) if (HasImage())
{ {
@ -118,12 +118,12 @@ void mapcavas::wheelEvent(QWheelEvent *event)
} }
} }
void mapcavas::scaling(qreal scaleFactor) void Mapcavas::scaling(qreal scaleFactor)
{ {
scale(scaleFactor, scaleFactor); scale(scaleFactor, scaleFactor);
} }
void mapcavas::mousePressEvent(QMouseEvent *event) void Mapcavas::mousePressEvent(QMouseEvent *event)
{ {
if (event->button()==Qt::LeftButton) if (event->button()==Qt::LeftButton)
{ {
@ -135,7 +135,7 @@ void mapcavas::mousePressEvent(QMouseEvent *event)
QGraphicsView::mousePressEvent(event); QGraphicsView::mousePressEvent(event);
} }
void mapcavas::mouseMoveEvent(QMouseEvent *event) void Mapcavas::mouseMoveEvent(QMouseEvent *event)
{ {
if (m_bMouseTranslate){ if (m_bMouseTranslate){
QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos); QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos);
@ -146,28 +146,28 @@ void mapcavas::mouseMoveEvent(QMouseEvent *event)
QGraphicsView::mousePressEvent(event); QGraphicsView::mousePressEvent(event);
} }
void mapcavas::mouseReleaseEvent(QMouseEvent *event) void Mapcavas::mouseReleaseEvent(QMouseEvent *event)
{ {
m_bMouseTranslate = false; m_bMouseTranslate = false;
QGraphicsView::mouseReleaseEvent(event); QGraphicsView::mouseReleaseEvent(event);
} }
void mapcavas::mouseDoubleClickEvent(QMouseEvent *event) void Mapcavas::mouseDoubleClickEvent(QMouseEvent *event)
{ {
QGraphicsView::mouseDoubleClickEvent(event); QGraphicsView::mouseDoubleClickEvent(event);
} }
void mapcavas::zoomIn() void Mapcavas::zoomIn()
{ {
zoom(1 + m_zoomDelta); zoom(1 + m_zoomDelta);
} }
void mapcavas::zoomOut() void Mapcavas::zoomOut()
{ {
zoom(1 - m_zoomDelta); zoom(1 - m_zoomDelta);
} }
void mapcavas::zoom(float scaleFactor) void Mapcavas::zoom(float scaleFactor)
{ {
qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width(); qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
if (factor < 0.07 || factor > 100) if (factor < 0.07 || factor > 100)
@ -177,38 +177,38 @@ void mapcavas::zoom(float scaleFactor)
m_scale *= scaleFactor; m_scale *= scaleFactor;
} }
void mapcavas::setTranslateSpeed(qreal speed) void Mapcavas::setTranslateSpeed(qreal speed)
{ {
Q_ASSERT_X(speed >= 0.0 && speed <= 2.0, Q_ASSERT_X(speed >= 0.0 && speed <= 2.0,
"InteractiveView::setTranslateSpeed", "Speed should be in range [0.0, 2.0]."); "InteractiveView::setTranslateSpeed", "Speed should be in range [0.0, 2.0].");
m_translateSpeed = speed; m_translateSpeed = speed;
} }
qreal mapcavas::translateSpeed() const qreal Mapcavas::translateSpeed() const
{ {
return m_translateSpeed; return m_translateSpeed;
} }
void mapcavas::setZoomDelta(qreal delta) void Mapcavas::setZoomDelta(qreal delta)
{ {
Q_ASSERT_X(delta >= 0.0 && delta <= 1.0, Q_ASSERT_X(delta >= 0.0 && delta <= 1.0,
"InteractiveView::setZoomDelta", "Delta should be in range [0.0, 1.0]."); "InteractiveView::setZoomDelta", "Delta should be in range [0.0, 1.0].");
m_zoomDelta = delta; m_zoomDelta = delta;
} }
qreal mapcavas::zoomDelta() const qreal Mapcavas::zoomDelta() const
{ {
return m_zoomDelta; return m_zoomDelta;
} }
// new: set associated raster layer // new: set associated raster layer
void mapcavas::setLayers(RasterLayer* layer) void Mapcavas::setLayers(RasterLayer* layer)
{ {
m_rasterLayer = layer; m_rasterLayer = layer;
} }
// new: refresh the map by rendering using the RasterLayer's render method // new: refresh the map by rendering using the RasterLayer's render method
void mapcavas::freshmap() void Mapcavas::freshmap()
{ {
if (!m_rasterLayer) return; if (!m_rasterLayer) return;

View File

@ -6,13 +6,13 @@
class RasterLayer; // forward class RasterLayer; // forward
class mapcavas : public QGraphicsView class Mapcavas : public QGraphicsView
{ {
Q_OBJECT Q_OBJECT
public: public:
mapcavas(QWidget* pParent = NULL); Mapcavas(QWidget* pParent = NULL);
~mapcavas(); ~Mapcavas();
void DisplayFrameNumber(int frameNumber); void DisplayFrameNumber(int frameNumber);

View File

@ -234,13 +234,11 @@ void ImagerOperationBase::start_record()
} }
// <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> // <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
// prepare file name that will be used for saving m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil";
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; QString baseName = QString::fromStdString(getFileNameFromPath(m_FileName2Save2));
QString baseName = QString::fromStdString(removeFileExtension(m_FileName2Save2)); QString filePath = QString::fromStdString(m_FileName2Save2);
QString filePath = QString::fromStdString(m_FileName2Save2); emit LayerFileCreated(baseName, filePath, m_FileSavedCounter);
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");
@ -307,7 +305,7 @@ void ImagerOperationBase::start_record()
//ÿ<><C3BF>1s<31><73><EFBFBD><EFBFBD>һ<EFBFBD>ν<EFBFBD><CEBD><EFBFBD>ͼ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD> //ÿ<><C3BF>1s<31><73><EFBFBD><EFBFBD>һ<EFBFBD>ν<EFBFBD><CEBD><EFBFBD>ͼ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
if (m_iFrameCounter % (int)getFramerate() == 0) if (m_iFrameCounter % (int)getFramerate() == 0)
{ {
emit PlotSignal(m_FileSavedCounter, m_iFrameCounter); emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath);
} }
if (m_iFrameCounter >= m_iFrameNumber) if (m_iFrameCounter >= m_iFrameNumber)
@ -320,7 +318,7 @@ 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); emit PlotSignal(m_FileSavedCounter, -1, filePath);
m_bRecordControlState = false; m_bRecordControlState = false;
WriteHdr(); WriteHdr();

View File

@ -102,7 +102,7 @@ public slots:
void getFocusIndexSobel(); void getFocusIndexSobel();
signals: signals:
void PlotSignal(int, int);//<2F><><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>źţ<C5BA><C5A3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>Ӱ<EFBFBD>񣻵ڶ<F1A3BBB5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>-1<><31><EFBFBD><EFBFBD><EFBFBD>˴βɼ<CEB2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD> void PlotSignal(int, int, QString);//<2F><><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>źţ<C5BA><C5A3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>Ӱ<EFBFBD>񣻵ڶ<F1A3BBB5><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>-1<><31><EFBFBD><EFBFBD><EFBFBD>˴βɼ<CEB2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
void RecordFinishedSignal_WhenFrameNumberMeet();//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA><C5A3><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>m_iFrameNumber<65><72><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> void RecordFinishedSignal_WhenFrameNumberMeet();//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA><C5A3><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>m_iFrameNumber<65><72><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
void RecordFinishedSignal_WhenFrameNumberNotMeet();//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA><C5A3><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>m_iFrameNumber<65><72>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD>;ֹͣ<CDA3>ɼ<EFBFBD> void RecordFinishedSignal_WhenFrameNumberNotMeet();//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA><C5A3><EFBFBD>Ҫ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>m_iFrameNumber<65><72>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD>;ֹͣ<CDA3>ɼ<EFBFBD>
void SpectralSignal(int);//<2F><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><C6B9>ף<EFBFBD><D7A3><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD> void SpectralSignal(int);//<2F><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD><C6B9>ף<EFBFBD><D7A3><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>

View File

@ -26,3 +26,5 @@ private:
QString m_name; QString m_name;
QString m_uri; QString m_uri;
}; };
Q_DECLARE_METATYPE(MapLayer*)

83
HPPA/MapLayerStore.cpp Normal file
View File

@ -0,0 +1,83 @@
#include "MapLayerStore.h"
#include "MapLayer.h"
MapLayerStore::MapLayerStore(QObject* parent)
: QObject(parent)
{
int a = 1;
}
void MapLayerStore::addLayer(MapLayer* layer, QWidget* widget)
{
if (!layer) return;
MapLayer* raw = layer;
m_layers.emplace_back(std::shared_ptr<MapLayer>(layer));
if (widget)
m_layerWidgets[raw] = widget;
emit layerAdded(raw);
}
void MapLayerStore::removeLayer(MapLayer* layer)
{
if (!layer) return;
for (auto it = m_layers.begin(); it != m_layers.end(); ++it) {
if (it->get() == layer) {
emit layerAboutToBeRemoved(layer);
m_layers.erase(it);
m_layerWidgets.erase(layer);
return;
}
}
}
void MapLayerStore::removeLayerByName(const QString& name)
{
for (auto it = m_layers.begin(); it != m_layers.end(); ++it) {
if ((*it)->name() == name) {
MapLayer* raw = it->get();
emit layerAboutToBeRemoved(raw);
m_layers.erase(it);
m_layerWidgets.erase(raw);
return;
}
}
}
MapLayer* MapLayerStore::getLayer(const QString& name) const
{
for (const auto& l : m_layers) {
if (l->name() == name) return l.get();
}
return nullptr;
}
MapLayer* MapLayerStore::getLayerAt(int index) const
{
if (index < 0 || index >= (int)m_layers.size()) return nullptr;
return m_layers[index].get();
}
int MapLayerStore::layerCount() const
{
return (int)m_layers.size();
}
QWidget* MapLayerStore::widgetForLayer(MapLayer* layer) const
{
auto it = m_layerWidgets.find(layer);
if (it == m_layerWidgets.end()) return nullptr;
return it->second;
}
QWidget* MapLayerStore::widgetForLayer(const QString& absolutePath) const
{
for (const auto& sp : m_layers) {
if (sp && sp->dataPath() == absolutePath) {
MapLayer* raw = sp.get();
auto it = m_layerWidgets.find(raw);
if (it != m_layerWidgets.end()) return it->second;
return nullptr;
}
}
return nullptr;
}

48
HPPA/MapLayerStore.h Normal file
View File

@ -0,0 +1,48 @@
#pragma once
#include <QObject>
#include <QString>
#include <vector>
#include <memory>
#include <unordered_map>
class MapLayer;
class QWidget;
class MapLayerStore : public QObject
{
Q_OBJECT
public:
explicit MapLayerStore(QObject* parent = nullptr);
~MapLayerStore() override = default;
// Take ownership of the layer (store will own and manage its lifetime)
// Now also accept the associated QWidget so UI widget can be retrieved by layer pointer
void addLayer(MapLayer* layer, QWidget* widget = nullptr);
// Remove by pointer or by name. Destruction happens when removed from store.
public slots:
void removeLayer(MapLayer* layer);
void removeLayerByName(const QString& name);
// Queries
MapLayer* getLayer(const QString& name) const;
MapLayer* getLayerAt(int index) const;
int layerCount() const;
// Get associated widget for a layer (or nullptr if none)
QWidget* widgetForLayer(MapLayer* layer) const;
// Get associated widget by layer absolute data path
QWidget* widgetForLayer(const QString& absolutePath) const;
signals:
void layerAdded(MapLayer* layer);
// Emitted just before the layer is destroyed/removed from store
void layerAboutToBeRemoved(MapLayer* layer);
private:
// store shared ownership so other parts can keep raw pointers safely (or use QPointer)
std::vector<std::shared_ptr<MapLayer>> m_layers;
// mapping from raw MapLayer pointer to associated QWidget*
std::unordered_map<MapLayer*, QWidget*> m_layerWidgets;
};

View File

@ -286,6 +286,7 @@ void ResononNirImager::start_record()
} }
m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil"; m_FileName2Save2 = m_FileName2Save + "_" + std::to_string(m_FileSavedCounter) + ".bil";
QString filePath = QString::fromStdString(m_FileName2Save2);
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;
@ -353,7 +354,7 @@ void ResononNirImager::start_record()
//ÿ<><C3BF>1s<31><73><EFBFBD><EFBFBD>һ<EFBFBD>ν<EFBFBD><CEBD><EFBFBD>ͼ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD> //ÿ<><C3BF>1s<31><73><EFBFBD><EFBFBD>һ<EFBFBD>ν<EFBFBD><CEBD><EFBFBD>ͼ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>
if (m_iFrameCounter % (int)getFramerate() == 0) if (m_iFrameCounter % (int)getFramerate() == 0)
{ {
emit PlotSignal(m_FileSavedCounter, m_iFrameCounter); emit PlotSignal(m_FileSavedCounter, m_iFrameCounter, filePath);
} }
if (m_iFrameCounter >= m_iFrameNumber) if (m_iFrameCounter >= m_iFrameNumber)
@ -367,7 +368,7 @@ void ResononNirImager::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>ɼ<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>ȫ emit PlotSignal(m_FileSavedCounter, -1, filePath);//<2F>ɼ<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>ȫ
m_bRecordControlState = false; m_bRecordControlState = false;
WriteHdr(); WriteHdr();

View File

@ -112,6 +112,24 @@ std::string removeFileExtension(std::string filename)
} }
// 从绝对路径中提取文件名(不包含扩展名)
std::string getFileNameFromPath(const std::string &fullPath)
{
// 找到最后一个路径分隔符,支持 '/' 和 '\\'
size_t lastSlash = fullPath.find_last_of("/\\");
size_t start = (lastSlash == std::string::npos) ? 0 : lastSlash + 1;
// 找到最后一个点,确保点在文件名范围内
size_t lastDot = fullPath.find_last_of('.');
if (lastDot == std::string::npos || lastDot < start) {
// 没有扩展名或点在路径之前,直接返回从 start 到结尾的子串
return fullPath.substr(start);
}
// 返回从 start 到 lastDot 之间的文件名(不含扩展名)
return fullPath.substr(start, lastDot - start);
}
QList<QString> getFileInfo(QString file) QList<QString> getFileInfo(QString file)
{ {
QFileInfo fileInfo = QFileInfo(file); QFileInfo fileInfo = QFileInfo(file);

View File

@ -20,6 +20,7 @@ void swap(unsigned short * a, unsigned short * b);
bool createDir(QString fullPath); bool createDir(QString fullPath);
std::string removeFileExtension(std::string filename); std::string removeFileExtension(std::string filename);
std::string getFileNameFromPath(const std::string& fullPath);
QList<QString> getFileInfo(QString file); QList<QString> getFileInfo(QString file);