00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "CutModelData.h"
00018
00022 CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
00023
00024 initializeData(id, interactor, observer, img);
00025
00026 }
00027 CutModelData::CutModelData(){
00028
00029 }
00030 void CutModelData::initializeData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
00031 _id = id;
00032 _currentshape=0;
00033 createBoxWidget(interactor, observer);
00034 setTransform(img);
00035 createActor();
00036 createShapes();
00037 ChangeShape(0);
00038 checkInvariant();
00039 }
00040 CutModelData::~CutModelData(){
00041 checkInvariant();
00042 _boxWidgetVolume->RemoveAllObservers();
00043 _boxWidgetVolume->Off();
00044 _boxWidgetVolume->SetInteractor(NULL);
00045 _boxWidgetVolume->Delete();
00046 _Mapper->Delete();
00047 _Actor->Delete();
00048 delete _cubefigure;
00049 delete _cylinderfigure;
00050 delete _spherefigure;
00051 currentmatrix->Delete();
00052 modeltransform->Delete();
00053 inversModel->Delete();
00054 _id = -1;
00055 }
00056 void CutModelData::RefreshViewBox(){
00057
00058 }
00059 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
00060
00061 _boxWidgetVolume = vtkBoxWidget::New();
00062 _boxWidgetVolume->SetInteractor( interactor );
00063
00064
00065
00066
00067 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
00068 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
00069 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
00070
00071 _boxWidgetVolume->HandlesOn ();
00072 _boxWidgetVolume->On();
00073
00074
00075 }
00076 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
00077
00078 currentmatrix = vtkTransform::New();
00079 modeltransform = vtkTransform::New();
00080 inversModel = vtkTransform::New();
00081
00082 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
00083 matrix->Identity();
00084 int *ext = img->GetExtent();
00085 double *spc = img->GetSpacing();
00086
00087
00088 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
00089 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
00090 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
00091
00092 double orgx = (ext[1]-ext[0])/2*spc[0];
00093 double orgy = (ext[3]-ext[2])/2*spc[1];
00094 double orgz = (ext[5]-ext[4])/2*spc[2];
00095
00096 matrix->SetElement(0,3,orgx);
00097 matrix->SetElement(1,3,orgy);
00098 matrix->SetElement(2,3,orgz);
00099
00100
00101 currentmatrix->SetMatrix(matrix);
00102 _boxWidgetVolume->SetTransform(currentmatrix);
00103
00104 }
00105 void CutModelData::createActor(){
00106
00107 _Mapper = vtkPolyDataMapper::New();
00108 _Actor = vtkActor::New();
00109 _Actor->SetMapper(_Mapper);
00110 _Actor->GetProperty()->SetColor(1, 0, 0);
00111 _Actor->GetProperty()->SetOpacity(0.5);
00112
00113 }
00114 void CutModelData::udapteActorDirection()throw( CutModelException){
00115 checkInvariant();
00116
00117 _boxWidgetVolume->GetTransform(currentmatrix);
00118 _Actor->SetUserMatrix(currentmatrix->GetMatrix());
00119 }
00120 void CutModelData::createShapes(){
00121 _cubefigure = new CutModelFigureCube();
00122 _cylinderfigure = new CutModelFigureCylinder();
00123 _spherefigure = new CutModelFigureSphere();
00124 }
00125 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
00126 checkInvariant();
00127 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
00128 }
00129
00130 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
00131 checkInvariant();
00132 if(check){
00133 _boxWidgetVolume->On();
00134 }else{
00135 _boxWidgetVolume->Off();
00136 }
00137 }
00138
00139 void CutModelData::ChangeShape(int selection)throw( CutModelException){
00140 checkInvariant();
00141
00142 if(selection == 0){
00143 _Mapper->SetInput(_spherefigure->getPolyData());
00144 }else if(selection == 1){
00145 _Mapper->SetInput(_cylinderfigure->getPolyData());
00146 }else if(selection == 2){
00147 _Mapper->SetInput(_cubefigure->getPolyData());
00148 }else{
00149 throw CutModelException("Shape type not found");
00150 }
00151
00152 _currentshape=selection;
00153 }
00154
00155 void CutModelData::checkInvariant()throw( CutModelException){
00156 if(_boxWidgetVolume==NULL){
00157 throw CutModelException("Box Widget not created");
00158 }
00159 if(_Mapper==NULL){
00160 throw CutModelException("Mapper not created");
00161 }
00162 if(_Actor==NULL){
00163 throw CutModelException("Actor not created");
00164 }
00165 if(_cubefigure==NULL){
00166 throw CutModelException("Cube not created");
00167 }
00168 if(_cylinderfigure==NULL){
00169 throw CutModelException("Cylinder not created");
00170 }
00171 if(_spherefigure==NULL){
00172 throw CutModelException("Sphere not created");
00173 }
00174
00175 }
00176
00177 vtkActor* CutModelData::getActor()throw( CutModelException){
00178 checkInvariant();
00179 return _Actor;
00180 }
00181
00182 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
00183 checkInvariant();
00184 _Actor->GetProperty()->SetColor( r,g,b );
00185 }
00186 CutModelFigure* CutModelData::getCurentCuttingModel(){
00187 checkInvariant();
00188
00189 if(_currentshape == 0){
00190 return _spherefigure;
00191 }else if(_currentshape == 1){
00192 return _cylinderfigure;
00193 }else if(_currentshape == 2){
00194 return _cubefigure;
00195 }else{
00196 throw CutModelException("Shape type not found");
00197 }
00198 }
00199 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
00200 {
00201
00202 wxBusyCursor wait;
00203
00204 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
00205
00206
00207 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
00208
00209 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
00210
00211 bool inside;
00212 bool volInt, volExt;
00213 int xx,yy,zz;
00214 unsigned short* pOrg;
00215 int ext[6];
00216 double spc[3];
00217 long int contAfter = 0;
00218 long int contBefor = 0;
00219
00220 double minvalue = range[0];
00221 double value = range[1];
00222 double maxvalue = range[2];
00223
00224
00225 copyimage->GetExtent(ext);
00226
00227 for (xx=ext[0];xx<ext[1]; xx++)
00228 {
00229 for (yy=ext[2];yy<ext[3]; yy++)
00230 {
00231 for (zz=ext[4];zz<ext[5];zz++)
00232 {
00233 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
00234 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
00235 {
00236 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
00237
00238
00239 if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
00240 {
00241
00242 *pOrg=(unsigned short)value;
00243
00244 }
00245 }
00246 }
00247 }
00248 }
00249
00250 }
00251
00252 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
00253 {
00254
00255 wxBusyCursor wait;
00256
00257 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
00258
00259 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
00260
00261 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
00262
00263 bool inside;
00264 bool volInt, volExt;
00265 int xx,yy,zz;
00266 unsigned short* pOrg;
00267 int ext[6];
00268 double spc[3];
00269 long int contAfter = 0;
00270 long int contBefor = 0;
00271
00272 double value;
00273
00274
00275
00276 copyimage->GetExtent(ext);
00277
00278 for (xx=ext[0];xx<ext[1]; xx++)
00279 {
00280 for (yy=ext[2];yy<ext[3]; yy++)
00281 {
00282 for (zz=ext[4];zz<ext[5];zz++)
00283 {
00284 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
00285 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
00286 {
00287 value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
00288 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
00289
00290 *pOrg=(unsigned short)value;
00291 }
00292 }
00293 }
00294 }
00295
00296 }
00297
00298 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
00299
00300 double *spc = copyimage->GetSpacing();
00301 modeltransform->Identity();
00302
00303 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
00304 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
00305 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
00306 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
00307 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
00308 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
00309 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
00310 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
00311 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
00312 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
00313 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
00314 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
00315 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
00316 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 modeltransform->Update();
00337
00338 return modeltransform;
00339
00340
00341 }
00342 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
00343
00344
00345 double *spc = img->GetSpacing();
00346
00347 currentmatrix->Identity();
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 _boxWidgetVolume->SetTransform(transform);
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378 udapteActorDirection();
00379 getModelTransform(img);
00380
00381 }
00382 vtkTransform* CutModelData::getModelTransformInvers(){
00383 inversModel->Identity ();
00384 inversModel->Concatenate ( modeltransform );
00385 inversModel->Inverse();
00386 return inversModel;
00387 }
00388
00389 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
00390 return _Mapper->GetInput();
00391 }
00392