refactor using pimpl and fix test

This commit is contained in:
AndreaRigoni
2026-03-25 16:18:07 +00:00
parent a467b7385b
commit 7d4acaef6d
17 changed files with 479 additions and 412 deletions

View File

@@ -67,25 +67,33 @@ vtkStandardNewMacro(vtkInteractorStyleNoSpin);
namespace uLib {
namespace Vtk {
struct ViewerData {
vtkRenderWindow *m_RenderWindow;
vtkSmartPointer<vtkButtonWidget> m_GridButton;
ViewerData() : m_RenderWindow(vtkRenderWindow::New()) {}
~ViewerData() { m_RenderWindow->Delete(); }
};
////////////////////////////////////////////////////////////////////////////////
///// VTK VIEWER //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
Viewer::Viewer()
: Viewport(), m_RenderWindow(vtkRenderWindow::New()) {
: Viewport(), d(new ViewerData()) {
InstallPipe();
}
Viewer::~Viewer() {
UninstallPipe();
m_RenderWindow->Delete();
delete d;
}
void Viewer::InstallPipe() {
m_RenderWindow->AddRenderer(m_Renderer);
m_RenderWindow->SetSize(600,600);
d->m_RenderWindow->AddRenderer(this->GetRenderer());
d->m_RenderWindow->SetSize(600,600);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(m_RenderWindow);
renderWindowInteractor->SetRenderWindow(d->m_RenderWindow);
// Common setup
Viewport::SetupPipeline(renderWindowInteractor);
@@ -99,21 +107,21 @@ void Viewer::InstallPipe() {
renderWindowInteractor->SetInteractorStyle(style);
// Must be rendered here in Vtk-6.0 or seg-fault //
m_RenderWindow->Render();
d->m_RenderWindow->Render();
}
void Viewer::UninstallPipe() {
if (m_Renderer) {
m_Renderer->RemoveAllViewProps();
if (GetRenderer()) {
GetRenderer()->RemoveAllViewProps();
}
}
void Viewer::Render() {
if (m_RenderWindow)
m_RenderWindow->Render();
if (d->m_RenderWindow)
d->m_RenderWindow->Render();
}
vtkSmartPointer<vtkCameraOrientationWidget>
vtkCameraOrientationWidget *
Viewer::MakeCameraOrientationWidget(vtkRenderWindowInteractor *interactor,
vtkRenderer *renderer) {
vtkSmartPointer<vtkCameraOrientationWidget> widget =
@@ -125,7 +133,7 @@ Viewer::MakeCameraOrientationWidget(vtkRenderWindowInteractor *interactor,
}
void Viewer::SetupGridButton() {
if (!m_RenderWindow || !m_RenderWindow->GetInteractor()) return;
if (!d->m_RenderWindow || !d->m_RenderWindow->GetInteractor()) return;
// Create procedural textures for the button using canvas
vtkNew<vtkImageCanvasSource2D> canvas;
@@ -158,9 +166,9 @@ void Viewer::SetupGridButton() {
rep->SetButtonTexture(0, imgOff);
rep->SetButtonTexture(1, imgOn);
m_GridButton = vtkSmartPointer<vtkButtonWidget>::New();
m_GridButton->SetInteractor(m_RenderWindow->GetInteractor());
m_GridButton->SetRepresentation(rep);
d->m_GridButton = vtkSmartPointer<vtkButtonWidget>::New();
d->m_GridButton->SetInteractor(d->m_RenderWindow->GetInteractor());
d->m_GridButton->SetRepresentation(rep);
// Position it initially
UpdateGridButtonPosition();
@@ -172,7 +180,7 @@ void Viewer::SetupGridButton() {
auto* v = static_cast<Viewer*>(clientdata);
v->UpdateGridButtonPosition();
});
m_RenderWindow->AddObserver(vtkCommand::ModifiedEvent, resizeCallback);
d->m_RenderWindow->AddObserver(vtkCommand::ModifiedEvent, resizeCallback);
// Callback for state change
vtkNew<vtkCallbackCommand> stateCallback;
@@ -184,19 +192,19 @@ void Viewer::SetupGridButton() {
v->SetGridVisible(r->GetState() == 1);
});
m_GridButton->AddObserver(vtkCommand::StateChangedEvent, stateCallback);
m_GridButton->On();
d->m_GridButton->AddObserver(vtkCommand::StateChangedEvent, stateCallback);
d->m_GridButton->On();
// Set initial state
rep->SetState(GetGridVisible() ? 1 : 0);
}
void Viewer::UpdateGridButtonPosition() {
if (!m_GridButton || !m_RenderWindow) return;
auto* rep = vtkTexturedButtonRepresentation2D::SafeDownCast(m_GridButton->GetRepresentation());
if (!d->m_GridButton || !d->m_RenderWindow) return;
auto* rep = vtkTexturedButtonRepresentation2D::SafeDownCast(d->m_GridButton->GetRepresentation());
if (!rep) return;
int *sz = m_RenderWindow->GetSize();
int *sz = d->m_RenderWindow->GetSize();
if (sz[0] == 0 || sz[1] == 0) return; // Window not yet sized or hidden
int margin_rigth = 23;
@@ -207,12 +215,12 @@ void Viewer::UpdateGridButtonPosition() {
rep->PlaceWidget(bds);
}
void Viewer::Start() { m_RenderWindow->GetInteractor()->Start(); }
void Viewer::Start() { d->m_RenderWindow->GetInteractor()->Start(); }
vtkRenderWindow *Viewer::GetRenderWindow() { return m_RenderWindow; }
vtkRenderWindow *Viewer::GetRenderWindow() { return d->m_RenderWindow; }
vtkRenderWindowInteractor *Viewer::GetInteractor() {
return m_RenderWindow->GetInteractor();
return d->m_RenderWindow->GetInteractor();
}
} // namespace Vtk