Skip to content

Commit 851b40b

Browse files
authored
Add loader option: no data conversion (#5)
* Remove unused variable * Do not create multiple copies * Early return instead of long if * Single data set creation * Rename for subsequent refactor and option addition * Introduce vol point data option
1 parent 20eeada commit 851b40b

3 files changed

Lines changed: 142 additions & 100 deletions

File tree

DVRTransferFunction/src/TransferFunctionPlugin.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,6 @@ TransferFunctionPlugin::TransferFunctionPlugin(const PluginFactory* factory) :
136136
return dropRegions;
137137
});
138138

139-
auto& selectionAction = _settingsAction.getSelectionAction();
140-
141139
getSamplerAction().setHtmlViewGeneratorFunction([this](const ViewPluginSamplerAction::SampleContext& toolTipContext) -> QString {
142140
QStringList localPointIndices, globalPointIndices;
143141

DVRVolumeLoader/src/DVRVolumeLoader.cpp

Lines changed: 135 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -156,97 +156,112 @@ void DVRVolumeLoader::loadData()
156156

157157
connect(inputDialog, &QDialog::accepted, this, [this, inputDialog]() -> void {
158158

159-
if (!inputDialog->getDatasetName().isEmpty()) {
160-
auto sourceDataset = inputDialog->getSourceDataset();
161-
auto numDims = inputDialog->getNumberOfValueDimensions();
162-
auto storeAs = inputDialog->getStoreAs();
163-
164-
Dataset<Points> point_data;
165-
166-
if (sourceDataset.isValid())
167-
point_data = mv::data().createDerivedDataset<Points>(inputDialog->getDatasetName(), sourceDataset);
168-
else
169-
point_data = mv::data().createDataset<Points>("Points", inputDialog->getDatasetName());
170-
171-
172-
Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ());
173-
int valueDimensions = inputDialog->getNumberOfValueDimensions();
174-
175-
if (inputDialog->getDatasetSource() == DatasetSource::PointDatasets) {
176-
Dataset<Points> spatialDataset = inputDialog->getSpatialDataset();
177-
Dataset<Points> valueDataset = inputDialog->getValueDataset();
178-
179-
mv::Vector3f min = mv::Vector3f(FLT_MAX, FLT_MAX, FLT_MAX);
180-
mv::Vector3f max = mv::Vector3f(FLT_MIN, FLT_MIN, FLT_MIN);
181-
std::vector<float> spatialPositions;
182-
spatialDataset->visitData([&min, &max, &spatialPositions](auto pointData) {
183-
for (const auto& point : pointData)
184-
{
185-
min.x = std::min(min.x, static_cast<float>(point[0]));
186-
min.y = std::min(min.y, static_cast<float>(point[1]));
187-
min.z = std::min(min.z, static_cast<float>(point[2]));
188-
max.x = std::max(max.x, static_cast<float>(point[0]));
189-
max.y = std::max(max.y, static_cast<float>(point[1]));
190-
max.z = std::max(max.z, static_cast<float>(point[2]));
191-
192-
for (auto& value : point) {
193-
spatialPositions.push_back(value);
194-
}
159+
if (inputDialog->getDatasetName().isEmpty()) {
160+
qWarning() << "DVRVolumeLoader::loadData: No dataset name provided.";
161+
return;
162+
}
163+
164+
const auto parentDataset = inputDialog->getSourceDataset();
165+
const auto sourceType = inputDialog->getDatasetSource();
166+
const auto datasetName = inputDialog->getDatasetName();
167+
const auto numDims = inputDialog->getNumberOfValueDimensions();
168+
const auto storeAs = inputDialog->getStoreAs();
169+
const auto volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ());
170+
171+
auto createValuesDataset = [sourceType, &datasetName, &parentDataset]() -> Dataset<Points>
172+
{
173+
if (sourceType == DatasetSource::VolumePointDatasets)
174+
return parentDataset;
175+
176+
return parentDataset.isValid()
177+
? mv::data().createDerivedDataset<Points>(datasetName, parentDataset)
178+
: mv::data().createDataset<Points>("Points", datasetName);
179+
};
180+
181+
Dataset<Points> valuesDataset = createValuesDataset();
182+
183+
switch (inputDialog->getDatasetSource())
184+
{
185+
case DatasetSource::ScatteredPointDatasets: {
186+
Dataset<Points> spatialDataset = inputDialog->getSpatialDataset();
187+
Dataset<Points> valueDataset = inputDialog->getValueDataset();
188+
189+
mv::Vector3f min = mv::Vector3f(FLT_MAX, FLT_MAX, FLT_MAX);
190+
mv::Vector3f max = mv::Vector3f(FLT_MIN, FLT_MIN, FLT_MIN);
191+
std::vector<float> spatialPositions;
192+
spatialDataset->visitData([&min, &max, &spatialPositions](auto pointData) {
193+
for (const auto& point : pointData)
194+
{
195+
min.x = std::min(min.x, static_cast<float>(point[0]));
196+
min.y = std::min(min.y, static_cast<float>(point[1]));
197+
min.z = std::min(min.z, static_cast<float>(point[2]));
198+
max.x = std::max(max.x, static_cast<float>(point[0]));
199+
max.y = std::max(max.y, static_cast<float>(point[1]));
200+
max.z = std::max(max.z, static_cast<float>(point[2]));
201+
202+
for (auto& value : point) {
203+
spatialPositions.push_back(value);
195204
}
205+
}
196206
});
197-
std::vector<float> newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * valueDimensions, 0.0f);
198-
std::vector<float> numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * valueDimensions, 0.0f);
199-
int i = 0;
200-
valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &valueDimensions, &i](auto pointData) {
201-
for (const auto& point : pointData)
202-
{
203-
mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize);
204-
int x = int(std::round(normalizedPos.x));
205-
int y = int(std::round(normalizedPos.y));
206-
int z = int(std::round(normalizedPos.z));
207-
int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height();
208-
//Populate the texture data with values
209-
for (int j = 0; j < valueDimensions; ++j) {
210-
newDataset[voxelIndex * valueDimensions + j] += point[j];
211-
numValuesPlaced[voxelIndex * valueDimensions + j] += 1;
212-
}
213-
i = i + 3;
207+
std::vector<float> newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f);
208+
std::vector<float> numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f);
209+
int i = 0;
210+
valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &numDims, &i](auto pointData) {
211+
for (const auto& point : pointData)
212+
{
213+
const mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize);
214+
const int x = static_cast<int>(std::round(normalizedPos.x));
215+
const int y = static_cast<int>(std::round(normalizedPos.y));
216+
const int z = static_cast<int>(std::round(normalizedPos.z));
217+
const int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height();
218+
//Populate the texture data with values
219+
for (int j = 0; j < numDims; ++j) {
220+
newDataset[voxelIndex * numDims + j] += point[j];
221+
numValuesPlaced[voxelIndex * numDims + j] += 1;
214222
}
223+
i = i + 3;
224+
}
215225
});
216226

217-
for (size_t i = 0; i < numValuesPlaced.size(); ++i) { // Average the values
218-
if(numValuesPlaced[i] != 0) {
219-
newDataset[i] = newDataset[i] / numValuesPlaced[i];
220-
}
227+
for (size_t i = 0; i < numValuesPlaced.size(); ++i) { // Average the values
228+
if (numValuesPlaced[i] != 0) {
229+
newDataset[i] = newDataset[i] / numValuesPlaced[i];
221230
}
222-
point_data->setData(newDataset, valueDimensions);
223231
}
224-
else {
232+
valuesDataset->setData(newDataset, numDims);
225233

226-
if (inputDialog->getDataType() == BinaryDataType::FLOAT)
227-
{
228-
recursiveReadDataAndAddToCore<float>(storeAs, point_data, numDims, _contents);
229-
}
230-
else if (inputDialog->getDataType() == BinaryDataType::UBYTE)
231-
{
232-
recursiveReadDataAndAddToCore<unsigned char>(storeAs, point_data, numDims, _contents);
233-
}
234-
else if (inputDialog->getDataType() == BinaryDataType::UINT16)
235-
{
236-
recursiveReadDataAndAddToCore<std::uint16_t>(storeAs, point_data, numDims, _contents);
237-
}
234+
break;
235+
}
236+
case DatasetSource::File: {
237+
if (inputDialog->getDataType() == BinaryDataType::FLOAT) {
238+
recursiveReadDataAndAddToCore<float>(storeAs, valuesDataset, numDims, _contents);
239+
}
240+
else if (inputDialog->getDataType() == BinaryDataType::UBYTE) {
241+
recursiveReadDataAndAddToCore<unsigned char>(storeAs, valuesDataset, numDims, _contents);
238242
}
243+
else if (inputDialog->getDataType() == BinaryDataType::UINT16) {
244+
recursiveReadDataAndAddToCore<std::uint16_t>(storeAs, valuesDataset, numDims, _contents);
245+
}
246+
247+
break;
248+
}
249+
case DatasetSource::VolumePointDatasets: {
250+
if (!parentDataset.isValid())
251+
qWarning() << "DVRVolumeLoader::loadData: Source data must be set for DatasetSource::VolumePointDatasets.";
239252

240-
//Create the Volumes dataset
241-
auto volumeDataset = mv::data().createDataset<Volumes>("Volumes", inputDialog->getDatasetName(), point_data);
253+
break;
254+
}
255+
}
242256

243-
volumeDataset->setVolumeSize(volumeBoxSize);
244-
volumeDataset->setComponentsPerVoxel(valueDimensions);
257+
// Create the Volumes dataset
258+
_volumesDataset = mv::data().createDataset<Volumes>("Volumes", inputDialog->getDatasetName(), valuesDataset);
245259

246-
events().notifyDatasetDataChanged(volumeDataset);
260+
_volumesDataset->setVolumeSize(volumeBoxSize);
261+
_volumesDataset->setComponentsPerVoxel(numDims);
262+
263+
events().notifyDatasetDataChanged(_volumesDataset);
247264

248-
_volumesDataset = volumeDataset;
249-
} else { qWarning() << "DVRVolumeLoader::loadData: No dataset name provided."; }
250265
});
251266

