Branch data Line data Source code
1 : : #ifndef MESHKIT_TRANSFORMBASE_HPP
2 : : #define MESHKIT_TRANSFORMBASE_HPP
3 : :
4 : : #include "meshkit/Error.hpp"
5 : : #include "meshkit/iMesh.hpp"
6 : : #include "meshkit/Matrix.hpp"
7 : : #include <vector>
8 : :
9 : : namespace MeshKit {
10 : 54 : inline double * vec2ptr(std::vector< Vector<3> > &v) {
11 : 54 : return reinterpret_cast<double *>(&v[0]);
12 : : }
13 : :
14 : : namespace Copy {
15 : : /** \class Transform Transform.hpp "meshkit/Transform.hpp"
16 : : * \brief A base class for transforming copied meshes
17 : : *
18 : : * This is the common base class used to transform vertices in copied
19 : : * meshes. Subclasses of this type implement particular transformation
20 : : * functions, e.g. translation or rotation.
21 : : */
22 : 12 : class Transform
23 : : {
24 : : public:
25 : : /** \brief Transform the selected vertices
26 : : * \param mesh the iMesh implementation holding the vertices
27 : : * \param src an array of the source vertices
28 : : * \param dest an array of the destination vertices
29 : : */
30 : : virtual void transform(iMesh *mesh,
31 : : const std::vector<iMesh::EntityHandle> &src,
32 : : std::vector<iMesh::EntityHandle> &dest) const = 0;
33 : :
34 : : /** \brief Clone this transform object
35 : : */
36 : : virtual Transform * clone() const = 0;
37 : :
38 : : /** \brief Virtual destructor
39 : : */
40 : 12 : virtual ~Transform ()
41 : 12 : {
42 [ - + ]: 12 : }
43 : : };
44 : :
45 : : /** \class BasicTransform Transform.hpp "meshkit/Transform.hpp"
46 : : * \brief A utility class for transforming copied meshes
47 : : *
48 : : * This class template simplifies the creation of new transformation
49 : : * functions. To use this, create a new class and inherit from this one,
50 : : * passing the new class name as the template parameter (the curiously-
51 : : * recurring template pattern).
52 : : *
53 : : * Example:
54 : : * class Example : public BasicTransform<Example>
55 : : * {
56 : : * friend class BasicTransform<Example>;
57 : : * public:
58 : : * Example() { ... }
59 : : * protected:
60 : : * void transform_one(Vector<3> &coords) const { ... }
61 : : * };
62 : : */
63 : : template<typename T>
64 [ - + ]: 32 : class BasicTransform : public Transform
65 : : {
66 : : public:
67 : : /** \brief Transform the selected vertices
68 : : * \param mesh the iMesh implementation holding the vertices
69 : : * \param src an array of the source vertices
70 : : * \param dest an array of the destination vertices
71 : : */
72 : 4 : virtual void transform(iMesh *mesh,
73 : : const std::vector<iMesh::EntityHandle> &src,
74 : : std::vector<iMesh::EntityHandle> &dest) const
75 : : {
76 [ + - ]: 4 : std::vector< Vector<3> > coords(src.size());
77 [ + - ][ + - ]: 4 : IBERRCHK(mesh->getVtxArrCoords(&src[0], src.size(), iBase_INTERLEAVED,
[ + - ][ + - ]
78 : : vec2ptr(coords)), *mesh);
79 : :
80 [ + + ]: 89 : for (size_t i=0; i<coords.size(); i++)
81 [ + - ][ + - ]: 85 : static_cast<const T*>(this)->transform_one(coords[i]);
82 : :
83 [ - + ]: 4 : if (&src == &dest)
84 : : {
85 [ # # ][ # # ]: 0 : IBERRCHK(mesh->setVtxArrCoords(&src[0], src.size(), iBase_INTERLEAVED,
[ # # ][ # # ]
86 : : vec2ptr(coords)), *mesh);
87 : : }
88 : : else {
89 [ + - ]: 4 : dest.resize(src.size());
90 [ + - ][ + - ]: 4 : IBERRCHK(mesh->createVtxArr(src.size(), iBase_INTERLEAVED,
[ + - ][ + - ]
91 : : vec2ptr(coords), &dest[0]), *mesh);
92 : 4 : }
93 : 4 : }
94 : :
95 : : /** \brief Clone this transform object
96 : : */
97 : 4 : virtual Transform * clone() const
98 : : {
99 : 4 : return new T(*static_cast<const T*>(this));
100 : : }
101 : : protected:
102 : 16 : BasicTransform() {}
103 : : };
104 : : }
105 : :
106 : : namespace Extrude {
107 : : /** \class Transform Transform.hpp "meshkit/Transform.hpp"
108 : : * \brief A base class for transforming extruded meshes
109 : : *
110 : : * This is the common base class used to transform vertices in extruded
111 : : * meshes. Subclasses of this type implement particular transformation
112 : : * functions, e.g. translation or rotation.
113 : : */
114 : 6 : class Transform
115 : : {
116 : : public:
117 : : /** \brief Transform the selected vertices
118 : : * \param step the step number for the extrusion, with 0 being the
119 : : * already-existing mesh data
120 : : * \param mesh the iMesh implementation holding the vertices
121 : : * \param src an array of the source vertices
122 : : * \param dest an array of the destination vertices
123 : : */
124 : : virtual void transform(int step, iMesh *mesh,
125 : : const std::vector<iMesh::EntityHandle> &src,
126 : : std::vector<iMesh::EntityHandle> &dest) const = 0;
127 : :
128 : : /** \brief The number of steps in this extrusion
129 : : */
130 : : virtual int steps() const = 0;
131 : :
132 : : /** \brief Clone this transform object
133 : : */
134 : : virtual Transform * clone() const = 0;
135 : :
136 : : /** \brief Virtual destructor
137 : : */
138 : 3 : virtual ~Transform ()
139 : 3 : {
140 [ - + ]: 3 : }
141 : : };
142 : :
143 : : /** \class BasicTransform Transform.hpp "meshkit/Transform.hpp"
144 : : * \brief A utility class for transforming extruded meshes
145 : : *
146 : : * This class template simplifies the creation of new transformation
147 : : * functions. To use this, create a new class and inherit from this one,
148 : : * passing the new class name as the template parameter (the curiously-
149 : : * recurring template pattern).
150 : : *
151 : : * Example:
152 : : * class Example : public BasicTransform<Example>
153 : : * {
154 : : * friend class BasicTransform<Example>;
155 : : * public:
156 : : * Example() { ... }
157 : : * protected:
158 : : * void transform_one(int step, Vector<3> &coords) const { ... }
159 : : * };
160 : : */
161 : : template<typename T>
162 [ - + ]: 12 : class BasicTransform : public Transform
163 : : {
164 : : public:
165 : : /** \brief Transform the selected vertices
166 : : * \param step the step number for the extrusion, with 0 being the
167 : : * already-existing mesh data
168 : : * \param mesh the iMesh implementation holding the vertices
169 : : * \param src an array of the source vertices
170 : : * \param dest an array of the destination vertices
171 : : */
172 : 21 : virtual void transform(int step, iMesh *mesh,
173 : : const std::vector<iMesh::EntityHandle> &src,
174 : : std::vector<iMesh::EntityHandle> &dest) const
175 : : {
176 [ + - ]: 21 : std::vector< Vector<3> > coords(src.size());
177 [ + - ][ + - ]: 21 : IBERRCHK(mesh->getVtxArrCoords(&src[0], src.size(), iBase_INTERLEAVED,
[ + - ][ + - ]
178 : : vec2ptr(coords)), *mesh);
179 : :
180 [ + + ]: 97 : for (size_t i=0; i<coords.size(); i++)
181 [ + - ][ + - ]: 76 : static_cast<const T*>(this)->transform_one(step, coords[i]);
182 : :
183 [ + - ]: 21 : dest.resize(src.size());
184 [ + - ][ + - ]: 21 : IBERRCHK(mesh->createVtxArr(src.size(), iBase_INTERLEAVED,
[ + - ][ + - ]
185 : 21 : vec2ptr(coords), &dest[0]), *mesh);
186 : 21 : }
187 : :
188 : : /** \brief The number of steps in this extrusion
189 : : */
190 : 24 : virtual int steps() const
191 : : {
192 : 24 : return steps_;
193 : : }
194 : :
195 : : /** \brief Clone this transform object
196 : : */
197 : 3 : virtual Transform * clone() const
198 : : {
199 : 3 : return new T(*static_cast<const T*>(this));
200 : : }
201 : : protected:
202 : 6 : BasicTransform(int steps) : steps_(steps)
203 : 3 : {}
204 : :
205 : : int steps_;
206 : : };
207 : : }
208 : : }
209 : :
210 : : #endif
|