1 #ifndef FBENGINE_HPP_
2 #define FBENGINE_HPP_
3 #include <cstdlib>
4
5 #include <vector>
6 #include <map>
7
8 #include "moab/Types.hpp"
9 #include "moab/Interface.hpp"
10 #include "moab/Range.hpp"
11 #include "moab/CartVect.hpp"
12
13 namespace moab
14 {
15 class GeomTopoTool;
16
17
18 class SmoothFace;
19 class SmoothCurve;
20
21
24 class FBEngine
25 {
26 public:
27 FBEngine( Interface* impl, GeomTopoTool* geomTopoTool = NULL, const bool smooth = false );
28
29 ~FBEngine();
30
31 ErrorCode Init();
32
33 ErrorCode getRootSet( EntityHandle* root_set );
34
35 ErrorCode getNumEntSets( EntityHandle set, int num_hops, int* all_sets );
36
37 ErrorCode createEntSet( int isList, EntityHandle* pSet );
38
39 ErrorCode addEntSet( EntityHandle entity_set_to_add, EntityHandle entity_set_handle );
40
41 ErrorCode getEntities( EntityHandle root_set, int ent_type, Range& gentities );
42
43 ErrorCode addEntArrToSet( const Range& entities, EntityHandle set );
44
45 ErrorCode getNumOfType( EntityHandle set, int ent_type, int* pNum );
46
47 ErrorCode getEntType( EntityHandle gent, int* type );
48
49 ErrorCode getEntBoundBox( EntityHandle this_gent,
50 double* x0,
51 double* y0,
52 double* z0,
53 double* x1,
54 double* y1,
55 double* z1 );
56 ErrorCode getEntClosestPt( EntityHandle this_gent,
57 double x,
58 double y,
59 double z,
60 double* x1,
61 double* y1,
62 double* y3 );
63
64 ErrorCode getVtxCoord( EntityHandle this_gent, double* x0, double* y0, double* z0 );
65
66 ErrorCode gsubtract( EntityHandle entity_set_1, EntityHandle entity_set_2, EntityHandle result_entity_set );
67
68 ErrorCode getEntNrmlXYZ( EntityHandle entity_handle,
69 double x,
70 double y,
71 double z,
72 double* nrml_i,
73 double* nrml_j,
74 double* nrml_k );
75
76 ErrorCode getPntRayIntsct( double x,
77 double y,
78 double z,
79 double dir_x,
80 double dir_y,
81 double dir_z,
82 std::vector< EntityHandle >& intersect_entity_handles,
83
84 std::vector< double >& intersect_coords,
85 std::vector< double >& param_coords );
86
87
88
89 ErrorCode createTag( const char* tag_name, int tag_num_type_values, int tag_type, Tag& tag_handle_out );
90
91 Interface* moab_instance()
92 {
93 return _mbImpl;
94 }
95
96 ErrorCode getArrData( const moab::EntityHandle* entity_handles,
97 int entity_handles_size,
98 Tag tag_handle,
99 void* tag_values_out );
100
101 ErrorCode setArrData( const EntityHandle* entity_handles,
102 int entity_handles_size,
103 Tag tag_handle,
104 const void* tag_values );
105
106 ErrorCode getEntAdj( EntityHandle handle, int type_requested, Range& adjEnts );
107
108 ErrorCode getEgFcSense( EntityHandle mbedge, EntityHandle mbface, int& sense );
109
110 ErrorCode measure( const EntityHandle* moab_entities, int entities_size, double* measures );
111
112
113 ErrorCode getEntNrmlSense( EntityHandle face, EntityHandle region, int& sense );
114
115 ErrorCode getEgEvalXYZ( EntityHandle edge,
116 double x,
117 double y,
118 double z,
119 double& on_x,
120 double& on_y,
121 double& on_z,
122 double& tngt_i,
123 double& tngt_j,
124 double& tngt_k,
125 double& cvtr_i,
126 double& cvtr_j,
127 double& cvtr_k );
128 ErrorCode getFcEvalXYZ( EntityHandle face,
129 double x,
130 double y,
131 double z,
132 double& on_x,
133 double& on_y,
134 double& on_z,
135 double& nrml_i,
136 double& nrml_j,
137 double& nrml_k,
138 double& cvtr1_i,
139 double& cvtr1_j,
140 double& cvtr1_k,
141 double& cvtr2_i,
142 double& cvtr2_j,
143 double& cvtr2_k );
144
145 ErrorCode getEgVtxSense( EntityHandle edge, EntityHandle vtx1, EntityHandle vtx2, int& sense );
146
147 ErrorCode getEntURange( EntityHandle edge, double& u_min, double& u_max );
148
149 ErrorCode getEntUtoXYZ( EntityHandle edge, double u, double& x, double& y, double& z );
150
151 ErrorCode getEntTgntU( EntityHandle edge, double u, double& i, double& j, double& k );
152
153 ErrorCode isEntAdj( EntityHandle entity1, EntityHandle entity2, bool& adjacent_out );
154
155 ErrorCode split_surface_with_direction( EntityHandle face,
156 std::vector< double >& xyz,
157 double* direction,
158 int closed,
159 double min_dot,
160 EntityHandle& oNewFace );
161
162 ErrorCode split_surface( EntityHandle face,
163 std::vector< EntityHandle >& chainedEdges,
164 std::vector< EntityHandle >& splittingNodes,
165 EntityHandle& newFace );
166
167 ErrorCode split_edge_at_point( EntityHandle edge, CartVect& point, EntityHandle& new_edge );
168
169 ErrorCode split_edge_at_mesh_node( EntityHandle edge, EntityHandle node, EntityHandle& new_edge );
170
171 ErrorCode split_bedge_at_new_mesh_node( EntityHandle b_edge,
172 EntityHandle atNode,
173 EntityHandle brokenEdge,
174 EntityHandle& new_edge );
175
176
177 void clean();
178
179 void delete_smooth_tags();
180
181
182
183 GeomTopoTool* get_gtt()
184 {
185 return this->_my_geomTopoTool;
186 }
187
188 ErrorCode create_volume_with_direction( EntityHandle newFace1,
189 EntityHandle newFace2,
190 double* direction,
191 EntityHandle& volume );
192
193
194 ErrorCode get_nodes_from_edge( EntityHandle gedge, std::vector< EntityHandle >& nodes );
195
196 ErrorCode weave_lateral_face_from_edges( EntityHandle bEdge,
197 EntityHandle tEdge,
198 double* direction,
199 EntityHandle& newLatFace );
200
201
202
203
204
205
211 ErrorCode chain_edges( double min_dot );
212
213
214 ErrorCode chain_two_edges( EntityHandle edge, EntityHandle next_edge );
215
216 ErrorCode get_vert_edges( EntityHandle edge, EntityHandle& v1, EntityHandle& v2 );
217
218 void set_smooth()
219 {
220 _smooth = true;
221 }
222
223 private:
224 ErrorCode initializeSmoothing();
225
226 ErrorCode getAdjacentEntities( const EntityHandle from, const int to_dim, Range& adj_ents );
227
228 ErrorCode compute_intersection_points( EntityHandle& face,
229 EntityHandle from,
230 EntityHandle to,
231 CartVect& Dir,
232 std::vector< CartVect >& points,
233 std::vector< EntityHandle >& entities,
234 std::vector< EntityHandle >& triangles );
235
236 ErrorCode BreakTriangle( EntityHandle tri,
237 EntityHandle e1,
238 EntityHandle e3,
239 EntityHandle n1,
240 EntityHandle n2,
241 EntityHandle n3 );
242
243 ErrorCode BreakTriangle2( EntityHandle tri,
244 EntityHandle e1,
245 EntityHandle e2,
246 EntityHandle n1,
247 EntityHandle n2 );
248
249 void print_debug_triangle( EntityHandle triangle );
250
251 ErrorCode create_new_gedge( std::vector< EntityHandle >& nodesAlongPolyline, EntityHandle& new_geo_edge );
252
253
254 ErrorCode separate( EntityHandle face, std::vector< EntityHandle >& chainedEdges, Range& first, Range& second );
255
256 ErrorCode smooth_new_intx_points( EntityHandle face, std::vector< EntityHandle >& chainedEdges );
257
258
259 ErrorCode split_boundary( EntityHandle face, EntityHandle atNode );
260
261
262 bool find_vertex_set_for_node( EntityHandle iNode, EntityHandle& oVertexSet );
263
264
265
266
267
268
269 ErrorCode redistribute_boundary_edges_to_faces( EntityHandle face,
270 EntityHandle newFace,
271 std::vector< EntityHandle >& chainedEdges );
272
273
274 ErrorCode set_neumann_tags( EntityHandle face, EntityHandle newFace );
275
276
277
278 ErrorCode split_quads();
279
280 ErrorCode boundary_nodes_on_face( EntityHandle face, std::vector< EntityHandle >& boundary_nodes );
281
282 ErrorCode boundary_mesh_edges_on_face( EntityHandle face, Range& boundary_mesh_edges );
283
284
285 ErrorCode split_internal_edge( EntityHandle& edge, EntityHandle& newVertex );
286
287 ErrorCode divide_triangle( EntityHandle triangle, EntityHandle& newVertex );
288 Interface* _mbImpl;
289
290
291 ErrorCode set_default_neumann_tags();
292
293 ErrorCode chain_able_edge( EntityHandle edge, double min_dot, EntityHandle& next_edge, bool& chainable );
294
295 GeomTopoTool* _my_geomTopoTool;
296 bool _t_created;
297 bool _smooth;
298 bool _initialized;
299
300
301
302 Range _my_gsets[5];
303
304
305
306
307 std::map< EntityHandle, SmoothFace* > _faces;
308 std::map< EntityHandle, SmoothCurve* > _edges;
309 SmoothFace** _smthFace;
310 SmoothCurve** _smthCurve;
311
312 Range _piercedTriangles;
313 Range _newTriangles;
314 Range _piercedEdges;
315 std::map< EntityHandle, EntityHandle > _brokenEdges;
316
317
318 };
319
320 }
321 #endif