MPR Reslice hair cross moving and slicing.
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user