Skip to content

Commit 9bfb02b

Browse files
committed
Introduce vol point data option
1 parent 3a85e50 commit 9bfb02b

2 files changed

Lines changed: 87 additions & 41 deletions

File tree

DVRVolumeLoader/src/DVRVolumeLoader.cpp

Lines changed: 83 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,28 @@ void DVRVolumeLoader::loadData()
161161
return;
162162
}
163163

164-
auto sourceDataset = inputDialog->getSourceDataset();
165-
auto numDims = inputDialog->getNumberOfValueDimensions();
166-
auto storeAs = inputDialog->getStoreAs();
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;
167175

168-
Dataset<Points> point_data = sourceDataset.isValid()
169-
? mv::data().createDerivedDataset<Points>(inputDialog->getDatasetName(), sourceDataset)
170-
: mv::data().createDataset<Points>("Points", inputDialog->getDatasetName());
176+
return parentDataset.isValid()
177+
? mv::data().createDerivedDataset<Points>(datasetName, parentDataset)
178+
: mv::data().createDataset<Points>("Points", datasetName);
179+
};
171180

172-
Size3D volumeBoxSize = Size3D(inputDialog->getNumberOfDimensionsX(), inputDialog->getNumberOfDimensionsY(), inputDialog->getNumberOfDimensionsZ());
181+
Dataset<Points> valuesDataset = createValuesDataset();
173182

174-
if (inputDialog->getDatasetSource() == DatasetSource::ScatteredPointDatasets) {
183+
switch (inputDialog->getDatasetSource())
184+
{
185+
case DatasetSource::ScatteredPointDatasets: {
175186
Dataset<Points> spatialDataset = inputDialog->getSpatialDataset();
176187
Dataset<Points> valueDataset = inputDialog->getValueDataset();
177188

@@ -192,52 +203,59 @@ void DVRVolumeLoader::loadData()
192203
spatialPositions.push_back(value);
193204
}
194205
}
195-
});
206+
});
196207
std::vector<float> newDataset(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f);
197208
std::vector<float> numValuesPlaced(volumeBoxSize.width() * volumeBoxSize.height() * volumeBoxSize.depth() * numDims, 0.0f);
198209
int i = 0;
199210
valueDataset->visitData([this, &spatialPositions, &numValuesPlaced, &newDataset, &min, &max, &volumeBoxSize, &numDims, &i](auto pointData) {
200211
for (const auto& point : pointData)
201212
{
202-
mv::Vector3f normalizedPos = normalizePosition(mv::Vector3f(spatialPositions[i], spatialPositions[i + 1], spatialPositions[i + 2]), min, max, volumeBoxSize);
203-
int x = int(std::round(normalizedPos.x));
204-
int y = int(std::round(normalizedPos.y));
205-
int z = int(std::round(normalizedPos.z));
206-
int voxelIndex = x + y * volumeBoxSize.width() + z * volumeBoxSize.width() * volumeBoxSize.height();
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();
207218
//Populate the texture data with values
208219
for (int j = 0; j < numDims; ++j) {
209220
newDataset[voxelIndex * numDims + j] += point[j];
210221
numValuesPlaced[voxelIndex * numDims + j] += 1;
211222
}
212223
i = i + 3;
213224
}
214-
});
225+
});
215226

