add Qt viewport

This commit is contained in:
AndreaRigoni
2026-03-13 22:36:52 +00:00
parent a142c5d060
commit 6bf9eaf309
12 changed files with 344 additions and 39 deletions

150
src/Vtk/vtkQViewport.cpp Normal file
View File

@@ -0,0 +1,150 @@
#include "vtkQViewport.h"
#include <QVBoxLayout>
#include <vtkAxesActor.h>
#include <vtkCamera.h>
#include <vtkCameraOrientationWidget.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkObjectFactory.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkTextProperty.h>
namespace uLib {
namespace Vtk {
QViewport::QViewport(QWidget* parent)
: QWidget(parent)
, m_VtkWidget(nullptr)
, m_Renderer(vtkRenderer::New())
, m_Annotation(vtkCornerAnnotation::New())
, m_Marker(vtkOrientationMarkerWidget::New())
, m_CameraWidget(nullptr)
{
// Build the layout zero margins so VTK fills the entire widget
auto* layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
m_VtkWidget = new QVTKOpenGLNativeWidget(this);
layout->addWidget(m_VtkWidget);
// After the Qt widget exists but before the first paint,
// attach the renderer and configure the pipeline.
SetupPipeline();
}
QViewport::~QViewport()
{
m_Renderer->RemoveAllViewProps();
m_Renderer->Clear();
m_Annotation->Delete();
m_Marker->Delete();
if (m_CameraWidget)
m_CameraWidget->Delete();
m_Renderer->Delete();
}
void QViewport::SetupPipeline()
{
// Add our renderer to the QVTKOpenGLNativeWidget's render window
vtkRenderWindow* rw = m_VtkWidget->renderWindow();
rw->AddRenderer(m_Renderer);
// Qt will supply its own interactor grab it
vtkRenderWindowInteractor* iren = rw->GetInteractor();
// Trackball-camera interaction style
vtkNew<vtkInteractorStyleTrackballCamera> style;
iren->SetInteractorStyle(style);
// Corner annotation
m_Annotation->GetTextProperty()->SetColor(1, 1, 1);
m_Annotation->GetTextProperty()->SetFontFamilyToArial();
m_Annotation->GetTextProperty()->SetOpacity(0.5);
m_Annotation->SetMaximumFontSize(10);
m_Annotation->SetText(0, "uLib VTK Viewer - OpenCMT all right reserved.");
m_Renderer->AddViewProp(m_Annotation);
// Orientation axes marker (bottom-left corner)
vtkNew<vtkAxesActor> axes;
m_Marker->SetInteractor(iren);
m_Marker->SetOrientationMarker(axes);
m_Marker->SetViewport(0.0, 0.0, 0.2, 0.2);
m_Marker->SetEnabled(true);
m_Marker->InteractiveOff();
// Camera-orientation widget (VTK ≥ 9)
#if VTK_MAJOR_VERSION >= 9
m_CameraWidget = vtkCameraOrientationWidget::New();
m_CameraWidget->SetParentRenderer(m_Renderer);
m_CameraWidget->SetInteractor(iren);
m_CameraWidget->On();
#endif
m_Renderer->SetBackground(0.15, 0.15, 0.15);
m_Renderer->ResetCamera();
}
// ── Public API ────────────────────────────────────────────────────────────────
void QViewport::Render()
{
m_VtkWidget->renderWindow()->Render();
}
void QViewport::Reset()
{
ZoomAuto();
Render();
}
void QViewport::ZoomAuto()
{
m_Renderer->ResetCameraClippingRange();
m_Renderer->ResetCamera();
}
void QViewport::AddPuppet(Puppet& prop)
{
prop.ConnectRenderer(m_Renderer);
prop.ConnectInteractor(GetInteractor());
Render();
}
void QViewport::RemovePuppet(Puppet& prop)
{
prop.DisconnectRenderer(m_Renderer);
Render();
}
void QViewport::addProp(vtkProp* prop)
{
m_Renderer->AddActor(prop);
Render();
}
void QViewport::RemoveProp(vtkProp* prop)
{
m_Renderer->RemoveViewProp(prop);
Render();
}
void QViewport::AddWidget(vtk3DWidget* /*widget*/)
{
// vtk3DWidget integration can be added here if needed
}
vtkRenderWindow* QViewport::GetRenderWindow()
{
return m_VtkWidget->renderWindow();
}
vtkRenderWindowInteractor* QViewport::GetInteractor()
{
return m_VtkWidget->renderWindow()->GetInteractor();
}
} // namespace Vtk
} // namespace uLib