add
1、修改渲染参数:拉伸最大值; 2、toc添加数据管理功能:同步渲染参数到右下角“图像控制”面板;
This commit is contained in:
109
HPPA/HPPA.cpp
109
HPPA/HPPA.cpp
@ -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)
|
||||
if (widget && m_imageViewerTabWidget)
|
||||
{
|
||||
const int tabIndex = m_imageViewerTabWidget->indexOf(layerWidget);
|
||||
const int tabIndex = m_imageViewerTabWidget->indexOf(widget);
|
||||
if (tabIndex >= 0)
|
||||
{
|
||||
if (m_recordFrameCounter)
|
||||
{
|
||||
m_recordFrameCounter->removeCounter(layerWidget);
|
||||
m_recordFrameCounter->removeCounter(widget);
|
||||
}
|
||||
m_imageViewerTabWidget->removeTab(tabIndex);
|
||||
}
|
||||
layerWidget->deleteLater();
|
||||
widget->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) {
|
||||
|
||||
if (!node || node->type() == LayerTreeNode::Type::Group)
|
||||
{
|
||||
m_ic->setActiveLayer(nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
auto* layerNode = static_cast<LayerTreeLayer*>(node);
|
||||
MapLayer* mapLayer = layerNode->mapLayer();
|
||||
//后续工作:当选择图层树中的图层时,应该显示此图层的元数据
|
||||
if (!node || node->type() == LayerTreeNode::Type::Layer)
|
||||
{
|
||||
m_ic->setActiveLayer(nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node || node->type() == LayerTreeNode::Type::Image)
|
||||
{
|
||||
auto* imageNode = static_cast<LayerTreeImageNode*>(node);
|
||||
RasterImageLayer* imageLayer = imageNode->imageLayer();
|
||||
MapLayer* mapLayer = imageLayer->layer();
|
||||
|
||||
if (!mapLayer || mapLayer->layerType() != MapLayer::LayerType::Raster) {
|
||||
m_ic->setActiveLayer(nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
// Also switch to the corresponding tab in the image viewer
|
||||
if (m_MapLayerStore && m_imageViewerTabWidget) {
|
||||
QWidget* widget = m_MapLayerStore->widgetForLayer(mapLayer);
|
||||
if (widget) {
|
||||
if (m_MapLayerStore && m_imageViewerTabWidget)
|
||||
{
|
||||
QWidget* widget = m_MapLayerStore->widgetForImageLayer(imageLayer);
|
||||
if (widget)
|
||||
{
|
||||
int tabIndex = m_imageViewerTabWidget->indexOf(widget);
|
||||
if (tabIndex >= 0) {
|
||||
if (tabIndex >= 0)
|
||||
{
|
||||
m_imageViewerTabWidget->setCurrentIndex(tabIndex);
|
||||
}
|
||||
}
|
||||
|
||||
// Get RasterImageLayer from the Mapcavas container
|
||||
QList<Mapcavas*> mapcavas = widget->findChildren<Mapcavas*>();
|
||||
if (!mapcavas.isEmpty()) {
|
||||
if (!mapcavas.isEmpty())
|
||||
{
|
||||
m_ic->setActiveLayer(mapcavas[0]->imageLayer());
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ic->setActiveLayer(nullptr);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
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*>();
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user