216227
for (size_t i = 0; i < numValuesPlaced.size(); ++i) { // Average the values
217-
if(numValuesPlaced[i] != 0) {
228+
if (numValuesPlaced[i] != 0) {
218229
newDataset[i] = newDataset[i] / numValuesPlaced[i];
219230
}
220231
}
221-
point_data->setData(newDataset, numDims);
222-
}
223-
else {
232+
valuesDataset->setData(newDataset, numDims);
224233

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

239257
// Create the Volumes dataset
240-
_volumesDataset = mv::data().createDataset<Volumes>("Volumes", inputDialog->getDatasetName(), point_data);
258+
_volumesDataset = mv::data().createDataset<Volumes>("Volumes", inputDialog->getDatasetName(), valuesDataset);
241259

242260
_volumesDataset->setVolumeSize(volumeBoxSize);
243261
_volumesDataset->setComponentsPerVoxel(numDims);
@@ -299,7 +317,12 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
299317
_fileLoadAction(this, "Load File"),
300318
_settingsGroupAction(this, "Settings"),
301319
_fileGroupAction(this, "File selection"),
302-
_scatteredDataGroupAction(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)),
303326
_selectedWidget(nullptr)
304327
{
305328
setWindowTitle(tr("DVRVolume Loader"));
@@ -335,12 +358,9 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
335358
_settingsGroupAction.addAction(&_datasetNameAction);
336359

337360
// Add radio buttons for dataset source selection
338-
_fileRadioButton = new QRadioButton(tr("File"), this);
339-
_scatteredDataRadioButton = new QRadioButton(tr("Point Datasets"), this);
340-
341-
_dataSourceButtonGroup = new QButtonGroup(this);
342361
_dataSourceButtonGroup->addButton(_fileRadioButton, DatasetSource::File);
343362
_dataSourceButtonGroup->addButton(_scatteredDataRadioButton, DatasetSource::ScatteredPointDatasets);
363+
_dataSourceButtonGroup->addButton(_volumeDataRadioButton, DatasetSource::VolumePointDatasets);
344364

345365
_fileRadioButton->setChecked(true); // Default to None
346366

@@ -353,6 +373,7 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
353373
buttonsLayout->setContentsMargins(150, 0, 0, 0);
354374
buttonsLayout->addWidget(_fileRadioButton);
355375
buttonsLayout->addWidget(_scatteredDataRadioButton);
376+
buttonsLayout->addWidget(_volumeDataRadioButton);
356377
layout->addLayout(buttonsLayout);
357378

358379
_fileGroupAction.addAction(&_fileLoadAction);
@@ -366,6 +387,11 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
366387
_scatteredDataGroupAction.addAction(&_valueDatasetPickerAction);
367388
_scatteredDataGroupAction.addAction(&_acceptAction);
368389

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);
394+
369395
_selectedWidget = _fileGroupAction.createWidget(this);
370396
layout->addWidget(_selectedWidget);
371397
setLayout(layout);
@@ -377,23 +403,40 @@ DVRVolumeLoadingInputDialog::DVRVolumeLoadingInputDialog(QWidget* parent, DVRVol
377403

378404
//Update the selected widget when a radio button is clicked
379405
connect(_dataSourceButtonGroup, &QButtonGroup::buttonClicked, this, [this, layout]() -> void {
380-
int id = _dataSourceButtonGroup->checkedId();
381-
_datasetSource = static_cast<DatasetSource>(id);
406+
const int id = _dataSourceButtonGroup->checkedId();
407+
_datasetSource = static_cast<DatasetSource>(id);
408+
382409
if (_selectedWidget) {
383410
layout->removeWidget(_selectedWidget);
384411
_selectedWidget->deleteLater();
385412
}
386-
if (_datasetSource == DatasetSource::File) {
413+
414+
bool enableAccept = true;
415+
416+
switch (_datasetSource)
417+
{
418+
case DatasetSource::File:
387419
_selectedWidget = _fileGroupAction.createWidget(this);
388-
}
389-
else if (_datasetSource == DatasetSource::ScatteredPointDatasets) {
420+
break;
421+
case DatasetSource::ScatteredPointDatasets:
390422
_selectedWidget = _scatteredDataGroupAction.createWidget(this);
423+
break;
424+
case DatasetSource::VolumePointDatasets:
425+
_selectedWidget = _volumeDataGroupAction.createWidget(this);
426+
enableAccept = (_sourceDatasetPickerAction.getCurrentIndex() != -1);
427+
428+
break;
391429
}
430+
431+
_acceptAction.setEnabled(enableAccept);
432+
392433
layout->addWidget(_selectedWidget);
393434
layout->update();
394435
});
395436

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

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

DVRVolumeLoader/src/DVRVolumeLoader.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ enum DatasetSource
3232
{
3333
File,
3434
ScatteredPointDatasets,
35+
VolumePointDatasets,
3536
};
3637

3738
class DVRVolumeLoadingInputDialog : public QDialog
@@ -130,11 +131,13 @@ class DVRVolumeLoadingInputDialog : public QDialog
130131
mv::gui::GroupAction _settingsGroupAction; /** Shared group action */
131132
mv::gui::GroupAction _fileGroupAction; /** File specific group action */
132133
mv::gui::GroupAction _scatteredDataGroupAction; /** Datasets specific group action */
134+
mv::gui::GroupAction _volumeDataGroupAction; /** Datasets specific group action */
133135

134136
DatasetSource _datasetSource; /** Dataset source */
135137

136138
QRadioButton* _fileRadioButton; /** File radio button */
137-
QRadioButton* _scatteredDataRadioButton; /** Point datasets radio button */
139+
QRadioButton* _scatteredDataRadioButton; /** Point dataset (scattered) radio button */
140+
QRadioButton* _volumeDataRadioButton; /** Point dataset (volume) radio button */
138141
QButtonGroup* _dataSourceButtonGroup; /** Data source button group */
139142

140143
QWidget* _selectedWidget; /** File widget */

0 commit comments

Comments
 (0)