handler toggle 1,2,3 keys

This commit is contained in:
AndreaRigoni
2026-03-19 14:28:20 +00:00
parent dbb5f24933
commit a8c0d5edc2
3 changed files with 111 additions and 10 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -192,7 +192,7 @@ void Viewport::SetupPipeline(vtkRenderWindowInteractor* iren)
// Keyboard events for widget coordinate frame
m_KeyCallback = vtkSmartPointer<vtkCallbackCommand>::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<vtkRenderWindowInteractor*>(caller);
auto* self = static_cast<Viewport*>(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;
}