diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index a8a6fe0..5e95bc8 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -2,6 +2,8 @@ //#include #include +#include +#include #include #include // 新增,用于解析路径 @@ -1016,28 +1018,31 @@ void HPPA::removeLayerByTreeIndex() auto* layerNode = static_cast(node); MapLayer* mapLayer = layerNode->mapLayer(); - QWidget* layerWidget = nullptr; + if (!mapLayer || !m_MapLayerStore) return; - if (mapLayer && m_MapLayerStore) + // 获取该 mapLayer 对应的所有 widget 并从 tab 中移除 + std::vector 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(static_cast(currentIndexTmp.model())); @@ -1060,8 +1064,9 @@ void HPPA::showColorImageByTreeIndex() if (!node || node->type() != LayerTreeNode::Type::Layer) return; auto* layerNode = static_cast(node); - MapLayer* mapLayer = layerNode->mapLayer(); + RasterLayer* mapLayer = static_cast(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 = mapcavasContainer->findChildren(); 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(idx.internalPointer()); - if (!node || node->type() != LayerTreeNode::Type::Layer) { + LayerTreeNode* node = static_cast(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(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(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 = widget->findChildren(); - 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 = widget->findChildren(); + 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 = container->findChildren(); diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index dbfd1f4..f7a8b4a 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -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(); diff --git a/HPPA/LayerTreeViewMenuProvider.cpp b/HPPA/LayerTreeViewMenuProvider.cpp index 28f86fa..6efa74f 100644 --- a/HPPA/LayerTreeViewMenuProvider.cpp +++ b/HPPA/LayerTreeViewMenuProvider.cpp @@ -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) { diff --git a/HPPA/MapLayerStore.cpp b/HPPA/MapLayerStore.cpp index a2f3b96..0234aa3 100644 --- a/HPPA/MapLayerStore.cpp +++ b/HPPA/MapLayerStore.cpp @@ -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()) diff --git a/HPPA/MultibandRasterRenderer.cpp b/HPPA/MultibandRasterRenderer.cpp index a51419d..529c866 100644 --- a/HPPA/MultibandRasterRenderer.cpp +++ b/HPPA/MultibandRasterRenderer.cpp @@ -12,12 +12,14 @@ void MultibandRasterRenderer::stretchTo8bit(const std::vector& 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(v * 255.0f); diff --git a/HPPA/RasterRenderParams.h b/HPPA/RasterRenderParams.h index 7364f64..815a7c5 100644 --- a/HPPA/RasterRenderParams.h +++ b/HPPA/RasterRenderParams.h @@ -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)