00001 #include "wxVtk2DBaseView.h"
00002
00003 #include "vtkInfoTextImage.h"
00004 #include "vtkInteractorStyleBaseView2D.h"
00005 #include "vtkInfoTextImageInteractor.h"
00006
00007
00008 wxVtk2DBaseView::wxVtk2DBaseView(wxWindow *parent)
00009 :wxVtkBaseView(parent)
00010 {
00011 _imageViewer2XYZ = NULL;
00012 _vtkIinfoTextImage = NULL;
00013 }
00014
00015
00016
00017 wxVtk2DBaseView::~wxVtk2DBaseView()
00018 {
00019 if (_vtkIinfoTextImage!=NULL)
00020 {
00021 delete _vtkIinfoTextImage;
00022 }
00023
00024 if (_imageViewer2XYZ!=NULL)
00025 {
00026 delete _imageViewer2XYZ;
00027 }
00028 }
00029
00030
00031 void wxVtk2DBaseView::TransformCoordinate_spacing_ViewToModel(double &X,double &Y, double &Z)
00032 {
00033
00034 double spc[3];
00035
00036
00037 vtkImageData* image = this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput();
00038 if(image){
00039 image->GetSpacing(spc);
00040 }else{
00041 spc[0] = 1;
00042 spc[1] = 1;
00043 spc[2] = 1;
00044 }
00045
00046
00047 X = X / spc[0];
00048 Y = Y / spc[1];
00049 Z = Z / spc[2];
00050
00051 }
00052
00053
00054 void wxVtk2DBaseView::TransformCoordinate_spacing_ModelToView(double &X,double &Y, double &Z)
00055 {
00056
00057 double spc[3];
00058
00059
00060 vtkImageData* image = this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput();
00061 if(image){
00062 image->GetSpacing(spc);
00063 }else{
00064 spc[0] = 1;
00065 spc[1] = 1;
00066 spc[2] = 1;
00067 }
00068
00069 X=X*spc[0];
00070 Y=Y*spc[1];
00071 Z=Z*spc[2];
00072
00073 }
00074
00075
00076 void wxVtk2DBaseView::ResetView()
00077 {
00078 double spx = 0,spy = 0,spz = 0;
00079 int x1 = 1,x2 = 1,y1 = 1,y2 = 1,z1 = 1,z2 = 1;
00080 wxVtkBaseView::Configure();
00081
00082 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00083 vtkImageData *imageData = GetVtkBaseData()->GetImageData();
00084 if(imageData){
00085 imageData->UpdateInformation();
00086 imageData->SetUpdateExtent( imageData->GetWholeExtent());
00087 imageData->Update();
00088 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
00089 imageData->GetSpacing (spx,spy,spz);
00090 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
00091 }
00092
00093
00094 _imageViewer2XYZ -> SetExtentDimension(x1,x2,y1,y2,z1,z2);
00095 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
00096
00097 _imageViewer2XYZ->GetVtkImageViewer2()->Render();
00098
00100
00101
00102
00103
00104
00105
00106 vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
00107
00108 manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
00109 style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
00110
00111 vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
00112 style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
00113
00114 SetInteractorStyleImage( style2D );
00115
00116
00118
00119 }
00120
00121
00122
00123 void wxVtk2DBaseView::Configure(bool okimage)
00124 {
00125 double spx,spy,spz;
00126 int x1,x2,y1,y2,z1,z2;
00127 wxVtkBaseView::Configure();
00128
00129
00130 if (_imageViewer2XYZ==NULL)
00131 {
00132 _imageViewer2XYZ = new vtkImageViewer2_XYZ();
00133 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00134 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
00135
00137
00138
00139
00140
00141
00142
00143 vtkInteractorStyleBaseView2D *style2D = vtkInteractorStyleBaseView2D::New();
00144
00145 manualInteractorWindowLevel *_manualinteractorwindowlevel= new manualInteractorWindowLevel();
00146 style2D->SetInteractorWindowLevel( _manualinteractorwindowlevel );
00147
00148 vtkInteractorScrollZ *_vtkInteractorScrollZ = new vtkInteractorScrollZ();
00149 style2D->SetInteractorScrollZ(_vtkInteractorScrollZ);
00150
00151 SetInteractorStyleImage( style2D );
00152
00153
00155 }
00156
00157
00158 vtkImageData *imageData = GetVtkBaseData()->GetMarImageData()->GetImageData();
00159 if (imageData!=NULL){
00160
00161 imageData->UpdateInformation();
00162 imageData->SetUpdateExtent( imageData->GetWholeExtent());
00163 imageData->Update();
00164 if (okimage==true){
00165 imageData->GetSpacing (spx,spy,spz);
00166 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
00167 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
00168 _imageViewer2XYZ->SetExtentDimension(x1,x2,y1,y2,z1,z2);
00169 double range[2];
00170 imageData->GetScalarRange(range);
00171 if (range[1]<20000){
00172 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( (range[1]-range[0])/2 );
00173 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( (range[1]+range[0])/4 );
00174 } else {
00175 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( 1000 );
00176 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( 500 );
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2();
00196 vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera();
00197
00198
00199
00200
00201
00202
00203
00204 camera->SetViewUp ( spx*0 , spy*1 , spz*0 );
00205 camera->SetPosition ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*10000 );
00206 camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0 );
00207
00208
00209 camera->SetClippingRange( 0.01 , 1000000 );
00210 camera->ComputeViewPlaneNormal();
00211 camera->SetParallelScale( spx*(x2-x1)/3.0 );
00212
00213
00214 if(_vtkIinfoTextImage == NULL){
00215 _vtkIinfoTextImage = new vtkInfoTextImage();
00216 _vtkIinfoTextImageInteractor = new vtkInfoTextImageInteractor();
00217 ((vtkInteractorStyleBaseView*)this->GetInteractorStyleBaseView())->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
00218 }
00219 _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
00220 _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
00221 _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);
00222 _vtkIinfoTextImage->Configure();
00223
00224 }
00225 }
00226 }
00227
00228
00229
00230 int wxVtk2DBaseView::GetActualSlice()
00231 {
00232 return (int)(_vtkbasedata->GetZ());
00233 }
00234
00235
00236 void wxVtk2DBaseView::SetActualSlice(int slice)
00237 {
00238 _vtkbasedata->SetZ(slice);
00239 }
00240
00241
00242
00243 vtkBaseData *wxVtk2DBaseView::GetVtkBaseData()
00244 {
00245 return _vtkbasedata;
00246 }
00247
00248
00249
00250 void wxVtk2DBaseView::SetVtkBaseData(vtkBaseData *vtkbasedata)
00251 {
00252 _vtkbasedata=vtkbasedata;
00253 }
00254
00255
00256
00257 void wxVtk2DBaseView::Refresh()
00258 {
00259 int z = (int)(GetVtkBaseData()->GetZ());
00260 _imageViewer2XYZ->SetZSlice( z );
00261
00262 wxVtkBaseView::Refresh();
00263 }
00264
00265
00266
00267 void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
00268 {
00269 SetInteractorStyleBaseView(interactorstylebaseview);
00270
00271 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00272 interactorstylebaseview->SetInteractor ( iren );
00273 iren->SetInteractorStyle(interactorstylebaseview);
00274 interactorstylebaseview->SetwxVtkBaseView(this);
00275
00276 vtkMaracasImageViewer2Callback * cbk = vtkMaracasImageViewer2Callback::New();
00277 cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
00278 interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
00279 interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
00280 interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
00281 cbk->Delete();
00282 }
00283
00284
00285 vtkRenderer* wxVtk2DBaseView::GetRenderer()
00286 {
00287 return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
00288 }
00289
00290 vtkRenderWindow* wxVtk2DBaseView::GetRenWin()
00291 {
00292 return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
00293 }
00294
00295
00296
00297 void wxVtk2DBaseView::GetSpacing(double spc[3])
00298 {
00299 vtkImageData *imageData = GetVtkBaseData()->GetImageData();
00300 if(imageData){
00301 imageData->GetSpacing(spc);
00302 }else{
00303 spc[0] = 0;
00304 spc[1] = 0;
00305 spc[2] = 0;
00306 }
00307 }
00308
00309 void wxVtk2DBaseView::setColorTransferFunction(vtkColorTransferFunction* colortable){
00310 if(_imageViewer2XYZ!=NULL){
00311 _imageViewer2XYZ->setColorTransferFunction(colortable);
00312 this->Refresh();
00313 }
00314 }
00315
00316 void wxVtk2DBaseView::setWindowLevel(double level){
00317
00318
00319 vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
00320 imagemaptowindowlevel->SetWindow(level);
00321 this->Refresh();
00322 }
00323
00324 void wxVtk2DBaseView::setColorLevel(double level){
00325
00326 vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
00327 imagemaptowindowlevel->SetLevel(level);
00328 this->Refresh();
00329 }