Change ReferenceLineLegendActor render logic and display effect.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user