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 _vtkIinfoTextImage = new vtkInfoTextImage();
00158 _vtkIinfoTextImageInteractor = new vtkInfoTextImageInteractor();
00159 _vtkIinfoTextImage->SetWxVtk2DBaseView(this);
00160 _vtkIinfoTextImage->SetMarImageData( GetVtkBaseData()->GetMarImageData() );
00161 _vtkIinfoTextImageInteractor->SetModelVtkInfoTextImage(_vtkIinfoTextImage);
00162 _vtkIinfoTextImage->Configure();
00163 ((vtkInteractorStyleBaseView*)this->GetInteractorStyleBaseView())->AddInteractorStyleMaracas(_vtkIinfoTextImageInteractor);
00164 }
00165 }
00166
00167 }
00168
00169
00170
00171 int wxVtk2DBaseView::GetActualSlice()
00172 {
00173 return (int)(_vtkbasedata->GetZ());
00174 }
00175
00176
00177 void wxVtk2DBaseView::SetActualSlice(int slice)
00178 {
00179 _vtkbasedata->SetZ(slice);
00180 }
00181
00182
00183
00184 vtkBaseData *wxVtk2DBaseView::GetVtkBaseData()
00185 {
00186 return _vtkbasedata;
00187 }
00188
00189
00190
00191 void wxVtk2DBaseView::SetVtkBaseData(vtkBaseData *vtkbasedata)
00192 {
00193 _vtkbasedata=vtkbasedata;
00194 }
00195
00196
00197
00198 void wxVtk2DBaseView::Refresh()
00199 {
00200 int z = (int)(GetVtkBaseData()->GetZ());
00201 _imageViewer2XYZ->SetZSlice( z );
00202
00203 wxVtkBaseView::Refresh();
00204 }
00205
00206
00207
00208 void wxVtk2DBaseView::SetInteractorStyleImage(vtkInteractorStyleBaseView *interactorstylebaseview)
00209 {
00210 SetInteractorStyleBaseView(interactorstylebaseview);
00211
00212 wxVTKRenderWindowInteractor *iren = GetWxVTKRenderWindowInteractor();
00213 interactorstylebaseview->SetInteractor ( iren );
00214 iren->SetInteractorStyle(interactorstylebaseview);
00215 interactorstylebaseview->SetwxVtkBaseView(this);
00216
00217 vtkMaracasImageViewer2Callback * cbk = vtkMaracasImageViewer2Callback::New();
00218 cbk->IV = _imageViewer2XYZ->GetVtkImageViewer2();
00219 interactorstylebaseview->AddObserver( vtkCommand::WindowLevelEvent, cbk );
00220 interactorstylebaseview->AddObserver( vtkCommand::StartWindowLevelEvent, cbk );
00221 interactorstylebaseview->AddObserver( vtkCommand::ResetWindowLevelEvent, cbk );
00222 cbk->Delete();
00223 }
00224
00225
00226 vtkRenderer* wxVtk2DBaseView::GetRenderer()
00227 {
00228 return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderer();
00229 }
00230
00231 vtkRenderWindow* wxVtk2DBaseView::GetRenWin()
00232 {
00233 return _imageViewer2XYZ->GetVtkImageViewer2()->GetRenderWindow();
00234 }
00235
00236
00237
00238 void wxVtk2DBaseView::GetSpacing(double spc[3])
00239 {
00240 vtkImageData *imageData = GetVtkBaseData()->GetImageData();
00241 imageData->GetSpacing(spc);
00242 }
00243
00244 void wxVtk2DBaseView::setColorTransferFunction(vtkColorTransferFunction* colortable){
00245 if(_imageViewer2XYZ!=NULL){
00246 _imageViewer2XYZ->setColorTransferFunction(colortable);
00247 }
00248 }