[vtkusers] ImageReslice question - Grad student in need of graduation!
Ken Urish
ken.urish at gmail.com
Thu May 1 17:40:49 EDT 2008
Help!
Ive been stuck on this for a while now. I am viewing a 3d dicom image
slice by slice based off teh the "ImageReslice1.cxx" example with teh
imageReslice class.
I am trying to pick 3d points on the image. I can pick x,y points
fine. BUt I have no way to figure out where I am on teh z-axis.
Ive been having trouble so Ive just been trying to get the program to
output the z-slice I am on when I hit a right mouse click. It give me
a number that does not change and is incorrect.
I threw an actor into the callback to see if I could call "GetZSlice"
but this always gives me a "0". Similarly if I try to see my bounds or
set bounds off the actor, nothing works. Ive lost a week on this
really simple step and it driving me up the wall.
Thanks
--Ken--
The code for the callback is below.
// The mouse motion callback, to turn "Slicing" on and off
class vtkImageInteractionCallback : public vtkCommand
{
public:
static vtkImageInteractionCallback *New() {
return new vtkImageInteractionCallback; };
vtkImageInteractionCallback() {
this->Slicing = 0;
this->ImageReslice = 0;
this->Interactor = 0; };
void SetImageReslice(vtkImageReslice *reslice) {
this->ImageReslice = reslice; };
void SetACtor(vtkImageActor *actor) {
this->Actor = actor; };
vtkImageReslice *GetImageReslice() {
return this->ImageReslice; };
vtkImageActor *GetImageActor() {
return this->Actor; };
void SetInteractor(vtkRenderWindowInteractor *interactor) {
this->Interactor = interactor; };
vtkRenderWindowInteractor *GetInteractor() {
return this->Interactor; };
virtual void Execute(vtkObject *, unsigned long event, void *)
{
vtkRenderWindowInteractor *interactor = this->GetInteractor();
int lastPos[2];
interactor->GetLastEventPosition(lastPos);
int currPos[2];
interactor->GetEventPosition(currPos);
if (event == vtkCommand::LeftButtonPressEvent)
{
this->Slicing = 1;
}
else if (event == vtkCommand::LeftButtonReleaseEvent)
{
this->Slicing = 0;
}
else if (event == vtkCommand::MouseMoveEvent)
{
if (this->Slicing)
{
vtkImageReslice *reslice = this->ImageReslice;
// Increment slice position by deltaY of mouse
int deltaY = lastPos[1] - currPos[1];
reslice->GetOutput()->UpdateInformation();
double sliceSpacing = reslice->GetOutput()->GetSpacing()[2];
vtkMatrix4x4 *matrix = reslice->GetResliceAxes();
// move the center point that we are slicing through
double point[4];
double center[4];
point[0] = 0.0;
point[1] = 0.0;
point[2] = sliceSpacing * deltaY;
point[3] = 1.0;
matrix->MultiplyPoint(point, center);
matrix->SetElement(0, 3, center[0]);
matrix->SetElement(1, 3, center[1]);
matrix->SetElement(2, 3, center[2]);
int z = actor->GetZSlice();
interactor->Render();
}
else
{
vtkInteractorStyle *style = vtkInteractorStyle::SafeDownCast(
interactor->GetInteractorStyle());
if (style)
{
style->OnMouseMove();
}
}
}
};
More information about the vtkusers
mailing list