1 /*=========================================================================
4 Module: $RCSfile: CutModelData.cxx,v $
6 Date: $Date: 2009/11/25 16:35:37 $
7 Version: $Revision: 1.5 $
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){
24 initializeData(id, interactor, observer, img);
27 CutModelData::CutModelData(){
30 void CutModelData::initializeData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
33 createBoxWidget(interactor, observer);
40 CutModelData::~CutModelData(){
42 _boxWidgetVolume->RemoveAllObservers();
43 _boxWidgetVolume->Off();
44 _boxWidgetVolume->SetInteractor(NULL);
45 _boxWidgetVolume->Delete();
49 delete _cylinderfigure;
51 currentmatrix->Delete();
52 modeltransform->Delete();
53 inversModel->Delete();
56 void CutModelData::RefreshViewBox(){
59 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
61 _boxWidgetVolume = vtkBoxWidget::New();
62 _boxWidgetVolume->SetInteractor( interactor );
63 //_boxWidgetVolume->SetPlaceFactor(1);
64 //_boxWidgetVolume->SetInput( img );
65 //_boxWidgetVolume->PlaceWidget();
67 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
68 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
69 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
71 _boxWidgetVolume->HandlesOn ();
72 _boxWidgetVolume->On();
73 //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);
74 //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);
76 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
78 currentmatrix = vtkTransform::New();
79 modeltransform = vtkTransform::New();
80 inversModel = vtkTransform::New();
82 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
84 int *ext = img->GetExtent();
85 double *spc = img->GetSpacing();
88 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
89 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
90 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
92 double orgx = (ext[1]-ext[0])/2*spc[0];
93 double orgy = (ext[3]-ext[2])/2*spc[1];
94 double orgz = (ext[5]-ext[4])/2*spc[2];
96 matrix->SetElement(0,3,orgx);
97 matrix->SetElement(1,3,orgy);
98 matrix->SetElement(2,3,orgz);
101 currentmatrix->SetMatrix(matrix);
102 _boxWidgetVolume->SetTransform(currentmatrix);
105 void CutModelData::createActor(){
107 _Mapper = vtkPolyDataMapper::New();
108 _Actor = vtkActor::New();
109 _Actor->SetMapper(_Mapper);
110 _Actor->GetProperty()->SetColor(1, 0, 0);
111 _Actor->GetProperty()->SetOpacity(0.5);
114 void CutModelData::udapteActorDirection()throw( CutModelException){
117 _boxWidgetVolume->GetTransform(currentmatrix);
118 _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
120 void CutModelData::createShapes(){
121 _cubefigure = new CutModelFigureCube();
122 _cylinderfigure = new CutModelFigureCylinder();
123 _spherefigure = new CutModelFigureSphere();
125 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
127 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
130 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
133 _boxWidgetVolume->On();
135 _boxWidgetVolume->Off();
139 void CutModelData::ChangeShape(int selection)throw( CutModelException){
143 _Mapper->SetInput(_spherefigure->getPolyData());
144 }else if(selection == 1){
145 _Mapper->SetInput(_cylinderfigure->getPolyData());
146 }else if(selection == 2){
147 _Mapper->SetInput(_cubefigure->getPolyData());
149 throw CutModelException("Shape type not found");
152 _currentshape=selection;
155 void CutModelData::checkInvariant()throw( CutModelException){
156 if(_boxWidgetVolume==NULL){
157 throw CutModelException("Box Widget not created");
160 throw CutModelException("Mapper not created");
163 throw CutModelException("Actor not created");
165 if(_cubefigure==NULL){
166 throw CutModelException("Cube not created");
168 if(_cylinderfigure==NULL){
169 throw CutModelException("Cylinder not created");
171 if(_spherefigure==NULL){
172 throw CutModelException("Sphere not created");
177 vtkActor* CutModelData::getActor()throw( CutModelException){
182 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
184 _Actor->GetProperty()->SetColor( r,g,b );
186 CutModelFigure* CutModelData::getCurentCuttingModel(){
189 if(_currentshape == 0){
190 return _spherefigure;
191 }else if(_currentshape == 1){
192 return _cylinderfigure;
193 }else if(_currentshape == 2){
196 throw CutModelException("Shape type not found");
199 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
204 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
206 //_boxWidgetVolume->GetTransform(currentmatrix);
207 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
208 //actualCuttingModel->SetVtkTransform(currentmatrix);
209 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
214 unsigned short* pOrg;
217 long int contAfter = 0;
218 long int contBefor = 0;
220 double minvalue = range[0];
221 double value = range[1];
222 double maxvalue = range[2];
225 copyimage->GetExtent(ext);
227 for (xx=ext[0];xx<ext[1]; xx++)
229 for (yy=ext[2];yy<ext[3]; yy++)
231 for (zz=ext[4];zz<ext[5];zz++)
233 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
234 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
236 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
238 //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
239 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
242 *pOrg=(unsigned short)value;
252 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
257 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
259 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
261 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
266 unsigned short* pOrg;
269 long int contAfter = 0;
270 long int contBefor = 0;
276 copyimage->GetExtent(ext);
278 for (xx=ext[0];xx<ext[1]; xx++)
280 for (yy=ext[2];yy<ext[3]; yy++)
282 for (zz=ext[4];zz<ext[5];zz++)
284 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
285 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
287 value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
288 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
289 //std::cout<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
290 *pOrg=(unsigned short)value;
298 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
300 double *spc = copyimage->GetSpacing();
301 modeltransform->Identity();
303 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
304 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
305 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
306 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
307 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
308 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
309 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
310 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
311 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
312 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
313 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
314 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
315 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
316 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
320 double* pos = currentmatrix->GetPosition();
321 modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
323 double* scal = currentmatrix->GetScale();
324 modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
326 //double* orient = currentmatrix->GetOrientation();
327 //modeltransform->RotateZ(orient[2]);
328 //modeltransform->RotateY(orient[1]);
329 //modeltransform->RotateX(orient[0]);
330 double* orient = currentmatrix->GetOrientationWXYZ();
331 modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
336 modeltransform->Update();
338 return modeltransform;
342 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
345 double *spc = img->GetSpacing();
347 currentmatrix->Identity();
349 /*double* orient = transform->GetOrientationWXYZ();
350 currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
352 double* pos = transform->GetPosition();
353 currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
355 double* scal = transform->GetScale();
356 currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
358 currentmatrix->Update(); */
360 _boxWidgetVolume->SetTransform(transform);
362 /*vtkMatrix4x4* matrix = transform->GetMatrix();
363 vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
364 matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
365 matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
366 matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
367 matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
368 matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
369 matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
370 matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
371 matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
372 matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
373 matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
374 matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
375 matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); */
378 udapteActorDirection();
379 getModelTransform(img);
382 vtkTransform* CutModelData::getModelTransformInvers(){
383 inversModel->Identity ();
384 inversModel->Concatenate ( modeltransform );
385 inversModel->Inverse();
389 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
390 return _Mapper->GetInput();