00001 #include "wxVtkMPR3DView.h"
00002
00003 #include "vtkDataSetMapper.h"
00004 #include "vtkPlaneSource.h"
00005 #include "vtkProbeFilter.h"
00006 #include "vtkStructuredPoints.h"
00007 #include "vtkMetaImageWriter.h"
00008 #include "vtkDataSetMapper.h"
00009 #include "vtkImageChangeInformation.h"
00010 #include "vtkPointData.h"
00011 #include "vtkWindowLevelLookupTable.h"
00012 #include "vtkPlane.h"
00013 #include "vtkCutter.h"
00014 #include "vtkTransform.h"
00015 #include "vtkmyPWCallback_3DPointWidget.h"
00016 #include "vtkProperty.h"
00017 #include "vtkCellPicker.h"
00018
00019 wxVtkMPR3DView::wxVtkMPR3DView( wxVtk3DBaseView *wxvtk3Dbaseview )
00020 {
00021 _wxvtk3Dbaseview = wxvtk3Dbaseview;
00022 _vtkmpr3Ddataviewer = NULL;
00023 _wxvtkmpr3DviewCntrlPanel = NULL;
00024
00025 _pointWidget = NULL;
00026 _planeWidget = NULL;
00027 _vtkplane = NULL;
00028 _probe = NULL;
00029 _contourMapper = NULL;
00030
00031 _planeWidgetX = 0;
00032 _planeWidgetY = 0;
00033 _planeWidgetZ = 0;
00034
00035
00036 }
00037
00038
00039
00040 wxVtkMPR3DView::~wxVtkMPR3DView()
00041 {
00042 VisiblePointWidget( false );
00043 VisiblePlaneWidget( false );
00044
00045 if(_pointWidget!=NULL){
00046 _pointWidget->Delete();
00047 }
00048 if(_planeWidget!=NULL){
00049 _planeWidget->Delete();
00050 }
00051
00052 if(_vtkplane!=NULL){
00053 _vtkplane->Delete();
00054 _probe->Delete();
00055 _contourMapper->Delete();
00056 _contourPlaneActor->Delete();
00057 }
00058
00059 }
00060
00061
00062 void wxVtkMPR3DView::RemoveActor(vtkActor* actor)
00063 {
00064 _wxvtk3Dbaseview->GetRenderer()->RemoveActor(actor);
00065 }
00066
00067
00068 void wxVtkMPR3DView::ResetCamera(int* ext, double* origin,double* spc)
00069 {
00070 if(ext == NULL){
00071 _wxvtk3Dbaseview->GetRenderer()->ResetCamera ();
00072 _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
00073 }else{
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 double x0=(spc[0])*((double)ext[0]);
00084 double x1=(spc[0])*((double)ext[1]);
00085 double y0=(spc[1])*((double)ext[2]);
00086 double y1=(spc[1])*((double)ext[3]);
00087 double z0=(spc[2])*((double)ext[4]);
00088 double z1=(spc[2])*((double)ext[5]);
00089
00090 _wxvtk3Dbaseview->GetRenderer()->ResetCamera(x0,x1,y0,y1,z0,z1);
00091
00092 _wxvtk3Dbaseview->GetCamera()->Dolly(1.5);
00093 }
00094 }
00095
00096
00097 void wxVtkMPR3DView::Configure(){
00098
00099
00100 vtkImageData *imageData = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
00101
00102 _wxvtk3Dbaseview->Configure();
00103 _wxvtkmpr3DviewCntrlPanel->UpdateControlPanel();
00104
00105
00106
00107
00108
00109 vtkActor* _outlineActor = _vtkmpr3Ddataviewer->GetOutlineActor();
00110 _wxvtk3Dbaseview->GetRenderer()->AddActor( _outlineActor );
00111
00112
00113
00114
00115
00116
00117
00118 _wxvtk3Dbaseview->GetRenderer()->SetActiveCamera(_wxvtk3Dbaseview->GetCamera());
00119 this->ResetCamera();
00120
00121
00122
00123
00124 _wxvtk3Dbaseview->GetRenderer()->SetBackground( 0.36 , 0.36 , 0.36 );
00125 _wxvtk3Dbaseview->GetRenWin()->SetSize(400, 400);
00126
00127
00128
00129
00130
00131
00132
00133 _wxvtk3Dbaseview->GetRenderer()->ResetCameraClippingRange();
00134
00135
00136
00137
00138
00139
00140
00141 vtkmyPWCallback_3DPointWidget *_myCallback = vtkmyPWCallback_3DPointWidget::New();
00142 _myCallback->SetWxVtkMPR3DView(this);
00143
00144
00145 if(imageData){
00146 if(_pointWidget==NULL){
00147 _pointWidget = vtkPointWidget::New();
00148 }
00149 _pointWidget->SetInput( imageData );
00150 _myCallback->SetVtkPointWidget(_pointWidget);
00151 _pointWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
00152 _pointWidget->AllOff();
00153 _pointWidget->PlaceWidget();
00154
00155 _pointWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
00156
00157
00158 if(_planeWidget==NULL)
00159 {
00160 _planeWidget = vtkPlaneWidget::New();
00161 }
00162 _planeWidget->SetInput( imageData );
00163
00164 _myCallback->SetVtkPlaneWidget(_planeWidget);
00165
00166 _planeWidget->NormalToXAxisOn();
00167 _planeWidget->SetResolution(50);
00168 _planeWidget->SetRepresentationToOutline();
00169
00170 int dim[3];
00171
00172 imageData->GetDimensions(dim);
00173 int px=(dim[0]/2);
00174 int py=(dim[1]/2);
00175 int pz=(dim[2]/2);
00176 int dd=20;
00177 _planeWidget->PlaceWidget( px-dd , px+dd , py-dd , py+dd , pz-dd , pz+dd );
00178
00179 if(_vtkplane==NULL){
00180 _vtkplane = vtkPolyData::New();
00181
00182 _probe = vtkProbeFilter::New();
00183 _probe->SetInput(_vtkplane);
00184
00185 _contourMapper = vtkPolyDataMapper::New();
00186
00187 _contourMapper->SetInput( _probe->GetPolyDataOutput() );
00188
00189 _contourPlaneActor = vtkActor::New();
00190 _contourPlaneActor->SetMapper(_contourMapper);
00191
00192 _contourPlaneActor->VisibilityOff();
00193
00194 _planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
00195 _planeWidget->AddObserver(vtkCommand::InteractionEvent,_myCallback);
00196
00197 _planeWidget->Off();
00198 _wxvtk3Dbaseview->GetRenderer()->AddActor( _contourPlaneActor );
00199
00200 }
00201
00202 _planeWidget->GetPolyData(_vtkplane);
00203 _probe->SetSource( imageData );
00204 _contourMapper->SetScalarRange( imageData->GetScalarRange() );
00205
00206
00207 ConfigureFreePlanes();
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 void wxVtkMPR3DView::ConfigureFreePlanes()
00233 {
00234
00235
00236
00237 vtkCellPicker* picker = vtkCellPicker::New();
00238 picker->SetTolerance(0.005);
00239
00240
00241 _planeWidgetX = GetPlaneWidget('x', 1, 0, 0, picker);
00242 _planeWidgetY = GetPlaneWidget('y', 1, 1, 0, picker);
00243 _planeWidgetZ = GetPlaneWidget('z', 0, 0, 1, picker);
00244
00245 _planeWidgetY->SetLookupTable(_planeWidgetX->GetLookupTable());
00246 _planeWidgetZ->SetLookupTable(_planeWidgetX->GetLookupTable());
00247
00248 picker->UnRegister(NULL);
00249
00250 }
00251
00252
00253 vtkImagePlaneWidget* wxVtkMPR3DView::GetPlaneWidget(unsigned char activationkey, double r, double g, double b, vtkCellPicker* picker)
00254 {
00255 vtkProperty* prop1 = 0;
00256 vtkImagePlaneWidget* planeWidget = 0;
00257 planeWidget = vtkImagePlaneWidget::New();
00258 planeWidget->EnabledOff();
00259 planeWidget->SetInteractor( GetWxvtk3Dbaseview()->GetWxVTKRenderWindowInteractor() );
00260 vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
00261 int xMin = 0, xMax = 0, yMin = 0, yMax = 0, zMin = 0, zMax = 0;
00262 double xSpacing = 0, ySpacing = 0, zSpacing = 0;
00263 if(image){
00264 planeWidget->SetInput( image );
00265 image->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
00266 image->GetSpacing(xSpacing, ySpacing, zSpacing);
00267 }
00268
00269
00270
00271
00272
00273
00274 if (activationkey=='x')
00275 {
00276 planeWidget->SetPlaneOrientationToXAxes();
00277 planeWidget->SetSlicePosition((xMax+xMin)/2.*xSpacing);
00278 }
00279
00280 if (activationkey=='y')
00281 {
00282 planeWidget->SetPlaneOrientationToYAxes();
00283 planeWidget->SetSlicePosition((yMax+yMin)/2.*ySpacing);
00284 }
00285
00286 if (activationkey=='z')
00287 {
00288 planeWidget->SetPlaneOrientationToZAxes();
00289 planeWidget->SetSlicePosition((zMax+zMin)/2.*zSpacing);
00290 }
00291
00292 planeWidget->DisplayTextOn();
00293 planeWidget->SetPicker(picker);
00294 planeWidget->SetKeyPressActivationValue(activationkey);
00295 prop1 = planeWidget->GetPlaneProperty();
00296 prop1->SetColor(r, g, b);
00297 return planeWidget;
00298 }
00299
00300
00301 void wxVtkMPR3DView::FreePlaneVisible(int plane, bool ok)
00302 {
00303 if(_planeWidgetX){
00304 if ((plane==1) && (ok==true)) _planeWidgetX->EnabledOn();
00305 if ((plane==2) && (ok==true)) _planeWidgetY->EnabledOn();
00306 if ((plane==3) && (ok==true)) _planeWidgetZ->EnabledOn();
00307 if ((plane==1) && (ok==false)) _planeWidgetX->EnabledOff();
00308 if ((plane==2) && (ok==false)) _planeWidgetY->EnabledOff();
00309 if ((plane==3) && (ok==false)) _planeWidgetZ->EnabledOff();
00310 }
00311 }
00312
00313
00314 void wxVtkMPR3DView::FreePlaneInteraction(bool ok)
00315 {
00316 if(_planeWidgetX){
00317 if (ok==true)
00318 {
00319 _planeWidgetX->InteractionOn();
00320 _planeWidgetY->InteractionOn();
00321 _planeWidgetZ->InteractionOn();
00322 } else {
00323 _planeWidgetX->InteractionOff();
00324 _planeWidgetY->InteractionOff();
00325 _planeWidgetZ->InteractionOff();
00326 }
00327 }
00328 }
00329
00330
00331
00332 void wxVtkMPR3DView::setColorTransferFunction(vtkColorTransferFunction* colortable)
00333 {
00334 GetVtkMPR3DDataViewer ()->setColorTransferFunction(colortable);
00335 }
00336
00337
00338 void wxVtkMPR3DView::Refresh()
00339 {
00340 _vtkmpr3Ddataviewer -> Refresh();
00341 if (_wxvtkmpr3DviewCntrlPanel!=NULL)
00342 {
00343 _wxvtkmpr3DviewCntrlPanel->Refresh();
00344 }
00345
00346 }
00347
00348
00349 void wxVtkMPR3DView::RefreshView()
00350 {
00351 double spc[3];
00352 vtkImageData *image = GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
00353
00354 if(image){
00355 image->GetSpacing(spc);
00356 }else{
00357 spc[0] = 0;
00358 spc[1] = 0;
00359 spc[2] = 0;
00360 }
00361
00362
00363
00364 Refresh();
00365 double x=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetX();
00366 double y=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetY();
00367 double z=GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetZ();
00368
00369 x=x*spc[0];
00370 y=y*spc[1];
00371 z=z*spc[2];
00372
00373 if(_pointWidget){
00374 _pointWidget->SetPosition( x,y,z );
00375
00376
00377 double in[3];
00378 double normal[3];
00379 vtkTransform *transform = GetVtkMPR3DDataViewer ()->GetVtkMPRBaseData()->GetTransformOrientation();
00380 in[0]=1; in[1]=0; in[2]=0;
00381 transform->TransformPoint(in,normal);
00382 _planeWidget->SetNormal( normal[0],normal[1],normal[2] );
00383
00384
00385 _planeWidget->SetCenter( x,y,z );
00386 _planeWidget->UpdatePlacement();
00387 _planeWidget->GetPolyData(_vtkplane);
00388 }
00389 }
00390
00391 wxPanel* wxVtkMPR3DView::CreateControlPanel(wxWindow *parent, bool align)
00392 {
00393 _wxvtkmpr3DviewCntrlPanel = new wxVtkMPR3DViewCntrlPanel(parent,this, align);
00394 return _wxvtkmpr3DviewCntrlPanel;
00395 }
00396
00397 vtkMPR3DDataViewer* wxVtkMPR3DView::GetVtkMPR3DDataViewer()
00398 {
00399 return _vtkmpr3Ddataviewer;
00400 }
00401
00402 wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview() throw (char*)
00403 {
00404 if(_wxvtk3Dbaseview==NULL){
00405 throw "wxVtk3DBaseView* wxVtkMPR3DView::GetWxvtk3Dbaseview() _wxvtk3Dbaseview=NULL";
00406 }
00407 return _wxvtk3Dbaseview;
00408 }
00409
00410
00411
00412 void wxVtkMPR3DView::VisibleImageActor(int idPosition, bool visible){
00413
00414
00415
00416
00417
00418
00419
00420
00421 if (visible!=_vtkmpr3Ddataviewer->GetVisiblePosition(idPosition)){
00422 if (visible==false){
00423 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition) );
00424 } else {
00425 _wxvtk3Dbaseview->GetRenderer()->AddActor( _vtkmpr3Ddataviewer->GetImageActor(idPosition) );
00426 }
00427 _vtkmpr3Ddataviewer->SetVisiblePosition(idPosition,visible);
00428 }
00429 }
00430
00431
00432
00433 void wxVtkMPR3DView::VisiblePointWidget( bool visible )
00434 {
00435 if(_pointWidget){
00436 if (visible==true)
00437 {
00438 _pointWidget->On();
00439 } else {
00440 _pointWidget->Off();
00441 }
00442 }
00443 }
00444
00445
00446 void wxVtkMPR3DView::VisiblePlaneWidget( bool visible )
00447 {
00448 if(_planeWidget){
00449 if (visible==true)
00450 {
00451 _planeWidget->On();
00452 _contourPlaneActor->VisibilityOn();
00453
00454 } else {
00455 _planeWidget->Off();
00456 _contourPlaneActor->VisibilityOff();
00457 }
00458 }
00459 }
00460
00461
00462 void wxVtkMPR3DView::showOutlineActor(bool value)
00463 {
00464 vtkActor* _outlineActor = _vtkmpr3Ddataviewer->GetOutlineActor();
00465 if(value == true)
00466 {
00467 _wxvtk3Dbaseview->GetRenderer()->AddActor( _outlineActor );
00468 }
00469 else
00470 {
00471 _wxvtk3Dbaseview->GetRenderer()->RemoveActor( _outlineActor );
00472 }
00473 }
00474
00475
00476 void wxVtkMPR3DView::SetVtkMPR3DDataViewer(vtkMPR3DDataViewer *vtkmpr3Ddataviewer)
00477 {
00478 _vtkmpr3Ddataviewer = vtkmpr3Ddataviewer;
00479 }
00480
00481
00482 void wxVtkMPR3DView::InitOrientationPointWidget()
00483 {
00484 this->_planeWidget->SetNormal(1,0,0);
00485 }
00486
00487
00488
00489
00490
00491
00492 void wxVtkMPR3DView::TestLoic1()
00493 {
00494
00495 int sizeIma = 128;
00496 double dimIma = sizeIma*2;
00497
00498 vtkImageData *vtkimagedata = this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
00499
00500 double spc[3];
00501 vtkimagedata->GetSpacing(spc);
00502
00503 vtkimagedata->Update();
00504
00505
00506 double p[3], n[3];
00507 this->_planeWidget->GetOrigin(p);
00508 this->_planeWidget->GetNormal(n);
00509
00510
00511
00512 vtkPlaneSource* pSource = vtkPlaneSource::New( );
00513 pSource->SetResolution( sizeIma - 1, sizeIma - 1 );
00514 pSource->SetOrigin( p[ 0 ], p[ 1 ], p[ 2 ] );
00515 pSource->SetPoint1( p[ 0 ] + dimIma - 1.0, p[ 1 ], p[ 2 ] );
00516 pSource->SetPoint2( p[ 0 ], p[ 1 ]+ dimIma - 1.0 , p[ 2 ] );
00517 pSource->Update( );
00518 pSource->SetCenter( p[ 0 ], p[ 1 ], p[ 2 ] );
00519 pSource->SetNormal( n[ 0 ], n[ 1 ], n[ 2 ] );
00520 pSource->Update( );
00521
00522 vtkProbeFilter* slices = vtkProbeFilter::New();
00523 slices->SetInput( ( vtkDataSet* )pSource->GetOutput( ) );
00524 slices->SetSource( vtkimagedata );
00525 slices->Update( );
00526 pSource->Delete( );
00527
00528 vtkStructuredPoints *stPoints = vtkStructuredPoints::New();
00529 stPoints -> GetPointData( )->SetScalars( slices->GetOutput()->GetPointData()->GetScalars() );
00530 stPoints -> SetDimensions( sizeIma, sizeIma, 1 );
00531 stPoints -> SetScalarType( vtkimagedata->GetScalarType() );
00532 stPoints -> SetScalarTypeToShort();
00533 stPoints -> Update();
00534
00535 vtkImageChangeInformation *change = vtkImageChangeInformation ::New();
00536 change -> SetInput( stPoints );
00537 change -> Update();
00538
00539 double _range[2];
00540 vtkimagedata->GetScalarRange(_range);
00541 vtkWindowLevelLookupTable *_bwlookup = vtkWindowLevelLookupTable::New( );
00542 _bwlookup->SetHueRange( 0 , 1 );
00543 _bwlookup->SetNumberOfColors( (int)(_range[1] - _range[0] + 1) );
00544 _bwlookup->SetTableRange( _range[0] , _range[1] );
00545 _bwlookup->SetSaturationRange( 0 , 0 );
00546 _bwlookup->SetValueRange( 0 , 1 );
00547 _bwlookup->SetAlphaRange( 1 , 1 );
00548 _bwlookup->Build( );
00549
00550 vtkLookupTable * _collookup = vtkLookupTable::New( );
00551 _collookup->SetNumberOfColors( 256 );
00552 _collookup->SetTableRange( 0 , 255 );
00553 _collookup->Build( );
00554 _collookup->SetTableValue( 0 , 1 , 0 , 0 , 1 );
00555 _collookup->SetTableValue(128 , 0 , 0 , 1 , 1 );
00556 _collookup->SetTableValue(255 , 0 , 1 , 0 , 1 );
00557
00558
00559 vtkMetaImageWriter *writer = vtkMetaImageWriter::New( );
00560 writer->SetInput( stPoints );
00561 writer->SetFileName( "C:/Users/Images/temp_EED/image.mhd" );
00562 writer->SetFileDimensionality( 2 );
00563 writer->Write( );
00564
00565
00566
00567 vtkDataSetMapper *_3DSliceMapper = vtkDataSetMapper::New( );
00568 _3DSliceMapper->SetInput(change->GetOutput( ) );
00569 _3DSliceMapper->SetLookupTable( _bwlookup );
00570 _3DSliceMapper->SetScalarRange( _range );
00571 _3DSliceMapper->ImmediateModeRenderingOn( );
00572
00573 vtkActor *_3DSliceActor = vtkActor::New( );
00574 _3DSliceActor->SetMapper( _3DSliceMapper );
00575
00576
00577 vtkCamera *camera = vtkCamera::New();
00578 camera->SetPosition(1,1,1);
00579 camera->SetFocalPoint(0,0,0);
00580
00581 vtkRenderer *renderer = vtkRenderer::New();
00582 vtkRenderWindow *renWin = vtkRenderWindow::New();
00583 renWin->AddRenderer(renderer);
00584
00585 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
00586 iren->SetRenderWindow(renWin);
00587
00588 renderer->AddActor( _3DSliceActor );
00589 renderer->SetActiveCamera(camera);
00590 renderer->ResetCamera();
00591 renderer->SetBackground(1,1,1);
00592
00593 renWin->SetSize(300,300);
00594
00595
00596 renWin->Render();
00597 iren->Start();
00598
00599
00600
00601
00602
00603 }
00604
00605
00606
00607 void wxVtkMPR3DView::TestLoic2()
00608 {
00609
00610
00611
00612
00613
00614
00615
00616 vtkPlane *slicePlane = vtkPlane::New();
00617 this->_planeWidget->GetPlane( slicePlane );
00618
00619
00620 vtkCutter* sliceCutter = vtkCutter::New();
00621 vtkImageData *vtkimagedata = this->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetImageData();
00622 sliceCutter->SetInput( vtkimagedata );
00623 sliceCutter->SetCutFunction( slicePlane );
00624
00625
00626
00627
00628
00629 vtkPolyDataMapper *slice = vtkPolyDataMapper::New();
00630 slice->SetInput( sliceCutter->GetOutput() );
00631 double range[2];
00632
00633
00634 vtkimagedata->GetScalarRange(range);
00635
00636
00637
00638
00639
00640
00641
00642
00643 vtkPolyDataMapper *contourMapper = vtkPolyDataMapper::New();
00644 contourMapper->SetInput( sliceCutter->GetOutput() );
00645 contourMapper->SetScalarRange( range );
00646
00647
00648
00649 vtkActor *contourActor = vtkActor::New();
00650 contourActor->SetMapper( contourMapper );
00651
00652
00653
00654
00655 vtkCamera *camera = vtkCamera::New();
00656 camera->SetPosition(1,1,1);
00657 camera->SetFocalPoint(0,0,0);
00658
00659 vtkRenderer *renderer = vtkRenderer::New();
00660 vtkRenderWindow *renWin = vtkRenderWindow::New();
00661 renWin->AddRenderer(renderer);
00662
00663 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
00664 iren->SetRenderWindow(renWin);
00665
00666 renderer->AddActor( contourActor );
00667
00668 renderer->SetActiveCamera(camera);
00669 renderer->ResetCamera();
00670 renderer->SetBackground(1,1,1);
00671
00672 renWin->SetSize(300,300);
00673
00674
00675 renWin->Render();
00676 iren->Start();
00677
00678
00679 }
00680