11 #include "MBRange.hpp"
27 if( ia->
v0 == ib->
v0 )
29 return (
int)( 100.f * ia->
v1 - 100.f * ib->
v1 );
33 return (
int)( 100.f * ia->
v0 - 100.f * ib->
v0 );
39 MBErrorCode
skin_tris( MBInterface*
mb, MBRange tris, MBRange& skin_edges )
45 if( !tris.all_of_type(
MBTRI ) )
return MB_FAILURE;
49 MBErrorCode rval =
mb->get_number_entities_by_type( 0,
MBEDGE, n_edges );
53 std::cerr <<
"skin_tris: failed because " << n_edges <<
" edges exist in the MOAB instance" << std::endl;
58 edge* edges =
new edge[3 * tris.size()];
61 for( MBRange::iterator i = tris.begin(); i != tris.end(); ++i )
63 const MBEntityHandle* conn;
64 rval =
mb->get_connectivity( *i, conn, n_verts );
66 if( 3 != n_verts )
return MB_FAILURE;
68 if( conn[0] == conn[1] || conn[1] == conn[2] || conn[2] == conn[0] )
70 std::cerr <<
"skin_tris: degenerate triangle" << std::endl;
75 edges[3 * ii + 0].
v0 = conn[0];
76 edges[3 * ii + 0].
v1 = conn[1];
77 edges[3 * ii + 1].
v0 = conn[1];
78 edges[3 * ii + 1].
v1 = conn[2];
79 edges[3 * ii + 2].
v0 = conn[2];
80 edges[3 * ii + 2].
v1 = conn[0];
85 for(
unsigned int i = 0; i < 3 * tris.size(); ++i )
87 if( edges[i].
v0 > edges[i].
v1 )
89 MBEntityHandle temp = edges[i].
v0;
90 edges[i].
v0 = edges[i].
v1;
99 for(
unsigned int i = 0; i < 3 * tris.size(); i++ )
103 if( 3 * tris.size() - 1 == i )
105 const MBEntityHandle conn[2] = { edges[i].
v0, edges[i].
v1 };
109 skin_edges.insert(
edge );
113 else if( edges[i].
v0 == edges[i + 1].
v0 && edges[i].
v1 == edges[i + 1].
v1 )
117 while( edges[i].
v0 == edges[i + 1].
v0 && edges[i].
v1 == edges[i + 1].
v1 )
119 std::cout <<
"find_skin WARNING: non-manifold edge" << std::endl;
120 mb->list_entity( edges[i].
v0 );
121 mb->list_entity( edges[i].
v1 );
128 const MBEntityHandle conn[2] = { edges[i].
v0, edges[i].
v1 };
132 skin_edges.insert(
edge );
141 int main(
int argc,
char** argv )
145 std::cout <<
"Usage: " << argv[0] <<
" <filename>" << std::endl;
150 MBCore*
mb =
new MBCore();
151 MBErrorCode rval =
mb->load_file( argv[1] );
156 rval =
mb->get_entities_by_type( 0,
MBEDGE, edges );
158 if( !edges.empty() ) std::cout <<
"Warning: deleting all MBEdges" << std::endl;
159 rval =
mb->delete_entities( edges );
168 void* dim[] = { &two };
169 rval =
mb->get_entities_by_type_and_tag( 0,
MBENTITYSET, &geom_tag, dim, 1, surf_sets );
173 for( MBRange::iterator i = surf_sets.begin(); i != surf_sets.end(); ++i )
178 rval =
mb->get_entities_by_type( *i,
MBTRI, tris );
187 std::cout <<
"surface has " << skin_edges.size() <<
" skin edges" << std::endl;
190 rval =
mb->delete_entities( skin_edges );