X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkDicomRTStruct2ImageFilter.cxx;h=86052170850c9a373294bb686574d60c94ce0d1f;hb=b99fac059ebc47ce7b243dc9d802b23d730e7100;hp=20a4b7009c14e8707b080b1225a615130ceec9b5;hpb=3a823a03d4a2217e41e4dd3b05a8ea825bb762a5;p=clitk.git diff --git a/common/clitkDicomRTStruct2ImageFilter.cxx b/common/clitkDicomRTStruct2ImageFilter.cxx index 20a4b70..8605217 100644 --- a/common/clitkDicomRTStruct2ImageFilter.cxx +++ b/common/clitkDicomRTStruct2ImageFilter.cxx @@ -31,7 +31,6 @@ #include #include #include -#include //-------------------------------------------------------------------- @@ -103,10 +102,15 @@ void clitk::DicomRTStruct2ImageFilter::SetImage(vvImage::Pointer image) mSpacing.resize(3); mOrigin.resize(3); mSize.resize(3); + mDirection.resize(3); + mTransformMatrix = image->GetTransform()[0]->GetMatrix(); for(unsigned int i=0; i<3; i++) { mSpacing[i] = image->GetSpacing()[i]; mOrigin[i] = image->GetOrigin()[i]; mSize[i] = image->GetSize()[i]; + mDirection[i].resize(3); + for(unsigned int j=0; j<3; j++) + mDirection[i][j] = image->GetDirection()[i][j]; } } //-------------------------------------------------------------------- @@ -126,10 +130,14 @@ void clitk::DicomRTStruct2ImageFilter::SetImageFilename(std::string f) mSpacing.resize(3); mOrigin.resize(3); mSize.resize(3); + mDirection.resize(3); for(unsigned int i=0; i<3; i++) { mSpacing[i] = header->GetSpacing(i); mOrigin[i] = header->GetOrigin(i); mSize[i] = header->GetDimensions(i); + mDirection[i].resize(3); + for(unsigned int j=0; j<3; j++) + mDirection[i][j] = header->GetDirection(i)[j]; } } //-------------------------------------------------------------------- @@ -172,11 +180,43 @@ void clitk::DicomRTStruct2ImageFilter::Update() } // Get Mesh - vtkPolyData * mesh = mROI->GetMesh(); + vtkPolyData * mesh = mROI->GetMesh(); // Get bounds double *bounds=mesh->GetBounds(); + //Change mOrigin, mSize and mSpacing with respect to the directions + // Spacing is influenced by input direction + std::vector tempSpacing; + tempSpacing.resize(3); + for(int i=0; i<3; i++) { + tempSpacing[i] = 0.0; + for(int j=0; j<3; j++) { + tempSpacing[i] += mDirection[i][j] * mSpacing[j]; + } + } + for(int i=0; i<3; i++) + mSpacing[i] = tempSpacing[i]; + + // Size is influenced by affine transform matrix and input direction + // Size is converted to double, transformed and converted back to size type. + std::vector tempSize; + tempSize.resize(3); + for(int i=0; i<3; i++) { + tempSize[i] = 0.0; + for(int j=0; j<3; j++) { + tempSize[i] += mDirection[i][j] * mSize[j]; + } + } + for(int i=0; i<3; i++) { + if (tempSize[i] < 0.0) { + tempSize[i] *= -1; + mOrigin[i] += mSpacing[i]*(tempSize[i] -1); + mSpacing[i] *= -1; + } + mSize[i] = lrint(tempSize[i]); + } + // Compute origin std::vector origin; origin.resize(3); @@ -190,7 +230,6 @@ void clitk::DicomRTStruct2ImageFilter::Update() extend[0] = ceil((bounds[1]-origin[0])/mSpacing[0]+4); extend[1] = ceil((bounds[3]-origin[1])/mSpacing[1]+4); extend[2] = ceil((bounds[5]-origin[2])/mSpacing[2]+4); - // If no crop, set initial image size/origin if (!mCropMask) { for(int i=0; i<3; i++) { @@ -203,18 +242,15 @@ void clitk::DicomRTStruct2ImageFilter::Update() mBinaryImage = vtkSmartPointer::New(); #if VTK_MAJOR_VERSION <= 5 mBinaryImage->SetScalarTypeToUnsignedChar(); +#endif mBinaryImage->SetOrigin(&origin[0]); mBinaryImage->SetSpacing(&mSpacing[0]); mBinaryImage->SetExtent(0, extend[0], 0, extend[1], 0, extend[2]); +#if VTK_MAJOR_VERSION <= 5 mBinaryImage->AllocateScalars(); #else - mBinaryImage->SetOrigin(&origin[0]); - mBinaryImage->SetSpacing(&mSpacing[0]); - mBinaryImage->SetExtent(0, extend[0], - 0, extend[1], - 0, extend[2]); mBinaryImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1); #endif @@ -240,7 +276,7 @@ void clitk::DicomRTStruct2ImageFilter::Update() #if VTK_MAJOR_VERSION <= 5 sts->SetInput(extrude->GetOutput()); #else - sts->SetInputData(extrude->GetOutput()); + sts->SetInputConnection(extrude->GetOutputPort(0)); #endif //sts->SetInput(mesh); @@ -248,7 +284,7 @@ void clitk::DicomRTStruct2ImageFilter::Update() #if VTK_MAJOR_VERSION <= 5 stencil->SetStencil(sts->GetOutput()); #else - stencil->SetStencilData(sts->GetOutput()); + stencil->SetStencilConnection(sts->GetOutputPort(0)); #endif #if VTK_MAJOR_VERSION <= 5 stencil->SetInput(mBinaryImage);