Change ReferenceLineLegendActor render logic and display effect.

This commit is contained in:
Krad
2022-08-08 10:04:27 +08:00
parent 39060429cd
commit 4381dee4ff
2 changed files with 56 additions and 21 deletions

View File

@@ -12,25 +12,38 @@
#include <vtkCamera.h> #include <vtkCamera.h>
#include <vtkPoints.h> #include <vtkPoints.h>
#include <vtkProperty2D.h> #include <vtkProperty2D.h>
#include <vtkPolyLineSource.h>
vtkStandardNewMacro(ReferenceLineLegendActor) vtkStandardNewMacro(ReferenceLineLegendActor)
ReferenceLineLegendActor::ReferenceLineLegendActor() { ReferenceLineLegendActor::ReferenceLineLegendActor() {
this->PickableOff(); this->PickableOff();
actor2D = vtkActor2D::New(); actor2D = vtkActor2D::New();
shadow2D = vtkActor2D::New();
actor2D->PickableOff(); actor2D->PickableOff();
vtkNew<vtkPolyDataMapper2D> mapper; vtkNew<vtkPolyDataMapper2D> mapper;
vtkNew<vtkPolyDataMapper2D> mapper2;
actor2D->SetMapper(mapper); actor2D->SetMapper(mapper);
shadow2D->SetMapper(mapper2);
actor2D->GetProperty()->SetLineWidth(1.0); 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() { ReferenceLineLegendActor::~ReferenceLineLegendActor() {
vtkPolyDataMapper2D::SafeDownCast(actor2D->GetMapper())->SetInputData(nullptr);
actor2D->Delete(); actor2D->Delete();
actor2D = nullptr; actor2D = nullptr;
vtkPolyDataMapper2D::SafeDownCast(shadow2D->GetMapper())->SetInputData(nullptr);
shadow2D->Delete();
shadow2D = nullptr;
} }
void ReferenceLineLegendActor::ReleaseGraphicsResources(vtkWindow *window) { void ReferenceLineLegendActor::ReleaseGraphicsResources(vtkWindow *window) {
shadow2D->ReleaseGraphicsResources(window);
actor2D->ReleaseGraphicsResources(window); actor2D->ReleaseGraphicsResources(window);
} }
@@ -38,26 +51,47 @@ int ReferenceLineLegendActor::RenderOverlay(vtkViewport *viewport) {
auto renderer = vtkRenderer::SafeDownCast(viewport); auto renderer = vtkRenderer::SafeDownCast(viewport);
if (!renderer) return 0; if (!renderer) return 0;
BuildShape(renderer); BuildShape(renderer);
shadow2D->RenderOverlay(viewport);
return actor2D->RenderOverlay(viewport); return actor2D->RenderOverlay(viewport);
} }
void ReferenceLineLegendActor::BuildShape(vtkRenderer *renderer) { void ReferenceLineLegendActor::BuildShape(vtkRenderer *renderer) {
//reference line 暂时不用考虑缩放问题 if(mModifyTime == MTime)return;
vtkNew<vtkPoints> pts; vtkNew<vtkPoints> pts;
vtkNew<vtkCellArray> lines; for(vtkIdType i = 0; i<linePoints->GetNumberOfPoints(); ++i)
vtkIdType ids[2] = {0, 1}; {
double p[3] = {.0, .0, .0}; double p[3] = {.0, .0, .0};
renderer->SetWorldPoint(linePoints->GetPoint(0)); renderer->SetWorldPoint(linePoints->GetPoint(i));
renderer->WorldToDisplay(); renderer->WorldToDisplay();
renderer->GetDisplayPoint(p); renderer->GetDisplayPoint(p);
ids[0] = pts->InsertNextPoint(p); pts->InsertNextPoint(p);
renderer->SetWorldPoint(linePoints->GetPoint(1)); }
renderer->WorldToDisplay(); double p1[3] = {.0, .0, .0};
renderer->GetDisplayPoint(p); double p2[3] = {.0, .0, .0};
ids[1] = pts->InsertNextPoint(0, 2.5, 0.0); pts->GetPoint(0, p1);
lines->InsertNextCell(2, ids); pts->GetPoint(1, p1);
double dis2 = vtkMath::Distance2BetweenPoints(p1,p2);
renderData->SetPoints(pts); pts->GetPoint(2, p1);
renderData->SetLines(lines); pts->GetPoint(3, p1);
double dis2_2 = vtkMath::Distance2BetweenPoints(p1,p2);
vtkNew<vtkPoints> 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<vtkPolyLineSource> source;
source->SetPoints(displayPts);
source->Update();
renderData->DeepCopy(source->GetOutput());
shadow2D->GetMapper()->SetInputDataObject(renderData);
actor2D->GetMapper()->SetInputDataObject(renderData); actor2D->GetMapper()->SetInputDataObject(renderData);
mModifyTime = MTime;
} }

View File

@@ -53,10 +53,9 @@ public:
vtkTypeBool HasTranslucentPolygonalGeometry() override { return 0; } vtkTypeBool HasTranslucentPolygonalGeometry() override { return 0; }
void SetLinePoint(double *p1, double *p2) { void setPoint(vtkIdType id, double *p) {
linePoints->SetNumberOfPoints(2); linePoints->SetPoint(id, p);
linePoints->SetPoint(0, p1); Modified();
linePoints->SetPoint(2, p2);
} }
protected: protected:
@@ -67,11 +66,13 @@ protected:
vtkNew<vtkPoints> linePoints; vtkNew<vtkPoints> linePoints;
vtkNew<vtkPolyData> renderData; vtkNew<vtkPolyData> renderData;
vtkActor2D *actor2D; vtkActor2D *actor2D;
vtkActor2D *shadow2D;
private: private:
ReferenceLineLegendActor(const ReferenceLineLegendActor &) = delete; ReferenceLineLegendActor(const ReferenceLineLegendActor &) = delete;
void operator=(const ReferenceLineLegendActor &) = delete; void operator=(const ReferenceLineLegendActor &) = delete;
vtkTimeStamp mModifyTime;
}; };