初步统一了多航线采集和打开影像功能
This commit is contained in:
119
HPPA/HPPA.cpp
119
HPPA/HPPA.cpp
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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" />
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
83
HPPA/MapLayerStore.cpp
Normal 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
48
HPPA/MapLayerStore.h
Normal 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;
|
||||||
|
};
|
||||||
@ -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();
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user