X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fvtk%2Fsrc%2FbbvtkImagePlanes.cxx;h=8ff343d308cb8f2d08b53e42e97e79f247b06c64;hb=49007dc0a651edf71dca840e43953886120d1965;hp=ed7cb860808fa014304a14a99da1d1e39b8b92a8;hpb=7785d9f3ee33f106ad64a204d8cef883185180b0;p=bbtk.git diff --git a/packages/vtk/src/bbvtkImagePlanes.cxx b/packages/vtk/src/bbvtkImagePlanes.cxx index ed7cb86..8ff343d 100644 --- a/packages/vtk/src/bbvtkImagePlanes.cxx +++ b/packages/vtk/src/bbvtkImagePlanes.cxx @@ -1,20 +1,33 @@ -/*========================================================================= - +/*========================================================================= Program: bbtk Module: $RCSfile: bbvtkImagePlanes.cxx,v $ Language: C++ - Date: $Date: 2008/10/06 09:01:08 $ - Version: $Revision: 1.5 $ - - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See Doc/License.txt or - http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - + Date: $Date: 2009/01/08 10:18:37 $ + Version: $Revision: 1.19 $ =========================================================================*/ + +/* --------------------------------------------------------------------- + +* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale) +* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux +* +* This software is governed by the CeCILL-B license under French law and +* abiding by the rules of distribution of free software. You can use, +* modify and/ or redistribute the software under the terms of the CeCILL-B +* license as circulated by CEA, CNRS and INRIA at the following URL +* http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +* or in the file LICENSE.txt. +* +* As a counterpart to the access to the source code and rights to copy, +* modify and redistribute granted by the license, users are provided only +* with a limited warranty and the software's author, the holder of the +* economic rights, and the successive licensors have only limited +* liability. +* +* The fact that you are presently reading this means that you have had +* knowledge of the CeCILL-B license and that you accept its terms. +* ------------------------------------------------------------------------ */ + /** * \file * \brief @@ -26,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; @@ -45,47 +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() { - Init(); + 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() + void ImagePlanes::bbUserCopyConstructor(bbtk::BlackBox::Pointer) { - Init(); + bbSetOutputPlaneX(0); + bbSetOutputPlaneY(0); + bbSetOutputPlaneZ(0); + bbSetOutputImageX(0); + bbSetOutputImageY(0); + bbSetOutputImageZ(0); } void ImagePlanes::Init() - { - + { + + /// 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 are used to probe the dataset. - planeWidgetX = vtkImagePlaneWidget::New(); + // The 3 image plane widgets + 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'); @@ -93,10 +189,7 @@ namespace bbvtk prop2->SetColor(1, 1, 0); planeWidgetY->SetLookupTable(planeWidgetX->GetLookupTable()); - // for the z-slice, turn off texture interpolation: - // interpolation is now nearest neighbour, to demonstrate - // cross-hair cursor snapping to pixel centers - planeWidgetZ = vtkImagePlaneWidget::New(); + vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New(); planeWidgetZ->DisplayTextOn(); planeWidgetZ->SetPicker(picker); planeWidgetZ->SetKeyPressActivationValue('z'); @@ -107,16 +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 (bbGetOutputPlaneX()) bbGetOutputPlaneX()->Delete(); - if (bbGetOutputPlaneY()) bbGetOutputPlaneY()->Delete(); - if (bbGetOutputPlaneZ()) bbGetOutputPlaneZ()->Delete(); + + if (bbGetOutputPlaneX()) bbGetOutputPlaneX()->UnRegister(NULL); + if (bbGetOutputPlaneY()) bbGetOutputPlaneY()->UnRegister(NULL); + if (bbGetOutputPlaneZ()) bbGetOutputPlaneZ()->UnRegister(NULL); } //--------------------------------------------------------------------- @@ -124,24 +227,54 @@ namespace bbvtk { if (bbGetInputIn()!=0) { - 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.); + // Create the widgets if not already done + Init(); - planeWidgetZ->SetInput(bbGetInputIn()); - planeWidgetZ->SetPlaneOrientationToZAxes(); - planeWidgetZ->SetSlicePosition((zMax+zMin)/2.); + if ( bbGetInputStatus("In") != bbtk::UPTODATE ) + { + // Input image has changed : reinitialize planes + image = bbGetInputIn(); - // planeWidgetZ->SetWindowLevel(512,256); + 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); + - planeWidgetZ->SetWindowLevel(bbGetInputWindowLevel()[0],bbGetInputWindowLevel()[1]); + 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