From 823278b33be0fc4ff06104c190c0f406b9ff9d5a Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Thu, 12 Mar 2026 11:14:02 +0100 Subject: [PATCH 1/6] Remove unused variable --- DVRTransferFunction/src/TransferFunctionPlugin.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/DVRTransferFunction/src/TransferFunctionPlugin.cpp b/DVRTransferFunction/src/TransferFunctionPlugin.cpp index 8e9e01c..1701dd7 100644 --- a/DVRTransferFunction/src/TransferFunctionPlugin.cpp +++ b/DVRTransferFunction/src/TransferFunctionPlugin.cpp @@ -136,8 +136,6 @@ TransferFunctionPlugin::TransferFunctionPlugin(const PluginFactory* factory) : return dropRegions; }); - auto& selectionAction = _settingsAction.getSelectionAction(); - getSamplerAction().setHtmlViewGeneratorFunction([this](const ViewPluginSamplerAction::SampleContext& toolTipContext) -> QString { QStringList localPointIndices, globalPointIndices; From 430c15669bb8ac17df194c1ec3165f7ef9713042 Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Thu, 12 Mar 2026 11:14:18 +0100 Subject: [PATCH 2/6] Do not create multiple copies --- DVRVolumeLoader/src/DVRVolumeLoader.cpp | 26 ++++++++++++------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.cpp b/DVRVolumeLoader/src/DVRVolumeLoader.cpp index 617a1e4..d2480c9 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.cpp +++ b/DVRVolumeLoader/src/DVRVolumeLoader.cpp @@ -170,7 +170,6 @@ void DVRVolumeLoader::loadData() Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); - int valueDimensions = inputDialog->getNumberOfValueDimensions(); if (inputDialog->getDatasetSource() == DatasetSource::PointDatasets) { Dataset spatialDataset = inputDialog->getSpatialDataset(); @@ -194,10 +193,10 @@ void DVRVolumeLoader::loadData() } } }); - std::vector newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * valueDimensions, 0.0f); - std::vector numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * valueDimensions, 0.0f); + std::vector newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); + std::vector numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); int i = 0; - valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &valueDimensions, &i](auto pointData) { + valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &numDims, &i](auto pointData) { for (const auto& point : pointData) { mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize); @@ -206,9 +205,9 @@ void DVRVolumeLoader::loadData() int z = int(std::round(normalizedPos.z)); int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height(); //Populate the texture data with values - for (int j = 0; j < valueDimensions; ++j) { - newDataset[voxelIndex * valueDimensions + j] += point[j]; - numValuesPlaced[voxelIndex * valueDimensions + j] += 1; + for (int j = 0; j < numDims; ++j) { + newDataset[voxelIndex * numDims + j] += point[j]; + numValuesPlaced[voxelIndex * numDims + j] += 1; } i = i + 3; } @@ -219,7 +218,7 @@ void DVRVolumeLoader::loadData() newDataset[i] = newDataset[i] / numValuesPlaced[i]; } } - point_data->setData(newDataset, valueDimensions); + point_data->setData(newDataset, numDims); } else { @@ -237,15 +236,14 @@ void DVRVolumeLoader::loadData() } } - //Create the Volumes dataset - auto volumeDataset = mv::data().createDataset("Volumes", inputDialog->getDatasetName(), point_data); + // Create the Volumes dataset + _volumesDataset = mv::data().createDataset("Volumes", inputDialog->getDatasetName(), point_data); - volumeDataset->setVolumeSize(volumeBoxSize); - volumeDataset->setComponentsPerVoxel(valueDimensions); + _volumesDataset->setVolumeSize(volumeBoxSize); + _volumesDataset->setComponentsPerVoxel(numDims); - events().notifyDatasetDataChanged(volumeDataset); + events().notifyDatasetDataChanged(_volumesDataset); - _volumesDataset = volumeDataset; } else { qWarning() << "DVRVolumeLoader::loadData: No dataset name provided."; } }); From 030094f7be375eaa36567d94bbea1ba445226e2c Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Thu, 12 Mar 2026 11:15:53 +0100 Subject: [PATCH 3/6] Early return instead of long if --- DVRVolumeLoader/src/DVRVolumeLoader.cpp | 156 ++++++++++++------------ 1 file changed, 79 insertions(+), 77 deletions(-) diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.cpp b/DVRVolumeLoader/src/DVRVolumeLoader.cpp index d2480c9..288334d 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.cpp +++ b/DVRVolumeLoader/src/DVRVolumeLoader.cpp @@ -156,95 +156,97 @@ void DVRVolumeLoader::loadData() connect(inputDialog, &QDialog::accepted, this, [this, inputDialog]() -> void { - if (!inputDialog->getDatasetName().isEmpty()) { - auto sourceDataset = inputDialog->getSourceDataset(); - auto numDims = inputDialog->getNumberOfValueDimensions(); - auto storeAs = inputDialog->getStoreAs(); - - Dataset point_data; - - if (sourceDataset.isValid()) - point_data = mv::data().createDerivedDataset(inputDialog->getDatasetName(), sourceDataset); - else - point_data = mv::data().createDataset("Points", inputDialog->getDatasetName()); - - - Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); - - if (inputDialog->getDatasetSource() == DatasetSource::PointDatasets) { - Dataset spatialDataset = inputDialog->getSpatialDataset(); - Dataset valueDataset = inputDialog->getValueDataset(); - - mv::Vector3f min = mv::Vector3f(FLT_MAX, FLT_MAX, FLT_MAX); - mv::Vector3f max = mv::Vector3f(FLT_MIN, FLT_MIN, FLT_MIN); - std::vector spatialPositions; - spatialDataset->visitData([&min, &max, &spatialPositions](auto pointData) { - for (const auto& point : pointData) - { - min.x = std::min(min.x, static_cast(point[0])); - min.y = std::min(min.y, static_cast(point[1])); - min.z = std::min(min.z, static_cast(point[2])); - max.x = std::max(max.x, static_cast(point[0])); - max.y = std::max(max.y, static_cast(point[1])); - max.z = std::max(max.z, static_cast(point[2])); - - for (auto& value : point) { - spatialPositions.push_back(value); - } - } - }); - std::vector newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); - std::vector numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); - int i = 0; - valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &numDims, &i](auto pointData) { - for (const auto& point : pointData) - { - mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize); - int x = int(std::round(normalizedPos.x)); - int y = int(std::round(normalizedPos.y)); - int z = int(std::round(normalizedPos.z)); - int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height(); - //Populate the texture data with values - for (int j = 0; j < numDims; ++j) { - newDataset[voxelIndex * numDims + j] += point[j]; - numValuesPlaced[voxelIndex * numDims + j] += 1; - } - i = i + 3; - } - }); + if (inputDialog->getDatasetName().isEmpty()) { + qWarning() << "DVRVolumeLoader::loadData: No dataset name provided."; + return; + } - for (size_t i = 0; i < numValuesPlaced.size(); ++i) { // Average the values - if(numValuesPlaced[i] != 0) { - newDataset[i] = newDataset[i] / numValuesPlaced[i]; - } - } - point_data->setData(newDataset, numDims); - } - else { + auto sourceDataset = inputDialog->getSourceDataset(); + auto numDims = inputDialog->getNumberOfValueDimensions(); + auto storeAs = inputDialog->getStoreAs(); - if (inputDialog->getDataType() == BinaryDataType::FLOAT) + Dataset point_data; + + if (sourceDataset.isValid()) + point_data = mv::data().createDerivedDataset(inputDialog->getDatasetName(), sourceDataset); + else + point_data = mv::data().createDataset("Points", inputDialog->getDatasetName()); + + Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); + + if (inputDialog->getDatasetSource() == DatasetSource::PointDatasets) { + Dataset spatialDataset = inputDialog->getSpatialDataset(); + Dataset valueDataset = inputDialog->getValueDataset(); + + mv::Vector3f min = mv::Vector3f(FLT_MAX, FLT_MAX, FLT_MAX); + mv::Vector3f max = mv::Vector3f(FLT_MIN, FLT_MIN, FLT_MIN); + std::vector spatialPositions; + spatialDataset->visitData([&min, &max, &spatialPositions](auto pointData) { + for (const auto& point : pointData) { - recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + min.x = std::min(min.x, static_cast(point[0])); + min.y = std::min(min.y, static_cast(point[1])); + min.z = std::min(min.z, static_cast(point[2])); + max.x = std::max(max.x, static_cast(point[0])); + max.y = std::max(max.y, static_cast(point[1])); + max.z = std::max(max.z, static_cast(point[2])); + + for (auto& value : point) { + spatialPositions.push_back(value); + } } - else if (inputDialog->getDataType() == BinaryDataType::UBYTE) + }); + std::vector newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); + std::vector numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); + int i = 0; + valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &numDims, &i](auto pointData) { + for (const auto& point : pointData) { - recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize); + int x = int(std::round(normalizedPos.x)); + int y = int(std::round(normalizedPos.y)); + int z = int(std::round(normalizedPos.z)); + int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height(); + //Populate the texture data with values + for (int j = 0; j < numDims; ++j) { + newDataset[voxelIndex * numDims + j] += point[j]; + numValuesPlaced[voxelIndex * numDims + j] += 1; + } + i = i + 3; } - else if (inputDialog->getDataType() == BinaryDataType::UINT16) - { - recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + }); + + for (size_t i = 0; i < numValuesPlaced.size(); ++i) { // Average the values + if(numValuesPlaced[i] != 0) { + newDataset[i] = newDataset[i] / numValuesPlaced[i]; } } + point_data->setData(newDataset, numDims); + } + else { + + if (inputDialog->getDataType() == BinaryDataType::FLOAT) + { + recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + } + else if (inputDialog->getDataType() == BinaryDataType::UBYTE) + { + recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + } + else if (inputDialog->getDataType() == BinaryDataType::UINT16) + { + recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + } + } - // Create the Volumes dataset - _volumesDataset = mv::data().createDataset("Volumes", inputDialog->getDatasetName(), point_data); + // Create the Volumes dataset + _volumesDataset = mv::data().createDataset("Volumes", inputDialog->getDatasetName(), point_data); - _volumesDataset->setVolumeSize(volumeBoxSize); - _volumesDataset->setComponentsPerVoxel(numDims); + _volumesDataset->setVolumeSize(volumeBoxSize); + _volumesDataset->setComponentsPerVoxel(numDims); - events().notifyDatasetDataChanged(_volumesDataset); + events().notifyDatasetDataChanged(_volumesDataset); - } else { qWarning() << "DVRVolumeLoader::loadData: No dataset name provided."; } }); inputDialog->open(); From d5d3266662d713da5d0766ff9daaaf2db89ccf13 Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Thu, 12 Mar 2026 11:17:19 +0100 Subject: [PATCH 4/6] Single data set creation --- DVRVolumeLoader/src/DVRVolumeLoader.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.cpp b/DVRVolumeLoader/src/DVRVolumeLoader.cpp index 288334d..27eb499 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.cpp +++ b/DVRVolumeLoader/src/DVRVolumeLoader.cpp @@ -165,12 +165,9 @@ void DVRVolumeLoader::loadData() auto numDims = inputDialog->getNumberOfValueDimensions(); auto storeAs = inputDialog->getStoreAs(); - Dataset point_data; - - if (sourceDataset.isValid()) - point_data = mv::data().createDerivedDataset(inputDialog->getDatasetName(), sourceDataset); - else - point_data = mv::data().createDataset("Points", inputDialog->getDatasetName()); + Dataset point_data = sourceDataset.isValid() + ? mv::data().createDerivedDataset(inputDialog->getDatasetName(), sourceDataset) + : mv::data().createDataset("Points", inputDialog->getDatasetName()); Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); From 5bda0f3db79c07c124e06dee703f5cfbf0cd1492 Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Thu, 12 Mar 2026 11:19:57 +0100 Subject: [PATCH 5/6] Rename for subsequent refactor and option addition --- DVRVolumeLoader/src/DVRVolumeLoader.cpp | 20 ++++++++++---------- DVRVolumeLoader/src/DVRVolumeLoader.h | 7 ++++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.cpp b/DVRVolumeLoader/src/DVRVolumeLoader.cpp index 27eb499..fc28c6a 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.cpp +++ b/DVRVolumeLoader/src/DVRVolumeLoader.cpp @@ -171,7 +171,7 @@ void DVRVolumeLoader::loadData() Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); - if (inputDialog->getDatasetSource() == DatasetSource::PointDatasets) { + if (inputDialog->getDatasetSource() == DatasetSource::ScatteredPointDatasets) { Dataset spatialDataset = inputDialog->getSpatialDataset(); Dataset valueDataset = inputDialog->getValueDataset(); @@ -299,7 +299,7 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol _fileLoadAction(this, "Load File"), _settingsGroupAction(this, "Settings"), _fileGroupAction(this, "File selection"), - _datasetGroupAction(this, "Dataset selection"), + _scatteredDataGroupAction(this, "Dataset selection"), _selectedWidget(nullptr) { setWindowTitle(tr("DVRVolume Loader")); @@ -336,11 +336,11 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol // Add radio buttons for dataset source selection _fileRadioButton = new QRadioButton(tr("File"), this); - _pointDatasetsRadioButton = new QRadioButton(tr("Point Datasets"), this); + _scatteredDataRadioButton = new QRadioButton(tr("Point Datasets"), this); _dataSourceButtonGroup = new QButtonGroup(this); _dataSourceButtonGroup->addButton(_fileRadioButton, DatasetSource::File); - _dataSourceButtonGroup->addButton(_pointDatasetsRadioButton, DatasetSource::PointDatasets); + _dataSourceButtonGroup->addButton(_scatteredDataRadioButton, DatasetSource::ScatteredPointDatasets); _fileRadioButton->setChecked(true); // Default to None @@ -352,7 +352,7 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol auto buttonsLayout = new QHBoxLayout(); buttonsLayout->setContentsMargins(150, 0, 0, 0); buttonsLayout->addWidget(_fileRadioButton); - buttonsLayout->addWidget(_pointDatasetsRadioButton); + buttonsLayout->addWidget(_scatteredDataRadioButton); layout->addLayout(buttonsLayout); _fileGroupAction.addAction(&_fileLoadAction); @@ -362,9 +362,9 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol _spatialDatasetPickerAction.setDatasets(dataSets); _valueDatasetPickerAction.setDatasets(dataSets); - _datasetGroupAction.addAction(&_spatialDatasetPickerAction); - _datasetGroupAction.addAction(&_valueDatasetPickerAction); - _datasetGroupAction.addAction(&_acceptAction); + _scatteredDataGroupAction.addAction(&_spatialDatasetPickerAction); + _scatteredDataGroupAction.addAction(&_valueDatasetPickerAction); + _scatteredDataGroupAction.addAction(&_acceptAction); _selectedWidget = _fileGroupAction.createWidget(this); layout->addWidget(_selectedWidget); @@ -386,8 +386,8 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol if (_datasetSource == DatasetSource::File) { _selectedWidget = _fileGroupAction.createWidget(this); } - else if (_datasetSource == DatasetSource::PointDatasets) { - _selectedWidget = _datasetGroupAction.createWidget(this); + else if (_datasetSource == DatasetSource::ScatteredPointDatasets) { + _selectedWidget = _scatteredDataGroupAction.createWidget(this); } layout->addWidget(_selectedWidget); layout->update(); diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.h b/DVRVolumeLoader/src/DVRVolumeLoader.h index 3b06db9..c246d7d 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.h +++ b/DVRVolumeLoader/src/DVRVolumeLoader.h @@ -30,7 +30,8 @@ enum BinaryDataType enum DatasetSource { - File, PointDatasets + File, + ScatteredPointDatasets, }; class DVRVolumeLoadingInputDialog : public QDialog @@ -128,12 +129,12 @@ class DVRVolumeLoadingInputDialog : public QDialog mv::gui::TriggerAction _fileLoadAction; /** File action */ mv::gui::GroupAction _settingsGroupAction; /** Shared group action */ mv::gui::GroupAction _fileGroupAction; /** File specific group action */ - mv::gui::GroupAction _datasetGroupAction; /** Datasets specific group action */ + mv::gui::GroupAction _scatteredDataGroupAction; /** Datasets specific group action */ DatasetSource _datasetSource; /** Dataset source */ QRadioButton* _fileRadioButton; /** File radio button */ - QRadioButton* _pointDatasetsRadioButton; /** Point datasets radio button */ + QRadioButton* _scatteredDataRadioButton; /** Point datasets radio button */ QButtonGroup* _dataSourceButtonGroup; /** Data source button group */ QWidget* _selectedWidget; /** File widget */ From a8c9a5a66ee77a65982852582f499309cf590c23 Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Thu, 12 Mar 2026 14:06:00 +0100 Subject: [PATCH 6/6] Introduce vol point data option --- DVRVolumeLoader/src/DVRVolumeLoader.cpp | 123 ++++++++++++++++-------- DVRVolumeLoader/src/DVRVolumeLoader.h | 5 +- 2 files changed, 87 insertions(+), 41 deletions(-) diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.cpp b/DVRVolumeLoader/src/DVRVolumeLoader.cpp index fc28c6a..6c852c1 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.cpp +++ b/DVRVolumeLoader/src/DVRVolumeLoader.cpp @@ -161,17 +161,28 @@ void DVRVolumeLoader::loadData() return; } - auto sourceDataset = inputDialog->getSourceDataset(); - auto numDims = inputDialog->getNumberOfValueDimensions(); - auto storeAs = inputDialog->getStoreAs(); + const auto parentDataset = inputDialog->getSourceDataset(); + const auto sourceType = inputDialog->getDatasetSource(); + const auto datasetName = inputDialog->getDatasetName(); + const auto numDims = inputDialog->getNumberOfValueDimensions(); + const auto storeAs = inputDialog->getStoreAs(); + const auto volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); + + auto createValuesDataset = [sourceType, &datasetName, &parentDataset]() -> Dataset + { + if (sourceType == DatasetSource::VolumePointDatasets) + return parentDataset; - Dataset point_data = sourceDataset.isValid() - ? mv::data().createDerivedDataset(inputDialog->getDatasetName(), sourceDataset) - : mv::data().createDataset("Points", inputDialog->getDatasetName()); + return parentDataset.isValid() + ? mv::data().createDerivedDataset(datasetName, parentDataset) + : mv::data().createDataset("Points", datasetName); + }; - Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ()); + Dataset valuesDataset = createValuesDataset(); - if (inputDialog->getDatasetSource() == DatasetSource::ScatteredPointDatasets) { + switch (inputDialog->getDatasetSource()) + { + case DatasetSource::ScatteredPointDatasets: { Dataset spatialDataset = inputDialog->getSpatialDataset(); Dataset valueDataset = inputDialog->getValueDataset(); @@ -192,18 +203,18 @@ void DVRVolumeLoader::loadData() spatialPositions.push_back(value); } } - }); + }); std::vector newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); std::vector numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f); int i = 0; valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &numDims, &i](auto pointData) { for (const auto& point : pointData) { - mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize); - int x = int(std::round(normalizedPos.x)); - int y = int(std::round(normalizedPos.y)); - int z = int(std::round(normalizedPos.z)); - int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height(); + const mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize); + const int x = static_cast(std::round(normalizedPos.x)); + const int y = static_cast(std::round(normalizedPos.y)); + const int z = static_cast(std::round(normalizedPos.z)); + const int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height(); //Populate the texture data with values for (int j = 0; j < numDims; ++j) { newDataset[voxelIndex * numDims + j] += point[j]; @@ -211,33 +222,40 @@ void DVRVolumeLoader::loadData() } i = i + 3; } - }); + }); for (size_t i = 0; i < numValuesPlaced.size(); ++i) { // Average the values - if(numValuesPlaced[i] != 0) { + if (numValuesPlaced[i] != 0) { newDataset[i] = newDataset[i] / numValuesPlaced[i]; } } - point_data->setData(newDataset, numDims); - } - else { + valuesDataset->setData(newDataset, numDims); - if (inputDialog->getDataType() == BinaryDataType::FLOAT) - { - recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + break; + } + case DatasetSource::File: { + if (inputDialog->getDataType() == BinaryDataType::FLOAT) { + recursiveReadDataAndAddToCore(storeAs, valuesDataset, numDims, _contents); } - else if (inputDialog->getDataType() == BinaryDataType::UBYTE) - { - recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + else if (inputDialog->getDataType() == BinaryDataType::UBYTE) { + recursiveReadDataAndAddToCore(storeAs, valuesDataset, numDims, _contents); } - else if (inputDialog->getDataType() == BinaryDataType::UINT16) - { - recursiveReadDataAndAddToCore(storeAs, point_data, numDims, _contents); + else if (inputDialog->getDataType() == BinaryDataType::UINT16) { + recursiveReadDataAndAddToCore(storeAs, valuesDataset, numDims, _contents); } + + break; + } + case DatasetSource::VolumePointDatasets: { + if (!parentDataset.isValid()) + qWarning() << "DVRVolumeLoader::loadData: Source data must be set for DatasetSource::VolumePointDatasets."; + + break; + } } // Create the Volumes dataset - _volumesDataset = mv::data().createDataset("Volumes", inputDialog->getDatasetName(), point_data); + _volumesDataset = mv::data().createDataset("Volumes", inputDialog->getDatasetName(), valuesDataset); _volumesDataset->setVolumeSize(volumeBoxSize); _volumesDataset->setComponentsPerVoxel(numDims); @@ -299,7 +317,12 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol _fileLoadAction(this, "Load File"), _settingsGroupAction(this, "Settings"), _fileGroupAction(this, "File selection"), - _scatteredDataGroupAction(this, "Dataset selection"), + _scatteredDataGroupAction(this, "Dataset (scat.) selection"), + _volumeDataGroupAction(this, "Dataset (vol.) selection"), + _fileRadioButton(new QRadioButton(tr("File"), this)), + _scatteredDataRadioButton(new QRadioButton(tr("Datasets (scat.)"), this)), + _volumeDataRadioButton(new QRadioButton(tr("Datasets (vol.)"), this)), + _dataSourceButtonGroup(new QButtonGroup(this)), _selectedWidget(nullptr) { setWindowTitle(tr("DVRVolume Loader")); @@ -335,12 +358,9 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol _settingsGroupAction.addAction(&_datasetNameAction); // Add radio buttons for dataset source selection - _fileRadioButton = new QRadioButton(tr("File"), this); - _scatteredDataRadioButton = new QRadioButton(tr("Point Datasets"), this); - - _dataSourceButtonGroup = new QButtonGroup(this); _dataSourceButtonGroup->addButton(_fileRadioButton, DatasetSource::File); _dataSourceButtonGroup->addButton(_scatteredDataRadioButton, DatasetSource::ScatteredPointDatasets); + _dataSourceButtonGroup->addButton(_volumeDataRadioButton, DatasetSource::VolumePointDatasets); _fileRadioButton->setChecked(true); // Default to None @@ -353,6 +373,7 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol buttonsLayout->setContentsMargins(150, 0, 0, 0); buttonsLayout->addWidget(_fileRadioButton); buttonsLayout->addWidget(_scatteredDataRadioButton); + buttonsLayout->addWidget(_volumeDataRadioButton); layout->addLayout(buttonsLayout); _fileGroupAction.addAction(&_fileLoadAction); @@ -366,6 +387,11 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol _scatteredDataGroupAction.addAction(&_valueDatasetPickerAction); _scatteredDataGroupAction.addAction(&_acceptAction); + auto stringAction = new mv::gui::StringAction(this, "Info", "You must select a source dataset for this option!"); + stringAction->setDefaultWidgetFlags(mv::gui::StringAction::WidgetFlag::Label); + _volumeDataGroupAction.addAction(stringAction); + _volumeDataGroupAction.addAction(&_acceptAction); + _selectedWidget = _fileGroupAction.createWidget(this); layout->addWidget(_selectedWidget); setLayout(layout); @@ -377,23 +403,40 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol //Update the selected widget when a radio button is clicked connect(_dataSourceButtonGroup, &QButtonGroup::buttonClicked, this, [this, layout]() -> void { - int id = _dataSourceButtonGroup->checkedId(); - _datasetSource = static_cast(id); + const int id = _dataSourceButtonGroup->checkedId(); + _datasetSource = static_cast(id); + if (_selectedWidget) { layout->removeWidget(_selectedWidget); _selectedWidget->deleteLater(); } - if (_datasetSource == DatasetSource::File) { + + bool enableAccept = true; + + switch (_datasetSource) + { + case DatasetSource::File: _selectedWidget = _fileGroupAction.createWidget(this); - } - else if (_datasetSource == DatasetSource::ScatteredPointDatasets) { + break; + case DatasetSource::ScatteredPointDatasets: _selectedWidget = _scatteredDataGroupAction.createWidget(this); + break; + case DatasetSource::VolumePointDatasets: + _selectedWidget = _volumeDataGroupAction.createWidget(this); + enableAccept = (_sourceDatasetPickerAction.getCurrentIndex() != -1); + + break; } + + _acceptAction.setEnabled(enableAccept); + layout->addWidget(_selectedWidget); layout->update(); }); - + connect(&_sourceDatasetPickerAction, &mv::gui::DatasetPickerAction::datasetPicked, this, [this](const Dataset<>&) { + _acceptAction.setEnabled(true); + }); // Update the state of the dataset picker const auto updateDatasetPicker = [this]() -> void { diff --git a/DVRVolumeLoader/src/DVRVolumeLoader.h b/DVRVolumeLoader/src/DVRVolumeLoader.h index c246d7d..2ffc01b 100644 --- a/DVRVolumeLoader/src/DVRVolumeLoader.h +++ b/DVRVolumeLoader/src/DVRVolumeLoader.h @@ -32,6 +32,7 @@ enum DatasetSource { File, ScatteredPointDatasets, + VolumePointDatasets, }; class DVRVolumeLoadingInputDialog : public QDialog @@ -130,11 +131,13 @@ class DVRVolumeLoadingInputDialog : public QDialog mv::gui::GroupAction _settingsGroupAction; /** Shared group action */ mv::gui::GroupAction _fileGroupAction; /** File specific group action */ mv::gui::GroupAction _scatteredDataGroupAction; /** Datasets specific group action */ + mv::gui::GroupAction _volumeDataGroupAction; /** Datasets specific group action */ DatasetSource _datasetSource; /** Dataset source */ QRadioButton* _fileRadioButton; /** File radio button */ - QRadioButton* _scatteredDataRadioButton; /** Point datasets radio button */ + QRadioButton* _scatteredDataRadioButton; /** Point dataset (scattered) radio button */ + QRadioButton* _volumeDataRadioButton; /** Point dataset (volume) radio button */ QButtonGroup* _dataSourceButtonGroup; /** Data source button group */ QWidget* _selectedWidget; /** File widget */