ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
anglewidgetobserver.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "anglewidgetobserver.h"
9 
10 #include <vtkAngleRepresentation2D.h>
11 #include <vtkAngleRepresentation3D.h>
12 #include <vtkAngleWidget.h>
13 #include <vtkMath.h>
14 
15 // CV_DB_LIB
16 #include <CVLog.h>
17 
18 namespace VtkUtils {
19 
21  : AbstractWidgetObserver(parent) {}
22 
23 void AngleWidgetObserver::Execute(vtkObject* caller,
24  unsigned long eventId,
25  void* callData) {
26  Q_UNUSED(eventId)
27  Q_UNUSED(callData)
28 
29  vtkAngleWidget* widget = reinterpret_cast<vtkAngleWidget*>(caller);
30  if (widget) {
31  vtkAngleRepresentation* angleRep = vtkAngleRepresentation::SafeDownCast(
32  widget->GetRepresentation());
33 
34  if (!angleRep) {
35  CVLog::Warning("[AngleWidgetObserver] Execute: angleRep is null");
36  return;
37  }
38 
39  // Check if it's 2D or 3D representation
40  vtkAngleRepresentation2D* rep2D =
41  vtkAngleRepresentation2D::SafeDownCast(angleRep);
42 
43  double worldPot1[3];
44  double worldPot2[3];
45  double worldCenter[3];
46  double displayPot1[3];
47  double displayPot2[3];
48  double displayCenter[3];
49 
50  angleRep->GetPoint1WorldPosition(worldPot1);
51  angleRep->GetPoint2WorldPosition(worldPot2);
52  angleRep->GetCenterWorldPosition(worldCenter);
53  angleRep->GetPoint1DisplayPosition(displayPot1);
54  angleRep->GetPoint2DisplayPosition(displayPot2);
55  angleRep->GetCenterDisplayPosition(displayCenter);
56 
57  // IMPORTANT: vtkAngleRepresentation2D::GetAngle() returns DEGREES
58  // vtkAngleRepresentation3D::GetAngle() returns RADIANS
59  double angleDegrees = 0.0;
60  double rawAngle = angleRep->GetAngle();
61  if (rep2D) {
62  // 2D representation returns degrees directly
63  angleDegrees = rawAngle;
64  } else {
65  // 3D representation returns radians, convert to degrees
66  angleDegrees = vtkMath::DegreesFromRadians(rawAngle);
67  }
68 
69  emit angleChanged(angleDegrees);
70  emit worldPoint1Changed(worldPot1);
71  emit worldPoint2Changed(worldPot2);
72  emit worldCenterChanged(worldCenter);
73  emit displayPoint1Changed(displayPot1);
74  emit displayPoint2Changed(displayPot2);
75  emit displayCenterChanged(displayCenter);
76  }
77 }
78 
79 } // namespace VtkUtils
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Definition: CVLog.cpp:133
void worldPoint2Changed(double *pos)
void displayPoint1Changed(double *pos)
void worldCenterChanged(double *pos)
void worldPoint1Changed(double *pos)
void Execute(vtkObject *caller, unsigned long eventId, void *callData)
AngleWidgetObserver(QObject *parent=nullptr)
void angleChanged(double angle)
void displayCenterChanged(double *pos)
void displayPoint2Changed(double *pos)