1 /*=========================================================================
4 Module: $RCSfile: CutModel2Data.cxx,v $
6 Date: $Date: 2009/11/19 15:00:33 $
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 "CutModel2Data.h"
20 ** Start of the manager class
22 CutModel2Data::CutModel2Data(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
24 initializeData(id, interactor, observer, img);
27 CutModel2Data::CutModel2Data(){
30 void CutModel2Data::initializeData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
33 createBoxWidget(interactor, observer);
40 CutModel2Data::~CutModel2Data(){
42 _boxWidgetVolume->Off();
43 _boxWidgetVolume->Delete();
47 delete _cylinderfigure;
49 currentmatrix->Delete();
50 inversModel->Delete();
52 void CutModel2Data::RefreshViewBox(){
55 void CutModel2Data::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
57 _boxWidgetVolume = vtkBoxWidget::New();
58 _boxWidgetVolume->SetInteractor( interactor );
59 //_boxWidgetVolume->SetPlaceFactor(1);
60 //_boxWidgetVolume->SetInput( img );
61 //_boxWidgetVolume->PlaceWidget();
63 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
64 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
65 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
67 _boxWidgetVolume->HandlesOn ();
68 _boxWidgetVolume->On();
69 //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);
70 //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);
72 void CutModel2Data::setTransform(vtkImageData* img)throw( CutModel2Exception){
74 currentmatrix = vtkTransform::New();
75 modeltransform = vtkTransform::New();
76 inversModel = vtkTransform::New();
78 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
80 int *ext = img->GetExtent();
81 double *spc = img->GetSpacing();
84 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
85 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
86 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
88 double orgx = (ext[1]-ext[0])/2*spc[0];
89 double orgy = (ext[3]-ext[2])/2*spc[1];
90 double orgz = (ext[5]-ext[4])/2*spc[2];
92 matrix->SetElement(0,3,orgx);
93 matrix->SetElement(1,3,orgy);
94 matrix->SetElement(2,3,orgz);
97 currentmatrix->SetMatrix(matrix);
98 _boxWidgetVolume->SetTransform(currentmatrix);
101 void CutModel2Data::createActor(){
103 _Mapper = vtkPolyDataMapper::New();
104 _Actor = vtkActor::New();
105 _Actor->SetMapper(_Mapper);
106 _Actor->GetProperty()->SetColor(1, 0, 0);
107 _Actor->GetProperty()->SetOpacity(0.5);
110 void CutModel2Data::udapteActorDirection()throw( CutModel2Exception){
113 _boxWidgetVolume->GetTransform(currentmatrix);
114 _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
116 void CutModel2Data::createShapes(){
117 _cubefigure = new CutModel2FigureCube();
118 _cylinderfigure = new CutModel2FigureCylinder();
119 _spherefigure = new CutModel2FigureSphere();
121 void CutModel2Data::changeOpacity(int opacity)throw( CutModel2Exception){
123 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
126 void CutModel2Data::ShowViewBox(bool check)throw( CutModel2Exception){
129 _boxWidgetVolume->On();
131 _boxWidgetVolume->Off();
135 void CutModel2Data::ChangeShape(int selection)throw( CutModel2Exception){
139 _Mapper->SetInput(_spherefigure->getPolyData());
140 }else if(selection == 1){
141 _Mapper->SetInput(_cylinderfigure->getPolyData());
142 }else if(selection == 2){
143 _Mapper->SetInput(_cubefigure->getPolyData());
145 throw CutModel2Exception("Shape type not found");
148 _currentshape=selection;
151 void CutModel2Data::checkInvariant()throw( CutModel2Exception){
152 if(_boxWidgetVolume==NULL){
153 throw CutModel2Exception("Box Widget not created");
156 throw CutModel2Exception("Mapper not created");
159 throw CutModel2Exception("Actor not created");
161 if(_cubefigure==NULL){
162 throw CutModel2Exception("Cube not created");
164 if(_cylinderfigure==NULL){
165 throw CutModel2Exception("Cylinder not created");
167 if(_spherefigure==NULL){
168 throw CutModel2Exception("Sphere not created");
173 vtkActor* CutModel2Data::getActor()throw( CutModel2Exception){
178 void CutModel2Data::changeColor(double r,double g,double b)throw( CutModel2Exception){
180 _Actor->GetProperty()->SetColor( r, g, b );
182 CutModel2Figure* CutModel2Data::getCurentCuttingModel(){
185 if(_currentshape == 0){
186 return _spherefigure;
187 }else if(_currentshape == 1){
188 return _cylinderfigure;
189 }else if(_currentshape == 2){
192 throw CutModel2Exception("Shape type not found");
195 void CutModel2Data::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModel2Exception)
200 CutModel2Figure* actualCuttingModel = getCurentCuttingModel();
202 //_boxWidgetVolume->GetTransform(currentmatrix);
203 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
204 //actualCuttingModel->SetVtkTransform(currentmatrix);
205 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
210 unsigned short* pOrg;
213 long int contAfter = 0;
214 long int contBefor = 0;
216 double minvalue = range[0];
217 double value = range[1];
218 double maxvalue = range[2];
221 copyimage->GetExtent(ext);
223 for (xx=ext[0];xx<ext[1]; xx++)
225 for (yy=ext[2];yy<ext[3]; yy++)
227 for (zz=ext[4];zz<ext[5];zz++)
229 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
230 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
232 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
234 //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
235 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
238 *pOrg=(unsigned short)value;
248 void CutModel2Data::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModel2Exception)
253 CutModel2Figure* actualCuttingModel = getCurentCuttingModel();
255 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
257 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
262 unsigned short* pOrg;
265 long int contAfter = 0;
266 long int contBefor = 0;
272 copyimage->GetExtent(ext);
274 for (xx=ext[0];xx<ext[1]; xx++)
276 for (yy=ext[2];yy<ext[3]; yy++)
278 for (zz=ext[4];zz<ext[5];zz++)
280 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
281 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
283 value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
284 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
285 //std::cout<<"CutModel2Data::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
286 *pOrg=(unsigned short)value;
294 vtkTransform* CutModel2Data::getModelTransform(vtkImageData* copyimage){
296 double *spc = copyimage->GetSpacing();
297 modeltransform->Identity();
299 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
300 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
301 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
302 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
303 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
304 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
305 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
306 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
307 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
308 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
309 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
310 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
311 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
312 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
316 double* pos = currentmatrix->GetPosition();
317 modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
319 double* scal = currentmatrix->GetScale();
320 modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
322 //double* orient = currentmatrix->GetOrientation();
323 //modeltransform->RotateZ(orient[2]);
324 //modeltransform->RotateY(orient[1]);
325 //modeltransform->RotateX(orient[0]);
326 double* orient = currentmatrix->GetOrientationWXYZ();
327 modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
332 modeltransform->Update();
334 return modeltransform;
338 void CutModel2Data::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModel2Exception){
341 double *spc = img->GetSpacing();
343 currentmatrix->Identity();
345 /*double* orient = transform->GetOrientationWXYZ();
346 currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
348 double* pos = transform->GetPosition();
349 currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
351 double* scal = transform->GetScale();
352 currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
354 currentmatrix->Update(); */
356 _boxWidgetVolume->SetTransform(transform);
358 /*vtkMatrix4x4* matrix = transform->GetMatrix();
359 vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
360 matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
361 matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
362 matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
363 matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
364 matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
365 matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
366 matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
367 matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
368 matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
369 matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
370 matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
371 matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); */
374 udapteActorDirection();
375 getModelTransform(img);
378 vtkTransform* CutModel2Data::getModelTransformInvers(){
379 inversModel->Identity ();
380 inversModel->Concatenate ( modeltransform );
381 inversModel->Inverse();
385 vtkPolyData* CutModel2Data::getPolyData()throw( CutModel2Exception){
386 return _Mapper->GetInput();