1 /*=========================================================================
4 Module: $RCSfile: CutModelData.cxx,v $
6 Date: $Date: 2009/09/01 14:01:36 $
7 Version: $Revision: 1.2 $
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){
25 createBoxWidget(interactor, observer);
34 CutModelData::~CutModelData(){
36 _boxWidgetVolume->Off();
37 _boxWidgetVolume->Delete();
41 delete _cylinderfigure;
43 currentmatrix->Delete();
44 inversModel->Delete();
46 void CutModelData::RefreshViewBox(){
49 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
51 _boxWidgetVolume = vtkBoxWidget::New();
52 _boxWidgetVolume->SetInteractor( interactor );
53 //_boxWidgetVolume->SetPlaceFactor(2);
54 //_boxWidgetVolume->SetInput( img );
55 //_boxWidgetVolume->PlaceWidget();
56 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
57 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
58 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
60 _boxWidgetVolume->HandlesOn ();
61 _boxWidgetVolume->On();
62 //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);
63 //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);
65 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
67 currentmatrix = vtkTransform::New();
68 modeltransform = vtkTransform::New();
69 inversModel = vtkTransform::New();
71 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
73 int *ext = img->GetExtent();
74 double *spc = img->GetSpacing();
76 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
77 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
78 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
79 matrix->SetElement(0,3,(ext[1]-ext[0])/2*spc[0]);
80 matrix->SetElement(1,3,(ext[3]-ext[2])/2*spc[1]);
81 matrix->SetElement(2,3,(ext[5]-ext[4])/2*spc[2]);
83 currentmatrix->SetMatrix(matrix);
84 _boxWidgetVolume->SetTransform(currentmatrix);
87 void CutModelData::createActor(){
89 _Mapper = vtkPolyDataMapper::New();
90 _Actor = vtkActor::New();
91 _Actor->SetMapper(_Mapper);
92 _Actor->GetProperty()->SetColor(1, 0, 0);
93 _Actor->GetProperty()->SetOpacity(0.5);
96 void CutModelData::udapteActorDirection()throw( CutModelException){
99 _boxWidgetVolume->GetTransform(currentmatrix);
100 _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
102 void CutModelData::createShapes(){
103 _cubefigure = new CutModelFigureCube();
104 _cylinderfigure = new CutModelFigureCylinder();
105 _spherefigure = new CutModelFigureSphere();
107 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
109 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
112 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
115 _boxWidgetVolume->On();
117 _boxWidgetVolume->Off();
121 void CutModelData::ChangeShape(int selection)throw( CutModelException){
125 _Mapper->SetInput(_spherefigure->getPolyData());
126 }else if(selection == 1){
127 _Mapper->SetInput(_cylinderfigure->getPolyData());
128 }else if(selection == 2){
129 _Mapper->SetInput(_cubefigure->getPolyData());
131 throw CutModelException("Shape type not found");
134 _currentshape=selection;
137 void CutModelData::checkInvariant()throw( CutModelException){
138 if(_boxWidgetVolume==NULL){
139 throw CutModelException("Box Widget not created");
142 throw CutModelException("Mapper not created");
145 throw CutModelException("Actor not created");
147 if(_cubefigure==NULL){
148 throw CutModelException("Cube not created");
150 if(_cylinderfigure==NULL){
151 throw CutModelException("Cylinder not created");
153 if(_spherefigure==NULL){
154 throw CutModelException("Sphere not created");
159 vtkActor* CutModelData::getActor()throw( CutModelException){
164 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
166 _Actor->GetProperty()->SetColor( r,g,b );
168 CutModelFigure* CutModelData::getCurentCuttingModel(){
171 if(_currentshape == 0){
172 return _spherefigure;
173 }else if(_currentshape == 1){
174 return _cylinderfigure;
175 }else if(_currentshape == 2){
178 throw CutModelException("Shape type not found");
181 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)
186 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
188 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
189 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
194 unsigned short* pOrg;
197 long int contAfter = 0;
198 long int contBefor = 0;
200 double minvalue = range[0];
201 double value = range[1];
202 double maxvalue = range[2];
205 copyimage->GetExtent(ext);
207 for (xx=ext[0];xx<ext[1]; xx++)
209 for (yy=ext[2];yy<ext[3]; yy++)
211 for (zz=ext[4];zz<ext[5];zz++)
213 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
214 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
216 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
218 //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
219 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
222 *pOrg=(unsigned short)value;
232 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
234 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
235 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
237 double *spc = copyimage->GetSpacing();
239 modeltransform->Identity();
241 double* orient = currentmatrix->GetOrientationWXYZ();
242 modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);
244 double* pos = currentmatrix->GetPosition();
245 modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
247 double* scal = currentmatrix->GetScale();
248 modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
250 /*matrixmodel->Identity();
251 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
252 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
253 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
254 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
255 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
256 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
257 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
258 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
259 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
260 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
261 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
262 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);*/
264 //modeltransform->SetMatrix(matrixmodel);
267 modeltransform->Update();
269 return modeltransform;
273 vtkTransform* CutModelData::getModelTransformInvers(){
274 inversModel->Identity ();
275 inversModel->Concatenate ( modeltransform );
276 inversModel->Inverse();