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
00041 CutModelData::~CutModelData(){
00042 checkInvariant();
00043 _boxWidgetVolume->RemoveAllObservers();
00044 _boxWidgetVolume->Off();
00045 _boxWidgetVolume->SetInteractor(NULL);
00046 _boxWidgetVolume->Delete();
00047 _Mapper->Delete();
00048 _Actor->Delete();
00049 delete _cubefigure;
00050 delete _cylinderfigure;
00051 delete _spherefigure;
00052 currentmatrix->Delete();
00053 modeltransform->Delete();
00054 inversModel->Delete();
00055 _id = -1;
00056 }
00057
00058 void CutModelData::RefreshViewBox(){
00059
00060 }
00061 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
00062 _boxWidgetVolume = vtkBoxWidget::New();
00063 _boxWidgetVolume->SetInteractor( interactor );
00064
00065
00066
00067
00068 _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent , observer );
00069 _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent , observer );
00070 _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent , observer );
00071
00072 _boxWidgetVolume->HandlesOn ();
00073 _boxWidgetVolume->On();
00074
00075
00076 }
00077
00078 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
00079
00080 currentmatrix = vtkTransform::New();
00081 modeltransform = vtkTransform::New();
00082 inversModel = vtkTransform::New();
00083
00084 vtkMatrix4x4* matrix = vtkMatrix4x4::New();
00085 matrix->Identity();
00086 int *ext = img->GetExtent();
00087 double *spc = img->GetSpacing();
00088
00089 matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
00090 matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);
00091 matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
00092
00093 double orgx = (ext[1]-ext[0])/2*spc[0];
00094 double orgy = (ext[3]-ext[2])/2*spc[1];
00095 double orgz = (ext[5]-ext[4])/2*spc[2];
00096
00097 matrix->SetElement(0,3,orgx);
00098 matrix->SetElement(1,3,orgy);
00099 matrix->SetElement(2,3,orgz);
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
00121 void CutModelData::createShapes(){
00122 _cubefigure = new CutModelFigureCube();
00123 _cylinderfigure = new CutModelFigureCylinder();
00124 _spherefigure = new CutModelFigureSphere();
00125 }
00126
00127 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
00128 checkInvariant();
00129 _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
00130 }
00131
00132 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
00133 checkInvariant();
00134 if(check){
00135 _boxWidgetVolume->On();
00136 }else{
00137 _boxWidgetVolume->Off();
00138 }
00139 }
00140
00141 void CutModelData::ChangeShape(int selection)throw( CutModelException){
00142 checkInvariant();
00143
00144 if(selection == 0){
00145 _Mapper->SetInput(_spherefigure->getPolyData());
00146 }else if(selection == 1){
00147 _Mapper->SetInput(_cylinderfigure->getPolyData());
00148 }else if(selection == 2){
00149 _Mapper->SetInput(_cubefigure->getPolyData());
00150 }else{
00151 throw CutModelException("Shape type not found");
00152 }
00153 _currentshape=selection;
00154 }
00155
00156 void CutModelData::checkInvariant()throw( CutModelException){
00157 if(_boxWidgetVolume==NULL){
00158 throw CutModelException("Box Widget not created");
00159 }
00160 if(_Mapper==NULL){
00161 throw CutModelException("Mapper not created");
00162 }
00163 if(_Actor==NULL){
00164 throw CutModelException("Actor not created");
00165 }
00166 if(_cubefigure==NULL){
00167 throw CutModelException("Cube not created");
00168 }
00169 if(_cylinderfigure==NULL){
00170 throw CutModelException("Cylinder not created");
00171 }
00172 if(_spherefigure==NULL){
00173 throw CutModelException("Sphere not created");
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
00187 CutModelFigure* CutModelData::getCurentCuttingModel(){
00188 checkInvariant();
00189
00190 if(_currentshape == 0){
00191 return _spherefigure;
00192 }else if(_currentshape == 1){
00193 return _cylinderfigure;
00194 }else if(_currentshape == 2){
00195 return _cubefigure;
00196 }else{
00197 throw CutModelException("Shape type not found");
00198 }
00199 }
00200
00201 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
00202 {
00203 wxBusyCursor wait;
00204
00205 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
00206
00207
00208 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
00209
00210 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
00211
00212 bool inside;
00213
00214 int xx,yy,zz;
00215 unsigned short* pOrg;
00216 int ext[6];
00217
00218
00219
00220
00221 double minvalue = range[0];
00222 double value = range[1];
00223 double maxvalue = range[2];
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 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
00252 {
00253 wxBusyCursor wait;
00254
00255 CutModelFigure* actualCuttingModel = getCurentCuttingModel();
00256
00257 actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
00258
00259 actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());
00260
00261 bool inside;
00262
00263 int xx,yy,zz;
00264 unsigned short* pOrg;
00265 int ext[6];
00266
00267
00268
00269
00270 double value;
00271
00272 copyimage->GetExtent(ext);
00273
00274 for (xx=ext[0];xx<ext[1]; xx++)
00275 {
00276 for (yy=ext[2];yy<ext[3]; yy++)
00277 {
00278 for (zz=ext[4];zz<ext[5];zz++)
00279 {
00280 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
00281 if ( ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
00282 {
00283 value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
00284 pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz);
00285
00286 *pOrg=(unsigned short)value;
00287 }
00288 }
00289 }
00290 }
00291 }
00292
00293 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
00294
00295 double *spc = copyimage->GetSpacing();
00296 modeltransform->Identity();
00297
00298 vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
00299 vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
00300 matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
00301 matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
00302 matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
00303 matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
00304 matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
00305 matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
00306 matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
00307 matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
00308 matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);
00309 matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
00310 matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
00311 matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 modeltransform->Update();
00329
00330 return modeltransform;
00331 }
00332
00333 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
00334
00335
00336
00337 currentmatrix->Identity();
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350 _boxWidgetVolume->SetTransform(transform);
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367 udapteActorDirection();
00368 getModelTransform(img);
00369 }
00370
00371 vtkTransform* CutModelData::getModelTransformInvers(){
00372 inversModel->Identity ();
00373 inversModel->Concatenate ( modeltransform );
00374 inversModel->Inverse();
00375 return inversModel;
00376 }
00377
00378 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
00379 return _Mapper->GetInput();
00380 }
00381