X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fvtk%2Fsrc%2FbbvtkImagePlanes.cxx;h=277d346dce5172d75313595742d36bd061b5184b;hb=70db75992e0ccf5ad1fab5ccf9cec013877ea3d5;hp=191fcfa426eca62c0f869e548e2d1f94a45431bb;hpb=1e2df7fb6ae571ce1cf72e6af1715f0e34675cbf;p=bbtk.git diff --git a/packages/vtk/src/bbvtkImagePlanes.cxx b/packages/vtk/src/bbvtkImagePlanes.cxx index 191fcfa..277d346 100644 --- a/packages/vtk/src/bbvtkImagePlanes.cxx +++ b/packages/vtk/src/bbvtkImagePlanes.cxx @@ -2,8 +2,8 @@ Program: bbtk Module: $RCSfile: bbvtkImagePlanes.cxx,v $ Language: C++ - Date: $Date: 2008/11/25 11:17:23 $ - Version: $Revision: 1.10 $ + Date: $Date: 2008/12/09 12:54:05 $ + Version: $Revision: 1.16 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -39,9 +39,29 @@ #include "vtkCellPicker.h" #include "vtkProperty.h" +#include "vtkMetaImageWriter.h" +#include "vtkPNGWriter.h" + #include "bbstdCast.h" +#include + +#include "vtkImageData.h" +//#include "vtkOutlineFilter.h" +//#include "vtkPolyDataMapper.h" +//#include "vtkActor.h" +#include "vtkImagePlaneWidget.h" +#include "vtkCellPicker.h" +//#include "vtkProperty.h" + +//#include "vtkRenderer.h" +//#include "vtkCamera.h" + +#include "vtkPlaneWidget.h" + + namespace bbstd { + //==================================================================== BBTK_BLACK_BOX_TEMPLATE2_IMPLEMENTATION(Cast, bbtk::AtomicBlackBox); @@ -51,6 +71,8 @@ namespace bbstd using namespace bbstd; namespace bbvtk { + + //==================================================================== // Add the specialized adaptors to the package typedef vtkImagePlaneWidget* I; @@ -63,42 +85,81 @@ namespace bbvtk namespace bbvtk { + //================================================================ + class myCallbackPlane : public vtkCommand + { + public: + static myCallbackPlane *New() + { + return new myCallbackPlane; + } + virtual void Execute(vtkObject *caller, unsigned long, void*) + { + currentBlackBox->Process(); + currentBlackBox->bbSignalOutputModification(); + } + void SetCurrentBlackBox(ImagePlanes *cBB) {currentBlackBox = cBB;}; + void SetVtkPlaneWidget( vtkImagePlaneWidget *planeWidget ); + myCallbackPlane() {}; + + private: + vtkPlaneWidget *planeWidget; + ImagePlanes *currentBlackBox; + }; + //================================================================ + + + + //================================================================ BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,ImagePlanes) BBTK_BLACK_BOX_IMPLEMENTATION(ImagePlanes,bbtk::AtomicBlackBox); void ImagePlanes::bbUserConstructor() { - planeWidgetX = planeWidgetY = planeWidgetZ = 0; + bbSetOutputPlaneX(0); + bbSetOutputPlaneY(0); + bbSetOutputPlaneZ(0); + bbSetOutputImageX(0); + bbSetOutputImageY(0); + bbSetOutputImageZ(0); bbSetInputIn(0); std::vector vect; - vect.push_back(512); - vect.push_back(256); - bbSetInputWindowLevel (vect); + vect.push_back(0); + vect.push_back(0); + bbSetInputWindowLevel (vect); } void ImagePlanes::bbUserCopyConstructor(bbtk::BlackBox::Pointer) { - planeWidgetX = planeWidgetY = planeWidgetZ = 0; + bbSetOutputPlaneX(0); + bbSetOutputPlaneY(0); + bbSetOutputPlaneZ(0); + bbSetOutputImageX(0); + bbSetOutputImageY(0); + bbSetOutputImageZ(0); } void ImagePlanes::Init() - { - if (planeWidgetX != 0) return; + { + + /// CREATION DES WIDGETS + if (bbGetOutputPlaneX() != 0) return; + // The shared picker enables us to use 3 planes at one time // and gets the picking order right vtkCellPicker* picker = vtkCellPicker::New(); picker->SetTolerance(0.005); // The 3 image plane widgets - planeWidgetX = vtkImagePlaneWidget::New(); + vtkImagePlaneWidget* planeWidgetX = vtkImagePlaneWidget::New(); planeWidgetX->DisplayTextOn(); planeWidgetX->SetPicker(picker); planeWidgetX->SetKeyPressActivationValue('x'); vtkProperty* prop1 = planeWidgetX->GetPlaneProperty(); prop1->SetColor(1, 0, 0); - planeWidgetY = vtkImagePlaneWidget::New(); + vtkImagePlaneWidget* planeWidgetY = vtkImagePlaneWidget::New(); planeWidgetY->DisplayTextOn(); planeWidgetY->SetPicker(picker); planeWidgetY->SetKeyPressActivationValue('y'); @@ -106,7 +167,7 @@ namespace bbvtk prop2->SetColor(1, 1, 0); planeWidgetY->SetLookupTable(planeWidgetX->GetLookupTable()); - planeWidgetZ = vtkImagePlaneWidget::New(); + vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New(); planeWidgetZ->DisplayTextOn(); planeWidgetZ->SetPicker(picker); planeWidgetZ->SetKeyPressActivationValue('z'); @@ -117,18 +178,26 @@ namespace bbvtk bbSetOutputPlaneX(planeWidgetX); bbSetOutputPlaneY(planeWidgetY); bbSetOutputPlaneZ(planeWidgetZ); + bbSetOutputImageX(planeWidgetX->GetResliceOutput()); + bbSetOutputImageY(planeWidgetY->GetResliceOutput()); + bbSetOutputImageZ(planeWidgetZ->GetResliceOutput()); picker->UnRegister(NULL); + + myCallbackPlane *_myCallback = myCallbackPlane::New(); + _myCallback->SetCurrentBlackBox(this); + planeWidgetX->AddObserver(vtkCommand::InteractionEvent,_myCallback); + planeWidgetY->AddObserver(vtkCommand::InteractionEvent,_myCallback); + planeWidgetZ->AddObserver(vtkCommand::InteractionEvent,_myCallback); } //--------------------------------------------------------------------- void ImagePlanes::bbUserDestructor() { - if (planeWidgetX) planeWidgetX->UnRegister(NULL); - if (planeWidgetY) planeWidgetY->UnRegister(NULL); - if (planeWidgetZ) planeWidgetZ->UnRegister(NULL); - + if (bbGetOutputPlaneX()) bbGetOutputPlaneX()->UnRegister(NULL); + if (bbGetOutputPlaneY()) bbGetOutputPlaneY()->UnRegister(NULL); + if (bbGetOutputPlaneZ()) bbGetOutputPlaneZ()->UnRegister(NULL); } //--------------------------------------------------------------------- @@ -136,26 +205,53 @@ namespace bbvtk { if (bbGetInputIn()!=0) { + // Create the widgets if not already done Init(); - int xMin, xMax, yMin, yMax, zMin, zMax; - bbGetInputIn()->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax); - - planeWidgetX->SetInput(bbGetInputIn()); - planeWidgetX->SetPlaneOrientationToXAxes(); - planeWidgetX->SetSlicePosition((xMax+xMin)/2.); - - planeWidgetY->SetInput(bbGetInputIn()); - planeWidgetY->SetPlaneOrientationToYAxes(); - planeWidgetY->SetSlicePosition((yMax+yMin)/2.); - - planeWidgetZ->SetInput(bbGetInputIn()); - planeWidgetZ->SetPlaneOrientationToZAxes(); - planeWidgetZ->SetSlicePosition((zMax+zMin)/2.); - - // planeWidgetZ->SetWindowLevel(512,256); + if ( bbGetInputStatus("In") != bbtk::UPTODATE ) + { + // Input image has changed : reinitialize planes + image = bbGetInputIn(); - planeWidgetZ->SetWindowLevel(bbGetInputWindowLevel()[0],bbGetInputWindowLevel()[1]); + int xMin, xMax, yMin, yMax, zMin, zMax; + bbGetInputIn()->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax); + + // Initial values : center of the volume (in real world, not in pixels!) + double xSpacing, ySpacing, zSpacing; + bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing); + + bbGetOutputPlaneX()->SetInput(bbGetInputIn()); + bbGetOutputPlaneX()->SetPlaneOrientationToXAxes(); + bbGetOutputPlaneX()->SetSlicePosition((xMax+xMin)/2.*xSpacing); + + bbGetOutputPlaneY()->SetInput(bbGetInputIn()); + bbGetOutputPlaneY()->SetPlaneOrientationToYAxes(); + bbGetOutputPlaneY()->SetSlicePosition((yMax+yMin)/2.*ySpacing); + + bbGetOutputPlaneZ()->SetInput(bbGetInputIn()); + bbGetOutputPlaneZ()->SetPlaneOrientationToZAxes(); + bbGetOutputPlaneZ()->SetSlicePosition((zMax+zMin)/2.*zSpacing); + + if (bbGetInputWindowLevel()[0]!=0) + { + bbGetOutputPlaneZ()->SetWindowLevel(bbGetInputWindowLevel()[0], + bbGetInputWindowLevel()[1]); + } + else + { + double *range = image->GetScalarRange(); + bbGetOutputPlaneZ()->SetWindowLevel(range[1] - range[0], + 0.5*(range[1]+range[0])); + } + } + + + // UPDATE DES SORTIES + bbGetOutputPlaneX()->GetResliceOutput()->Update(); + bbGetOutputPlaneY()->GetResliceOutput()->Update(); + bbGetOutputPlaneZ()->GetResliceOutput()->Update(); + + } } }//namespace bbtk