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 this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
00037
00038 X = X / spc[0];
00039 Y = Y / spc[1];
00040 Z = Z / spc[2];
00041
00042 }
00043
00044
00045 void wxVtk2DBaseView::TransformCoordinate_spacing_ModelToView(double &X,double &Y, double &Z)
00046 {
00047
00048 double spc[3];
00049
00050 this->_imageViewer2XYZ->GetVtkImageViewer2()->GetInput()->GetSpacing(spc);
00051
00052 X=X*spc[0];
00053 Y=Y*spc[1];
00054 Z=Z*spc[2];
00055
00056 }
00057
00058
00059 void wxVtk2DBaseView::ResetView()
00060 {
00061 double spx,spy,spz;
00062 int x1,x2,y1,y2,z1,z2;
00063 wxVtkBaseView::Configure();
00064
00065 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00066 vtkImageData *imageData = GetVtkBaseData()->GetImageData();
00067 imageData->UpdateInformation();
00068 imageData->SetUpdateExtent( imageData->GetWholeExtent());
00069 imageData->Update();
00070
00071 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
00072 imageData->GetSpacing (spx,spy,spz);
00073 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
00074 _imageViewer2XYZ -> SetExtentDimension(x1,x2,y1,y2,z1,z2);
00075 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
00076
00077 _imageViewer2XYZ->GetVtkImageViewer2()->Render();
00078 SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
00079
00080 }
00081
00082
00083
00084 void wxVtk2DBaseView::Configure(bool okimage)
00085 {
00086 double spx,spy,spz;
00087 int x1,x2,y1,y2,z1,z2;
00088 wxVtkBaseView::Configure();
00089
00090
00091 if (_imageViewer2XYZ==NULL)
00092 {
00093 _imageViewer2XYZ = new vtkImageViewer2_XYZ();
00094 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00095 _imageViewer2XYZ -> GetVtkImageViewer2()->SetupInteractor ( iren );
00096 SetInteractorStyleImage( vtkInteractorStyleBaseView2D::New() );
00097 }
00098
00099
00100 vtkImageData *imageData = GetVtkBaseData()->GetMarImageData()->GetImageData();
00101 if (imageData!=NULL){
00102 imageData->UpdateInformation();
00103 imageData->SetUpdateExtent( imageData->GetWholeExtent());
00104 imageData->Update();
00105 if (okimage==true){
00106 imageData->GetSpacing (spx,spy,spz);
00107 imageData->GetExtent (x1,x2,y1,y2,z1,z2);
00108
00109
00110 _imageViewer2XYZ->GetVtkImageViewer2()->SetInput(imageData );
00111 _imageViewer2XYZ->SetExtentDimension(x1,x2,y1,y2,z1,z2);
00112 double range[2];
00113 imageData->GetScalarRange(range);
00114 if (range[1]<20000){
00115 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( (range[1]-range[0])/2 );
00116 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( (range[1]+range[0])/4 );
00117 } else {
00118 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( 1000 );
00119 _imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( 500 );
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 vtkImageViewer2 *IV2=_imageViewer2XYZ->GetVtkImageViewer2();
00139 vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera();
00140
00141
00142
00143
00144
00145
00146
00147 camera->SetViewUp ( spx*0 , spy*1 , spz*0 );
00148 camera->SetPosition ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*10000 );
00149 camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0 );
00150
00151
00152 camera->SetClippingRange( 0.01 , 1000000 );
00153 camera->ComputeViewPlaneNormal();
00154 camera->SetParallelScale( spx*(x2-x1)/3.0 );
00155
00156
00157 if(_vtkIinfoTextImage == NULL){
00158 _vtkIinfoTextImage = new vtkInfoTextImage();
00159 _vtkIinfoTextImageInteractor = new vtkInfoTextImageInteractor();
00160 ((vtkInteractorStyleBaseView*)this->GetInteractorStyleBaseView())->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
00161 }
00162 _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
00163 _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
00164 _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);
00165 _vtkIinfoTextImage->Configure();
00166
00167 }
00168 }
00169
00170 }
00171
00172
00173
00174 int wxVtk2DBaseView::GetActualSlice()
00175 {
00176 return (int)(_vtkbasedata->GetZ());
00177 }
00178
00179
00180 void wxVtk2DBaseView::SetActualSlice(int slice)
00181 {
00182 _vtkbasedata->SetZ(slice);
00183 }
00184
00185
00186
00187 vtkBaseData *wxVtk2DBaseView::GetVtkBaseData()
00188 {
00189 return _vtkbasedata;
00190 }
00191
00192
00193
00194 void wxVtk2DBaseView::SetVtkBaseData(vtkBaseData *vtkbasedata)
00195 {
00196 _vtkbasedata=vtkbasedata;
00197 }
00198
00199
00200
00201 void wxVtk2DBaseView::Refresh()
00202 {
00203 int z = (int)(GetVtkBaseData()->GetZ());
00204 _imageViewer2XYZ->SetZSlice( z );
00205
00206 wxVtkBaseView::Refresh();
00207 }
00208
00209
00210
00211 void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
00212 {
00213 SetInteractorStyleBaseView(interactorstylebaseview);
00214
00215 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00216 interactorstylebaseview->SetInteractor ( iren );
00217 iren->SetInteractorStyle(interactorstylebaseview);
00218 interactorstylebaseview->SetwxVtkBaseView(this);
00219
00220 vtkMaracasImageViewer2Callback * cbk = vtkMaracasImageViewer2Callback::New();
00221 cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
00222 interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
00223 interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
00224 interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
00225 cbk->Delete();
00226 }
00227
00228
00229 vtkRenderer* wxVtk2DBaseView::GetRenderer()
00230 {
00231 return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
00232 }
00233
00234 vtkRenderWindow* wxVtk2DBaseView::GetRenWin()
00235 {
00236 return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
00237 }
00238
00239
00240
00241 void wxVtk2DBaseView::GetSpacing(double spc[3])
00242 {
00243 vtkImageData *imageData = GetVtkBaseData()->GetImageData();
00244 imageData->GetSpacing(spc);
00245 }
00246
00247 void wxVtk2DBaseView::setColorTransferFunction(vtkColorTransferFunction* colortable){
00248 if(_imageViewer2XYZ!=NULL){
00249 _imageViewer2XYZ->setColorTransferFunction(colortable);
00250 this->Refresh();
00251 }
00252 }
00253
00254 void wxVtk2DBaseView::setWindowLevel(double level){
00255
00256
00257 vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
00258 imagemaptowindowlevel->SetWindow(level);
00259 this->Refresh();
00260 }
00261
00262 void wxVtk2DBaseView::setColorLevel(double level){
00263
00264 vtkImageMapToWindowLevelColors* imagemaptowindowlevel = _imageViewer2XYZ->GetVtkImageViewer2()->GetWindowLevel();
00265 imagemaptowindowlevel->SetLevel(level);
00266 this->Refresh();
00267 }