diff --git a/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.cpp b/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.cpp index 392ce8550d..dfc6f032ec 100644 --- a/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.cpp +++ b/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.cpp @@ -1,413 +1,413 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkTransferFunctionGeneratorWidget.h" #include #include #include #include #include #include #include #include #include QmitkTransferFunctionGeneratorWidget::QmitkTransferFunctionGeneratorWidget(QWidget* parent, Qt::WindowFlags f) : QWidget(parent, f), deltaScale(1.0), deltaMax(1024), deltaMin(1) { histoGramm = NULL; this->setupUi(this); // LevelWindow Tab { connect( m_CrossLevelWindow, SIGNAL( SignalDeltaMove( int, int ) ), this, SLOT( OnDeltaLevelWindow( int, int ) ) ); } // Threshold Tab { connect( m_CrossThreshold, SIGNAL( SignalDeltaMove( int, int ) ), this, SLOT( OnDeltaThreshold( int, int ) ) ); thDelta = 100; } // Presets Tab { m_TransferFunctionComboBox->setVisible(false); connect( m_TransferFunctionComboBox, SIGNAL( activated( int ) ), this, SIGNAL(SignalTransferFunctionModeChanged(int)) ); connect( m_TransferFunctionComboBox, SIGNAL( activated( int ) ), this, SLOT(OnPreset(int)) ); connect( m_SavePreset, SIGNAL( clicked() ), this, SLOT( OnSavePreset() ) ); connect( m_LoadPreset, SIGNAL( clicked() ), this, SLOT( OnLoadPreset() ) ); } presetFileName = "."; } int QmitkTransferFunctionGeneratorWidget::AddPreset(const QString &presetName) { m_TransferFunctionComboBox->setVisible(true); m_TransferFunctionComboBox->addItem( presetName); return m_TransferFunctionComboBox->count()-1; } void QmitkTransferFunctionGeneratorWidget::SetPresetsTabEnabled(bool enable) { m_PresetTab->setEnabled(enable); } void QmitkTransferFunctionGeneratorWidget::SetThresholdTabEnabled(bool enable) { m_ThresholdTab->setEnabled(enable); } void QmitkTransferFunctionGeneratorWidget::SetBellTabEnabled(bool enable) { m_BellTab->setEnabled(enable); } void QmitkTransferFunctionGeneratorWidget::OnSavePreset( ) { if(tfpToChange.IsNull()) return; mitk::TransferFunction::Pointer tf = tfpToChange->GetValue(); std::string fileName; std::string fileNameOutput; - presetFileName = QFileDialog::getSaveFileName( this,"Choose a filename to save the transferfunction",presetFileName, "Transferfunction (*.xml)" ); + presetFileName = QFileDialog::getSaveFileName( this,"Choose a filename to save the transfer function", presetFileName, "Transferfunction (*.xml)" ); fileName=presetFileName.toLocal8Bit().constData(); MITK_INFO << "Saving Transferfunction under path: " << fileName; fileNameOutput= ReduceFileName(fileName); if ( mitk::TransferFunctionPropertySerializer::SerializeTransferFunction( fileName.c_str(), tf )) m_InfoPreset->setText( QString( (std::string("saved ")+ fileNameOutput).c_str() ) ); else m_InfoPreset->setText( QString( std::string("saving failed").c_str() ) ); } void QmitkTransferFunctionGeneratorWidget::OnLoadPreset( ) { if(tfpToChange.IsNull()) return; std::string fileName; std::string fileNameOutput; - presetFileName = QFileDialog::getOpenFileName( this,"Choose a file to open the transferfunction from",presetFileName, "Transferfunction (*.xml)" ); + presetFileName = QFileDialog::getOpenFileName( this,"Choose a file to open the transfer function from",presetFileName, "Transferfunction (*.xml)" ); fileName=presetFileName.toLocal8Bit().constData(); MITK_INFO << "Loading Transferfunction from path: " << fileName; fileNameOutput= ReduceFileName(fileName); mitk::TransferFunction::Pointer tf = mitk::TransferFunctionPropertySerializer::DeserializeTransferFunction(fileName.c_str()); if(tf.IsNotNull()) { tfpToChange->SetValue( tf ); m_InfoPreset->setText( QString( (std::string("loaded ")+ fileNameOutput).c_str() ) ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalUpdateCanvas(); } } void QmitkTransferFunctionGeneratorWidget::OnPreset(int mode) { //first item is only information if( --mode == -1 ) return; m_InfoPreset->setText(QString("selected ") + m_TransferFunctionComboBox->currentText()); //revert to first item m_TransferFunctionComboBox->setCurrentIndex( 0 ); } static double transformationGlocke ( double x ) { double z = 0.1; double a = 2 - 2 * z; double b = 2 * z - 1; x = a * x + b; return x; } static double stepFunctionGlocke ( double x ) { x = 1-(2*x -1.0); // map [0.5;1] to [0,1] x = x * ( 3*x - 2*x*x ); // apply smoothing function x = x * x; return x; } double QmitkTransferFunctionGeneratorWidget::ScaleDelta(int d) const { return deltaScale*(double)d; } void QmitkTransferFunctionGeneratorWidget::OnDeltaLevelWindow(int dx, int dy) // bell { if(tfpToChange.IsNull()) return; thPos += ScaleDelta(dx); thDelta -= ScaleDelta(dy); if(thDelta < deltaMin) thDelta = deltaMin; if(thDelta > deltaMax) thDelta = deltaMax; if(thPos < histoMinimum) thPos = histoMinimum; if(thPos > histoMaximum) thPos = histoMaximum; std::stringstream ss; ss << "Click on the cross and move the mouse"<<"\n" <<"\n" << "center at " << thPos << "\n" << "width " << thDelta * 2; m_InfoLevelWindow->setText( QString( ss.str().c_str() ) ); mitk::TransferFunction::Pointer tf = tfpToChange->GetValue(); // grayvalue->opacity { vtkPiecewiseFunction *f=tf->GetScalarOpacityFunction(); f->RemoveAllPoints(); for( int r = 0; r<= 6; r++) { double relPos = (r / 6.0) * 0.5 + 0.5; f->AddPoint(thPos+thDelta*(-transformationGlocke(relPos)),stepFunctionGlocke(relPos)); f->AddPoint(thPos+thDelta*( transformationGlocke(relPos)),stepFunctionGlocke(relPos)); } f->Modified(); } // gradient at grayvalue->opacity { vtkPiecewiseFunction *f=tf->GetGradientOpacityFunction(); f->RemoveAllPoints(); f->AddPoint( 0, 1.0 ); f->Modified(); } tf->Modified(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalUpdateCanvas(); } static double stepFunctionThreshold ( double x ) { x = 0.5*x + 0.5; // map [-1;1] to [0,1] x = x * ( 3*x - 2*x*x ); // apply smoothing function x = x * x; return x; } void QmitkTransferFunctionGeneratorWidget::OnDeltaThreshold(int dx, int dy) // LEVELWINDOW { if(tfpToChange.IsNull()) return; thPos += ScaleDelta(dx); thDelta += ScaleDelta(dy); if(thDelta < deltaMin) thDelta = deltaMin; if(thDelta > deltaMax) thDelta = deltaMax; if(thPos < histoMinimum) thPos = histoMinimum; if(thPos > histoMaximum) thPos = histoMaximum; std::stringstream ss; ss << "Click on the cross and move the mouse"<<"\n" <<"\n" << "threshold at " << thPos << "\n" << "width " << thDelta * 2; m_InfoThreshold->setText( QString( ss.str().c_str() ) ); mitk::TransferFunction::Pointer tf = tfpToChange->GetValue(); // grayvalue->opacity { vtkPiecewiseFunction *f=tf->GetScalarOpacityFunction(); f->RemoveAllPoints(); for( int r = 1; r<= 4; r++) { double relPos = r / 4.0; f->AddPoint(thPos+thDelta*(-relPos),stepFunctionThreshold(-relPos)); f->AddPoint(thPos+thDelta*( relPos),stepFunctionThreshold( relPos)); } f->Modified(); } // gradient at grayvalue->opacity { vtkPiecewiseFunction *f=tf->GetGradientOpacityFunction(); f->RemoveAllPoints(); f->AddPoint( 0, 1.0 ); f->Modified(); } tf->Modified(); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); emit SignalUpdateCanvas(); } std::string QmitkTransferFunctionGeneratorWidget::ReduceFileName(std::string fileNameLong ) { if (fileNameLong.length()< 40) return fileNameLong; std::string fileNameShort; std::string fileNameRevert; for(unsigned int i=0; i< fileNameLong.length(); i++) { if(i<3) { char x= fileNameLong[i]; fileNameShort= fileNameShort+x; } if(i==3) { fileNameShort= fileNameShort+"..."; break; } } unsigned int len( fileNameLong.length() ); for(unsigned int i=len-1; i <= len; i--) { std::string x=std::string("")+fileNameLong[i]; if ( x.compare("/")==0 || x.compare("\\")==0) { fileNameRevert= "/" + fileNameRevert; break; } if (i>=fileNameLong.length()-24) { fileNameRevert= x+ fileNameRevert; } else { fileNameRevert= "/..." + fileNameRevert; break; } } return fileNameShort+fileNameRevert; } QmitkTransferFunctionGeneratorWidget::~QmitkTransferFunctionGeneratorWidget() { } void QmitkTransferFunctionGeneratorWidget::SetDataNode(mitk::DataNode* node) { histoGramm = NULL; if (node) { tfpToChange = dynamic_cast(node->GetProperty("TransferFunction")); if(!tfpToChange) node->SetProperty("TransferFunction", tfpToChange = mitk::TransferFunctionProperty::New() ); mitk::TransferFunction::Pointer tf = tfpToChange->GetValue(); if( mitk::Image* image = dynamic_cast( node->GetData() ) ) { mitk::ImageStatisticsHolder* statistics = image->GetStatistics(); histoMinimum= statistics->GetScalarValueMin(); histoMaximum= statistics->GetScalarValueMax(); } else if (mitk::UnstructuredGrid* grid = dynamic_cast( node->GetData() ) ) { double* range = grid->GetVtkUnstructuredGrid()->GetScalarRange(); histoMinimum = range[0]; histoMaximum = range[1]; double histoRange = histoMaximum - histoMinimum; deltaMax = histoRange/4.0; deltaMin = histoRange/400.0; deltaScale = histoRange/1024.0; } else { MITK_WARN << "QmitkTransferFunctonGeneratorWidget does not support " << node->GetData()->GetNameOfClass() << " instances"; } thPos = ( histoMinimum + histoMaximum ) / 2.0; } else { tfpToChange = 0; m_InfoPreset->setText( QString( "" ) ); } } diff --git a/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.ui b/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.ui index 92c187bfea..be99afbb43 100644 --- a/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.ui +++ b/Modules/QtWidgetsExt/QmitkTransferFunctionGeneratorWidget.ui @@ -1,416 +1,425 @@ QmitkTransferFunctionGeneratorWidget 0 0 349 316 1 1 16777215 16777215 Form - + + 0 + + + 0 + + + 0 + + 0 0 0 0 0 16777215 120 0 0 0 Presets - Apply internal MITK transferfunction presets. -Or save and load your own created transferfunctions in a folder in XML format. + Apply internal MITK transfer function presets. +Or save and load your own created transfer functions in a folder in XML format. Qt::Vertical 20 0 true 0 0 0 0 - Choose one of generic MITK internal presets to apply on standard CT data or MR data. + Choose one of generic MITK internal presets to apply to standard CT data or MR data. Load a MITK internal preset -1 16 16 false true 0 1 0 0 16777215 25 Qt::AutoText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 0 64 16777215 - Load a transferfunction in xml-format from the filesystem. -The load includes all transferfunctions: grayvalue, color and gradient. + Load a transfer function in xml-format from the filesystem. +The load includes all transfer functions: grayvalue, color and gradient. Load 0 0 64 16777215 - Save a transferfunction in xml-format in the filesystem. -The save includes all transferfunctions: grayvalue, color and gradient. + Save a transfer function in xml-format in the filesystem. +The save includes all transfer functions: grayvalue, color and gradient. Save 0 0 Threshold Generate a threshold transfer function interactively. 0 0 0 0 48 48 Click and hold left mouse button on the cross. Move the mouse to the top and the function will be flatter. -Move the mouse to the bottom and the function will be steeper. +Move the mouse to the bottom and the function will be steeper. Move the mouse to the left and the function moves to the left. Move the mouse to the right and the function moves to the right. Qt::LeftToRight - :/QtWidgetsExt/cross.png + :/QtWidgetsExt/cross.png true Qt::AlignCenter -1 Qt::NoTextInteraction 0 0 0 0 7 - Click and hold left mouse button on the cross to interactively generate a threshold transferfunction + Click and hold left mouse button on the cross to interactively generate a threshold transfer function Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 Bell Generate a bell transfer function interactively. 0 0 0 0 48 48 Click and hold left mouse button on the cross. Move the mouse to the top and the bell will be wider. -Move the mouse to the bottom and the bell will be flattened. +Move the mouse to the bottom and the bell will be narrowed. Move the mouse to the left and the center of the bell moves to the left. -Move the mouse to the right and the center of the bell moves to the right. +Move the mouse to the right and the center of the bell moves to the right. - :/QtWidgetsExt/cross.png + :/QtWidgetsExt/cross.png true Qt::AlignCenter Qt::NoTextInteraction 0 0 0 0 7 - Click and hold left mouse button on the cross to interactively generate a bell transferfunction + Click and hold left mouse button on the cross to interactively generate a bell transfer function Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true QmitkCrossWidget QLabel
QmitkCrossWidget.h
- +
diff --git a/Modules/SceneSerializationBase/BasePropertySerializer/mitkTransferFunctionPropertySerializer.cpp b/Modules/SceneSerializationBase/BasePropertySerializer/mitkTransferFunctionPropertySerializer.cpp index cd2722e8b6..467bdf2aee 100644 --- a/Modules/SceneSerializationBase/BasePropertySerializer/mitkTransferFunctionPropertySerializer.cpp +++ b/Modules/SceneSerializationBase/BasePropertySerializer/mitkTransferFunctionPropertySerializer.cpp @@ -1,232 +1,232 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkTransferFunctionPropertySerializer.h" namespace mitk { mitk::TransferFunctionPropertySerializer::TransferFunctionPropertySerializer() { } mitk::TransferFunctionPropertySerializer::~TransferFunctionPropertySerializer() { } TiXmlElement* mitk::TransferFunctionPropertySerializer::Serialize() { if (const TransferFunctionProperty* prop = dynamic_cast(mitk::BasePropertySerializer::m_Property.GetPointer())) { TransferFunction* transferfunction = prop->GetValue(); if (!transferfunction) return NULL; TiXmlElement* element = new TiXmlElement("TransferFunction"); // serialize scalar opacity function TiXmlElement* scalarOpacityPointlist = new TiXmlElement( "ScalarOpacity" ); TransferFunction::ControlPoints scalarOpacityPoints = transferfunction->GetScalarOpacityPoints(); for ( TransferFunction::ControlPoints::iterator iter = scalarOpacityPoints.begin(); iter != scalarOpacityPoints.end(); ++iter ) { TiXmlElement* pointel = new TiXmlElement("point"); pointel->SetDoubleAttribute("x", iter->first); pointel->SetDoubleAttribute("y", iter->second); scalarOpacityPointlist->LinkEndChild( pointel ); } element->LinkEndChild( scalarOpacityPointlist ); // serialize gradient opacity function TiXmlElement* gradientOpacityPointlist = new TiXmlElement( "GradientOpacity" ); TransferFunction::ControlPoints gradientOpacityPoints = transferfunction->GetGradientOpacityPoints(); for ( TransferFunction::ControlPoints::iterator iter = gradientOpacityPoints.begin(); iter != gradientOpacityPoints.end(); ++iter ) { TiXmlElement* pointel = new TiXmlElement("point"); pointel->SetDoubleAttribute("x", iter->first); pointel->SetDoubleAttribute("y", iter->second); gradientOpacityPointlist->LinkEndChild( pointel ); } element->LinkEndChild( gradientOpacityPointlist ); // serialize color function vtkColorTransferFunction* ctf = transferfunction->GetColorTransferFunction(); if (ctf == NULL) return NULL; TiXmlElement* pointlist = new TiXmlElement("Color"); for (int i = 0; i < ctf->GetSize(); i++ ) { double myVal[6]; ctf->GetNodeValue(i, myVal); TiXmlElement* pointel = new TiXmlElement("point"); pointel->SetDoubleAttribute("x", myVal[0]); pointel->SetDoubleAttribute("r", myVal[1]); pointel->SetDoubleAttribute("g", myVal[2]); pointel->SetDoubleAttribute("b", myVal[3]); pointel->SetDoubleAttribute("midpoint", myVal[4]); pointel->SetDoubleAttribute("sharpness", myVal[5]); pointlist->LinkEndChild( pointel ); } element->LinkEndChild( pointlist ); return element; } else return NULL; } bool mitk::TransferFunctionPropertySerializer::SerializeTransferFunction( const char * filename, TransferFunction::Pointer tf ) { TransferFunctionPropertySerializer::Pointer tfps=TransferFunctionPropertySerializer::New(); tfps->SetProperty( TransferFunctionProperty::New( tf ) ); TiXmlElement* s=tfps->Serialize(); if(!s) { MITK_ERROR << "cant serialize transfer function"; return false; } TiXmlDocument document; TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "UTF-8", "" ); // TODO what to write here? encoding? standalone would mean that we provide a DTD somewhere... document.LinkEndChild( decl ); TiXmlElement* version = new TiXmlElement("Version"); version->SetAttribute("TransferfunctionVersion", 1 ); document.LinkEndChild(version); document.LinkEndChild(s); if ( !document.SaveFile( filename ) ) { MITK_ERROR << "Could not write scene to " << filename << "\nTinyXML reports '" << document.ErrorDesc() << "'"; return false; } return true; } BaseProperty::Pointer mitk::TransferFunctionPropertySerializer::Deserialize(TiXmlElement* element) { if (!element) return NULL; TransferFunction::Pointer tf = TransferFunction::New(); // deserialize scalar opacity function TiXmlElement* scalarOpacityPointlist = element->FirstChildElement("ScalarOpacity"); if (scalarOpacityPointlist == NULL) return NULL; tf->ClearScalarOpacityPoints(); for( TiXmlElement* pointElement = scalarOpacityPointlist->FirstChildElement("point"); pointElement != NULL; pointElement = pointElement->NextSiblingElement("point")) { double x; double y; if (pointElement->QueryDoubleAttribute("x", &x) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("y", &y) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? tf->AddScalarOpacityPoint(x, y); } TiXmlElement* gradientOpacityPointlist = element->FirstChildElement("GradientOpacity"); if (gradientOpacityPointlist == NULL) return NULL; tf->ClearGradientOpacityPoints(); for( TiXmlElement* pointElement = gradientOpacityPointlist->FirstChildElement("point"); pointElement != NULL; pointElement = pointElement->NextSiblingElement("point")) { double x; double y; if (pointElement->QueryDoubleAttribute("x", &x) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("y", &y) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? tf->AddGradientOpacityPoint(x, y); } TiXmlElement* rgbPointlist = element->FirstChildElement("Color"); if (rgbPointlist == NULL) return NULL; vtkColorTransferFunction* ctf = tf->GetColorTransferFunction(); if (ctf == NULL) return NULL; ctf->RemoveAllPoints(); for( TiXmlElement* pointElement = rgbPointlist->FirstChildElement("point"); pointElement != NULL; pointElement = pointElement->NextSiblingElement("point")) { double x; double r,g,b, midpoint, sharpness; if (pointElement->QueryDoubleAttribute("x", &x) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("r", &r) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("g", &g) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("b", &b) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("midpoint", &midpoint) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? if (pointElement->QueryDoubleAttribute("sharpness", &sharpness) == TIXML_WRONG_TYPE) return NULL; // TODO: can we do a better error handling? ctf->AddRGBPoint(x, r, g, b, midpoint, sharpness); } return TransferFunctionProperty::New(tf).GetPointer(); } mitk::TransferFunction::Pointer mitk::TransferFunctionPropertySerializer::DeserializeTransferFunction( const char *filePath ) { TiXmlDocument document( filePath ); if (!document.LoadFile()) { MITK_ERROR << "Could not open/read/parse " << filePath << "\nTinyXML reports: " << document.ErrorDesc() << std::endl; return NULL; } // find version node --> note version in some variable int fileVersion = 1; TiXmlElement* versionObject = document.FirstChildElement("Version"); if (versionObject) { if ( versionObject->QueryIntAttribute( "TransferfunctionVersion", &fileVersion ) != TIXML_SUCCESS ) { MITK_WARN << "Transferfunction file " << filePath << " does not contain version information! Trying version 1 format."; } } TiXmlElement* input = document.FirstChildElement("TransferFunction"); TransferFunctionPropertySerializer::Pointer tfpd = TransferFunctionPropertySerializer::New(); BaseProperty::Pointer bp = tfpd->Deserialize(input); TransferFunctionProperty::Pointer tfp = dynamic_cast(bp.GetPointer()); if(tfp.IsNotNull()) { TransferFunction::Pointer tf = tfp->GetValue(); return tf; } - MITK_WARN << "Can't deserialize transferfunction"; + MITK_WARN << "Can't deserialize transfer function"; return NULL; } } // namespace // important to put this into the GLOBAL namespace (because it starts with 'namespace mitk') MITK_REGISTER_SERIALIZER(TransferFunctionPropertySerializer); diff --git a/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationViewControls.ui b/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationViewControls.ui index 5251781bd9..982bc0f0a9 100644 --- a/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationViewControls.ui +++ b/Plugins/org.mitk.gui.qt.volumevisualization/src/internal/QmitkVolumeVisualizationViewControls.ui @@ -1,331 +1,334 @@ QmitkVolumeVisualizationViewControls 0 0 - 323 + 324 679 0 0 16777215 16777215 QmitkTemplate 0 0 191 0 0 191 0 0 191 0 0 191 0 0 191 0 0 191 0 0 120 120 120 120 120 120 120 120 120 0 0 197 0 0 191 0 0 189 0 0 197 0 0 191 0 0 189 0 0 120 120 120 120 120 120 120 120 120 Please select a volume image! 0 0 Click this checkbox to enable volumerendering in the 3D view of the selected image. Volumerendering Level of detail (LOD) enables a fast but lower quality preview rendering to increase interactivity. LOD 0 1 + + Select render mode + 0 0 0 0 0 1 QmitkTransferFunctionWidget QWidget
QmitkTransferFunctionWidget.h
QmitkTransferFunctionGeneratorWidget QWidget
QmitkTransferFunctionGeneratorWidget.h
1
QmitkDataStorageComboBox.h