MPR Reslice hair cross moving and slicing.

This commit is contained in:
Krad
2023-01-06 13:27:03 +08:00
parent 4090ee188a
commit f67cdd3a5c
6 changed files with 111 additions and 35 deletions

View File

@@ -13,6 +13,7 @@
#include <vtkPropCollection.h> #include <vtkPropCollection.h>
#include <vtkPropPicker.h> #include <vtkPropPicker.h>
#include "Rendering/Core/RenderingDefines.h"
#include "Rendering/Legend/ResliceCursorLegendActor.h" #include "Rendering/Legend/ResliceCursorLegendActor.h"
vtkStandardNewMacro(ResliceImageInteractorStyle) vtkStandardNewMacro(ResliceImageInteractorStyle)
@@ -21,7 +22,7 @@ ResliceImageInteractorStyle::ResliceImageInteractorStyle():vtkInteractorStyleIma
picker = vtkPropPicker::New(); picker = vtkPropPicker::New();
picker->Register(this); picker->Register(this);
picker->Delete(); picker->Delete();
this->InteractionMode = VTKIS_IMAGE2D; this->InteractionMode = VTKIS_IMAGE_SLICING;
SetCurrentImageNumber(0); SetCurrentImageNumber(0);
} }
@@ -61,6 +62,7 @@ void ResliceImageInteractorStyle::OnMouseMove() {
case VTKIS_SLICE: case VTKIS_SLICE:
this->FindPokedRenderer(x, y); this->FindPokedRenderer(x, y);
this->Slice(); this->Slice();
this->InvokeEvent(SliceEvent, nullptr);
this->InvokeEvent(vtkCommand::InteractionEvent, nullptr); this->InvokeEvent(vtkCommand::InteractionEvent, nullptr);
break; break;
} }
@@ -111,7 +113,7 @@ void ResliceImageInteractorStyle::OnLeftButtonDown() {
} }
void ResliceImageInteractorStyle::OnLeftButtonUp() { void ResliceImageInteractorStyle::OnLeftButtonUp() {
this->InvokeEvent(ResliceCursorLegendActor::IMAGE_INTERACT_OFF);
if (this->CurrentProp){ if (this->CurrentProp){
StopCursorInteractive(); StopCursorInteractive();
@@ -121,6 +123,7 @@ void ResliceImageInteractorStyle::OnLeftButtonUp() {
else { else {
vtkInteractorStyleImage::OnLeftButtonUp(); vtkInteractorStyleImage::OnLeftButtonUp();
} }
this->InvokeEvent(ResliceCursorLegendActor::IMAGE_INTERACT_OFF);
} }
void ResliceImageInteractorStyle::NoneStatePick() { void ResliceImageInteractorStyle::NoneStatePick() {

View File

@@ -297,12 +297,8 @@ void ResliceCursorLegendActor::ApplyRoll(vtkRenderer * renderer) {
void ResliceCursorLegendActor::ApplyMove(vtkRenderer * renderer) { void ResliceCursorLegendActor::ApplyMove(vtkRenderer * renderer) {
int *pos = renderer->GetRenderWindow()->GetInteractor()->GetEventPosition(); int *pos = renderer->GetRenderWindow()->GetInteractor()->GetEventPosition();
if (!Moving){ double pt1[4] = {pos[0] + 0.5 ,
LastSliceDisplayPoint[0]=SliceDisplayPoint[0]; pos[1] + 0.5 ,
LastSliceDisplayPoint[1]=SliceDisplayPoint[1];
}
double pt1[4] = {LastSliceDisplayPoint[0]+(pos[0]-DragStartPosition[0]) + 0.5 ,
LastSliceDisplayPoint[1]+(pos[1]-DragStartPosition[1]) + 0.5 ,
0, 0,
1.0}; 1.0};
renderer->SetDisplayPoint(pt1); renderer->SetDisplayPoint(pt1);
@@ -320,7 +316,6 @@ void ResliceCursorLegendActor::ApplyMove(vtkRenderer * renderer) {
if (ReferenceCursor){ if (ReferenceCursor){
ReferenceCursor->SetSlicePoint(intersectPoint); ReferenceCursor->SetSlicePoint(intersectPoint);
} }
this->InvokeEvent(MOVE);
} }
} }
@@ -349,24 +344,6 @@ void ResliceCursorLegendActor::UpdateCursor3DPoint(vtkRenderer * renderer) {
renderer->DisplayToWorld(); renderer->DisplayToWorld();
renderer->GetWorldPoint(worldPt2); renderer->GetWorldPoint(worldPt2);
vtkNew<vtkPlane> plane;
plane->SetOrigin(GetSlicePoint());
plane->SetNormal(GetProjectDirectionVector());
double t;
double wpt_end[4] = {worldPt1[0] + 10000.0 * ProjectDirectionVector[0],
worldPt1[1] + 10000.0 * ProjectDirectionVector[1],
worldPt1[2] + 10000.0 * ProjectDirectionVector[2],
1.0};
double newPt1[4] = {.0,.0,.0,1.};
int ret = plane->IntersectWithLine(worldPt1,wpt_end,t,newPt1);
double wpt_end2[4] = {worldPt2[0] + 10000.0 * ProjectDirectionVector[0],
worldPt2[1] + 10000.0 * ProjectDirectionVector[1],
worldPt2[2] + 10000.0 * ProjectDirectionVector[2],
1.0};
double newPt2[4] = {.0,.0,.0,1.};
ret = plane->IntersectWithLine(worldPt2,wpt_end2,t,newPt2);
double vector[3] = {worldPt2[0]-worldPt1[0],worldPt2[1]-worldPt1[1],worldPt2[2]-worldPt1[2]}; double vector[3] = {worldPt2[0]-worldPt1[0],worldPt2[1]-worldPt1[1],worldPt2[2]-worldPt1[2]};
vtkMath::Cross(vector, GetProjectDirectionVector(), vector); vtkMath::Cross(vector, GetProjectDirectionVector(), vector);
this->SetSliceDirectionVector(vector); this->SetSliceDirectionVector(vector);

View File

@@ -22,6 +22,7 @@
#include "Rendering/Legend/FastCornerAnnotationActor.h" #include "Rendering/Legend/FastCornerAnnotationActor.h"
#include "Rendering/Legend/ResliceSquareLegendActor.h" #include "Rendering/Legend/ResliceSquareLegendActor.h"
#include "Interaction/ResliceImageInteractorStyle.h" #include "Interaction/ResliceImageInteractorStyle.h"
#include "Rendering/Core/RenderingDefines.h"
namespace { namespace {
void GetDirectionString(const double *directionVector, std::string &str) { void GetDirectionString(const double *directionVector, std::string &str) {
@@ -224,8 +225,10 @@ void ResliceImageViewer::Render() {
cursor2->SetSliceDirectionVector(sliceDirection2); cursor2->SetSliceDirectionVector(sliceDirection2);
this->InteractorStyle->AddObserver(ResliceCursorLegendActor::MOUSE_FREE_MOVE,this,&ResliceImageViewer::updateHandle); this->InteractorStyle->AddObserver(ResliceCursorLegendActor::MOUSE_FREE_MOVE,this,&ResliceImageViewer::updateHandle);
this->InteractorStyle->AddObserver(ResliceCursorLegendActor::IMAGE_INTERACT_ON,cursor1,&ResliceCursorLegendActor::ActiveControlPointOff); this->InteractorStyle->AddObserver(ResliceCursorLegendActor::IMAGE_INTERACT_ON,cursor1,&ResliceCursorLegendActor::ActiveControlPointOff);
this->InteractorStyle->AddObserver(ResliceCursorLegendActor::IMAGE_INTERACT_ON,this,&ResliceImageViewer::InvokeClick);
this->InteractorStyle->AddObserver(ResliceCursorLegendActor::IMAGE_INTERACT_OFF,this,&ResliceImageViewer::ResetHandle); this->InteractorStyle->AddObserver(ResliceCursorLegendActor::IMAGE_INTERACT_OFF,this,&ResliceImageViewer::ResetHandle);
this->InteractorStyle->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageViewer::EndDrag); this->InteractorStyle->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageViewer::EndDrag);
this->InteractorStyle->AddObserver(SliceEvent,this, &ResliceImageViewer::SliceCallback);
this->RenderWindow->AddObserver(vtkCommand::WindowResizeEvent,this,&ResliceImageViewer::handleResize); this->RenderWindow->AddObserver(vtkCommand::WindowResizeEvent,this,&ResliceImageViewer::handleResize);
cursor1->AddObserver(ResliceCursorLegendActor::ROLL,this, &ResliceImageViewer::handleRoll); cursor1->AddObserver(ResliceCursorLegendActor::ROLL,this, &ResliceImageViewer::handleRoll);
@@ -328,7 +331,32 @@ void ResliceImageViewer::ChangeSliceNormal(double *normal) {
} }
void ResliceImageViewer::ChangeSlicePoint(double *point) { void ResliceImageViewer::ChangeSlicePoint(double *point) {
SetCameraFocalPoint(point);
//avoid cursor update by camera modified
cursor1->SetSlicePoint(point);
cursor2->SetSlicePoint(point);
}
void ResliceImageViewer::SetCameraFocalPoint(const double *point) const {
auto camera = Renderer->GetActiveCamera();
double focalPt[3] = {.0, .0, .0};
camera->GetFocalPoint(focalPt);
double position[3] = {.0, .0, .0};
camera->GetPosition(position);
double vector[3] = {point[0] - focalPt[0],
point[1] - focalPt[1],
point[2] - focalPt[2]};
for (int i = 0; i < 3; ++i) {
position[i] += vector[i];
}
camera->SetPosition(position);
camera->SetFocalPoint(point);
Renderer->ResetCameraClippingRange();
}
void ResliceImageViewer::AdjustCameraFollowCursor() {
this->SetCameraFocalPoint(this->GetCursorSlicePoint());
Render();
} }
void ResliceImageViewer::UpdateSliceCursor() { void ResliceImageViewer::UpdateSliceCursor() {
@@ -336,7 +364,7 @@ void ResliceImageViewer::UpdateSliceCursor() {
cursor1->UpdateCursor3DPoint(Renderer); cursor1->UpdateCursor3DPoint(Renderer);
cursor2->SetProjectDirectionVector(Renderer->GetActiveCamera()->GetDirectionOfProjection()); cursor2->SetProjectDirectionVector(Renderer->GetActiveCamera()->GetDirectionOfProjection());
cursor2->UpdateCursor3DPoint(Renderer); cursor2->UpdateCursor3DPoint(Renderer);
Renderer->Render(); Render();
} }
void ResliceImageViewer::EndDrag() { void ResliceImageViewer::EndDrag() {
@@ -389,3 +417,25 @@ void ResliceImageViewer::ResetHandle() {
cursor1->UpdateMousePosition(pos); cursor1->UpdateMousePosition(pos);
cursor2->UpdateMousePosition(pos); cursor2->UpdateMousePosition(pos);
} }
void ResliceImageViewer::SetChecked(bool checked) {
if (Square->GetChecked()!= checked){
Square->SetChecked(checked);
Render();
}
}
void ResliceImageViewer::InvokeClick() {
this->InvokeEvent(vtkCommand::LeftButtonPressEvent);
}
void ResliceImageViewer::SliceCallback() {
if (this->InteractorStyle->GetState() == VTKIS_SLICE)
{
auto camera = Renderer->GetActiveCamera();
cursor1->SetSlicePoint(camera->GetFocalPoint());
cursor2->SetSlicePoint(camera->GetFocalPoint());
this->InvokeEvent(SliceEvent);
}
}

View File

@@ -6,6 +6,7 @@
#define OMEGAV_RESLICEIMAGEVIEWER_H #define OMEGAV_RESLICEIMAGEVIEWER_H
#include "vtkObject.h" #include "vtkObject.h"
#include "vtkCommand.h"
class vtkImageData; class vtkImageData;
@@ -54,7 +55,11 @@ public:
void ChangeSliceNormal(double * normal); void ChangeSliceNormal(double * normal);
void EndDrag(); void EndDrag();
void UpdateSliceCursor(); void UpdateSliceCursor();
void AdjustCameraFollowCursor();
void SetChecked(bool checked);
void InvokeClick();
void SliceCallback();
protected: protected:
ResliceImageViewer(); ResliceImageViewer();
@@ -91,6 +96,8 @@ private:
vtkMatrix4x4* OrientationMatrix; vtkMatrix4x4* OrientationMatrix;
int DefaultOrientation; int DefaultOrientation;
bool FirstRender; bool FirstRender;
void SetCameraFocalPoint(const double *point) const;
}; };

View File

@@ -8,6 +8,7 @@
#include "Rendering/Viewer/ResliceImageViewer.h" #include "Rendering/Viewer/ResliceImageViewer.h"
#include "Rendering/Legend/ResliceCursorLegendActor.h" #include "Rendering/Legend/ResliceCursorLegendActor.h"
#include "Rendering/Core/RenderingDefines.h"
ResliceImageManager::ResliceImageManager(QObject *parent) : QObject(parent) { ResliceImageManager::ResliceImageManager(QObject *parent) : QObject(parent) {
@@ -34,9 +35,18 @@ void ResliceImageManager::InitEvents() {
viewerA->AddObserver(ResliceCursorLegendActor::ROLL,this,&ResliceImageManager::RollCallback); viewerA->AddObserver(ResliceCursorLegendActor::ROLL,this,&ResliceImageManager::RollCallback);
viewerS->AddObserver(ResliceCursorLegendActor::ROLL,this,&ResliceImageManager::RollCallback); viewerS->AddObserver(ResliceCursorLegendActor::ROLL,this,&ResliceImageManager::RollCallback);
viewerC->AddObserver(ResliceCursorLegendActor::ROLL,this,&ResliceImageManager::RollCallback); viewerC->AddObserver(ResliceCursorLegendActor::ROLL,this,&ResliceImageManager::RollCallback);
viewerA->AddObserver(ResliceCursorLegendActor::MOVE,this,&ResliceImageManager::MoveCallback);
viewerS->AddObserver(ResliceCursorLegendActor::MOVE,this,&ResliceImageManager::MoveCallback);
viewerC->AddObserver(ResliceCursorLegendActor::MOVE,this,&ResliceImageManager::MoveCallback);
viewerA->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageManager::EndDrag); viewerA->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageManager::EndDrag);
viewerS->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageManager::EndDrag); viewerS->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageManager::EndDrag);
viewerC->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageManager::EndDrag); viewerC->AddObserver(ResliceCursorLegendActor::END_DRAG,this,&ResliceImageManager::EndDrag);
viewerA->AddObserver(vtkCommand::LeftButtonPressEvent,this,&ResliceImageManager::ClickCallback);
viewerS->AddObserver(vtkCommand::LeftButtonPressEvent,this,&ResliceImageManager::ClickCallback);
viewerC->AddObserver(vtkCommand::LeftButtonPressEvent,this,&ResliceImageManager::ClickCallback);
viewerA->AddObserver(SliceEvent,this,&ResliceImageManager::MoveCallback);
viewerS->AddObserver(SliceEvent,this,&ResliceImageManager::MoveCallback);
viewerC->AddObserver(SliceEvent,this,&ResliceImageManager::MoveCallback);
} }
void ResliceImageManager::RollCallback(vtkObject *sender, unsigned long eventID, void *data) { void ResliceImageManager::RollCallback(vtkObject *sender, unsigned long eventID, void *data) {
@@ -64,20 +74,46 @@ void ResliceImageManager::RollCallback(vtkObject *sender, unsigned long eventID,
} }
void ResliceImageManager::EndDrag(vtkObject *sender, unsigned long eventID, void *data) { void ResliceImageManager::MoveCallback(vtkObject *sender, unsigned long eventID, void *data) {
auto viewer = ResliceImageViewer::SafeDownCast(sender); auto viewer = ResliceImageViewer::SafeDownCast(sender);
if (viewer){ if (viewer){
if (viewer!=viewerA){ if (viewer!=viewerA){
viewerA->UpdateSliceCursor(); viewerA->ChangeSlicePoint(viewer->GetCursorSlicePoint());
viewerA->Render(); viewerA->Render();
} }
if (viewer!=viewerC){
viewerC->UpdateSliceCursor();
viewerC->Render();
}
if (viewer!=viewerS){ if (viewer!=viewerS){
viewerS->UpdateSliceCursor(); viewerS->ChangeSlicePoint(viewer->GetCursorSlicePoint());
viewerS->Render(); viewerS->Render();
} }
if (viewer!=viewerC){
viewerC->ChangeSlicePoint(viewer->GetCursorSlicePoint());
viewerC->Render();
}
} }
} }
void ResliceImageManager::EndDrag(vtkObject *sender, unsigned long eventID, void *data) {
auto viewer = ResliceImageViewer::SafeDownCast(sender);
if (viewer){
viewer->AdjustCameraFollowCursor();
if (viewer!=viewerA){
viewerA->UpdateSliceCursor();
}
if (viewer!=viewerC){
viewerC->UpdateSliceCursor();
}
if (viewer!=viewerS){
viewerS->UpdateSliceCursor();
}
}
}
void ResliceImageManager::ClickCallback(vtkObject *sender, unsigned long eventID, void *data) {
auto viewer = ResliceImageViewer::SafeDownCast(sender);
if (viewer){
viewerA->SetChecked(viewer==viewerA);
viewerS->SetChecked(viewer==viewerS);
viewerC->SetChecked(viewer==viewerC);
}
}

View File

@@ -28,6 +28,9 @@ private:
ResliceImageViewer * viewerC; ResliceImageViewer * viewerC;
void RollCallback(vtkObject* sender, unsigned long eventID, void* data); void RollCallback(vtkObject* sender, unsigned long eventID, void* data);
void MoveCallback(vtkObject* sender, unsigned long eventID, void* data);
void ClickCallback(vtkObject* sender, unsigned long eventID, void* data);
// void SliceCallback(vtkObject* sender, unsigned long eventID, void* data);
void EndDrag(vtkObject* sender, unsigned long eventID, void* data); void EndDrag(vtkObject* sender, unsigned long eventID, void* data);
}; };