1 /*=========================================================================
4 Module: $RCSfile: CutModelData.cxx,v $
6 Date: $Date: 2011/02/07 10:30:05 $
7 Version: $Revision: 1.9 $
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"
18 #include "vtkRenderWindow.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);
38 interactor->GetRenderWindow ()->Render();
42 CutModelData::~CutModelData(){
44 _boxWidgetVolume->RemoveAllObservers();
45 _boxWidgetVolume->Off();
46 _boxWidgetVolume->SetInteractor(NULL);
47 _boxWidgetVolume->Delete();
51 delete _cylinderfigure;
53 currentmatrix->Delete();
54 modeltransform->Delete();
55 inversModel->Delete();
59 void CutModelData::RefreshViewBox(){
62 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
63 _boxWidgetVolume = vtkBoxWidget::New();
64 _boxWidgetVolume->SetInteractor( interactor );
65 //_boxWidgetVolume->SetPlaceFactor(1);
66 //_boxWidgetVolume->SetInput( img );
67 //_boxWidgetVolume->PlaceWidget();
69 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
70 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
71 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
73 _boxWidgetVolume->HandlesOn ();
74 _boxWidgetVolume->On();
75 //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);
76 //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);
79 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
81 currentmatrix = vtkTransform::New();
82 modeltransform = vtkTransform::New();
83 inversModel = vtkTransform::New();
85 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
87 double *ori = img->GetOrigin();
88 int *ext = img->GetExtent();
89 double *spc = img->GetSpacing();
91 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
92 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
93 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
95 double orgx = (ext[1]+ext[0])/2.*spc[0];
96 double orgy = (ext[3]+ext[2])/2.*spc[1];
97 double orgz = (ext[5]+ext[4])/2.*spc[2];
99 matrix->SetElement(0,3,orgx);
100 matrix->SetElement(1,3,orgy);
101 matrix->SetElement(2,3,orgz);
103 currentmatrix->SetMatrix(matrix);
104 _boxWidgetVolume->SetTransform(currentmatrix);
107 void CutModelData::createActor(){
109 _Mapper = vtkPolyDataMapper::New();
110 _Actor = vtkActor::New();
111 _Actor->SetMapper(_Mapper);
112 _Actor->GetProperty()->SetColor(1, 0, 0);
113 _Actor->GetProperty()->SetOpacity(0.5);
116 void CutModelData::udapteActorDirection()throw( CutModelException){
119 _boxWidgetVolume->GetTransform(currentmatrix);
120 _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
123 void CutModelData::createShapes(){
124 _cubefigure = new CutModelFigureCube();
125 _cylinderfigure = new CutModelFigureCylinder();
126 _spherefigure = new CutModelFigureSphere();
129 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
131 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
134 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
137 _boxWidgetVolume->On();
139 _boxWidgetVolume->Off();
143 void CutModelData::ChangeShape(int selection)throw( CutModelException){
147 _Mapper->SetInput(_spherefigure->getPolyData());
148 }else if(selection == 1){
149 _Mapper->SetInput(_cylinderfigure->getPolyData());
150 }else if(selection == 2){
151 _Mapper->SetInput(_cubefigure->getPolyData());
153 throw CutModelException("Shape type not found");
155 _currentshape=selection;
158 void CutModelData::checkInvariant()throw( CutModelException){
159 if(_boxWidgetVolume==NULL){
160 throw CutModelException("Box Widget not created");
163 throw CutModelException("Mapper not created");
166 throw CutModelException("Actor not created");
168 if(_cubefigure==NULL){
169 throw CutModelException("Cube not created");
171 if(_cylinderfigure==NULL){
172 throw CutModelException("Cylinder not created");
174 if(_spherefigure==NULL){
175 throw CutModelException("Sphere not created");
179 vtkActor* CutModelData::getActor()throw( CutModelException){
184 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
186 _Actor->GetProperty()->SetColor( r,g,b );
189 CutModelFigure* CutModelData::getCurentCuttingModel(){
192 if(_currentshape == 0){
193 return _spherefigure;
194 }else if(_currentshape == 1){
195 return _cylinderfigure;
196 }else if(_currentshape == 2){
199 throw CutModelException("Shape type not found");
203 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
207 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
209 //_boxWidgetVolume->GetTransform(currentmatrix);
210 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
211 //actualCuttingModel->SetVtkTransform(currentmatrix);
212 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
215 //bool volInt, volExt; // unused
217 unsigned short* pOrg;
219 //double spc[3]; // unused
220 //long int contAfter = 0; // unused
221 //long int contBefor = 0; // unused
223 double minvalue = range[0];
224 double value = range[1];
225 double maxvalue = range[2];
227 copyimage->GetExtent(ext);
229 for (xx=ext[0];xx<=ext[1]; xx++)
231 for (yy=ext[2];yy<=ext[3]; yy++)
233 for (zz=ext[4];zz<=ext[5];zz++)
235 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
236 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
238 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
240 //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
241 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
244 *pOrg=(unsigned short)value;
253 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
257 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
259 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
261 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
264 // bool volInt, volExt; // unused // JPRx
266 unsigned short* pOrg;
268 //double spc[3]; // unused // JPRx
269 //long int contAfter = 0; // unused // JPRx
270 //long int contBefor = 0; // unused // JPRx
274 copyimage->GetExtent(ext);
276 for (xx=ext[0];xx<=ext[1]; xx++)
278 for (yy=ext[2];yy<=ext[3]; yy++)
280 for (zz=ext[4];zz<=ext[5];zz++)
282 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
283 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
285 value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
286 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
287 //std::cout<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
288 *pOrg=(unsigned short)value;
295 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
297 double *spc = copyimage->GetSpacing();
298 modeltransform->Identity();
300 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
301 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
302 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
303 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
304 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
305 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
306 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
307 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
308 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
309 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
310 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
311 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
312 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
313 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]);
330 modeltransform->Update();
332 return modeltransform;
335 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
337 // double *spc = img->GetSpacing(); // spc unused // JPR
339 currentmatrix->Identity();
341 /*double* orient = transform->GetOrientationWXYZ();
342 currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
344 double* pos = transform->GetPosition();
345 currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
347 double* scal = transform->GetScale();
348 currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
350 currentmatrix->Update(); */
352 _boxWidgetVolume->SetTransform(transform);
354 /*vtkMatrix4x4* matrix = transform->GetMatrix();
355 vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
356 matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
357 matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
358 matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
359 matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
360 matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
361 matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
362 matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
363 matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
364 matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
365 matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
366 matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
367 matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]); */
369 udapteActorDirection();
370 getModelTransform(img);
373 vtkTransform* CutModelData::getModelTransformInvers(){
374 inversModel->Identity ();
375 inversModel->Concatenate ( modeltransform );
376 inversModel->Inverse();
380 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
381 return _Mapper->GetInput();