diff --git a/src/src/measure/ReferenceLineLegendActor.cpp b/src/src/measure/ReferenceLineLegendActor.cpp new file mode 100644 index 0000000..fd46bdf --- /dev/null +++ b/src/src/measure/ReferenceLineLegendActor.cpp @@ -0,0 +1,61 @@ +// +// Created by Krad on 2022/4/11. +// + +#include "ReferenceLineLegendActor.h" +#include +#include "vtkPolyDataMapper2D.h" +#include "vtkRenderer.h" +#include "vtkRenderWindow.h" +#include "vtkCamera.h" +#include "vtkPoints.h" +#include "vtkProperty2D.h" + +vtkStandardNewMacro(ReferenceLineLegendActor) + +void ReferenceLineLegendActor::BuildShape(vtkRenderer* renderer) { + //reference line 暂时不用考虑缩放问题 + 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); + actor2D->GetMapper()->SetInputDataObject(renderData); +} + +void ReferenceLineLegendActor::ReleaseGraphicsResources(vtkWindow * iwin) { + actor2D->ReleaseGraphicsResources(iwin); +} + +int ReferenceLineLegendActor::RenderOverlay(vtkViewport *viewport) { + auto renderer = vtkRenderer::SafeDownCast(viewport); + if (!renderer) return 0; + BuildShape(renderer); + return actor2D->RenderOverlay(viewport); +} + +ReferenceLineLegendActor::ReferenceLineLegendActor() { + this->PickableOff(); + actor2D = vtkActor2D::New(); + actor2D->PickableOff(); + vtkNew mapper; + actor2D->SetMapper(mapper); + actor2D->GetProperty()->SetLineWidth(1.0); + actor2D->GetProperty()->SetColor(1.0,0.0,0.0); +} + +ReferenceLineLegendActor::~ReferenceLineLegendActor() { + actor2D->Delete(); + actor2D = nullptr; +} diff --git a/src/src/measure/ReferenceLineLegendActor.h b/src/src/measure/ReferenceLineLegendActor.h new file mode 100644 index 0000000..38cd61c --- /dev/null +++ b/src/src/measure/ReferenceLineLegendActor.h @@ -0,0 +1,73 @@ +// +// Created by Krad on 2022/4/11. +// + +#ifndef OMEGAV_REFERENCELINELEGENDACTOR_H +#define OMEGAV_REFERENCELINELEGENDACTOR_H + +#include "vtkProp.h" +#include "vtkActor2D.h" +#include "vtkPolyData.h" +#include "vtkNew.h" // for ivars +class vtkRenderer; +class ReferenceLineLegendActor : public vtkProp { +public: + //@{ + /** + * Standard methods for instances of this class. + */ + static ReferenceLineLegendActor *New(); + + vtkTypeMacro(ReferenceLineLegendActor, vtkProp); + + virtual void BuildShape(vtkRenderer* renderer); + + //@{ + /** + * Methods to make this class behave as a vtkProp. + */ + double *GetBounds() VTK_SIZEHINT(6) override { return nullptr; } + + void GetActors(vtkPropCollection *) override {} + + void GetVolumes(vtkPropCollection *) override {} + + void ShallowCopy(vtkProp *prop) override {}; + + void ReleaseGraphicsResources(vtkWindow *) override; + + /** + * Method use to make this actor render in 2D scene; + * @param viewport + * @return render is success + */ + int RenderOverlay(vtkViewport *viewport) override; + + int RenderOpaqueGeometry(vtkViewport *vtkNotUsed(viewport)) override { return 0; } + + int RenderTranslucentPolygonalGeometry(vtkViewport *vtkNotUsed(viewport)) override { return 0; } + + int RenderVolumetricGeometry(vtkViewport *vtkNotUsed(viewport)) override { return 0; } + + vtkTypeBool HasTranslucentPolygonalGeometry() override { return 0; } + + void SetLinePoint(double* p1, double* p2){ + linePoints->SetNumberOfPoints(2); + linePoints->SetPoint(0, p1); + linePoints->SetPoint(2, p2); + } + +protected: + ReferenceLineLegendActor(); + ~ReferenceLineLegendActor() override; + vtkNew linePoints; + vtkNew renderData; + vtkActor2D * actor2D; + +private: + ReferenceLineLegendActor(const ReferenceLineLegendActor &) = delete; + void operator=(const ReferenceLineLegendActor &) = delete; +}; + + +#endif //OMEGAV_REFERENCELINELEGENDACTOR_H