1、修改渲染参数:拉伸最大值;
2、toc添加数据管理功能:同步渲染参数到右下角“图像控制”面板;
This commit is contained in:
tangchao0503
2026-05-25 13:48:31 +08:00
parent dcce0a6665
commit b2ed6e9c73
6 changed files with 110 additions and 56 deletions

View File

@ -2,6 +2,8 @@
//#include <afx.h>
#include <exception>
#include <memory>
#include <vector>
#include <QMessageBox>
#include <QFileInfo> // 新增,用于解析路径
@ -1016,28 +1018,31 @@ void HPPA::removeLayerByTreeIndex()
auto* layerNode = static_cast<LayerTreeLayer*>(node);
MapLayer* mapLayer = layerNode->mapLayer();
QWidget* layerWidget = nullptr;
if (!mapLayer || !m_MapLayerStore) return;
if (mapLayer && m_MapLayerStore)
// 获取该 mapLayer 对应的所有 widget 并从 tab 中移除
std::vector<QWidget*> widgets = m_MapLayerStore->widgetsForMapLayer(mapLayer);
for (QWidget* widget : widgets)
{
layerWidget = m_MapLayerStore->widgetForLayer(mapLayer);
m_MapLayerStore->removeLayer(mapLayer);
}
if (layerWidget && m_imageViewerTabWidget)
{
const int tabIndex = m_imageViewerTabWidget->indexOf(layerWidget);
if (tabIndex >= 0)
if (widget && m_imageViewerTabWidget)
{
if (m_recordFrameCounter)
const int tabIndex = m_imageViewerTabWidget->indexOf(widget);
if (tabIndex >= 0)
{
m_recordFrameCounter->removeCounter(layerWidget);
if (m_recordFrameCounter)
{
m_recordFrameCounter->removeCounter(widget);
}
m_imageViewerTabWidget->removeTab(tabIndex);
}
m_imageViewerTabWidget->removeTab(tabIndex);
widget->deleteLater();
}
layerWidget->deleteLater();
}
// 删除 MapLayerStore 中的 mapLayer
m_MapLayerStore->removeLayer(mapLayer);
// 删除树模型中的节点
LayerTreeNode* parent = node->parentNode();
int row = node->rowInParent();
LayerTreeNode* removed = model->removeNode(parent, row);
@ -1050,7 +1055,6 @@ void HPPA::removeLayerByTreeIndex()
void HPPA::showColorImageByTreeIndex()
{
QModelIndex currentIndexTmp = m_layerTreeView->currentIndex();
if (!currentIndexTmp.isValid()) return;
LayerTreeModel* model = const_cast<LayerTreeModel*>(static_cast<const LayerTreeModel*>(currentIndexTmp.model()));
@ -1060,8 +1064,9 @@ void HPPA::showColorImageByTreeIndex()
if (!node || node->type() != LayerTreeNode::Type::Layer) return;
auto* layerNode = static_cast<LayerTreeLayer*>(node);
MapLayer* mapLayer = layerNode->mapLayer();
RasterLayer* mapLayer = static_cast<RasterLayer*>(layerNode->mapLayer());
newImage(mapLayer, RasterImageLayer::RendererType::Multiband, node);
}
void HPPA::removeImageByTreeIndex()
@ -2604,7 +2609,7 @@ void HPPA::onLayerCreatedFromFile(const QString& baseName, const QString& filePa
addLayer(baseName, filePath, false);
}
void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refresh)
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);
@ -2614,13 +2619,31 @@ void HPPA::addLayer(const QString& baseName, const QString& filePath,bool refres
if (m_MapLayerStore) m_MapLayerStore->addLayer(ml);
QWidget* mapcavasContainer = onCreateTab(baseName);
RasterImageLayer* rasterImageLayer = new RasterImageLayer(ml, RasterImageLayer::RendererType::Multiband);
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);
LayerTreeImageNode* imageNode = new LayerTreeImageNode(rasterImageLayer, "222");
LayerTreeNode* node2 = m_LayerTreeModel->addLayer(node, imageNode);
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);
@ -2634,50 +2657,72 @@ void HPPA::onLayerTreeSelectionChanged(const QItemSelection& selected, const QIt
{
Q_UNUSED(deselected);
if (selected.indexes().isEmpty()) {
if (selected.indexes().isEmpty())
{
m_ic->setActiveLayer(nullptr);
return;
}
QModelIndex idx = selected.indexes().first();
if (!idx.isValid()) {
if (!idx.isValid())
{
m_ic->setActiveLayer(nullptr);
return;
}
LayerTreeNode* node = static_cast<LayerTreeNode*>(idx.internalPointer());
if (!node || node->type() != LayerTreeNode::Type::Layer) {
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;
}
auto* layerNode = static_cast<LayerTreeLayer*>(node);
MapLayer* mapLayer = layerNode->mapLayer();
if (!mapLayer || mapLayer->layerType() != MapLayer::LayerType::Raster) {
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();
// Also switch to the corresponding tab in the image viewer
if (m_MapLayerStore && m_imageViewerTabWidget) {
QWidget* widget = m_MapLayerStore->widgetForLayer(mapLayer);
if (widget) {
int tabIndex = m_imageViewerTabWidget->indexOf(widget);
if (tabIndex >= 0) {
m_imageViewerTabWidget->setCurrentIndex(tabIndex);
}
}
if (!mapLayer || mapLayer->layerType() != MapLayer::LayerType::Raster) {
m_ic->setActiveLayer(nullptr);
return;
}
// Get RasterImageLayer from the Mapcavas container
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);
}
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)
@ -2693,7 +2738,7 @@ void HPPA::onBandSelectionChanged(double rWave, double gWave, double bWave)
if (!m_MapLayerStore) return;
MapLayer* mapLayer = imageLayer->layer();
QWidget* container = m_MapLayerStore->widgetForLayer(mapLayer);
QWidget* container = m_MapLayerStore->widgetForImageLayer(imageLayer);
if (!container) return;
QList<Mapcavas*> mapcavas = container->findChildren<Mapcavas*>();

View File

@ -374,9 +374,11 @@ public Q_SLOTS:
void createMicroscopicMotionControlScenario();
void onCreated3DModelOneMotor();
void addLayer(const QString& baseName, const QString& filePath, bool refresh);
void addLayer(const QString& baseName, const QString& filePath, bool refresh, bool isAddImage = true);
void newImage(RasterLayer* ml, RasterImageLayer::RendererType, LayerTreeNode* parent, bool refresh=true);
void onLayerCreatedFromFile(const QString& baseName, const QString& filePath, int fileIndex);
void removeLayerByTreeIndex();
void showColorImageByTreeIndex();
void removeImageByTreeIndex();
void removeAllLayersInRasterGroup();

View File

@ -38,7 +38,12 @@ QMenu* LayerTreeViewMenuProvider::createContextMenu()
{
QAction* removeLayerAction = new QAction(QStringLiteral("移除图层"), menu);
connect(removeLayerAction, &QAction::triggered, HPPA::instance(), &HPPA::removeLayerByTreeIndex);
QAction* showColorImageAction = new QAction(QStringLiteral("显示彩色图像"), menu);
connect(showColorImageAction, &QAction::triggered, HPPA::instance(), &HPPA::showColorImageByTreeIndex);
menu->addAction(removeLayerAction);
menu->addAction(showColorImageAction);
}
else if (node->type() == LayerTreeNode::Type::Image)
{

View File

@ -171,7 +171,7 @@ QWidget* MapLayerStore::widgetForImageLayer(RasterImageLayer* imageLayer) const
return nullptr;
}
QWidget* MapLayerStore::widgetForLayer(MapLayer* layer) const
QWidget* MapLayerStore::widgetForLayer(MapLayer* layer) const//需要修改??????????????????????????????????????????????
{
const LayerEntry* entry = findLayerEntry(layer);
if (!entry || entry->imageLayers.empty())

View File

@ -12,12 +12,14 @@ void MultibandRasterRenderer::stretchTo8bit(const std::vector<float>& in, std::v
{
size_t n = in.size();
out.resize(n);
if (maxVal <= minVal) {
if (maxVal <= minVal)
{
std::fill(out.begin(), out.end(), 0);
return;
}
float denom = 1.0f / (maxVal - minVal);
for (size_t i = 0; i < n; ++i) {
for (size_t i = 0; i < n; ++i)
{
float v = (in[i] - minVal) * denom;
v = std::min(std::max(v, 0.0f), 1.0f);
out[i] = static_cast<unsigned char>(v * 255.0f);

View File

@ -3,7 +3,7 @@
// Common base struct for all render parameters
struct RasterRenderParamsBase {
double minValue = 0.0;
double maxValue = 255.0;
double maxValue = 4095.0;
};
// Parameters for multiband rendering (RGB with wavelengths)