1 /*=========================================================================
4 Module: $RCSfile: CutModelData.cxx,v $
6 Date: $Date: 2010/09/29 21:21:05 $
7 Version: $Revision: 1.7 $
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 int *ext = img->GetExtent();
87 double *spc = img->GetSpacing();
89 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
90 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
91 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
93 double orgx = (ext[1]-ext[0])/2*spc[0];
94 double orgy = (ext[3]-ext[2])/2*spc[1];
95 double orgz = (ext[5]-ext[4])/2*spc[2];
97 matrix->SetElement(0,3,orgx);
98 matrix->SetElement(1,3,orgy);
99 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 );
121 void CutModelData::createShapes(){
122 _cubefigure = new CutModelFigureCube();
123 _cylinderfigure = new CutModelFigureCylinder();
124 _spherefigure = new CutModelFigureSphere();
127 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
129 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
132 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
135 _boxWidgetVolume->On();
137 _boxWidgetVolume->Off();
141 void CutModelData::ChangeShape(int selection)throw( CutModelException){
145 _Mapper->SetInput(_spherefigure->getPolyData());
146 }else if(selection == 1){
147 _Mapper->SetInput(_cylinderfigure->getPolyData());
148 }else if(selection == 2){
149 _Mapper->SetInput(_cubefigure->getPolyData());
151 throw CutModelException("Shape type not found");
153 _currentshape=selection;
156 void CutModelData::checkInvariant()throw( CutModelException){
157 if(_boxWidgetVolume==NULL){
158 throw CutModelException("Box Widget not created");
161 throw CutModelException("Mapper not created");
164 throw CutModelException("Actor not created");
166 if(_cubefigure==NULL){
167 throw CutModelException("Cube not created");
169 if(_cylinderfigure==NULL){
170 throw CutModelException("Cylinder not created");
172 if(_spherefigure==NULL){
173 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 );
187 CutModelFigure* CutModelData::getCurentCuttingModel(){
190 if(_currentshape == 0){
191 return _spherefigure;
192 }else if(_currentshape == 1){
193 return _cylinderfigure;
194 }else if(_currentshape == 2){
197 throw CutModelException("Shape type not found");
201 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
205 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
207 //_boxWidgetVolume->GetTransform(currentmatrix);
208 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
209 //actualCuttingModel->SetVtkTransform(currentmatrix);
210 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
213 //bool volInt, volExt; // unused
215 unsigned short* pOrg;
217 //double spc[3]; // unused
218 //long int contAfter = 0; // unused
219 //long int contBefor = 0; // unused
221 double minvalue = range[0];
222 double value = range[1];
223 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;
251 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
255 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
257 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
259 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
262 // bool volInt, volExt; // unused // JPRx
264 unsigned short* pOrg;
266 //double spc[3]; // unused // JPRx
267 //long int contAfter = 0; // unused // JPRx
268 //long int contBefor = 0; // unused // JPRx
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<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
286 *pOrg=(unsigned short)value;
293 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
295 double *spc = copyimage->GetSpacing();
296 modeltransform->Identity();
298 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
299 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
300 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
301 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
302 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
303 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
304 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
305 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
306 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
307 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
308 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
309 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
310 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
311 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
314 double* pos = currentmatrix->GetPosition();
315 modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
317 double* scal = currentmatrix->GetScale();
318 modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
320 //double* orient = currentmatrix->GetOrientation();
321 //modeltransform->RotateZ(orient[2]);
322 //modeltransform->RotateY(orient[1]);
323 //modeltransform->RotateX(orient[0]);
324 double* orient = currentmatrix->GetOrientationWXYZ();
325 modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
328 modeltransform->Update();
330 return modeltransform;
333 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
335 // double *spc = img->GetSpacing(); // spc unused // JPR
337 currentmatrix->Identity();
339 /*double* orient = transform->GetOrientationWXYZ();
340 currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
342 double* pos = transform->GetPosition();
343 currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
345 double* scal = transform->GetScale();
346 currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
348 currentmatrix->Update(); */
350 _boxWidgetVolume->SetTransform(transform);
352 /*vtkMatrix4x4* matrix = transform->GetMatrix();
353 vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
354 matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
355 matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
356 matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
357 matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
358 matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
359 matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
360 matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
361 matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
362 matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
363 matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
364 matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
365 matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); */
367 udapteActorDirection();
368 getModelTransform(img);
371 vtkTransform* CutModelData::getModelTransformInvers(){
372 inversModel->Identity ();
373 inversModel->Concatenate ( modeltransform );
374 inversModel->Inverse();
378 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
379 return _Mapper->GetInput();