#include <iostream>
#include <stdlib.h>
#include "MBCore.hpp"
#include "MBRange.hpp"
#include "MBTagConventions.hpp"
Go to the source code of this file.
Function Documentation
Definition at line 15 of file SkinMesh.cpp.
{
struct edge *ia = (struct edge *)a;
struct edge *ib = (struct edge *)b;
if(ia->v0 == ib->v0) {
return (int)(100.f*ia->v1 - 100.f*ib->v1);
} else {
return (int)(100.f*ia->v0 - 100.f*ib->v0);
}
}
int main |
( |
int |
argc, |
|
|
char ** |
argv |
|
) |
| |
Definition at line 118 of file SkinMesh.cpp.
{
if (1 == argc) {
std::cout << "Usage: " << argv[0] << " <filename>" << std::endl;
return 0;
}
MBCore *mb = new MBCore();
MBErrorCode rval = mb->load_file(argv[1]);
if(MB_SUCCESS != rval) return 0;
MBRange edges;
rval = mb->get_entities_by_type( 0, MBEDGE, edges );
if(MB_SUCCESS != rval) return 0;
if( !edges.empty() ) std::cout << "Warning: deleting all MBEdges" << std::endl;
rval = mb->delete_entities( edges );
if(MB_SUCCESS != rval) return 0;
MBTag geom_tag;
rval = mb->tag_get_handle( GEOM_DIMENSION_TAG_NAME, 1, MB_TYPE_INTEGER, geom_tag );
if(MB_SUCCESS != rval) return 0;
MBRange surf_sets;
int two = 2;
void *dim[] = {&two};
rval = mb->get_entities_by_type_and_tag( 0, MBENTITYSET, &geom_tag,
dim, 1, surf_sets );
if(MB_SUCCESS != rval) return 0;
for(MBRange::iterator i=surf_sets.begin(); i!=surf_sets.end(); ++i) {
MBRange tris;
rval = mb->get_entities_by_type( *i, MBTRI, tris );
if(MB_SUCCESS != rval) return 0;
MBRange skin_edges;
rval = skin_tris( mb, tris, skin_edges );
if(MB_SUCCESS != rval) return 0;
std::cout << "surface has " << skin_edges.size() << " skin edges" << std::endl;
rval = mb->delete_entities( skin_edges );
if(MB_SUCCESS != rval) return 0;
}
}
Definition at line 27 of file SkinMesh.cpp.
{
skin_edges.clear();
if(tris.empty()) return MB_ENTITY_NOT_FOUND;
if(!tris.all_of_type(MBTRI)) return MB_FAILURE;
int n_edges;
MBErrorCode rval = mb->get_number_entities_by_type( 0, MBEDGE, n_edges );
if(MB_SUCCESS != rval) return rval;
if(0 != n_edges) {
std::cerr << "skin_tris: failed because " << n_edges
<< " edges exist in the MOAB instance" << std::endl;
return MB_FAILURE;
}
edge *edges = new edge[3*tris.size()];
int n_verts;
int ii = 0;
for(MBRange::iterator i=tris.begin(); i!=tris.end(); i++) {
const MBEntityHandle *conn;
rval = mb->get_connectivity( *i, conn, n_verts );
if(MB_SUCCESS != rval) return rval;
if(3 != n_verts) return MB_FAILURE;
if(conn[0]==conn[1] || conn[1]==conn[2] || conn[2]==conn[0]) {
std::cerr << "skin_tris: degenerate triangle" << std::endl;
return MB_FAILURE;
}
edges[3*ii+0].v0 = conn[0];
edges[3*ii+0].v1 = conn[1];
edges[3*ii+1].v0 = conn[1];
edges[3*ii+1].v1 = conn[2];
edges[3*ii+2].v0 = conn[2];
edges[3*ii+2].v1 = conn[0];
ii++;
}
for(unsigned int i=0; i<3*tris.size(); ++i) {
if(edges[i].v0 > edges[i].v1) {
MBEntityHandle temp = edges[i].v0;
edges[i].v0 = edges[i].v1;
edges[i].v1 = temp;
}
}
qsort(edges, 3*tris.size(), sizeof(struct edge), compare_edge);
for(unsigned int i=0; i<3*tris.size(); i++) {
if(3*tris.size()-1 == i) {
const MBEntityHandle conn[2] = {edges[i].v0, edges[i].v1};
MBEntityHandle edge;
rval = mb->create_element( MBEDGE, conn, 2, edge );
if(MB_SUCCESS != rval) return rval;
skin_edges.insert(edge);
} else if(edges[i].v0==edges[i+1].v0 && edges[i].v1==edges[i+1].v1) {
i++;
while( edges[i].v0==edges[i+1].v0 && edges[i].v1==edges[i+1].v1 ) {
std::cout << "find_skin WARNING: non-manifold edge" << std::endl;
mb->list_entity( edges[i].v0 );
mb->list_entity( edges[i].v1 );
++i;
}
} else {
const MBEntityHandle conn[2] = {edges[i].v0, edges[i].v1};
MBEntityHandle edge;
rval = mb->create_element( MBEDGE, conn, 2, edge );
if(MB_SUCCESS != rval) return rval;
skin_edges.insert( edge );
}
}
delete[] edges;
return MB_SUCCESS;
}