Branch data Line data Source code
1 : : #ifndef MESHKIT_EXTRUDE_MESH_HPP
2 : : #define MESHKIT_EXTRUDE_MESH_HPP
3 : :
4 : : #include <vector>
5 : : #include <set>
6 : :
7 : : #include "meshkit/Types.hpp"
8 : : #include "meshkit/Error.hpp"
9 : : #include "meshkit/MeshScheme.hpp"
10 : : #include "meshkit/ModelEnt.hpp"
11 : :
12 : : #include "CESets.hpp"
13 : : #include "meshkit/LocalTag.hpp"
14 : : #include "Transform.hpp"
15 : :
16 : : #include "meshkit/iMesh.hpp"
17 : :
18 : :
19 : : namespace MeshKit {
20 : :
21 : : class MKCore;
22 : :
23 : :
24 : : /** \class ExtrudeMesh ExtrudeMesh.hpp "meshkit/ExtrudeMesh.hpp"
25 : : * \brief A simple class for extruding meshes
26 : : *
27 : : * INPUT: ModelEnts representing meshes
28 : : * MESH TYPE(S): ALL TYPES
29 : : * OUTPUT: Copied mesh along with the existing mesh
30 : : * DEPENDENCIES: (none)
31 : : * CONSTRAINTS: (none)
32 : : *
33 : : * This class performs the trivial task of extruding meshes. There can be
34 : : * multiple instances of this class, and therefore it is pointed to and managed by ....
35 : : *
36 : : * Each instance of this class stores all the ModelEnt's representing the mesh data,
37 : : * and after execution after meshing new entities are created and tag propagation happens.
38 : : */
39 : : class ExtrudeMesh : public MeshScheme
40 : : {
41 : : public:
42 : : //! Bare constructor
43 : : ExtrudeMesh(MKCore *mkcore, const MEntVector &me_vec);
44 : :
45 : : //! Destructor
46 : : virtual ~ExtrudeMesh();
47 : :
48 : : /**\brief Get class name */
49 : : static const char* name();
50 : :
51 : : /**\brief Function returning whether this scheme can mesh entities of t
52 : : * the specified dimension.
53 : : *\param dim entity dimension
54 : : */
55 : : static bool can_mesh(iBase_EntityType dim);
56 : :
57 : : /** \brief Function returning whether this scheme can mesh the specified entity
58 : : *
59 : : * Used by MeshOpFactory to find scheme for an entity.
60 : : * \param me ModelEnt being queried
61 : : * \return If true, this scheme can mesh the specified ModelEnt
62 : : */
63 : : static bool can_mesh(ModelEnt *me);
64 : :
65 : : /**\brief Get list of mesh entity types that can be generated.
66 : : *\return array terminated with \c moab::MBMAXTYPE
67 : : */
68 : : static const moab::EntityType* output_types();
69 : :
70 : : /** \brief Return the mesh entity types operated on by this scheme
71 : : * \return array terminated with \c moab::MBMAXTYPE
72 : : */
73 : : virtual const moab::EntityType* mesh_types_arr() const;
74 : :
75 : : /** \brief Re-implemented here so we can check topological dimension of model_ent
76 : : * \param model_ent ModelEnt being added
77 : : */
78 : : virtual bool add_modelent(ModelEnt *model_ent);
79 : :
80 : : //! Setup is a no-op, but must be provided since it's pure virtual
81 : : virtual void setup_this();
82 : :
83 : : //! The only setup/execute function we need, since meshing vertices is trivial
84 : : virtual void execute_this();
85 : :
86 : : // ExtrudeMesh function local //////////////////
87 : :
88 : : /* \brief Return the tag used to indicate extruded sets
89 : : */
90 : : iBase_TagHandle extrude_tag();
91 : :
92 : : /* \brief Return the tag used to indicate copied sets
93 : : */
94 : : iBase_TagHandle copy_tag();
95 : :
96 : : /* \brief Set the transform function for this operation
97 : : */
98 : : void set_transform(const Extrude::Transform &transform);
99 : :
100 : : /* \brief Turn copying of faces on (true) or off (false)
101 : : */
102 : : void copy_faces(bool copy);
103 : :
104 : : void update_sets();
105 : :
106 : : /* \brief Reset the copy and expand set lists
107 : : */
108 : : void reset_sets();
109 : :
110 : : /* \brief Return reference to extrude sets
111 : : */
112 : : CESets &extrude_sets();
113 : :
114 : : /* \brief Return reference to copy sets
115 : : */
116 : : CESets ©_sets();
117 : :
118 : : /* \brief Return reference to expand sets
119 : : */
120 : : CESets &expand_sets();
121 : :
122 : : // - get structure
123 : : int getStructure(iMesh_Instance instance,
124 : : iBase_EntitySetHandle set,
125 : : std::vector<iBase_EntityHandle> &ents,
126 : : std::vector<iBase_EntityHandle> &unique_adj,
127 : : std::vector<int> &indices,
128 : : std::vector<int> &offsets);
129 : :
130 : : private:
131 : : void do_extrude(iMesh::EntitySetHandle set_handle);
132 : :
133 : : void get_normals(const std::vector<iBase_EntityHandle> &verts,
134 : : const std::vector<int> &indices,
135 : : const std::vector<int> &offsets, const Vector<3> &dv,
136 : : std::vector<int> &normals);
137 : :
138 : : void connect_up_dots(iBase_EntityHandle *src, int size,
139 : : iBase_TagHandle local_tag, int *norms, int *inds,
140 : : int *offs, iBase_EntityHandle *pre,
141 : : iBase_EntityHandle *post);
142 : : void connect_up_dots(iBase_EntityHandle *src, int size,
143 : : iBase_TagHandle local_tag,
144 : : int *pre_norms, int *pre_inds, int *pre_offs,
145 : : iBase_EntityHandle *pre,
146 : : int *post_norms, int *post_inds, int *post_offs,
147 : : iBase_EntityHandle *post);
148 : :
149 : : iMesh *mesh; // mesh instance
150 : : LocalTag extrudeTag; // tag storing extrude-to tag
151 : : LocalTag copyTag; // tag storing copy-to tag
152 : : Extrude::Transform *transform; // transform function for extrusion
153 : : bool copyFaces;
154 : :
155 : : CESets extrudeSets;
156 : : CESets copySets;
157 : : CESets expandSets;
158 : : };
159 : :
160 : 745 : inline const char* ExtrudeMesh::name()
161 : : {
162 : 745 : return "ExtrudeMesh";
163 : : }
164 : :
165 : 160 : inline bool ExtrudeMesh::can_mesh(iBase_EntityType)
166 : : {
167 : : // Given just a dimension, ExtrudeMesh can't do anything since it doesn't
168 : : // know what to extrude.
169 : 160 : return false;
170 : : }
171 : :
172 : 0 : inline bool ExtrudeMesh::can_mesh(ModelEnt *me)
173 : : {
174 : 0 : return me->dimension() < 3;
175 : : }
176 : :
177 : 0 : inline const moab::EntityType* ExtrudeMesh::mesh_types_arr() const
178 : : {
179 : 0 : return output_types();
180 : : }
181 : :
182 : 3 : inline void ExtrudeMesh::set_transform(const Extrude::Transform &trans)
183 : : {
184 [ - + ]: 3 : delete transform;
185 : 3 : transform = trans.clone();
186 : 3 : }
187 : :
188 : 3 : inline void ExtrudeMesh::copy_faces(bool copy)
189 : : {
190 : 3 : copyFaces = copy;
191 : 3 : }
192 : :
193 : 2 : inline iBase_TagHandle ExtrudeMesh::copy_tag()
194 : : {
195 : 2 : return copyTag;
196 : : }
197 : :
198 : 2 : inline iBase_TagHandle ExtrudeMesh::extrude_tag()
199 : : {
200 : 2 : return extrudeTag;
201 : : }
202 : :
203 : : inline void ExtrudeMesh::reset_sets()
204 : : {
205 : : extrudeSets.clear();
206 : : copySets.clear();
207 : : expandSets.clear();
208 : : }
209 : :
210 : 3 : inline CESets &ExtrudeMesh::copy_sets()
211 : : {
212 : 3 : return copySets;
213 : : }
214 : :
215 : 2 : inline CESets &ExtrudeMesh::expand_sets()
216 : : {
217 : 2 : return expandSets;
218 : : }
219 : :
220 : 5 : inline CESets &ExtrudeMesh::extrude_sets()
221 : : {
222 : 5 : return extrudeSets;
223 : : }
224 : :
225 : : inline void
226 : 21 : ExtrudeMesh::connect_up_dots(iBase_EntityHandle *src, int size,
227 : : iBase_TagHandle local_tag, int *norms, int *inds,
228 : : int *offs, iBase_EntityHandle *pre,
229 : : iBase_EntityHandle *post)
230 : : {
231 : : connect_up_dots(src, size, local_tag,
232 : : norms, inds, offs, pre,
233 : 21 : norms, inds, offs, post);
234 : 21 : }
235 : :
236 : : } // namespace MeshKit
237 : : #endif
238 : :
239 : :
|