1 /*=========================================================================
4 Module: $RCSfile: CutModelData.cxx,v $
6 Date: $Date: 2009/08/31 08:46:11 $
7 Version: $Revision: 1.1 $
9 Copyright: (c) 2002, 2003
12 This software is distributed WITHOUT ANY WARRANTY; without even
13 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 PURPOSE. See the above copyright notice for more information.
16 =========================================================================*/
17 #include "CutModelData.h"
20 ** Start of the manager class
22 CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
25 createBoxWidget(interactor, observer);
34 CutModelData::~CutModelData(){
36 _boxWidgetVolume->Off();
37 _boxWidgetVolume->Delete();
41 delete _cylinderfigure;
43 currentmatrix->Delete();
44 inversModel->Delete();
47 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
49 _boxWidgetVolume = vtkBoxWidget::New();
50 _boxWidgetVolume->SetInteractor( interactor );
51 //_boxWidgetVolume->SetPlaceFactor(2);
52 //_boxWidgetVolume->SetInput( img );
53 //_boxWidgetVolume->PlaceWidget();
54 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
55 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
56 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
58 _boxWidgetVolume->HandlesOn ();
59 _boxWidgetVolume->On();
61 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
63 currentmatrix = vtkTransform::New();
64 modeltransform = vtkTransform::New();
65 inversModel = vtkTransform::New();
67 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
69 int *ext = img->GetExtent();
70 double *spc = img->GetSpacing();
72 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
73 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
74 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
75 matrix->SetElement(0,3,(ext[1]-ext[0])/2*spc[0]);
76 matrix->SetElement(1,3,(ext[3]-ext[2])/2*spc[1]);
77 matrix->SetElement(2,3,(ext[5]-ext[4])/2*spc[2]);
79 currentmatrix->SetMatrix(matrix);
80 _boxWidgetVolume->SetTransform(currentmatrix);
83 void CutModelData::createActor(){
85 _Mapper = vtkPolyDataMapper::New();
86 _Actor = vtkActor::New();
87 _Actor->SetMapper(_Mapper);
88 _Actor->GetProperty()->SetColor(1, 0, 0);
89 _Actor->GetProperty()->SetOpacity(0.4);
92 void CutModelData::udapteActorDirection()throw( CutModelException){
95 _boxWidgetVolume->GetTransform(currentmatrix);
96 _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
98 void CutModelData::createShapes(){
99 _cubefigure = new CutModelFigureCube();
100 _cylinderfigure = new CutModelFigureCylinder();
101 _spherefigure = new CutModelFigureSphere();
103 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
105 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
108 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
111 _boxWidgetVolume->On();
113 _boxWidgetVolume->Off();
117 void CutModelData::ChangeShape(int selection)throw( CutModelException){
121 _Mapper->SetInput(_spherefigure->getPolyData());
122 }else if(selection == 1){
123 _Mapper->SetInput(_cylinderfigure->getPolyData());
124 }else if(selection == 2){
125 _Mapper->SetInput(_cubefigure->getPolyData());
127 throw CutModelException("Shape type not found");
130 _currentshape=selection;
133 void CutModelData::checkInvariant()throw( CutModelException){
134 if(_boxWidgetVolume==NULL){
135 throw CutModelException("Box Widget not created");
138 throw CutModelException("Mapper not created");
141 throw CutModelException("Actor not created");
143 if(_cubefigure==NULL){
144 throw CutModelException("Cube not created");
146 if(_cylinderfigure==NULL){
147 throw CutModelException("Cylinder not created");
149 if(_spherefigure==NULL){
150 throw CutModelException("Sphere not created");
155 vtkActor* CutModelData::getActor()throw( CutModelException){
160 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
162 _Actor->GetProperty()->SetColor( r,g,b );
164 CutModelFigure* CutModelData::getCurentCuttingModel(){
167 if(_currentshape == 0){
168 return _spherefigure;
169 }else if(_currentshape == 1){
170 return _cylinderfigure;
171 }else if(_currentshape == 2){
174 throw CutModelException("Shape type not found");
177 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)
182 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
184 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
185 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
190 unsigned short* pOrg;
193 long int contAfter = 0;
194 long int contBefor = 0;
196 double minvalue = range[0];
197 double value = range[1];
198 double maxvalue = range[2];
201 copyimage->GetExtent(ext);
203 for (xx=ext[0];xx<ext[1]; xx++)
205 for (yy=ext[2];yy<ext[3]; yy++)
207 for (zz=ext[4];zz<ext[5];zz++)
209 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
210 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
212 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
214 //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
215 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
218 *pOrg=(unsigned short)value;
228 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
230 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
231 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
233 double *spc = copyimage->GetSpacing();
235 matrixmodel->Identity();
236 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
237 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
238 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
239 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
240 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
241 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
242 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
243 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
244 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
245 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
246 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
247 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
250 modeltransform->Update();
252 return modeltransform;
256 vtkTransform* CutModelData::getModelTransformInvers(){
257 inversModel->Identity ();
258 inversModel->Concatenate ( modeltransform );
259 inversModel->Inverse();