From 4381dee4ff44c96c8967c54bfdd63ed60326661e Mon Sep 17 00:00:00 2001 From: Krad Date: Mon, 8 Aug 2022 10:04:27 +0800 Subject: [PATCH] Change ReferenceLineLegendActor render logic and display effect. --- .../Legend/ReferenceLineLegendActor.cpp | 68 ++++++++++++++----- .../Legend/ReferenceLineLegendActor.h | 9 +-- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/src/Rendering/Legend/ReferenceLineLegendActor.cpp b/src/src/Rendering/Legend/ReferenceLineLegendActor.cpp index 86ac25f..1c06583 100644 --- a/src/src/Rendering/Legend/ReferenceLineLegendActor.cpp +++ b/src/src/Rendering/Legend/ReferenceLineLegendActor.cpp @@ -12,25 +12,38 @@ #include #include #include +#include vtkStandardNewMacro(ReferenceLineLegendActor) ReferenceLineLegendActor::ReferenceLineLegendActor() { this->PickableOff(); actor2D = vtkActor2D::New(); + shadow2D = vtkActor2D::New(); actor2D->PickableOff(); vtkNew mapper; + vtkNew mapper2; actor2D->SetMapper(mapper); + shadow2D->SetMapper(mapper2); actor2D->GetProperty()->SetLineWidth(1.0); - actor2D->GetProperty()->SetColor(1.0, 0.0, 0.0); + //马尔斯绿 + actor2D->GetProperty()->SetColor(0.004, 0.515, 0.5); + shadow2D->GetProperty()->SetColor(0.0, 0.0, 0.0); + shadow2D->GetProperty()->SetLineWidth(3.0); + linePoints->SetNumberOfPoints(4); } ReferenceLineLegendActor::~ReferenceLineLegendActor() { + vtkPolyDataMapper2D::SafeDownCast(actor2D->GetMapper())->SetInputData(nullptr); actor2D->Delete(); actor2D = nullptr; + vtkPolyDataMapper2D::SafeDownCast(shadow2D->GetMapper())->SetInputData(nullptr); + shadow2D->Delete(); + shadow2D = nullptr; } void ReferenceLineLegendActor::ReleaseGraphicsResources(vtkWindow *window) { + shadow2D->ReleaseGraphicsResources(window); actor2D->ReleaseGraphicsResources(window); } @@ -38,26 +51,47 @@ int ReferenceLineLegendActor::RenderOverlay(vtkViewport *viewport) { auto renderer = vtkRenderer::SafeDownCast(viewport); if (!renderer) return 0; BuildShape(renderer); + shadow2D->RenderOverlay(viewport); return actor2D->RenderOverlay(viewport); } void ReferenceLineLegendActor::BuildShape(vtkRenderer *renderer) { - //reference line 暂时不用考虑缩放问题 + if(mModifyTime == MTime)return; vtkNew pts; - vtkNew lines; - vtkIdType ids[2] = {0, 1}; - double p[3] = {.0, .0, .0}; - renderer->SetWorldPoint(linePoints->GetPoint(0)); - renderer->WorldToDisplay(); - renderer->GetDisplayPoint(p); - ids[0] = pts->InsertNextPoint(p); - renderer->SetWorldPoint(linePoints->GetPoint(1)); - renderer->WorldToDisplay(); - renderer->GetDisplayPoint(p); - ids[1] = pts->InsertNextPoint(0, 2.5, 0.0); - lines->InsertNextCell(2, ids); - - renderData->SetPoints(pts); - renderData->SetLines(lines); + for(vtkIdType i = 0; iGetNumberOfPoints(); ++i) + { + double p[3] = {.0, .0, .0}; + renderer->SetWorldPoint(linePoints->GetPoint(i)); + renderer->WorldToDisplay(); + renderer->GetDisplayPoint(p); + pts->InsertNextPoint(p); + } + double p1[3] = {.0, .0, .0}; + double p2[3] = {.0, .0, .0}; + pts->GetPoint(0, p1); + pts->GetPoint(1, p1); + double dis2 = vtkMath::Distance2BetweenPoints(p1,p2); + pts->GetPoint(2, p1); + pts->GetPoint(3, p1); + double dis2_2 = vtkMath::Distance2BetweenPoints(p1,p2); + vtkNew displayPts; + if (dis2>dis2_2){ + pts->GetPoint(0,p1); + pts->GetPoint(1, p2); + displayPts->InsertNextPoint(round(p1[0])+0.5,round(p1[1])+0.5, round(p1[2])+0.5 ); + displayPts->InsertNextPoint( round(p2[0])+0.5,round(p2[1])+0.5, round(p2[2])+0.5); + } + else{ + pts->GetPoint(2,p1); + pts->GetPoint(3, p2); + displayPts->InsertNextPoint( round(p1[0])+0.5,round(p1[1])+0.5, round(p1[2])+0.5); + displayPts->InsertNextPoint( round(p2[0])+0.5,round(p2[1])+0.5, round(p2[2])+0.5); + } + vtkNew source; + source->SetPoints(displayPts); + source->Update(); + renderData->DeepCopy(source->GetOutput()); + shadow2D->GetMapper()->SetInputDataObject(renderData); actor2D->GetMapper()->SetInputDataObject(renderData); + mModifyTime = MTime; } diff --git a/src/src/Rendering/Legend/ReferenceLineLegendActor.h b/src/src/Rendering/Legend/ReferenceLineLegendActor.h index 4c4d458..b2b2a34 100644 --- a/src/src/Rendering/Legend/ReferenceLineLegendActor.h +++ b/src/src/Rendering/Legend/ReferenceLineLegendActor.h @@ -53,10 +53,9 @@ public: vtkTypeBool HasTranslucentPolygonalGeometry() override { return 0; } - void SetLinePoint(double *p1, double *p2) { - linePoints->SetNumberOfPoints(2); - linePoints->SetPoint(0, p1); - linePoints->SetPoint(2, p2); + void setPoint(vtkIdType id, double *p) { + linePoints->SetPoint(id, p); + Modified(); } protected: @@ -67,11 +66,13 @@ protected: vtkNew linePoints; vtkNew renderData; vtkActor2D *actor2D; + vtkActor2D *shadow2D; private: ReferenceLineLegendActor(const ReferenceLineLegendActor &) = delete; void operator=(const ReferenceLineLegendActor &) = delete; + vtkTimeStamp mModifyTime; };