/*========================================================================= Program: bbtk Module: $RCSfile: bbvtkImagePlanes.cxx,v $ Language: C++ Date: $Date: 2008/11/26 16:19:44 $ Version: $Revision: 1.11 $ =========================================================================*/ /* --------------------------------------------------------------------- * 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 */ #ifdef _USE_VTK_ #include "bbvtkImagePlanes.h" #include "bbvtkPackage.h" #include "vtkCellPicker.h" #include "vtkProperty.h" #include "bbstdCast.h" namespace bbstd { //==================================================================== BBTK_BLACK_BOX_TEMPLATE2_IMPLEMENTATION(Cast, bbtk::AtomicBlackBox); //==================================================================== } using namespace bbstd; namespace bbvtk { //==================================================================== // Add the specialized adaptors to the package typedef vtkImagePlaneWidget* I; typedef vtkInteractorObserver* O; BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(vtk,Cast,I,O); } namespace bbvtk { BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,ImagePlanes) BBTK_BLACK_BOX_IMPLEMENTATION(ImagePlanes,bbtk::AtomicBlackBox); void ImagePlanes::bbUserConstructor() { planeWidgetX = planeWidgetY = planeWidgetZ = 0; bbSetInputIn(0); std::vector vect; vect.push_back(512); vect.push_back(256); bbSetInputWindowLevel (vect); } void ImagePlanes::bbUserCopyConstructor(bbtk::BlackBox::Pointer) { planeWidgetX = planeWidgetY = planeWidgetZ = 0; } void ImagePlanes::Init() { if (planeWidgetX != 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(); planeWidgetX->DisplayTextOn(); planeWidgetX->SetPicker(picker); planeWidgetX->SetKeyPressActivationValue('x'); vtkProperty* prop1 = planeWidgetX->GetPlaneProperty(); prop1->SetColor(1, 0, 0); planeWidgetY = vtkImagePlaneWidget::New(); planeWidgetY->DisplayTextOn(); planeWidgetY->SetPicker(picker); planeWidgetY->SetKeyPressActivationValue('y'); vtkProperty* prop2 = planeWidgetY->GetPlaneProperty(); prop2->SetColor(1, 1, 0); planeWidgetY->SetLookupTable(planeWidgetX->GetLookupTable()); planeWidgetZ = vtkImagePlaneWidget::New(); planeWidgetZ->DisplayTextOn(); planeWidgetZ->SetPicker(picker); planeWidgetZ->SetKeyPressActivationValue('z'); vtkProperty* prop3 = planeWidgetZ->GetPlaneProperty(); prop3->SetColor(0, 0, 1); planeWidgetZ->SetLookupTable(planeWidgetX->GetLookupTable()); bbSetOutputPlaneX(planeWidgetX); bbSetOutputPlaneY(planeWidgetY); bbSetOutputPlaneZ(planeWidgetZ); picker->UnRegister(NULL); } //--------------------------------------------------------------------- void ImagePlanes::bbUserDestructor() { if (planeWidgetX) planeWidgetX->UnRegister(NULL); if (planeWidgetY) planeWidgetY->UnRegister(NULL); if (planeWidgetZ) planeWidgetZ->UnRegister(NULL); } //--------------------------------------------------------------------- void ImagePlanes::Process() { if (bbGetInputIn()!=0) { Init(); 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); planeWidgetX->SetInput(bbGetInputIn()); planeWidgetX->SetPlaneOrientationToXAxes(); planeWidgetX->SetSlicePosition((xMax+xMin)/2.*xSpacing); planeWidgetY->SetInput(bbGetInputIn()); planeWidgetY->SetPlaneOrientationToYAxes(); planeWidgetY->SetSlicePosition((yMax+yMin)/2.*ySpacing); planeWidgetZ->SetInput(bbGetInputIn()); planeWidgetZ->SetPlaneOrientationToZAxes(); planeWidgetZ->SetSlicePosition((zMax+zMin)/2.*zSpacing); // planeWidgetZ->SetWindowLevel(512,256); planeWidgetZ->SetWindowLevel(bbGetInputWindowLevel()[0],bbGetInputWindowLevel()[1]); } } }//namespace bbtk #endif // _USE_VTK_