00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <wx/image.h>
00019 #include <wx/filedlg.h>
00020 #include "wxMaracasImageBrowser02.h"
00021
00022 DEFINE_EVENT_TYPE(wxEVT_MARACASIMAGEBROWSERCUTIMAGE)
00023
00024 BEGIN_EVENT_TABLE( wxMaracasImageBrowser02, wxPanel )
00025 EVT_MENU( 12121, wxMaracasImageBrowser02::OnRefreshView )
00026 EVT_MENU( 12122, wxMaracasImageBrowser02::OnRefreshView2 )
00027 END_EVENT_TABLE( );
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 wxMaracasImageBrowser02::wxMaracasImageBrowser02( wxWindow* parent, marFilesBase *dicom ,marParameters* parameters )
00038 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ){
00039
00040 this->SetSize(100,100);
00041
00042
00043 _parameters = parameters;
00044
00045 wxPanel *panel1=new wxPanel(this,-1);
00046 _btnRestRoi = new wxButton (panel1,-1,_T("Set VOI"),wxDefaultPosition ,wxSize(100,80) );
00047 _loadRangeImage = new LoadRangeImage(panel1,dicom);
00048 _loadRangeImage->SetSize(100,100);
00049 wxButton *bt_SavePerpSlice = new wxButton(panel1,-1,_T("Save VOI image"));
00050 wxButton *bt_CutVolume = new wxButton(panel1,-1,_T("Cut Volume"));
00051 Connect(bt_SavePerpSlice->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasImageBrowser02::OnBtSaveVOIData );
00052 Connect(bt_CutVolume->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &wxMaracasImageBrowser02::OnBtnCutVolume );
00053 Connect(_btnRestRoi->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) (wxCommandEventFunction) &wxMaracasImageBrowser02::OnBtnResetRoi );
00054
00055
00056 wxPanel *panel2=new wxPanel(this,-1);
00057 _imageviewer2D_1 = new wxVtk2DBaseView(panel2);
00058 wxVTKRenderWindowInteractor *iren = _imageviewer2D_1->GetWxVTKRenderWindowInteractor();
00059 wxBoxSizer *sizerDown= new wxBoxSizer(wxVERTICAL);
00060 sizerDown->Add( iren , 1, wxEXPAND , 0 );
00061 panel2->SetSizer( sizerDown );
00062 panel2->SetAutoLayout( true );
00063 panel2->SetSize( 100,100 );
00064 panel2->Layout();
00065
00066
00067
00068
00069 wxFlexGridSizer *sizer1= new wxFlexGridSizer(10);
00070 panel1->SetSizer( sizer1 );
00071 sizer1->AddGrowableCol(1);
00072 sizer1->Add( _btnRestRoi );
00073 sizer1->Add( _loadRangeImage,1,wxEXPAND,0 );
00074 sizer1->Add( bt_SavePerpSlice);
00075 sizer1->Add( bt_CutVolume);
00076
00077
00078 wxFlexGridSizer *sizer= new wxFlexGridSizer(1);
00079 sizer->AddGrowableCol(0);
00080 sizer->AddGrowableRow(1);
00081
00082
00083 sizer->Add( panel1 ,1,wxEXPAND,0 );
00084 sizer->Add( panel2 , 1, wxGROW , 0 );
00085
00086 this->SetSizer( sizer );
00087 this->SetAutoLayout( true );
00088 this->Layout();
00089 }
00090
00091 wxMaracasImageBrowser02::~wxMaracasImageBrowser02()
00092 {
00093 delete _imageviewer2D_1;
00094 }
00095
00096
00097 void wxMaracasImageBrowser02::OnBtnCutVolume( wxCommandEvent & event )
00098 {
00099 wxCommandEvent cevent( wxEVT_MARACASIMAGEBROWSERCUTIMAGE, GetId() );
00100 cevent.SetEventObject( this );
00101 GetEventHandler()->ProcessEvent( cevent );
00102 }
00103
00104
00105 void wxMaracasImageBrowser02::OnBtnResetRoi( wxCommandEvent & event )
00106 {
00107 if (_loadRangeImage!=NULL) {_loadRangeImage->Reset();}
00108
00109 vtkImageData *imagedata = _vtkbasedata_1->GetImageData();
00110 int dim[3];
00111 imagedata->GetDimensions(dim);
00112
00113
00114 vtkImageViewer2 *IV2= this->_imageviewer2D_1->_imageViewer2XYZ->GetVtkImageViewer2();
00115 vtkCamera *camera = IV2->GetRenderer()->GetActiveCamera();
00116 double pos[3];
00117 camera->GetPosition(pos);
00118
00119
00120
00121
00122
00123
00124
00125 _manRoiControl->InitRoi( dim[0] , dim[1] , 0.2);
00126 _manRoiControl->SetActive(true);
00127
00128 _btnRestRoi->SetLabel( _T("Reset VOI") );
00129
00130 _imageviewer2D_1->Refresh();
00131
00132 }
00133
00134
00135
00136 void wxMaracasImageBrowser02::LoadData( marImageData *marimagedata )
00137 {
00138 vtkImageData *imagedata = marimagedata->GetImageData();
00139 imagedata->UpdateInformation();
00140 imagedata->SetUpdateExtent(imagedata->GetWholeExtent());
00141 imagedata->Update();
00142
00143 _vtkbasedata_1 = new vtkBaseData();
00144 _vtkbasedata_1->SetMarImageData( marimagedata );
00145 _imageviewer2D_1->SetVtkBaseData( _vtkbasedata_1 );
00146 _imageviewer2D_1->Configure(true);
00147
00148
00149
00150 _manRoiControl = new manualRoiControler();
00151
00152
00153
00154 _mContourModel = new manualContourModelRoi();
00155
00156 _mViewRoi = new manualViewRoi();
00157 _mViewRoi->SetModel( _mContourModel );
00158 _mViewRoi->SetWxVtkBaseView( _imageviewer2D_1 );
00159 _mViewRoi->SetRange( (int)1.5 );
00160
00161
00162
00163 double spc[3];
00164 imagedata->GetSpacing(spc);
00165 _mViewRoi->SetSpacing(spc);
00166
00167 _manRoiControl->SetModelView( _mContourModel , _mViewRoi );
00168 _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manRoiControl );
00169 _manRoiControl->CreateNewManualContour();
00170 _manRoiControl->SetState(0);
00171 _manRoiControl->SetActive(false);
00172 _mViewRoi->RefreshContour();
00173
00174 _imageviewer2D_1->GetWxVTKRenderWindowInteractor()->Render();
00175 }
00176
00177 void wxMaracasImageBrowser02::SetROI( int voi[6] )
00178 {
00179 _loadRangeImage->Reset();
00180 _loadRangeImage->SetStartEnd( voi[4],voi[5]);
00181 _manRoiControl->SetRoi( voi[0],voi[2], voi[1],voi[3] );
00182 _manRoiControl->SetActive(true);
00183 }
00184
00185 void wxMaracasImageBrowser02::GetROI( int ext[6] )
00186 {
00187 double minX,minY,maxX,maxY;
00188 _mViewRoi->GetMinMax(minX,minY,maxX,maxY);
00189 ext[0]=(int)minX;
00190 ext[1]=(int)maxX;
00191 ext[2]=(int)minY;
00192 ext[3]=(int)maxY;
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 _loadRangeImage->GetROI( ext );
00205
00206 if ( (ext[0]==ext[1]) || (ext[2]==ext[3]) || (ext[4]==ext[5]) )
00207 {
00208 int border[6];
00209 _vtkbasedata_1->GetImageData ()->GetExtent( border );
00210 ext[0] = border[0];
00211 ext[1] = border[1];
00212 ext[2] = border[2];
00213 ext[3] = border[3];
00214 ext[4] = border[4];
00215 ext[5] = border[5];
00216 }
00217
00218 }
00219
00220 void wxMaracasImageBrowser02::Start( ){
00221 _loadRangeImage->Start();
00222 }
00223
00224
00225 void wxMaracasImageBrowser02::ForceToFinisReadActiveImages(){
00226 _loadRangeImage->ForceToFinisReadActiveImages();
00227 }
00228
00229 bool wxMaracasImageBrowser02::GetRoiSelected()
00230 {
00231 double minX,minY,maxX,maxY;
00232 _mViewRoi->GetMinMax(minX,minY,maxX,maxY);
00233
00234 bool result=true;
00235 if ( (minX==maxX) || (minY==maxY) )
00236 {
00237 result=false;
00238 }
00239 return result;
00240 }
00241
00242 void wxMaracasImageBrowser02::Refresh()
00243 {
00244 int z = (int)_vtkbasedata_1->GetZ( );
00245 _loadRangeImage->SetActualSlice( z );
00246 _loadRangeImage->RefreshSlice();
00247 z = _loadRangeImage->GetActualSlice( );
00248 _vtkbasedata_1->SetZ( z );
00249
00250
00251 }
00252
00253 void wxMaracasImageBrowser02::OnRefreshView(wxCommandEvent & event)
00254 {
00255 Refresh();
00256 }
00257
00258 void wxMaracasImageBrowser02::OnRefreshView2(wxCommandEvent & event)
00259 {
00260 _loadRangeImage -> ResetActualSlice();
00261 int z = _loadRangeImage->GetActualSlice();
00262 _vtkbasedata_1->SetZ( z );
00263 _imageviewer2D_1->Refresh();
00264 }
00265
00266
00267
00268
00269
00270 void wxMaracasImageBrowser02::OnBtSaveVOIData(wxCommandEvent& event)
00271 {
00272 wxFileDialog dialog(this, _T("Choose a file"), _T(""), _T(""), _T("*.maracas"), wxSAVE );
00273 if (dialog.ShowModal() == wxID_OK)
00274 {
00275 ForceToFinisReadActiveImages();
00276 std::string directory = (const char *)(dialog.GetDirectory().mb_str());
00277 std::string filename = (const char *)(dialog.GetFilename().mb_str());
00278 float rescalaSlope = _parameters->getRescaleSlope();
00279 float rescalaIntercept = _parameters->getRescaleIntercept();
00280 vtkImageData *vtkimagedata = this->_vtkbasedata_1->GetMarImageData()->GetImageData();
00281 int voi[6];
00282 this->GetROI(voi);
00283 marRAW2Files marraw2;
00284 marraw2.saveVolume(directory,filename,vtkimagedata,voi,rescalaSlope,rescalaIntercept);
00285 }
00286 }
00287
00288
00289