44 #include <vtkTransform.h>
45 #include <vtkAbstractVolumeMapper.h>
46 #include <vtkVolumeMapper.h>
47 #include <vtkRenderWindow.h>
48 #include <vtkRenderer.h>
49 #include <vtkImageData.h>
50 #include <vtkCommand.h>
51 #include <vtkBoxWidget2.h>
52 #include <vtkBoxWidget.h>
81 virtual void Execute(vtkObject* caller,
unsigned long,
void*)
104 virtual void Execute(vtkObject* caller,
unsigned long,
void*)
124 connect(mActiveImageProxy.get(), SIGNAL(cropBoxChanged()),
this, SLOT(imageCropChangedSlot()));
127 void InteractiveCropper::initialize()
132 mBoxWidget = vtkBoxWidgetPtr::New();
133 mBoxWidget->RotationEnabledOff();
136 { -1, 1, -1, 1, -1, 1 };
137 mBoxWidget->PlaceWidget(bb_hard);
139 mCropBoxCallback = CropBoxCallbackPtr::New();
140 mCropBoxCallback->SetCropper(
this);
141 mCropBoxEnableCallback = CropBoxEnableCallbackPtr::New();
142 mCropBoxEnableCallback->SetCropper(
true,
this);
143 mCropBoxDisableCallback = CropBoxEnableCallbackPtr::New();
144 mCropBoxDisableCallback->SetCropper(
false,
this);
146 mBoxWidget->SetInteractor(mView->getRenderWindow()->GetInteractor());
148 mBoxWidget->SetEnabled(
false);
154 this->updateBoxWidgetInteractor();
157 void InteractiveCropper::updateBoxWidgetInteractor()
166 mBoxWidget->SetInteractor(mView->getRenderWindow()->GetInteractor());
167 mBoxWidget->AddObserver(vtkCommand::InteractionEvent, mCropBoxCallback);
168 mBoxWidget->AddObserver(vtkCommand::EnableEvent, mCropBoxEnableCallback);
169 mBoxWidget->AddObserver(vtkCommand::DisableEvent, mCropBoxDisableCallback);
173 mBoxWidget->RemoveObserver(vtkCommand::InteractionEvent);
174 mBoxWidget->RemoveObserver(vtkCommand::EnableEvent);
175 mBoxWidget->RemoveObserver(vtkCommand::DisableEvent);
189 if (!mImage->getCropping() && on)
192 mBoxWidget->SetEnabled(on);
200 if (!mImage || !mBoxWidget)
202 return mImage->getCroppingBox();
207 this->setCroppingRegion(bb_d);
208 this->setBoxWidgetSize(bb_d);
219 mImage->setCropping(on);
222 void InteractiveCropper::imageCropChangedSlot()
228 this->setBoxWidgetSize(bb_d);
229 this->updateBoxWidgetInteractor();
231 if (!mImage->getCropping())
242 void InteractiveCropper::imageChangedSlot()
245 mImage = mBackend->patientModelService->getActiveImage();
247 this->imageCropChangedSlot();
255 return mImage->getCropping();
262 return mBoxWidget->GetEnabled();
267 std::vector<int> dimensions;
271 double spacing_x = 1;
272 double spacing_y = 1;
273 double spacing_z = 1;
274 mImage->getBaseVtkImageData()->GetSpacing(spacing_x, spacing_y, spacing_z);
277 int dim_x = (bb.begin()[1] - bb.begin()[0])/spacing_x + 1;
278 int dim_y = (bb.begin()[3] - bb.begin()[2])/spacing_y + 1;
279 int dim_z = (bb.begin()[5] - bb.begin()[4])/spacing_z + 1;
280 dimensions.push_back(dim_x);
281 dimensions.push_back(dim_y);
282 dimensions.push_back(dim_z);
291 if (!mImage || !mBoxWidget)
295 { -0.5, 0.5, -0.5, 0.5, -0.5, 0.5 };
296 DoubleBoundingBox3D bb_unit(bb_hard);
302 transform->SetMatrix(M.getVtkMatrix());
303 mBoxWidget->SetTransform(transform);
308 DoubleBoundingBox3D InteractiveCropper::getBoxWidgetSize()
310 if (!mImage || !mBoxWidget)
316 { -0.5, 0.5, -0.5, 0.5, -0.5, 0.5 };
317 DoubleBoundingBox3D bb_unit(bb_hard);
320 mBoxWidget->GetTransform(transform);
331 void InteractiveCropper::setCroppingRegion(DoubleBoundingBox3D bb_d)
335 mImage->setCroppingBox(bb_d);
339 void InteractiveCropper::boxWasShown(
bool val)
351 return mImage->boundingBox();
DoubleBoundingBox3D transform(const Transform3D &m, const DoubleBoundingBox3D &bb)
virtual void Execute(vtkObject *caller, unsigned long, void *)
InteractiveCropper * mCropper
static CropBoxEnableCallback * New()
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
DoubleBoundingBox3D getBoundingBox()
get BB in data space
InteractiveCropper(CoreServicesPtr backend)
boost::shared_ptr< class View > ViewPtr
vtkSmartPointer< class vtkTransform > vtkTransformPtr
void SetCropper(InteractiveCropper *cropper)
Transform3D createTransformNormalize(const DoubleBoundingBox3D &in, const DoubleBoundingBox3D &out)
void useCropping(bool on)
InteractiveCropper * mCropper
bool getShowBoxWidget() const
DoubleBoundingBox3D getMaxBoundingBox()
void showBoxWidget(bool on)
virtual void Execute(vtkObject *caller, unsigned long, void *)
static DoubleBoundingBox3D zero()
Representation of a floating-point bounding box in 3D. The data are stored as {xmin,xmax,ymin,ymax,zmin,zmax}, in order to simplify communication with vtk.
void resetBoundingBox()
set bounding box back to initial size (entire volume)
void setView(ViewPtr view)
adds an interactive box widget to the view. Press 'I' to show
boost::shared_ptr< class CoreServices > CoreServicesPtr
static ActiveImageProxyPtr New(PatientModelServicePtr patientModelService)
void SetCropper(bool val, InteractiveCropper *cropper)
void activeImageChanged(const QString &uid)
The original image changed signal from DataManager.
void setBoundingBox(const DoubleBoundingBox3D &bb_d)
set BB in reference space
static CropBoxCallback * New()
std::vector< int > getDimensions()