Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkVolumeVisualizationView.h"
00019
00020 #include <QComboBox>
00021
00022 #include <berryISelectionProvider.h>
00023 #include <berryISelectionService.h>
00024 #include <berryIWorkbenchWindow.h>
00025
00026 #include <mitkDataNodeObject.h>
00027
00028 #include <mitkProperties.h>
00029 #include <mitkNodePredicateDataType.h>
00030
00031 #include <mitkTransferFunction.h>
00032 #include <mitkTransferFunctionProperty.h>
00033 #include "mitkHistogramGenerator.h"
00034 #include "QmitkPiecewiseFunctionCanvas.h"
00035 #include "QmitkColorTransferFunctionCanvas.h"
00036
00037 #include "mitkBaseRenderer.h"
00038 #include "mitkGPUVolumeMapper3D.h"
00039
00040 #include "mitkVtkVolumeRenderingProperty.h"
00041
00042 #include <QToolTip>
00043 #include <qxtspanslider.h>
00044
00045 enum RenderMode
00046 {
00047 RM_CPU_COMPOSITE_RAYCAST = 0,
00048 RM_CPU_MIP_RAYCAST = 1,
00049 RM_GPU_COMPOSITE_SLICING = 2,
00050 RM_GPU_COMPOSITE_RAYCAST = 3,
00051 RM_GPU_MIP_RAYCAST = 4
00052 };
00053
00054 QmitkVolumeVisualizationView::QmitkVolumeVisualizationView()
00055 : QmitkFunctionality(),
00056 m_Controls(NULL)
00057 {
00058 }
00059
00060 QmitkVolumeVisualizationView::~QmitkVolumeVisualizationView()
00061 {
00062 }
00063
00064 void QmitkVolumeVisualizationView::CreateQtPartControl(QWidget* parent)
00065 {
00066
00067 if (!m_Controls)
00068 {
00069 m_Controls = new Ui::QmitkVolumeVisualizationViewControls;
00070 m_Controls->setupUi(parent);
00071
00072 m_Controls->m_RenderMode->addItem("CPU raycast");
00073 m_Controls->m_RenderMode->addItem("CPU MIP raycast");
00074 m_Controls->m_RenderMode->addItem("GPU slicing");
00075
00076 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) ))
00077 m_Controls->m_RenderMode->addItem("GPU raycast");
00078 m_Controls->m_RenderMode->addItem("GPU MIP raycast");
00079 #endif
00080
00081 connect( m_Controls->m_EnableRenderingCB, SIGNAL( toggled(bool) ),this, SLOT( OnEnableRendering(bool) ));
00082 connect( m_Controls->m_EnableLOD, SIGNAL( toggled(bool) ),this, SLOT( OnEnableLOD(bool) ));
00083 connect( m_Controls->m_RenderMode, SIGNAL( activated(int) ),this, SLOT( OnRenderMode(int) ));
00084
00085 connect( m_Controls->m_TransferFunctionGeneratorWidget, SIGNAL( SignalUpdateCanvas( ) ), m_Controls->m_TransferFunctionWidget, SLOT( OnUpdateCanvas( ) ) );
00086
00087 m_Controls->m_EnableRenderingCB->setEnabled(false);
00088 m_Controls->m_EnableLOD->setEnabled(false);
00089 m_Controls->m_RenderMode->setEnabled(false);
00090 m_Controls->m_TransferFunctionWidget->setEnabled(false);
00091 m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(false);
00092
00093 m_Controls->m_SelectedImageLabel->hide();
00094 m_Controls->m_ErrorImageLabel->hide();
00095
00096 }
00097 }
00098
00099
00100 void QmitkVolumeVisualizationView::OnSelectionChanged( std::vector<mitk::DataNode*> nodes )
00101 {
00102 bool weHadAnImageButItsNotThreeDeeOrFourDee = false;
00103
00104 mitk::DataNode::Pointer node;
00105
00106 for (std::vector<mitk::DataNode*>::iterator iter = nodes.begin();
00107 iter != nodes.end();
00108 ++iter)
00109 {
00110 mitk::DataNode::Pointer currentNode = *iter;
00111
00112 if( currentNode.IsNotNull() && dynamic_cast<mitk::Image*>(currentNode->GetData()) )
00113 {
00114 if( dynamic_cast<mitk::Image*>(currentNode->GetData())->GetDimension()>=3 )
00115 {
00116 if (node.IsNull())
00117 {
00118 node = currentNode;
00119 }
00120 }
00121 else
00122 {
00123 weHadAnImageButItsNotThreeDeeOrFourDee = true;
00124 }
00125 }
00126 }
00127
00128 if( node.IsNotNull() )
00129 {
00130 m_Controls->m_NoSelectedImageLabel->hide();
00131 m_Controls->m_ErrorImageLabel->hide();
00132 m_Controls->m_SelectedImageLabel->show();
00133
00134 std::string infoText;
00135
00136 if (node->GetName().empty())
00137 infoText = std::string("Selected Image: [currently selected image has no name]");
00138 else
00139 infoText = std::string("Selected Image: ") + node->GetName();
00140
00141 m_Controls->m_SelectedImageLabel->setText( QString( infoText.c_str() ) );
00142
00143 m_SelectedNode = node;
00144 }
00145 else
00146 {
00147 if(weHadAnImageButItsNotThreeDeeOrFourDee)
00148 {
00149 m_Controls->m_NoSelectedImageLabel->hide();
00150 m_Controls->m_ErrorImageLabel->show();
00151 std::string infoText;
00152 infoText = std::string("only 3D or 4D images are supported");
00153 m_Controls->m_ErrorImageLabel->setText( QString( infoText.c_str() ) );
00154 }
00155 else
00156 {
00157 m_Controls->m_SelectedImageLabel->hide();
00158 m_Controls->m_ErrorImageLabel->hide();
00159 m_Controls->m_NoSelectedImageLabel->show();
00160 }
00161
00162 m_SelectedNode = 0;
00163 }
00164
00165 UpdateInterface();
00166 }
00167
00168
00169 void QmitkVolumeVisualizationView::UpdateInterface()
00170 {
00171 if(m_SelectedNode.IsNull())
00172 {
00173
00174 m_Controls->m_EnableRenderingCB->setChecked(false);
00175 m_Controls->m_EnableRenderingCB->setEnabled(false);
00176
00177 m_Controls->m_EnableLOD->setChecked(false);
00178 m_Controls->m_EnableLOD->setEnabled(false);
00179
00180 m_Controls->m_RenderMode->setCurrentIndex(0);
00181 m_Controls->m_RenderMode->setEnabled(false);
00182
00183 m_Controls->m_TransferFunctionWidget->SetDataNode(0);
00184 m_Controls->m_TransferFunctionWidget->setEnabled(false);
00185
00186 m_Controls->m_TransferFunctionGeneratorWidget->SetDataNode(0);
00187 m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(false);
00188 return;
00189 }
00190
00191 bool enabled = false;
00192
00193 m_SelectedNode->GetBoolProperty("volumerendering",enabled);
00194 m_Controls->m_EnableRenderingCB->setEnabled(true);
00195 m_Controls->m_EnableRenderingCB->setChecked(enabled);
00196
00197 if(!enabled)
00198 {
00199
00200 m_Controls->m_EnableLOD->setChecked(false);
00201 m_Controls->m_EnableLOD->setEnabled(false);
00202
00203 m_Controls->m_RenderMode->setCurrentIndex(0);
00204 m_Controls->m_RenderMode->setEnabled(false);
00205
00206 m_Controls->m_TransferFunctionWidget->SetDataNode(0);
00207 m_Controls->m_TransferFunctionWidget->setEnabled(false);
00208
00209 m_Controls->m_TransferFunctionGeneratorWidget->SetDataNode(0);
00210 m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(false);
00211 return;
00212 }
00213
00214
00215 enabled = false;
00216 m_SelectedNode->GetBoolProperty("volumerendering.uselod",enabled);
00217 m_Controls->m_EnableLOD->setEnabled(true);
00218 m_Controls->m_EnableLOD->setChecked(enabled);
00219
00220 m_Controls->m_RenderMode->setEnabled(true);
00221
00222
00223 {
00224 bool usegpu=false;
00225 bool useray=false;
00226 bool usemip=false;
00227 m_SelectedNode->GetBoolProperty("volumerendering.usegpu",usegpu);
00228
00229 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) ))
00230 m_SelectedNode->GetBoolProperty("volumerendering.useray",useray);
00231 #endif
00232 m_SelectedNode->GetBoolProperty("volumerendering.usemip",usemip);
00233
00234 int mode = 0;
00235
00236 if(useray)
00237 {
00238 if(usemip)
00239 mode=RM_GPU_MIP_RAYCAST;
00240 else
00241 mode=RM_GPU_COMPOSITE_RAYCAST;
00242 }
00243 else if(usegpu)
00244 mode=RM_GPU_COMPOSITE_SLICING;
00245 else
00246 {
00247 if(usemip)
00248 mode=RM_CPU_MIP_RAYCAST;
00249 else
00250 mode=RM_CPU_COMPOSITE_RAYCAST;
00251 }
00252
00253 m_Controls->m_RenderMode->setCurrentIndex(mode);
00254 }
00255
00256 m_Controls->m_TransferFunctionWidget->SetDataNode(m_SelectedNode);
00257 m_Controls->m_TransferFunctionWidget->setEnabled(true);
00258 m_Controls->m_TransferFunctionGeneratorWidget->SetDataNode(m_SelectedNode);
00259 m_Controls->m_TransferFunctionGeneratorWidget->setEnabled(true);
00260 }
00261
00262
00263 void QmitkVolumeVisualizationView::OnEnableRendering(bool state)
00264 {
00265 if(m_SelectedNode.IsNull())
00266 return;
00267
00268 m_SelectedNode->SetProperty("volumerendering",mitk::BoolProperty::New(state));
00269 UpdateInterface();
00270 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00271 }
00272
00273 void QmitkVolumeVisualizationView::OnEnableLOD(bool state)
00274 {
00275 if(m_SelectedNode.IsNull())
00276 return;
00277
00278 m_SelectedNode->SetProperty("volumerendering.uselod",mitk::BoolProperty::New(state));
00279 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00280 }
00281
00282 void QmitkVolumeVisualizationView::OnRenderMode(int mode)
00283 {
00284 if(m_SelectedNode.IsNull())
00285 return;
00286
00287 bool usegpu=mode==RM_GPU_COMPOSITE_SLICING;
00288
00289 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) ))
00290 bool useray=(mode==RM_GPU_COMPOSITE_RAYCAST)||(mode==RM_GPU_MIP_RAYCAST);
00291 #endif
00292 bool usemip=(mode==RM_GPU_MIP_RAYCAST)||(mode==RM_CPU_MIP_RAYCAST);
00293
00294 m_SelectedNode->SetProperty("volumerendering.usegpu",mitk::BoolProperty::New(usegpu));
00295
00296 #if ((VTK_MAJOR_VERSION > 5) || ((VTK_MAJOR_VERSION==5) && (VTK_MINOR_VERSION>=6) ))
00297 m_SelectedNode->SetProperty("volumerendering.useray",mitk::BoolProperty::New(useray));
00298 #endif
00299 m_SelectedNode->SetProperty("volumerendering.usemip",mitk::BoolProperty::New(usemip));
00300
00301 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00302 }
00303
00304 void QmitkVolumeVisualizationView::SetFocus()
00305 {
00306
00307 }
00308