From a8c0d5edc25e5e239c06c7d11b05e8fa26cf0262 Mon Sep 17 00:00:00 2001 From: AndreaRigoni Date: Thu, 19 Mar 2026 14:28:20 +0000 Subject: [PATCH] handler toggle 1,2,3 keys --- src/Vtk/vtkHandlerWidget.cpp | 62 ++++++++++++++++++++++++++++++++++++ src/Vtk/vtkHandlerWidget.h | 11 +++++++ src/Vtk/vtkViewport.cpp | 48 ++++++++++++++++++++++------ 3 files changed, 111 insertions(+), 10 deletions(-) diff --git a/src/Vtk/vtkHandlerWidget.cpp b/src/Vtk/vtkHandlerWidget.cpp index 47a8a52..44ff8fb 100644 --- a/src/Vtk/vtkHandlerWidget.cpp +++ b/src/Vtk/vtkHandlerWidget.cpp @@ -68,6 +68,9 @@ vtkHandlerWidget::vtkHandlerWidget() { this->m_OverlayRenderer->EraseOff(); this->m_OverlayRenderer->InteractiveOff(); this->Priority = 50.0; // Higher priority to beat camera style + this->m_TranslationEnabled = true; + this->m_RotationEnabled = true; + this->m_ScalingEnabled = true; this->CreateGizmos(); } @@ -131,6 +134,8 @@ void vtkHandlerWidget::SetEnabled(int enabling) { this->m_OverlayRenderer->AddActor(m_ScaleY); this->m_OverlayRenderer->AddActor(m_ScaleZ); + this->UpdateVisibility(); + this->InvokeEvent(::vtkCommand::EnableEvent, nullptr); } else { if (!this->Enabled) @@ -454,6 +459,63 @@ void vtkHandlerWidget::PlaceWidget(double bounds[6]) { this->UpdateGizmoPosition(); } +void vtkHandlerWidget::SetTranslationEnabled(bool enabled) { + this->m_TranslationEnabled = enabled; + this->UpdateVisibility(); + if (this->Interactor) this->Interactor->Render(); +} + +void vtkHandlerWidget::SetRotationEnabled(bool enabled) { + this->m_RotationEnabled = enabled; + this->UpdateVisibility(); + if (this->Interactor) this->Interactor->Render(); +} + +void vtkHandlerWidget::SetScalingEnabled(bool enabled) { + this->m_ScalingEnabled = enabled; + this->UpdateVisibility(); + if (this->Interactor) this->Interactor->Render(); +} + +void vtkHandlerWidget::UpdateVisibility() { + if (!m_AxesX) return; + + m_AxesX->SetVisibility(m_TranslationEnabled); + m_AxesY->SetVisibility(m_TranslationEnabled); + m_AxesZ->SetVisibility(m_TranslationEnabled); + + m_RotX->SetVisibility(m_RotationEnabled); + m_RotY->SetVisibility(m_RotationEnabled); + m_RotZ->SetVisibility(m_RotationEnabled); + m_RotCam->SetVisibility(m_RotationEnabled); + + m_ScaleX->SetVisibility(m_ScalingEnabled); + m_ScaleY->SetVisibility(m_ScalingEnabled); + m_ScaleZ->SetVisibility(m_ScalingEnabled); + + // Update picker list + if (m_Picker) { + m_Picker->InitializePickList(); + if (m_TranslationEnabled) { + m_Picker->AddPickList(m_AxesX); + m_Picker->AddPickList(m_AxesY); + m_Picker->AddPickList(m_AxesZ); + } + if (m_RotationEnabled) { + m_Picker->AddPickList(m_RotX); + m_Picker->AddPickList(m_RotY); + m_Picker->AddPickList(m_RotZ); + m_Picker->AddPickList(m_RotCam); + } + if (m_ScalingEnabled) { + m_Picker->AddPickList(m_ScaleX); + m_Picker->AddPickList(m_ScaleY); + m_Picker->AddPickList(m_ScaleZ); + } + m_Picker->PickFromListOn(); + } +} + void vtkHandlerWidget::PlaceWidget() { this->UpdateGizmoPosition(); } void vtkHandlerWidget::SetTransform(::vtkTransform *t) { diff --git a/src/Vtk/vtkHandlerWidget.h b/src/Vtk/vtkHandlerWidget.h index dfdea55..b25e5a0 100644 --- a/src/Vtk/vtkHandlerWidget.h +++ b/src/Vtk/vtkHandlerWidget.h @@ -99,14 +99,25 @@ public: void GetTransform(::vtkTransform *t); ::vtkRenderer *GetOverlayRenderer() { return this->m_OverlayRenderer; } + + void SetTranslationEnabled(bool enabled); + bool GetTranslationEnabled() const { return m_TranslationEnabled; } + void SetRotationEnabled(bool enabled); + bool GetRotationEnabled() const { return m_RotationEnabled; } + void SetScalingEnabled(bool enabled); + bool GetScalingEnabled() const { return m_ScalingEnabled; } protected: void CreateGizmos(); void UpdateGizmoPosition(); void Highlight(::vtkProp *prop); + void UpdateVisibility(); vtkSmartPointer<::vtkRenderer> m_OverlayRenderer; ReferenceFrame m_Frame; + bool m_TranslationEnabled; + bool m_RotationEnabled; + bool m_ScalingEnabled; int Interaction; ::vtkProp *m_HighlightedProp; diff --git a/src/Vtk/vtkViewport.cpp b/src/Vtk/vtkViewport.cpp index c6a8c2e..05b3853 100644 --- a/src/Vtk/vtkViewport.cpp +++ b/src/Vtk/vtkViewport.cpp @@ -192,7 +192,7 @@ void Viewport::SetupPipeline(vtkRenderWindowInteractor* iren) // Keyboard events for widget coordinate frame m_KeyCallback = vtkSmartPointer::New(); m_KeyCallback->SetClientData(this); - m_KeyCallback->SetCallback([](vtkObject* caller, unsigned long, void* clientdata, void*){ + m_KeyCallback->SetCallback([](vtkObject* caller, unsigned long event, void* clientdata, void*){ auto* iren = static_cast(caller); auto* self = static_cast(clientdata); @@ -201,29 +201,57 @@ void Viewport::SetupPipeline(vtkRenderWindowInteractor* iren) if (self->m_HandlerWidget && self->m_HandlerWidget->GetEnabled()) { if (key == "l") { - self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::LOCAL); - std::cout << "Widget Frame: LOCAL" << std::endl; + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::LOCAL); + std::cout << "Widget Frame: LOCAL" << std::endl; + } handled = true; } else if (key == "g") { - self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::GLOBAL); - std::cout << "Widget Frame: GLOBAL" << std::endl; + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::GLOBAL); + std::cout << "Widget Frame: GLOBAL" << std::endl; + } handled = true; } else if (key == "c") { - self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::CENTER); - std::cout << "Widget Frame: CENTER" << std::endl; + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::CENTER); + std::cout << "Widget Frame: CENTER" << std::endl; + } handled = true; } else if (key == "k") { - self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::CENTER_LOCAL); - std::cout << "Widget Frame: CENTER_LOCAL" << std::endl; + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetReferenceFrame(vtkHandlerWidget::CENTER_LOCAL); + std::cout << "Widget Frame: CENTER_LOCAL" << std::endl; + } + handled = true; + } + else if (key == "1") { + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetTranslationEnabled(!self->m_HandlerWidget->GetTranslationEnabled()); + } + handled = true; + } + else if (key == "2") { + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetRotationEnabled(!self->m_HandlerWidget->GetRotationEnabled()); + } + handled = true; + } + else if (key == "3") { + if (event == vtkCommand::KeyPressEvent) { + self->m_HandlerWidget->SetScalingEnabled(!self->m_HandlerWidget->GetScalingEnabled()); + } handled = true; } } if (key == "f") { - self->ZoomSelected(); + if (event == vtkCommand::KeyPressEvent) { + self->ZoomSelected(); + } handled = true; }