ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
vtkutils.h
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 #pragma once
9 
10 #include <vtkActor.h>
11 #include <vtkConeSource.h>
12 #include <vtkCubeSource.h>
13 #include <vtkCylinderSource.h>
14 #include <vtkDelaunay2D.h>
15 #include <vtkDoubleArray.h>
16 #include <vtkPointData.h>
17 #include <vtkPoints.h>
18 #include <vtkPolyData.h>
19 #include <vtkPolyDataMapper.h>
20 #include <vtkSmartPointer.h>
21 #include <vtkSphereSource.h>
22 
23 #include "../qPCL.h"
24 #include "point3f.h"
25 #include "utils.h"
26 #include "vector4f.h"
27 
28 // macroes
29 #ifndef VTK_CREATE
30 #define VTK_CREATE(TYPE, NAME) \
31  vtkSmartPointer<TYPE> NAME = vtkSmartPointer<TYPE>::New()
32 #endif
33 
34 class vtkImageData;
35 class QVTKOpenGLNativeWidget;
36 class vtkPolyDataAlgorithm;
37 namespace VtkUtils {
38 
39 QImage QPCL_ENGINE_LIB_API vtkImageDataToQImage(vtkImageData* imageData);
40 void QPCL_ENGINE_LIB_API qImageToVtkImage(QImage& img, vtkImageData* imageData);
41 QImage QPCL_ENGINE_LIB_API vtkWidgetSnapshot(QVTKOpenGLNativeWidget* widget);
42 
43 template <class T>
44 void vtkInitOnce(T** obj) {
45  if (*obj == nullptr) *obj = T::New();
46 }
47 
48 template <class T>
50  if (!obj) obj = vtkSmartPointer<T>::New();
51 }
52 
53 template <class T>
54 void vtkSafeDelete(T* obj) {
55  if (obj) obj->Delete();
56 }
57 
58 static inline vtkActor* createSourceActor(vtkPolyDataAlgorithm* algo) {
59  vtkActor* actor = vtkActor::New();
60  vtkSmartPointer<vtkPolyDataMapper> mapper(vtkPolyDataMapper::New());
61  mapper->SetInputConnection(algo->GetOutputPort());
62  actor->SetMapper(mapper);
63 
64  return actor;
65 }
66 
67 template <class T>
68 class SourceSetter {
69 public:
70  void config(T* source) {
71  Q_UNUSED(source)
72  // no impl
73  }
74 };
75 
76 template <>
77 class SourceSetter<vtkSphereSource> {
78 public:
79  void config(vtkSphereSource* source) {}
80 };
81 
82 template <>
83 class SourceSetter<vtkConeSource> {
84 public:
85  void config(vtkConeSource* source) {}
86 };
87 
88 template <class T>
89 static inline vtkActor* createSourceActor(SourceSetter<T>* setter = nullptr) {
90  vtkActor* actor = vtkActor::New();
91 
92  vtkSmartPointer<T> source(T::New());
93 
94  if (setter) setter->config(source);
95 
96  vtkSmartPointer<vtkPolyDataMapper> mapper(vtkPolyDataMapper::New());
97  mapper->SetInputConnection(source->GetOutputPort());
98  actor->SetMapper(mapper);
99 
100  return actor;
101 }
102 
103 static vtkActor* createSurfaceActor(
104  const QList<Point3F>& points,
105  const QList<qreal>& scalars = QList<qreal>()) {
106  vtkSmartPointer<vtkPoints> vtkpoints(vtkPoints::New());
107  foreach (const Point3F& p3f, points)
108  vtkpoints->InsertNextPoint(p3f.x, p3f.y, p3f.z);
109 
110  vtkSmartPointer<vtkPolyData> polyData(vtkPolyData::New());
111  polyData->SetPoints(vtkpoints);
112 
113  vtkSmartPointer<vtkDoubleArray> scalarArray(vtkDoubleArray::New());
114  scalarArray->SetName("scalar");
115  foreach (qreal scalar, scalars) scalarArray->InsertNextTuple1(scalar);
116 
117  // vtkSmartPointer<vtkPointData> pointdata(vtkPointData::New());
118  // pointdata->SetScalars(dataArray);
119  vtkpoints->SetData(scalarArray);
120 
121  vtkSmartPointer<vtkDelaunay2D> del(vtkDelaunay2D::New());
122  del->SetInputData(polyData);
123  del->Update();
124 
125  vtkSmartPointer<vtkPolyDataMapper> mapper(vtkPolyDataMapper::New());
126  mapper->SetInputConnection(del->GetOutputPort());
127 
128  vtkActor* actor = vtkActor::New();
129  actor->SetMapper(mapper);
130 
131  return actor;
132 }
133 
134 template <class DataObject, class Mapper = vtkPolyDataMapper>
135 static inline vtkActor* createActorFromData(DataObject* data) {
136  vtkActor* actor = vtkActor::New();
137 
138  VTK_CREATE(Mapper, mapper);
139  mapper->SetInputData(data);
140  actor->SetMapper(mapper);
141 
142  return actor;
143 }
144 
145 void QPCL_ENGINE_LIB_API exportActorToFile(vtkActor* actor,
146  const QString& outfile);
147 
148 } // namespace VtkUtils
int points
void config(vtkConeSource *source)
Definition: vtkutils.h:85
void config(vtkSphereSource *source)
Definition: vtkutils.h:79
void config(T *source)
Definition: vtkutils.h:70
GraphType data
Definition: graph_cut.cc:138
normal_z scalar
static vtkActor * createSourceActor(vtkPolyDataAlgorithm *algo)
Definition: vtkutils.h:58
void exportActorToFile(vtkActor *actor, const QString &outfile)
Definition: vtkutils.cpp:77
QImage vtkImageDataToQImage(vtkImageData *imageData)
Definition: vtkutils.cpp:35
void vtkInitOnce(T **obj)
Definition: vtkutils.h:44
void qImageToVtkImage(QImage &img, vtkImageData *imageData)
Definition: vtkutils.cpp:58
static vtkActor * createActorFromData(DataObject *data)
Definition: vtkutils.h:135
static vtkActor * createSurfaceActor(const QList< Point3F > &points, const QList< qreal > &scalars=QList< qreal >())
Definition: vtkutils.h:103
QImage vtkWidgetSnapshot(QVTKOpenGLNativeWidget *widget)
Definition: vtkutils.cpp:71
void vtkSafeDelete(T *obj)
Definition: vtkutils.h:54
#define QPCL_ENGINE_LIB_API
Definition: qPCL.h:15
#define VTK_CREATE(TYPE, NAME)
Definition: vtkutils.h:30