X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fvtk%2Fsrc%2FbbvtkImagePlanes.cxx;h=8ff343d308cb8f2d08b53e42e97e79f247b06c64;hb=49007dc0a651edf71dca840e43953886120d1965;hp=06253d0d93dead3af2bee24e9fff937a04136b4f;hpb=6cfd155d0c3f67ed2b8ce1e7e6f0ffebddd59802;p=bbtk.git diff --git a/packages/vtk/src/bbvtkImagePlanes.cxx b/packages/vtk/src/bbvtkImagePlanes.cxx index 06253d0..8ff343d 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/27 16:38:32 $ - Version: $Revision: 1.13 $ + Date: $Date: 2009/01/08 10:18:37 $ + Version: $Revision: 1.19 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -39,18 +39,55 @@ #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" + +#include "bbstdRelay.h" + + + namespace bbstd { + //==================================================================== BBTK_BLACK_BOX_TEMPLATE2_IMPLEMENTATION(Cast, bbtk::AtomicBlackBox); //==================================================================== + //==================================================================== +// BBTK_BLACK_BOX_TEMPLATE_IMPLEMENTATION(Relay, +// bbtk::AtomicBlackBox); + //==================================================================== } using namespace bbstd; +/* +namespace bbtk +{ + typedef vtkImageData::Pointer vtkImageDataPointer; + BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(vtkImageDataPointer, + "vtkImageDataPointer"); +} +*/ namespace bbvtk { + + //==================================================================== // Add the specialized adaptors to the package typedef vtkImagePlaneWidget* I; @@ -58,49 +95,93 @@ namespace bbvtk BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(vtk,Cast,I,O); + BBTK_DEFINE_RELAY_BLACK_BOX(vtkImageDataPointer,vtk,vtkImageDataPointerRelay); + BBTK_BLACK_BOX_IMPLEMENTATION(vtkImageDataPointerRelay,bbtk::AtomicBlackBox); + + BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,vtkImageDataPointerRelay); + // BBTK_ADD_TEMPLATE_BLACK_BOX_TO_PACKAGE(vtk,Relay,vtkImageDataPointer); + //Pointer); + } 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; - imageX = imageY = imageZ = 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; - imageX = imageY = imageZ = 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'); @@ -108,7 +189,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'); @@ -119,18 +200,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); } //--------------------------------------------------------------------- @@ -138,39 +227,54 @@ 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); + if ( bbGetInputStatus("In") != bbtk::UPTODATE ) + { + // Input image has changed : reinitialize planes + image = bbGetInputIn(); + + 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); + - // 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])); + } + } + - planeWidgetX->SetInput(bbGetInputIn()); - planeWidgetX->SetPlaneOrientationToXAxes(); - planeWidgetX->SetSlicePosition((xMax+xMin)/2.*xSpacing); - planeWidgetX->GetResliceOutput()->Update(); - bbSetOutput("ImageX", planeWidgetX->GetResliceOutput()); - //planeWidgetX->GetResliceOutput()->Print(std::cout); - - planeWidgetY->SetInput(bbGetInputIn()); - planeWidgetY->SetPlaneOrientationToYAxes(); - planeWidgetY->SetSlicePosition((yMax+yMin)/2.*ySpacing); - planeWidgetY->GetResliceOutput()->Update(); - bbSetOutput("ImageY", planeWidgetY->GetResliceOutput()); - //planeWidgetY->GetResliceOutput()->Print(std::cout); + // UPDATE DES SORTIES + bbGetOutputPlaneX()->GetResliceOutput()->Update(); + bbGetOutputPlaneY()->GetResliceOutput()->Update(); + bbGetOutputPlaneZ()->GetResliceOutput()->Update(); - planeWidgetZ->SetInput(bbGetInputIn()); - planeWidgetZ->SetPlaneOrientationToZAxes(); - planeWidgetZ->SetSlicePosition((zMax+zMin)/2.*zSpacing); - planeWidgetZ->GetResliceOutput()->Update(); - bbSetOutput("ImageZ", planeWidgetZ->GetResliceOutput()); - // planeWidgetZ->GetResliceOutput()->Print(std::cout); - - // planeWidgetZ->SetWindowLevel(512,256); - - planeWidgetZ->SetWindowLevel(bbGetInputWindowLevel()[0],bbGetInputWindowLevel()[1]); + } } }//namespace bbtk