1 /*=========================================================================
4 Module: $RCSfile: CutModelData.cxx,v $
6 Date: $Date: 2011/02/07 09:16:29 $
7 Version: $Revision: 1.8 $
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);
41 CutModelData::~CutModelData(){
43 _boxWidgetVolume->RemoveAllObservers();
44 _boxWidgetVolume->Off();
45 _boxWidgetVolume->SetInteractor(NULL);
46 _boxWidgetVolume->Delete();
50 delete _cylinderfigure;
52 currentmatrix->Delete();
53 modeltransform->Delete();
54 inversModel->Delete();
58 void CutModelData::RefreshViewBox(){
61 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
62 _boxWidgetVolume = vtkBoxWidget::New();
63 _boxWidgetVolume->SetInteractor( interactor );
64 //_boxWidgetVolume->SetPlaceFactor(1);
65 //_boxWidgetVolume->SetInput( img );
66 //_boxWidgetVolume->PlaceWidget();
68 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
69 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
70 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
72 _boxWidgetVolume->HandlesOn ();
73 _boxWidgetVolume->On();
74 //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);
75 //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);
78 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
80 currentmatrix = vtkTransform::New();
81 modeltransform = vtkTransform::New();
82 inversModel = vtkTransform::New();
84 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
86 double *ori = img->GetOrigin();
87 int *ext = img->GetExtent();
88 double *spc = img->GetSpacing();
90 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
91 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
92 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
94 double orgx = (ori[0] + (ext[1]-ext[0])/2)*spc[0];
95 double orgy = (ori[1] + (ext[3]-ext[2])/2)*spc[1];
96 double orgz = (ori[2] + (ext[5]-ext[4])/2)*spc[2];
98 matrix->SetElement(0,3,orgx);
99 matrix->SetElement(1,3,orgy);
100 matrix->SetElement(2,3,orgz);
102 currentmatrix->SetMatrix(matrix);
103 _boxWidgetVolume->SetTransform(currentmatrix);
106 void CutModelData::createActor(){
108 _Mapper = vtkPolyDataMapper::New();
109 _Actor = vtkActor::New();
110 _Actor->SetMapper(_Mapper);
111 _Actor->GetProperty()->SetColor(1, 0, 0);
112 _Actor->GetProperty()->SetOpacity(0.5);
115 void CutModelData::udapteActorDirection()throw( CutModelException){
118 _boxWidgetVolume->GetTransform(currentmatrix);
119 _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
122 void CutModelData::createShapes(){
123 _cubefigure = new CutModelFigureCube();
124 _cylinderfigure = new CutModelFigureCylinder();
125 _spherefigure = new CutModelFigureSphere();
128 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
130 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
133 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
136 _boxWidgetVolume->On();
138 _boxWidgetVolume->Off();
142 void CutModelData::ChangeShape(int selection)throw( CutModelException){
146 _Mapper->SetInput(_spherefigure->getPolyData());
147 }else if(selection == 1){
148 _Mapper->SetInput(_cylinderfigure->getPolyData());
149 }else if(selection == 2){
150 _Mapper->SetInput(_cubefigure->getPolyData());
152 throw CutModelException("Shape type not found");
154 _currentshape=selection;
157 void CutModelData::checkInvariant()throw( CutModelException){
158 if(_boxWidgetVolume==NULL){
159 throw CutModelException("Box Widget not created");
162 throw CutModelException("Mapper not created");
165 throw CutModelException("Actor not created");
167 if(_cubefigure==NULL){
168 throw CutModelException("Cube not created");
170 if(_cylinderfigure==NULL){
171 throw CutModelException("Cylinder not created");
173 if(_spherefigure==NULL){
174 throw CutModelException("Sphere not created");
178 vtkActor* CutModelData::getActor()throw( CutModelException){
183 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
185 _Actor->GetProperty()->SetColor( r,g,b );
188 CutModelFigure* CutModelData::getCurentCuttingModel(){
191 if(_currentshape == 0){
192 return _spherefigure;
193 }else if(_currentshape == 1){
194 return _cylinderfigure;
195 }else if(_currentshape == 2){
198 throw CutModelException("Shape type not found");
202 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
206 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
208 //_boxWidgetVolume->GetTransform(currentmatrix);
209 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
210 //actualCuttingModel->SetVtkTransform(currentmatrix);
211 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
214 //bool volInt, volExt; // unused
216 unsigned short* pOrg;
218 //double spc[3]; // unused
219 //long int contAfter = 0; // unused
220 //long int contBefor = 0; // unused
222 double minvalue = range[0];
223 double value = range[1];
224 double maxvalue = range[2];
226 copyimage->GetExtent(ext);
228 for (xx=ext[0];xx<ext[1]; xx++)
230 for (yy=ext[2];yy<ext[3]; yy++)
232 for (zz=ext[4];zz<ext[5];zz++)
234 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
235 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
237 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
239 //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
240 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
243 *pOrg=(unsigned short)value;
252 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
256 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
258 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
260 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
263 // bool volInt, volExt; // unused // JPRx
265 unsigned short* pOrg;
267 //double spc[3]; // unused // JPRx
268 //long int contAfter = 0; // unused // JPRx
269 //long int contBefor = 0; // unused // JPRx
273 copyimage->GetExtent(ext);
275 for (xx=ext[0];xx<ext[1]; xx++)
277 for (yy=ext[2];yy<ext[3]; yy++)
279 for (zz=ext[4];zz<ext[5];zz++)
281 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
282 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
284 value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
285 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
286 //std::cout<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
287 *pOrg=(unsigned short)value;
294 vtkTransform* CutModelData::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]);
315 double* pos = currentmatrix->GetPosition();
316 modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
318 double* scal = currentmatrix->GetScale();
319 modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
321 //double* orient = currentmatrix->GetOrientation();
322 //modeltransform->RotateZ(orient[2]);
323 //modeltransform->RotateY(orient[1]);
324 //modeltransform->RotateX(orient[0]);
325 double* orient = currentmatrix->GetOrientationWXYZ();
326 modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
329 modeltransform->Update();
331 return modeltransform;
334 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
336 // double *spc = img->GetSpacing(); // spc unused // JPR
338 currentmatrix->Identity();
340 /*double* orient = transform->GetOrientationWXYZ();
341 currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
343 double* pos = transform->GetPosition();
344 currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
346 double* scal = transform->GetScale();
347 currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
349 currentmatrix->Update(); */
351 _boxWidgetVolume->SetTransform(transform);
353 /*vtkMatrix4x4* matrix = transform->GetMatrix();
354 vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
355 matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
356 matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
357 matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
358 matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
359 matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
360 matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
361 matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
362 matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
363 matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
364 matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
365 matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
366 matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); */
368 udapteActorDirection();
369 getModelTransform(img);
372 vtkTransform* CutModelData::getModelTransformInvers(){
373 inversModel->Identity ();
374 inversModel->Concatenate ( modeltransform );
375 inversModel->Inverse();
379 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
380 return _Mapper->GetInput();