@@ -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 {
0 commit comments