X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FmaracasVisuLib%2Fsrc%2FCutModule%2Fkernel%2FCutModelData.cxx;h=ccd36989a479e62849484c255e0a17ff5b793999;hb=06b778a59d0c5109cf7626c76d2ee21e033f8c28;hp=d340ec69b3c1adc1aa56c70d5bd7114a3c746638;hpb=0949d9991131d8fde35ab5fdd41a50a43a0dfd7f;p=creaMaracasVisu.git diff --git a/lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx b/lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx index d340ec6..ccd3698 100644 --- a/lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx +++ b/lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx @@ -1,10 +1,35 @@ +/*# --------------------------------------------------------------------- +# +# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image +# pour la Sant�) +# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton +# Previous Authors : Laurent Guigues, Jean-Pierre Roux +# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil +# +# 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. +# ------------------------------------------------------------------------ */ + /*========================================================================= Program: wxMaracas Module: $RCSfile: CutModelData.cxx,v $ Language: C++ - Date: $Date: 2009/09/01 14:01:36 $ - Version: $Revision: 1.2 $ + Date: $Date: 2012/11/15 14:15:48 $ + Version: $Revision: 1.10 $ Copyright: (c) 2002, 2003 License: @@ -15,11 +40,19 @@ =========================================================================*/ #include "CutModelData.h" - +#include "vtkRenderWindow.h" /** ** Start of the manager class **/ CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){ + + initializeData(id, interactor, observer, img); +} + +CutModelData::CutModelData(){ + +} +void CutModelData::initializeData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){ _id = id; _currentshape=0; createBoxWidget(interactor, observer); @@ -27,13 +60,15 @@ CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCom createActor(); createShapes(); ChangeShape(0); + interactor->GetRenderWindow ()->Render(); checkInvariant(); - - } + CutModelData::~CutModelData(){ checkInvariant(); + _boxWidgetVolume->RemoveAllObservers(); _boxWidgetVolume->Off(); + _boxWidgetVolume->SetInteractor(NULL); _boxWidgetVolume->Delete(); _Mapper->Delete(); _Actor->Delete(); @@ -41,18 +76,21 @@ CutModelData::~CutModelData(){ delete _cylinderfigure; delete _spherefigure; currentmatrix->Delete(); + modeltransform->Delete(); inversModel->Delete(); + _id = -1; } + void CutModelData::RefreshViewBox(){ } void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){ - _boxWidgetVolume = vtkBoxWidget::New(); _boxWidgetVolume->SetInteractor( interactor ); - //_boxWidgetVolume->SetPlaceFactor(2); + //_boxWidgetVolume->SetPlaceFactor(1); //_boxWidgetVolume->SetInput( img ); //_boxWidgetVolume->PlaceWidget(); + _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer ); _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer ); _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer ); @@ -62,6 +100,7 @@ void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCom //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5); //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5); } + void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){ currentmatrix = vtkTransform::New(); @@ -69,41 +108,49 @@ void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){ inversModel = vtkTransform::New(); vtkMatrix4x4* matrix = vtkMatrix4x4::New(); - matrix->Identity(); + matrix->Identity(); + double *ori = img->GetOrigin(); int *ext = img->GetExtent(); double *spc = img->GetSpacing(); matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]); matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]); - matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]); - matrix->SetElement(0,3,(ext[1]-ext[0])/2*spc[0]); - matrix->SetElement(1,3,(ext[3]-ext[2])/2*spc[1]); - matrix->SetElement(2,3,(ext[5]-ext[4])/2*spc[2]); + matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]); + + double orgx = (ext[1]+ext[0])/2.*spc[0]; + double orgy = (ext[3]+ext[2])/2.*spc[1]; + double orgz = (ext[5]+ext[4])/2.*spc[2]; + + matrix->SetElement(0,3,orgx); + matrix->SetElement(1,3,orgy); + matrix->SetElement(2,3,orgz); currentmatrix->SetMatrix(matrix); - _boxWidgetVolume->SetTransform(currentmatrix); - + _boxWidgetVolume->SetTransform(currentmatrix); } + void CutModelData::createActor(){ _Mapper = vtkPolyDataMapper::New(); _Actor = vtkActor::New(); _Actor->SetMapper(_Mapper); _Actor->GetProperty()->SetColor(1, 0, 0); - _Actor->GetProperty()->SetOpacity(0.5); - + _Actor->GetProperty()->SetOpacity(0.5); } + void CutModelData::udapteActorDirection()throw( CutModelException){ checkInvariant(); _boxWidgetVolume->GetTransform(currentmatrix); _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix ); } + void CutModelData::createShapes(){ _cubefigure = new CutModelFigureCube(); _cylinderfigure = new CutModelFigureCylinder(); _spherefigure = new CutModelFigureSphere(); } + void CutModelData::changeOpacity(int opacity)throw( CutModelException){ checkInvariant(); _Actor->GetProperty()->SetOpacity((double)opacity/100.0); @@ -121,16 +168,32 @@ void CutModelData::ShowViewBox(bool check)throw( CutModelException){ void CutModelData::ChangeShape(int selection)throw( CutModelException){ checkInvariant(); - if(selection == 0){ + if(selection == 0) + { +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 _Mapper->SetInput(_spherefigure->getPolyData()); +#else + _Mapper->SetInputData(_spherefigure->getPolyData()); +#endif }else if(selection == 1){ + +#if VTK_MAJOR_VERSION <= 5 _Mapper->SetInput(_cylinderfigure->getPolyData()); +#else + _Mapper->SetInputData(_cylinderfigure->getPolyData()); +#endif + }else if(selection == 2){ +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 _Mapper->SetInput(_cubefigure->getPolyData()); +#else + _Mapper->SetInputData(_cubefigure->getPolyData()); +#endif }else{ throw CutModelException("Shape type not found"); } - _currentshape=selection; } @@ -152,8 +215,7 @@ void CutModelData::checkInvariant()throw( CutModelException){ } if(_spherefigure==NULL){ throw CutModelException("Sphere not created"); - } - + } } vtkActor* CutModelData::getActor()throw( CutModelException){ @@ -165,6 +227,7 @@ void CutModelData::changeColor(double r,double g,double b)throw( CutModelExcepti checkInvariant(); _Actor->GetProperty()->SetColor( r,g,b ); } + CutModelFigure* CutModelData::getCurentCuttingModel(){ checkInvariant(); @@ -178,37 +241,38 @@ CutModelFigure* CutModelData::getCurentCuttingModel(){ throw CutModelException("Shape type not found"); } } -void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage) -{ +void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException) +{ wxBusyCursor wait; CutModelFigure* actualCuttingModel = getCurentCuttingModel(); + //_boxWidgetVolume->GetTransform(currentmatrix); actualCuttingModel->SetVtkTransform(getModelTransform(copyimage)); + //actualCuttingModel->SetVtkTransform(currentmatrix); actualCuttingModel->SetInversVtkTransform(getModelTransformInvers()); bool inside; - bool volInt, volExt; - int xx,yy,zz; - unsigned short* pOrg; - int ext[6]; - double spc[3]; - long int contAfter = 0; - long int contBefor = 0; + //bool volInt, volExt; // unused + int xx,yy,zz; + unsigned short* pOrg; + int ext[6]; + //double spc[3]; // unused + //long int contAfter = 0; // unused + //long int contBefor = 0; // unused double minvalue = range[0]; double value = range[1]; double maxvalue = range[2]; - - + copyimage->GetExtent(ext); - for (xx=ext[0];xxIfPointInside(xx,yy,zz); if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) ) @@ -226,28 +290,57 @@ void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyi } // for zz } // for yy } // for xx - } -vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){ +void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException) +{ + wxBusyCursor wait; - vtkMatrix4x4* matrix = currentmatrix->GetMatrix(); - vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix(); + CutModelFigure* actualCuttingModel = getCurentCuttingModel(); - double *spc = copyimage->GetSpacing(); + actualCuttingModel->SetVtkTransform(getModelTransform(copyimage)); - modeltransform->Identity(); + actualCuttingModel->SetInversVtkTransform(getModelTransformInvers()); - double* orient = currentmatrix->GetOrientationWXYZ(); - modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]); + bool inside; + // bool volInt, volExt; // unused // JPRx + int xx,yy,zz; + unsigned short* pOrg; + int ext[6]; + //double spc[3]; // unused // JPRx + //long int contAfter = 0; // unused // JPRx + //long int contBefor = 0; // unused // JPRx - double* pos = currentmatrix->GetPosition(); - modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]); + double value; - double* scal = currentmatrix->GetScale(); - modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]); + copyimage->GetExtent(ext); - /*matrixmodel->Identity(); + for (xx=ext[0];xx<=ext[1]; xx++) + { + for (yy=ext[2];yy<=ext[3]; yy++) + { + for (zz=ext[4];zz<=ext[5];zz++) + { + inside=actualCuttingModel->IfPointInside(xx,yy,zz); + if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) ) + { + value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz)); + pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); + //std::cout<<"CutModelData::ExecuteUnCut() "<GetSpacing(); + modeltransform->Identity(); + + vtkMatrix4x4* matrix = currentmatrix->GetMatrix(); + vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix(); matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]); matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]); matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]); @@ -259,20 +352,74 @@ vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){ matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]); matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]); matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]); - matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);*/ + matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); - //modeltransform->SetMatrix(matrixmodel); + /* + double* pos = currentmatrix->GetPosition(); + modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]); + double* scal = currentmatrix->GetScale(); + modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]); + + //double* orient = currentmatrix->GetOrientation(); + //modeltransform->RotateZ(orient[2]); + //modeltransform->RotateY(orient[1]); + //modeltransform->RotateX(orient[0]); + double* orient = currentmatrix->GetOrientationWXYZ(); + modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]); + */ modeltransform->Update(); return modeltransform; +} +void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){ +// double *spc = img->GetSpacing(); // spc unused // JPR + + currentmatrix->Identity(); + + /*double* orient = transform->GetOrientationWXYZ(); + currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]); + + double* pos = transform->GetPosition(); + currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]); + + double* scal = transform->GetScale(); + currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]); + + currentmatrix->Update(); */ + + _boxWidgetVolume->SetTransform(transform); + + /*vtkMatrix4x4* matrix = transform->GetMatrix(); + vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix(); + matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]); + matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]); + matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]); + matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]); + matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]); + matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]); + matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]); + matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]); + matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]); + matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]); + matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]); + matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); */ + + udapteActorDirection(); + getModelTransform(img); } + vtkTransform* CutModelData::getModelTransformInvers(){ inversModel->Identity (); inversModel->Concatenate ( modeltransform ); inversModel->Inverse(); return inversModel; -} \ No newline at end of file +} + +vtkPolyData* CutModelData::getPolyData()throw( CutModelException){ + return _Mapper->GetInput(); +} +