ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
distancewidgetobserver.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 
9 
10 #include <vtkDistanceRepresentation.h>
11 #include <vtkDistanceWidget.h>
12 #include <vtkLineRepresentation.h>
13 #include <vtkLineWidget2.h>
14 #include <vtkMath.h>
15 
16 namespace VtkUtils {
17 
19  : AbstractWidgetObserver(parent) {}
20 
21 void DistanceWidgetObserver::Execute(vtkObject* caller,
22  unsigned long eventId,
23  void* callData) {
24  Q_UNUSED(eventId)
25  Q_UNUSED(callData)
26 
27  // Try vtkLineWidget2 first (for cvConstrainedDistanceWidget)
28  vtkLineWidget2* lineWidget = vtkLineWidget2::SafeDownCast(caller);
29  if (lineWidget) {
30  vtkWidgetRepresentation* rep = lineWidget->GetRepresentation();
31  vtkLineRepresentation* lineRep =
32  vtkLineRepresentation::SafeDownCast(rep);
33  if (lineRep) {
34  double worldPot1[3];
35  double worldPot2[3];
36  double displayPot1[3];
37  double displayPot2[3];
38 
39  lineRep->GetPoint1WorldPosition(worldPot1);
40  lineRep->GetPoint2WorldPosition(worldPot2);
41  lineRep->GetPoint1DisplayPosition(displayPot1);
42  lineRep->GetPoint2DisplayPosition(displayPot2);
43 
44  // Calculate distance (following ParaView)
45  double distance =
46  sqrt(vtkMath::Distance2BetweenPoints(worldPot1, worldPot2));
47 
49  emit worldPoint1Changed(worldPot1);
50  emit worldPoint2Changed(worldPot2);
51  emit displayPoint1Changed(displayPot1);
52  emit displayPoint2Changed(displayPot2);
53  }
54  return;
55  }
56 
57  // Fallback to vtkDistanceWidget (for backward compatibility)
58  vtkDistanceWidget* widget = vtkDistanceWidget::SafeDownCast(caller);
59  if (widget) {
60  vtkWidgetRepresentation* rep = widget->GetRepresentation();
61  vtkDistanceRepresentation* distRep =
62  vtkDistanceRepresentation::SafeDownCast(rep);
63  if (distRep) {
64  double worldPot1[3];
65  double worldPot2[3];
66  double displayPot1[3];
67  double displayPot2[3];
68 
69  distRep->GetPoint1WorldPosition(worldPot1);
70  distRep->GetPoint2WorldPosition(worldPot2);
71  distRep->GetPoint1DisplayPosition(displayPot1);
72  distRep->GetPoint2DisplayPosition(displayPot2);
73 
74  emit distanceChanged(distRep->GetDistance());
75  emit worldPoint1Changed(worldPot1);
76  emit worldPoint2Changed(worldPot2);
77  emit displayPoint1Changed(displayPot1);
78  emit displayPoint2Changed(displayPot2);
79  }
80  }
81 }
82 
83 } // namespace VtkUtils
DistanceWidgetObserver(QObject *parent=nullptr)
void displayPoint2Changed(double *pos)
void distanceChanged(double dist)
void Execute(vtkObject *caller, unsigned long eventId, void *callData)
void worldPoint1Changed(double *pos)
void worldPoint2Changed(double *pos)
void displayPoint1Changed(double *pos)
static double distance(T *pot1, T *pot2)
Definition: utils.h:111