Branch data Line data Source code
1 : : #include "meshkit/VertexMesher.hpp"
2 : : #include "meshkit/MKCore.hpp"
3 : : #include "MBTagConventions.hpp"
4 : : #include "moab/EntityType.hpp"
5 : : #include "meshkit/iGeom.hpp"
6 : : #include "meshkit/RegisterMeshOp.hpp"
7 : :
8 : : namespace MeshKit
9 : : {
10 : :
11 : :
12 : : // static registration of this mesh scheme
13 : : moab::EntityType types[] = { moab::MBVERTEX, moab::MBMAXTYPE};
14 : 40 : const moab::EntityType* VertexMesher::output_types()
15 : 40 : { return types; }
16 : :
17 : 32 : VertexMesher::VertexMesher(MKCore *mkcore, const MEntVector &me_vec)
18 : 32 : : MeshScheme(mkcore, me_vec)
19 : : {
20 [ + - ][ + - ]: 32 : if (mk_core()->vertex_mesher())
[ - + ]
21 [ # # ]: 0 : throw Error(MK_FAILURE, "Should only have a single VertexMesher; use mk_core()->vertex_mesher().");
22 : :
23 [ + - ][ + - ]: 32 : mk_core()->vertex_mesher(this);
24 : 32 : }
25 : :
26 : 90 : VertexMesher::~VertexMesher()
27 : : {
28 [ - + ]: 30 : assert (mk_core()->vertex_mesher() == this);
29 : 30 : mk_core()->vertex_mesher(NULL);
30 [ - + ]: 60 : }
31 : :
32 : 242 : bool VertexMesher::add_modelent(ModelEnt *model_ent)
33 : : {
34 : : // make sure this represents a geometric vertex
35 [ - + ]: 242 : if (0 != model_ent->dimension())
36 [ # # ]: 0 : throw Error(MK_WRONG_DIMENSION, "Wrong dimension entity added to VertexMesher.");
37 : :
38 : 242 : return MeshOp::add_modelent(model_ent);
39 : : }
40 : :
41 : : //! Setup is a no-op, but must be provided since it's pure virtual
42 : 33 : void VertexMesher::setup_this()
43 : 33 : {}
44 : :
45 : 33 : void VertexMesher::execute_this()
46 : : {
47 [ - + ]: 66 : if (mentSelection.empty()) return;
48 : :
49 : : // generate vertices for each vertex
50 [ + - ]: 33 : MEntSelection::iterator sit;
51 [ + - ][ + - ]: 279 : for (sit = mentSelection.begin(); sit != mentSelection.end(); sit++) {
[ + + ]
52 [ + - ][ + - ]: 246 : if ((*sit).first->get_meshed_state() >= COMPLETE_MESH)
[ + + ]
53 : 8 : continue;
54 : 238 : double pos[3] = {0, 0, 0};
55 : : // get the position
56 [ + - ][ + - ]: 238 : (*sit).first->evaluate(pos[0], pos[0], pos[0], pos);
57 : : moab::EntityHandle new_vert;
58 : : // create the vertex
59 [ + - ][ + - ]: 238 : moab::ErrorCode rval = mk_core()->moab_instance()->create_vertex(pos, new_vert);
[ + - ]
60 [ - + ][ # # ]: 238 : MBERRCHK(rval, mk_core()->moab_instance());
[ # # ][ # # ]
[ # # ][ # # ]
61 : : // category tagging
62 [ + - ][ + - ]: 238 : iMesh::EntitySetHandle msh = IBSH((*sit).first->mesh_handle());
63 : 238 : char category_val[CATEGORY_TAG_SIZE] = "Vertex\0";
64 : : iBase_TagHandle category_tag;
65 [ + - ][ + - ]: 238 : mk_core()->imesh_instance()->createTag(CATEGORY_TAG_NAME,CATEGORY_TAG_SIZE,iBase_BYTES, category_tag);
[ + - ]
66 [ + - ][ + - ]: 238 : mk_core()->imesh_instance()->setEntSetData(msh, category_tag, &category_val);
[ + - ]
67 : : // add to meselection
68 [ + - ][ + - ]: 238 : (*sit).second.insert(new_vert);
69 : : // commit to ModelEnt
70 [ + - ][ + - ]: 238 : (*sit).first->commit_mesh((*sit).second, COMPLETE_MESH);
[ + - ]
71 : : }
72 : : }
73 : :
74 : :
75 [ + - ][ + - ]: 156 : } // namespace MeshKit
|