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 "QmitkMITKSurfaceMaterialEditorView.h"
00019
00020 #include "mitkBaseRenderer.h"
00021 #include "mitkNodePredicateDataType.h"
00022 #include "mitkProperties.h"
00023 #include "mitkIDataStorageService.h"
00024 #include "mitkDataNodeObject.h"
00025
00026 #include "berryIEditorPart.h"
00027 #include "berryIWorkbenchPage.h"
00028
00029 #include "mitkShaderProperty.h"
00030 #include "mitkShaderRepository.h"
00031
00032 #include "QmitkDataStorageComboBox.h"
00033 #include "QmitkStdMultiWidget.h"
00034
00035 #include <vtkSphereSource.h>
00036 #include <vtkPolyData.h>
00037 #include <vtkCamera.h>
00038 #include <vtkRenderer.h>
00039 #include <vtkTextActor.h>
00040 #include <vtkRenderer.h>
00041 #include <vtkTextProperty.h>
00042 #include <vtkCoordinate.h>
00043 #include <vtkActor.h>
00044 #include <vtkProperty.h>
00045 #include <vtkXMLMaterial.h>
00046 #include <vtkXMLShader.h>
00047 #include <vtkXMLDataElement.h>
00048
00049 #include <mitkVtkPropRenderer.h>
00050 #include <mitkVtkLayerController.h>
00051
00052 #include <qmessagebox.h>
00053
00054 #include "mitkStandaloneDataStorage.h"
00055
00056
00057
00058 const std::string QmitkMITKSurfaceMaterialEditorView::VIEW_ID = "org.mitk.views.mitksurfacematerialeditor";
00059
00060 QmitkMITKSurfaceMaterialEditorView::QmitkMITKSurfaceMaterialEditorView()
00061 : QmitkFunctionality(),
00062 m_Controls(NULL),
00063 m_MultiWidget(NULL)
00064 {
00065 fixedProperties.push_back( "shader" );
00066 fixedProperties.push_back( "material.representation" );
00067 fixedProperties.push_back( "color" );
00068 fixedProperties.push_back( "opacity" );
00069 fixedProperties.push_back( "material.wireframeLineWidth" );
00070
00071 fixedProperties.push_back( "material.ambientCoefficient" );
00072 fixedProperties.push_back( "material.diffuseCoefficient" );
00073 fixedProperties.push_back( "material.ambientColor" );
00074 fixedProperties.push_back( "material.diffuseColor" );
00075 fixedProperties.push_back( "material.specularColor" );
00076 fixedProperties.push_back( "material.specularCoefficient" );
00077 fixedProperties.push_back( "material.specularPower" );
00078 fixedProperties.push_back( "material.interpolation" );
00079
00080 shaderProperties.push_back( "shader" );
00081 shaderProperties.push_back( "material.representation" );
00082 shaderProperties.push_back( "color" );
00083 shaderProperties.push_back( "opacity" );
00084 shaderProperties.push_back( "material.wireframeLineWidth" );
00085
00086 observerAllocated = false;
00087
00088
00089 mitk::ShaderRepository::GetGlobalShaderRepository();
00090 }
00091
00092 QmitkMITKSurfaceMaterialEditorView::~QmitkMITKSurfaceMaterialEditorView()
00093 {
00094 }
00095
00096 void QmitkMITKSurfaceMaterialEditorView::InitPreviewWindow()
00097 {
00098 usedTimer=0;
00099
00100 vtkSphereSource* sphereSource = vtkSphereSource::New();
00101 sphereSource->SetThetaResolution(25);
00102 sphereSource->SetPhiResolution(25);
00103 sphereSource->Update();
00104
00105 vtkPolyData* sphere = sphereSource->GetOutput();
00106
00107 m_Surface = mitk::Surface::New();
00108 m_Surface->SetVtkPolyData( sphere );
00109
00110 m_DataNode = mitk::DataNode::New();
00111 m_DataNode->SetData( m_Surface );
00112
00113 m_DataTree = mitk::StandaloneDataStorage::New();
00114
00115 m_DataTree->Add( m_DataNode , (mitk::DataNode *)0 );
00116
00117 m_Controls->m_PreviewRenderWindow->GetRenderer()->SetDataStorage( m_DataTree );
00118 m_Controls->m_PreviewRenderWindow->GetRenderer()->SetMapperID( mitk::BaseRenderer::Standard3D );
00119
00120 sphereSource->Delete();
00121 }
00122
00123
00124 void QmitkMITKSurfaceMaterialEditorView::RefreshPropertiesList()
00125 {
00126 mitk::DataNode* SrcND = m_SelectedDataNode;
00127 mitk::DataNode* DstND = m_DataNode;
00128
00129 mitk::PropertyList* DstPL = DstND->GetPropertyList();
00130
00131
00132 m_Controls->m_ShaderPropertyList->SetPropertyList( 0 );
00133
00134 DstPL->Clear();
00135
00136 if(observerAllocated)
00137 {
00138 observedProperty->RemoveObserver( observerIndex );
00139 observerAllocated=false;
00140 }
00141
00142 if(SrcND)
00143 {
00144 mitk::PropertyList* SrcPL = SrcND->GetPropertyList();
00145
00146 mitk::ShaderProperty::Pointer shaderEnum = dynamic_cast<mitk::ShaderProperty*>(SrcPL->GetProperty("shader"));
00147
00148 std::string shaderState = "fixed";
00149
00150 if(shaderEnum.IsNotNull())
00151 {
00152 shaderState = shaderEnum->GetValueAsString();
00153
00154 itk::MemberCommand<QmitkMITKSurfaceMaterialEditorView>::Pointer propertyModifiedCommand = itk::MemberCommand<QmitkMITKSurfaceMaterialEditorView>::New();
00155 propertyModifiedCommand->SetCallbackFunction(this, &QmitkMITKSurfaceMaterialEditorView::shaderEnumChange);
00156 observerIndex = shaderEnum->AddObserver(itk::ModifiedEvent(), propertyModifiedCommand);
00157 observedProperty = shaderEnum;
00158 observerAllocated=true;
00159 }
00160
00161 MITK_INFO << "PROPERTIES SCAN BEGIN";
00162
00163 for(mitk::PropertyList::PropertyMap::const_iterator it=SrcPL->GetMap()->begin(); it!=SrcPL->GetMap()->end(); it++)
00164 {
00165 std::string name=it->first;
00166 mitk::BaseProperty *p=it->second.first;
00167
00168
00169
00170 if(shaderState.compare("fixed")==0)
00171 {
00172 if(std::find(fixedProperties.begin(), fixedProperties.end(), name) != fixedProperties.end())
00173 {
00174 DstPL->SetProperty(name,p);
00175 }
00176 }
00177 else
00178 {
00179
00180 {
00181 DstPL->SetProperty(name,p);
00182 }
00183 }
00184 }
00185
00186 MITK_INFO << "PROPERTIES SCAN END";
00187 }
00188
00189 m_Controls->m_ShaderPropertyList->SetPropertyList( DstPL );
00190
00191 }
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 void QmitkMITKSurfaceMaterialEditorView::CreateQtPartControl(QWidget *parent)
00239 {
00240 if (!m_Controls)
00241 {
00242
00243 m_Controls = new Ui::QmitkMITKSurfaceMaterialEditorViewControls;
00244 m_Controls->setupUi(parent);
00245 this->CreateConnections();
00246
00247 InitPreviewWindow();
00248 RefreshPropertiesList();
00249
00250 }
00251 }
00252
00253 void QmitkMITKSurfaceMaterialEditorView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
00254 {
00255 m_MultiWidget = &stdMultiWidget;
00256 }
00257
00258 void QmitkMITKSurfaceMaterialEditorView::StdMultiWidgetNotAvailable()
00259 {
00260 m_MultiWidget = NULL;
00261 }
00262
00263 void QmitkMITKSurfaceMaterialEditorView::CreateConnections()
00264 {
00265 }
00266
00267 void QmitkMITKSurfaceMaterialEditorView::Activated()
00268 {
00269 QmitkFunctionality::Activated();
00270 }
00271
00272 void QmitkMITKSurfaceMaterialEditorView::Deactivated()
00273 {
00274 QmitkFunctionality::Deactivated();
00275 }
00276
00277
00278 void QmitkMITKSurfaceMaterialEditorView::OnSelectionChanged(std::vector<mitk::DataNode*> nodes)
00279 {
00280 if(!nodes.empty())
00281 {
00282 m_SelectedDataNode = nodes.at(0);
00283 MITK_INFO << "Node '" << m_SelectedDataNode->GetName() << "' selected";
00284 SurfaceSelected();
00285 }
00286 }
00287
00288 void QmitkMITKSurfaceMaterialEditorView::SurfaceSelected()
00289 {
00290 postRefresh();
00291 }
00292
00293 void QmitkMITKSurfaceMaterialEditorView::shaderEnumChange(const itk::Object * , const itk::EventObject & )
00294 {
00295 postRefresh();
00296 }
00297
00298 void QmitkMITKSurfaceMaterialEditorView::postRefresh()
00299 {
00300 if(usedTimer)
00301 return;
00302
00303 usedTimer=startTimer(0);
00304 }
00305
00306 void QmitkMITKSurfaceMaterialEditorView::timerEvent( QTimerEvent *e )
00307 {
00308 if(usedTimer!=e->timerId())
00309 {
00310 MITK_ERROR << "INTERNAL ERROR: usedTimer[" << usedTimer << "] != timerId[" << e->timerId() << "]";
00311 }
00312
00313 if(usedTimer)
00314 {
00315 killTimer(usedTimer);
00316 usedTimer=0;
00317 }
00318
00319 RefreshPropertiesList();
00320 }