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