Add reslice size fit window (When orthogonal slice)

This commit is contained in:
Krad
2022-12-29 13:14:52 +08:00
parent 5d51716405
commit 6b096c9d60
2 changed files with 27 additions and 7 deletions

View File

@@ -26,6 +26,7 @@ ResliceImageViewer::ResliceImageViewer()
: vtkObject() : vtkObject()
, RenderWindow(nullptr) , RenderWindow(nullptr)
, Renderer(vtkRenderer::New()) , Renderer(vtkRenderer::New())
, MeasureRenderer(vtkRenderer::New())
, InteractorStyle(ResliceImageInteractorStyle::New()) , InteractorStyle(ResliceImageInteractorStyle::New())
, Interactor(nullptr) , Interactor(nullptr)
, Mapper(vtkImageResliceMapper::New()) , Mapper(vtkImageResliceMapper::New())
@@ -145,12 +146,18 @@ void ResliceImageViewer::Render() {
if (FirstRender){ if (FirstRender){
//some first render logic //some first render logic
FirstRender = false; FirstRender = false;
Renderer->AddActor2D(cursor1); MeasureRenderer->SetActiveCamera(Renderer->GetActiveCamera());
Renderer->AddActor2D(cursor2); RenderWindow->AddRenderer(MeasureRenderer);
cursor1->SetSlicePoint(Renderer->GetActiveCamera()->GetFocalPoint()); MeasureRenderer->Delete();
cursor2->SetSlicePoint(Renderer->GetActiveCamera()->GetFocalPoint()); RenderWindow->SetNumberOfLayers(2);
cursor1->SetProjectDirectionVector(Renderer->GetActiveCamera()->GetDirectionOfProjection()); Renderer->SetLayer(0);
cursor2->SetProjectDirectionVector(Renderer->GetActiveCamera()->GetDirectionOfProjection()); MeasureRenderer->SetLayer(1);
MeasureRenderer->AddActor2D(cursor1);
MeasureRenderer->AddActor2D(cursor2);
cursor1->SetSlicePoint(MeasureRenderer->GetActiveCamera()->GetFocalPoint());
cursor2->SetSlicePoint(MeasureRenderer->GetActiveCamera()->GetFocalPoint());
cursor1->SetProjectDirectionVector(MeasureRenderer->GetActiveCamera()->GetDirectionOfProjection());
cursor2->SetProjectDirectionVector(MeasureRenderer->GetActiveCamera()->GetDirectionOfProjection());
double sliceDirection1[4]{.0, .0, .0, 1.}; double sliceDirection1[4]{.0, .0, .0, 1.};
double sliceDirection2[4]{.0, .0, .0, 1.}; double sliceDirection2[4]{.0, .0, .0, 1.};
switch (DefaultOrientation) { switch (DefaultOrientation) {
@@ -192,8 +199,9 @@ void ResliceImageViewer::Render() {
cursor1->AddObserver(ResliceCursorLegendActor::MOVE,this, &ResliceImageViewer::handleMove); cursor1->AddObserver(ResliceCursorLegendActor::MOVE,this, &ResliceImageViewer::handleMove);
cursor2->AddObserver(ResliceCursorLegendActor::ROLL,this, &ResliceImageViewer::handleRoll); cursor2->AddObserver(ResliceCursorLegendActor::ROLL,this, &ResliceImageViewer::handleRoll);
cursor2->AddObserver(ResliceCursorLegendActor::MOVE,this, &ResliceImageViewer::handleMove); cursor2->AddObserver(ResliceCursorLegendActor::MOVE,this, &ResliceImageViewer::handleMove);
Renderer->AddActor2D(Square); MeasureRenderer->AddActor2D(Square);
Render(); Render();
return; return;
} }
Interactor->Render(); Interactor->Render();
@@ -230,6 +238,7 @@ void ResliceImageViewer::SetDefaultSliceOrientation(int orientation) {
camera->SetPosition(position); camera->SetPosition(position);
camera->SetViewUp(ViewUp); camera->SetViewUp(ViewUp);
Renderer->ResetCamera(); Renderer->ResetCamera();
AdjustOrthogonalScale();
} }
void ResliceImageViewer::SetCoordsTransformMatrix(vtkMatrix4x4 *matrix4X4) { void ResliceImageViewer::SetCoordsTransformMatrix(vtkMatrix4x4 *matrix4X4) {
@@ -300,3 +309,13 @@ void ResliceImageViewer::handleResize() {
cursor1->Modified(); cursor1->Modified();
cursor2->Modified(); cursor2->Modified();
} }
void ResliceImageViewer::AdjustOrthogonalScale() {
vtkCamera* camera = Renderer->GetActiveCamera();
double * viewUp = camera->GetViewUp();
vtkImageData * data = Mapper->GetInput();
int index = abs(((int)viewUp[0]) * 0 + ((int)viewUp[1]) * 1 + ((int)viewUp[2]) * 2);
double pixelScale = data->GetDimensions()[index]*data->GetSpacing()[index];
camera->SetParallelScale(pixelScale/2-3);
}

View File

@@ -47,6 +47,7 @@ public:
double* GetCursorSliceDirection1(); double* GetCursorSliceDirection1();
double* GetCursorSliceDirection2(); double* GetCursorSliceDirection2();
void AdjustOrthogonalScale();
void ChangeSlicePoint(double * point); void ChangeSlicePoint(double * point);
void ChangeSliceNormal(double * normal); void ChangeSliceNormal(double * normal);
void EndDrag(); void EndDrag();