ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
PclTransformTool.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 "PclTransformTool.h"
9 
10 // Local
11 #include <Utils/vtk2cc.h>
12 
13 #include "PclUtils/PCLVis.h"
16 #include "VtkUtils/vtkutils.h"
17 
18 // CV_CORE_LIB
19 #include <CVGeom.h>
20 #include <CVLog.h>
21 #include <CVTools.h>
22 
23 // CV_DB_LIB
24 #include <ecvDisplayTools.h>
25 #include <ecvMesh.h>
26 #include <ecvPointCloud.h>
27 #include <ecvPolyline.h>
28 
29 // VTK
30 #include <vtkActor.h>
31 #include <vtkAssembly.h>
32 #include <vtkBoxRepresentation.h>
33 #include <vtkMatrix4x4.h>
34 #include <vtkRenderWindowInteractor.h>
35 #include <vtkTransform.h>
36 #include <vtkTransformPolyDataFilter.h>
37 #include <vtkWidgetRepresentation.h>
38 
39 using namespace PclUtils;
40 
43  m_boxWidgetTransformer(nullptr),
44  m_viewer(nullptr) {
45  setVisualizer(viewer);
46  m_modelActors.clear();
47 }
48 
50 
52  if (viewer) {
53  m_viewer = reinterpret_cast<PCLVis*>(viewer);
54  if (!m_viewer) {
55  CVLog::Warning("[PclTransformTool::setVisualizer] viewer is Null!");
56  }
57  } else {
58  CVLog::Warning("[PclTransformTool::setVisualizer] viewer is Null!");
59  }
60 }
61 
62 bool PclTransformTool::setInputData(ccHObject* entity, int viewport) {
63  if (!m_viewer || !ecvGenericTransformTool::setInputData(entity)) {
64  return false;
65  }
66 
67  m_modelActors.clear();
68 
69  if (!getAssociatedEntity()) {
70  return false;
71  }
72 
73  addActors();
74 
75  return true;
76 }
77 
79  assert(m_modelActors.empty());
80  if (!getAssociatedEntity()) {
81  return;
82  }
83 
84  unsigned n = getAssociatedEntity()->getChildrenNumber();
85  for (unsigned i = 0; i < n; ++i) {
87  std::string id = CVTools::FromQString(ent->getViewId());
88  if (id == "") {
89  continue;
90  }
91 
92  vtkActor* actor = m_viewer->getActorById(id);
93  if (!actor) {
94  continue;
95  }
96  m_modelActors.push_back(actor);
97  }
98 }
99 
101  if (!m_boxWidgetTransformer) {
103  QString("[PclTransformTool::showInteractor] boxWidget has not "
104  "been initialized!"));
105  return;
106  }
107 
108  if (state) {
109  m_boxWidgetTransformer->On();
110  } else {
111  m_boxWidgetTransformer->Off();
112  }
113 }
114 
116  if (m_modelActors.empty()) {
117  return false;
118  }
119 
120  VtkUtils::vtkInitOnce(m_boxWidgetTransformer);
121  m_boxWidgetTransformer->SetInteractor(
122  m_viewer->getRenderWindowInteractor());
123  m_boxWidgetTransformer->HandlesOff(); // default off
124  m_boxWidgetTransformer->SetPlaceFactor(1.1); // default 0.5
125 
126  VTK_CREATE(vtkAssembly, assembly);
127  for (vtkActor* actor : m_modelActors) {
128  assembly->AddPart(actor);
129  }
130  m_boxWidgetTransformer->PlaceWidget(assembly->GetBounds());
131 
132  VtkUtils::vtkInitOnce(m_originTrans);
133  m_boxWidgetTransformer->GetTransform(m_originTrans);
134 
137  boxCallback->SetActors(m_modelActors);
138  boxCallback->attach(m_boxWidgetTransformer);
139  // connect(boxCallback, &CallbackTools::vtkBoxCallback::uerTransform, this,
140  // &PclTransformTool::onTransform);
141  m_boxWidgetTransformer->On();
142 
143  return true;
144 }
145 
147  if (m_boxWidgetTransformer) {
148  reset();
149  // m_boxWidgetTransformer->RemoveObserver(vtkCommand::EndInteractionEvent);
150  m_boxWidgetTransformer->Off();
151  }
152 
153  if (!m_modelActors.empty()) {
154  m_modelActors.clear();
155  }
156 }
157 
159  if (m_originTrans && !m_modelActors.empty() && m_boxWidgetTransformer) {
160  m_boxWidgetTransformer->SetTransform(m_originTrans);
161  for (vtkActor* actor : this->m_modelActors) {
162  if (actor) {
163  actor->SetUserTransform(m_originTrans);
164  actor->Modified();
165  }
166  }
168  }
169 }
170 
172 
174  if (!m_boxWidgetTransformer) {
176  QString("[PclTransformTool::setTranlationMode] boxWidget has "
177  "not been initialized!"));
178  return;
179  }
180 
181  switch (mode) {
183  m_boxWidgetTransformer->SetTranslateXEnabled(true);
184  m_boxWidgetTransformer->SetTranslateYEnabled(false);
185  m_boxWidgetTransformer->SetTranslateZEnabled(false);
186  } break;
188  m_boxWidgetTransformer->SetTranslateXEnabled(false);
189  m_boxWidgetTransformer->SetTranslateYEnabled(true);
190  m_boxWidgetTransformer->SetTranslateZEnabled(false);
191  } break;
193  m_boxWidgetTransformer->SetTranslateXEnabled(false);
194  m_boxWidgetTransformer->SetTranslateYEnabled(false);
195  m_boxWidgetTransformer->SetTranslateZEnabled(true);
196  } break;
198  m_boxWidgetTransformer->SetTranslateXEnabled(true);
199  m_boxWidgetTransformer->SetTranslateYEnabled(true);
200  m_boxWidgetTransformer->SetTranslateZEnabled(false);
201  } break;
203  m_boxWidgetTransformer->SetTranslateXEnabled(true);
204  m_boxWidgetTransformer->SetTranslateYEnabled(false);
205  m_boxWidgetTransformer->SetTranslateZEnabled(true);
206  } break;
208  m_boxWidgetTransformer->SetTranslateXEnabled(false);
209  m_boxWidgetTransformer->SetTranslateYEnabled(true);
210  m_boxWidgetTransformer->SetTranslateZEnabled(true);
211  } break;
213  m_boxWidgetTransformer->SetTranslateXEnabled(true);
214  m_boxWidgetTransformer->SetTranslateYEnabled(true);
215  m_boxWidgetTransformer->SetTranslateZEnabled(true);
216  } break;
218  m_boxWidgetTransformer->SetTranslateXEnabled(false);
219  m_boxWidgetTransformer->SetTranslateYEnabled(false);
220  m_boxWidgetTransformer->SetTranslateZEnabled(false);
221  } break;
222  default:
223  break;
224  }
225 }
226 
228  if (!m_boxWidgetTransformer) {
230  QString("[PclTransformTool::setRotationMode] boxWidget has "
231  "not been initialized!"));
232  return;
233  }
234 
235  switch (mode) {
237  m_boxWidgetTransformer->SetRotateXEnabled(true);
238  m_boxWidgetTransformer->SetRotateYEnabled(true);
239  m_boxWidgetTransformer->SetRotateZEnabled(true);
240  } break;
242  m_boxWidgetTransformer->SetRotateXEnabled(true);
243  m_boxWidgetTransformer->SetRotateYEnabled(false);
244  m_boxWidgetTransformer->SetRotateZEnabled(false);
245  } break;
247  m_boxWidgetTransformer->SetRotateXEnabled(false);
248  m_boxWidgetTransformer->SetRotateYEnabled(true);
249  m_boxWidgetTransformer->SetRotateZEnabled(false);
250  } break;
252  m_boxWidgetTransformer->SetRotateXEnabled(false);
253  m_boxWidgetTransformer->SetRotateYEnabled(false);
254  m_boxWidgetTransformer->SetRotateZEnabled(true);
255  } break;
256  default:
257  break;
258  }
259 }
260 
262  if (!m_boxWidgetTransformer) {
264  QString("[PclTransformTool::setScaleEnabled] boxWidget has "
265  "not been initialized!"));
266  return;
267  }
268 
269  m_boxWidgetTransformer->SetScaleEnabled(state);
270 }
271 
273  if (!m_boxWidgetTransformer) {
275  QString("[PclTransformTool::setShearEnabled] boxWidget has "
276  "not been initialized!"));
277  return;
278  }
279 
280  state ? m_boxWidgetTransformer->HandlesOn()
281  : m_boxWidgetTransformer->HandlesOff();
282 }
283 
285  if (!m_boxWidgetTransformer) {
286  return ccGLMatrixd();
287  }
288 
290  m_boxWidgetTransformer->GetTransform(trans);
291 
294  trans->GetTranspose(matrix44);
295  return ccGLMatrixd(matrix44->GetData());
296 }
297 
298 void PclTransformTool::getOutput(std::vector<ccHObject*>& out) {
299  if (!m_boxWidgetTransformer) {
300  return;
301  }
302 
304  m_boxWidgetTransformer->GetTransform(trans);
305 
306  assert(m_modelActors.size() == getAssociatedEntity()->getChildrenNumber());
307  int index = 0;
308  for (vtkActor* actor : m_modelActors) {
309  vtkPolyData* polydata =
310  reinterpret_cast<vtkPolyDataMapper*>(actor->GetMapper())
311  ->GetInput();
312  if (nullptr == polydata) {
313  out.push_back(nullptr);
314  index++;
315  continue;
316  }
317 
318  vtkSmartPointer<vtkPolyData> dataObject =
320  dataObject->DeepCopy(polydata);
321 
324  transformFilter->SetInputData(dataObject);
325  transformFilter->SetTransform(trans);
326  transformFilter->Update();
327  dataObject = transformFilter->GetOutput();
328 
329  ccHObject* result = nullptr;
330  ccHObject* baseEntity = getAssociatedEntity()->getChild(index);
331  assert(baseEntity);
332 
333  if (baseEntity->isKindOf(CV_TYPES::POINT_CLOUD)) {
334  result = vtk2cc::ConvertToPointCloud(dataObject);
335  } else if (baseEntity->isKindOf(CV_TYPES::MESH)) {
336  result = vtk2cc::ConvertToMesh(dataObject);
337  } else if (baseEntity->isKindOf(CV_TYPES::POLY_LINE)) {
338  result = vtk2cc::ConvertToPolyline(dataObject);
339  } else {
340  CVLog::Warning(QString(
341  "only cloud, mesh and polyline are supported now!"));
342  }
343 
344  if (result) {
345  out.push_back(result);
346  } else {
347  out.push_back(nullptr);
348  }
349 
350  index++;
351  }
352 }
core::Tensor result
Definition: VtkUtils.cpp:76
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Definition: CVLog.cpp:133
static std::string FromQString(const QString &qs)
Definition: CVTools.cpp:100
virtual void reset() override
PclTransformTool(ecvGenericVisualizer3D *viewer)
virtual bool setInputData(ccHObject *entity, int viewport=0) override
virtual void showInteractor(bool state) override
virtual bool start() override
virtual void setVisualizer(ecvGenericVisualizer3D *viewer=nullptr) override
initialize
virtual void stop() override
virtual void setRotationMode(RotationMode mode)
virtual const ccGLMatrixd getFinalTransformation() override
virtual void setShearEnabled(bool state)
virtual void getOutput(std::vector< ccHObject * > &out) override
virtual void setScaleEnabled(bool state)
virtual void clear() override
virtual void setTranlationMode(TranslationMOde mode)
vtkSmartPointer< vtkRenderWindowInteractor > getRenderWindowInteractor()
Get a pointer to the current interactor style used.
Definition: PCLVis.h:148
vtkActor * getActorById(const std::string &viewId)
Definition: PCLVis.cpp:3022
Double version of ccGLMatrixTpl.
Definition: ecvGLMatrix.h:56
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
QString getViewId() const
Definition: ecvHObject.h:225
unsigned getChildrenNumber() const
Returns the number of children.
Definition: ecvHObject.h:312
ccHObject * getChild(unsigned childPos) const
Returns the ith child.
Definition: ecvHObject.h:325
bool isKindOf(CV_CLASS_ENUM type) const
Definition: ecvObject.h:128
static void UpdateScreen()
Generic Annotation Tool interface.
virtual bool setInputData(ccHObject *entity, int viewport=0)
RotationMode
Default constructor.
Generic visualizer 3D interface.
static ccMesh * ConvertToMesh(vtkPolyData *polydata, bool silent=false)
Definition: vtk2cc.cpp:290
static ccPolyline * ConvertToPolyline(vtkPolyData *polydata, bool silent=false)
Definition: vtk2cc.cpp:392
static ccPointCloud * ConvertToPointCloud(vtkPolyData *polydata, bool silent=false)
Definition: vtk2cc.cpp:53
@ MESH
Definition: CVTypes.h:105
@ POINT_CLOUD
Definition: CVTypes.h:104
@ POLY_LINE
Definition: CVTypes.h:112
void vtkInitOnce(T **obj)
Definition: vtkutils.h:44
#define VTK_CREATE(type, name)