252267
inputDialog->open();
@@ -302,7 +317,12 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
302317
_fileLoadAction(this, "Load File"),
303318
_settingsGroupAction(this, "Settings"),
304319
_fileGroupAction(this, "File selection"),
305-
_datasetGroupAction(this, "Dataset selection"),
320+
_scatteredDataGroupAction(this, "Dataset (scat.) selection"),
321+
_volumeDataGroupAction(this, "Dataset (vol.) selection"),
322+
_fileRadioButton(new QRadioButton(tr("File"), this)),
323+
_scatteredDataRadioButton(new QRadioButton(tr("Datasets (scat.)"), this)),
324+
_volumeDataRadioButton(new QRadioButton(tr("Datasets (vol.)"), this)),
325+
_dataSourceButtonGroup(new QButtonGroup(this)),
306326
_selectedWidget(nullptr)
307327
{
308328
setWindowTitle(tr("DVRVolume Loader"));
@@ -338,12 +358,9 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
338358
_settingsGroupAction.addAction(&_datasetNameAction);
339359

340360
// Add radio buttons for dataset source selection
341-
_fileRadioButton = new QRadioButton(tr("File"), this);
342-
_pointDatasetsRadioButton = new QRadioButton(tr("Point Datasets"), this);
343-
344-
_dataSourceButtonGroup = new QButtonGroup(this);
345361
_dataSourceButtonGroup->addButton(_fileRadioButton, DatasetSource::File);
346-
_dataSourceButtonGroup->addButton(_pointDatasetsRadioButton, DatasetSource::PointDatasets);
362+
_dataSourceButtonGroup->addButton(_scatteredDataRadioButton, DatasetSource::ScatteredPointDatasets);
363+
_dataSourceButtonGroup->addButton(_volumeDataRadioButton, DatasetSource::VolumePointDatasets);
347364

348365
_fileRadioButton->setChecked(true); // Default to None
349366

@@ -355,7 +372,8 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
355372
auto buttonsLayout = new QHBoxLayout();
356373
buttonsLayout->setContentsMargins(150, 0, 0, 0);
357374
buttonsLayout->addWidget(_fileRadioButton);
358-
buttonsLayout->addWidget(_pointDatasetsRadioButton);
375+
buttonsLayout->addWidget(_scatteredDataRadioButton);
376+
buttonsLayout->addWidget(_volumeDataRadioButton);
359377
layout->addLayout(buttonsLayout);
360378

361379
_fileGroupAction.addAction(&_fileLoadAction);
@@ -365,9 +383,14 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
365383
_spatialDatasetPickerAction.setDatasets(dataSets);
366384
_valueDatasetPickerAction.setDatasets(dataSets);
367385

368-
_datasetGroupAction.addAction(&_spatialDatasetPickerAction);
369-
_datasetGroupAction.addAction(&_valueDatasetPickerAction);
370-
_datasetGroupAction.addAction(&_acceptAction);
386+
_scatteredDataGroupAction.addAction(&_spatialDatasetPickerAction);
387+
_scatteredDataGroupAction.addAction(&_valueDatasetPickerAction);
388+
_scatteredDataGroupAction.addAction(&_acceptAction);
389+
390+
auto stringAction = new mv::gui::StringAction(this, "Info", "You must select a source dataset for this option!");
391+
stringAction->setDefaultWidgetFlags(mv::gui::StringAction::WidgetFlag::Label);
392+
_volumeDataGroupAction.addAction(stringAction);
393+
_volumeDataGroupAction.addAction(&_acceptAction);
371394

372395
_selectedWidget = _fileGroupAction.createWidget(this);
373396
layout->addWidget(_selectedWidget);
@@ -380,23 +403,40 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
380403

381404
//Update the selected widget when a radio button is clicked
382405
connect(_dataSourceButtonGroup, &QButtonGroup::buttonClicked, this, [this, layout]() -> void {
383-
int id = _dataSourceButtonGroup->checkedId();
384-
_datasetSource = static_cast<DatasetSource>(id);
406+
const int id = _dataSourceButtonGroup->checkedId();
407+
_datasetSource = static_cast<DatasetSource>(id);
408+
385409
if (_selectedWidget) {
386410
layout->removeWidget(_selectedWidget);
387411
_selectedWidget->deleteLater();
388412
}
389-
if (_datasetSource == DatasetSource::File) {
413+
414+
bool enableAccept = true;
415+
416+
switch (_datasetSource)
417+
{
418+
case DatasetSource::File:
390419
_selectedWidget = _fileGroupAction.createWidget(this);
420+
break;
421+
case DatasetSource::ScatteredPointDatasets:
422+
_selectedWidget = _scatteredDataGroupAction.createWidget(this);
423+
break;
424+
case DatasetSource::VolumePointDatasets:
425+
_selectedWidget = _volumeDataGroupAction.createWidget(this);
426+
enableAccept = (_sourceDatasetPickerAction.getCurrentIndex() != -1);
427+
428+
break;
391429
}
392-
else if (_datasetSource == DatasetSource::PointDatasets) {
393-
_selectedWidget = _datasetGroupAction.createWidget(this);
394-
}
430+
431+
_acceptAction.setEnabled(enableAccept);
432+
395433
layout->addWidget(_selectedWidget);
396434
layout->update();
397435
});
398436

399-
437+
connect(&_sourceDatasetPickerAction, &mv::gui::DatasetPickerAction::datasetPicked, this, [this](const Dataset<>&) {
438+
_acceptAction.setEnabled(true);
439+
});
400440

401441
// Update the state of the dataset picker
402442
const auto updateDatasetPicker = [this]() -> void {

DVRVolumeLoader/src/DVRVolumeLoader.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ enum BinaryDataType
3030

3131
enum DatasetSource
3232
{
33-
File, PointDatasets
33+
File,
34+
ScatteredPointDatasets,
35+
VolumePointDatasets,
3436
};
3537

3638
class DVRVolumeLoadingInputDialog : public QDialog
@@ -128,12 +130,14 @@ class DVRVolumeLoadingInputDialog : public QDialog
128130
mv::gui::TriggerAction _fileLoadAction; /** File action */
129131
mv::gui::GroupAction _settingsGroupAction; /** Shared group action */
130132
mv::gui::GroupAction _fileGroupAction; /** File specific group action */
131-
mv::gui::GroupAction _datasetGroupAction; /** Datasets specific group action */
133+
mv::gui::GroupAction _scatteredDataGroupAction; /** Datasets specific group action */
134+
mv::gui::GroupAction _volumeDataGroupAction; /** Datasets specific group action */
132135

133136
DatasetSource _datasetSource; /** Dataset source */
134137

135138
QRadioButton* _fileRadioButton; /** File radio button */
136-
QRadioButton* _pointDatasetsRadioButton; /** Point datasets radio button */
139+
QRadioButton* _scatteredDataRadioButton; /** Point dataset (scattered) radio button */
140+
QRadioButton* _volumeDataRadioButton; /** Point dataset (volume) radio button */
137141
QButtonGroup* _dataSourceButtonGroup; /** Data source button group */
138142

139143
QWidget* _selectedWidget; /** File widget */

0 commit comments

Comments
 (0)