X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fvtk%2Fsrc%2FbbvtkImagePlanes.cxx;h=e838e03ed8b47f61a8c6e23ef033793a78fff904;hb=e68a062addb8d49203f887b1e4ce4379e5890d1a;hp=79ab3850b81e61815cc83328d6940080d02b13cb;hpb=ae4497a19b957df306e688ce3f69c3687323668e;p=bbtk.git diff --git a/packages/vtk/src/bbvtkImagePlanes.cxx b/packages/vtk/src/bbvtkImagePlanes.cxx index 79ab385..e838e03 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/12/03 09:34:39 $ - Version: $Revision: 1.14 $ + Date: $Date: 2009/06/09 08:41:53 $ + Version: $Revision: 1.26 $ =========================================================================*/ /* --------------------------------------------------------------------- @@ -38,20 +38,57 @@ #include "bbvtkPackage.h" #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" + +#include "vtkObjectFactory.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; @@ -59,36 +96,75 @@ 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 ImagePlanes::VtkCallbackType : public vtkCommand + { + public: + static VtkCallbackType *New() + { + return new VtkCallbackType; + } + //vtkTypeRevisionMacro(VtkCallbackType,vtkCommand); + + virtual void Execute(vtkObject *caller, unsigned long, void*) + { + mBlackBox->Process(); + mBlackBox->bbSignalOutputModification(); + } + void SetBlackBox(ImagePlanes *BB) { mBlackBox = BB;}; + // void SetVtkPlaneWidget( vtkImagePlaneWidget *planeWidget ); + VtkCallbackType() {}; + + private: + // vtkPlaneWidget *planeWidget; + ImagePlanes *mBlackBox; + }; + //================================================================ + + //vtkCxxRevisionMacro(ImagePlanes::VtkCallbackType, "$Revision: 1.26 $"); + + //================================================================ + BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,ImagePlanes) BBTK_BLACK_BOX_IMPLEMENTATION(ImagePlanes,bbtk::AtomicBlackBox); - void ImagePlanes::bbUserConstructor() + + + void ImagePlanes::bbUserSetDefaultValues() { - 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); + vect.push_back(0); + vect.push_back(0); bbSetInputWindowLevel (vect); - - bbSetModifiedStatus(); + mVtkCallback = 0; } - void ImagePlanes::bbUserCopyConstructor(bbtk::BlackBox::Pointer) - { - planeWidgetX = planeWidgetY = planeWidgetZ = 0; - imageX = imageY = imageZ = 0; - } - void ImagePlanes::Init() + + void ImagePlanes::bbUserInitializeProcessing() { - 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 @@ -96,14 +172,14 @@ namespace bbvtk 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'); @@ -111,7 +187,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'); @@ -122,24 +198,44 @@ 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); + mVtkCallback = VtkCallbackType::New(); + mVtkCallback->SetBlackBox(this); + planeWidgetX->AddObserver(vtkCommand::InteractionEvent,mVtkCallback); + planeWidgetY->AddObserver(vtkCommand::InteractionEvent,mVtkCallback); + planeWidgetZ->AddObserver(vtkCommand::InteractionEvent,mVtkCallback); } //--------------------------------------------------------------------- - void ImagePlanes::bbUserDestructor() + void ImagePlanes::bbUserFinalizeProcessing() { + + if (bbGetOutputPlaneX()) + { - if (planeWidgetX) planeWidgetX->UnRegister(NULL); - if (planeWidgetY) planeWidgetY->UnRegister(NULL); - if (planeWidgetZ) planeWidgetZ->UnRegister(NULL); + /* + bbGetOutputPlaneX()->RemoveObserver(mVtkCallback); + bbGetOutputPlaneY()->RemoveObserver(mVtkCallback); + bbGetOutputPlaneZ()->RemoveObserver(mVtkCallback); + + + bbGetOutputPlaneX()->Delete(); + bbGetOutputPlaneY()->Delete(); + bbGetOutputPlaneZ()->Delete(); + mVtkCallback->Delete(); + */ + //bbGetOutputPlaneX()->SetInput(NULL); + //bbGetOutputPlaneY()->SetInput(NULL); + //bbGetOutputPlaneZ()->SetInput(NULL); + + } + } //--------------------------------------------------------------------- @@ -147,63 +243,75 @@ namespace bbvtk { if (bbGetInputIn()!=0) { - 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(); - // Initial values : center of the volume (in real world, not in pixels!) - double xSpacing, ySpacing, zSpacing; - bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing); - - planeWidgetX->SetInput(bbGetInputIn()); - planeWidgetX->SetPlaneOrientationToXAxes(); - planeWidgetX->SetSlicePosition((xMax+xMin)/2.*xSpacing); - planeWidgetX->GetResliceOutput()->Update(); - bbSetOutput("ImageX", planeWidgetX->GetResliceOutput()); - - - vtkMetaImageWriter *writer = vtkMetaImageWriter::New(); - - std::string newFilenameX("newFilenameX.mhd"); - writer->SetInput(planeWidgetX->GetResliceOutput()); - writer->SetFileName(newFilenameX.c_str()); - writer->Update(); - - //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); + 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); + + +// bbGetOutputPlaneX()->SetOrigin( 58*xSpacing , 80*ySpacing , 82*zSpacing ); +// bbGetOutputPlaneX()->SetPoint1( 0*xSpacing, 146*ySpacing, 186*zSpacing); +// bbGetOutputPlaneX()->SetPoint2( 126*xSpacing, 146*ySpacing, 0*zSpacing); + + + 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])); + } + } - std::string newFilenameY("newFilenameY.mhd"); - writer->SetInput(planeWidgetY->GetResliceOutput()); - writer->SetFileName(newFilenameY.c_str()); - writer->Update(); - - planeWidgetZ->SetInput(bbGetInputIn()); - planeWidgetZ->SetPlaneOrientationToZAxes(); - planeWidgetZ->SetSlicePosition((zMax+zMin)/2.*zSpacing); - planeWidgetZ->GetResliceOutput()->Update(); - bbSetOutput("ImageZ", planeWidgetZ->GetResliceOutput()); - // planeWidgetZ->GetResliceOutput()->Print(std::cout); + // UPDATE DES SORTIES + bbGetOutputPlaneX()->GetResliceOutput()->Update(); + bbGetOutputPlaneY()->GetResliceOutput()->Update(); + bbGetOutputPlaneZ()->GetResliceOutput()->Update(); + } + } - // planeWidgetZ->SetWindowLevel(512,256); - std::string newFilenameZ("newFilenameZ.mhd"); - writer->SetInput(planeWidgetZ->GetResliceOutput()); - writer->SetFileName(newFilenameZ.c_str()); - writer->Update(); + //----------------------------------------------------------------- + void vtkImageDataPointerRelay::bbUserSetDefaultValues() + { + } + + //----------------------------------------------------------------- + void vtkImageDataPointerRelay::bbUserInitializeProcessing() + { + } + + //----------------------------------------------------------------- + void vtkImageDataPointerRelay::bbUserFinalizeProcessing() + { + } + - planeWidgetZ->SetWindowLevel(bbGetInputWindowLevel()[0],bbGetInputWindowLevel()[1]); - // writer->vtkMetaImageWriter::Delete(); - - } - } }//namespace bbtk #endif // _USE_VTK_