|
cgma
|
#include "iGeom.h"#include "RefEntity.hpp"#include "RefFace.hpp"#include "RefEdge.hpp"#include "RefVertex.hpp"#include "Body.hpp"#include "CubitVector.hpp"#include "ModelQueryEngine.hpp"#include "GeometryQueryTool.hpp"#include <iostream>Go to the source code of this file.
Defines | |
| #define | CHECK(STR) if (err != iBase_SUCCESS) return print_error( STR, err, geom, __FILE__, __LINE__ ) |
| #define | ENGINE "FACET" |
| #define | FORMAT "FACET" |
| #define | FILE_NAME "brick.facet" |
| #define | STRINGIFY(S) XSTRINGIFY(S) |
| #define | XSTRINGIFY(S) #S |
Functions | |
| int | getFirstVolume (iGeom_Instance geom, iBase_EntityHandle &volume) |
| int | checkEdgeOrientation (iGeom_Instance geom, iBase_EntityHandle &volume) |
| static int | print_error (const char *desc, int err, iGeom_Instance geom, const char *file, int line) |
| int | main (int argc, char *argv[]) |
| #define CHECK | ( | STR | ) | if (err != iBase_SUCCESS) return print_error( STR, err, geom, __FILE__, __LINE__ ) |
Definition at line 11 of file test_edge_orient.cc.
| #define ENGINE "FACET" |
Definition at line 21 of file test_edge_orient.cc.
| #define FILE_NAME "brick.facet" |
Definition at line 23 of file test_edge_orient.cc.
| #define FORMAT "FACET" |
Definition at line 22 of file test_edge_orient.cc.
| #define STRINGIFY | ( | S | ) | XSTRINGIFY(S) |
Definition at line 26 of file test_edge_orient.cc.
| #define XSTRINGIFY | ( | S | ) | #S |
Definition at line 27 of file test_edge_orient.cc.
| int checkEdgeOrientation | ( | iGeom_Instance | geom, |
| iBase_EntityHandle & | volume | ||
| ) |
Definition at line 189 of file test_edge_orient.cc.
{
int i, j, err;
// get all edges
iBase_EntityHandle* edges = NULL;
int e_alloc = 0;
int e_size = 0;
iGeom_getEntAdj(geom, volume, iBase_EDGE, &edges, &e_alloc,
&e_size, &err);
CHECK("Failed to get edges.");
// Check that the edge senses to the two parent faces, each multiplied by
// its parent face's sense to the volume, should be opposite
for (i = 0; i < e_size; i++) { // for all edges
// get parent faces
iBase_EntityHandle* faces = NULL;
int f_alloc = 0;
int f_size = 0;
iGeom_getEntAdj(geom, edges[i], iBase_FACE, &faces, &f_alloc,
&f_size, &err);
CHECK("Failed to get edges.");
// check if # of parent faces of the edges on the volume is 2
if (f_size != 2) {
std::cerr << "Error: # of parent faces of solid edges should be 2."
<< std::endl;
return 1;
}
// compute the edge to volume senses by multiplying the edge to face sense
// by the parent face sense with respect to the volume.
int face_sense;
int sense[2];
for (j = 0; j < 2; j++) {
iGeom_getEgFcSense(geom, edges[i], faces[j], &sense[j], &err);
CHECK("Failed to get edge to face sense.");
iGeom_getEntNrmlSense(geom, faces[j], volume, &face_sense, &err);
CHECK("Failed to get face to volume sense.");
if(0!=face_sense)
sense[j] *= face_sense;
}
// check if the edge to volume senses are opposite
if (sense[0]*sense[1] != -1) {
std::cerr << "Error: Edge senses to 2 parent faces should be opposite."
<< std::endl;
return 1;
}
}
std::cout << "Verified opposite edge to face senses for " << e_size
<< " edges." << std::endl;
return 0;
}
| int getFirstVolume | ( | iGeom_Instance | geom, |
| iBase_EntityHandle & | volume | ||
| ) |
Definition at line 168 of file test_edge_orient.cc.
{
int err;
iBase_EntitySetHandle root_set;
iGeom_getRootSet(geom, &root_set, &err);
CHECK("Failed to get root set.");
// get the (first) volume
iBase_EntityHandle* vols = NULL;
int v_alloc = 0;
int v_size = 0;
iGeom_getEntities(geom, root_set, iBase_REGION, &vols,
&v_alloc, &v_size, &err);
CHECK("Failed to get volumes.");
volume = vols[0];
return 0;
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 51 of file test_edge_orient.cc.
{
// initialize the Mesh
int i, err;
iGeom_Instance geom;
std::string engine_opt = ";engine=";
engine_opt += ENGINE;
iGeom_newGeom(engine_opt.c_str(), &geom, &err, engine_opt.length());
// read in the geometry file, which is the geometry of a brick
std::string input_file;
input_file = STRINGIFY(SRCDIR)"/";
input_file += FILE_NAME;
if (argc>1)
input_file = argv[1];
iGeom_load(geom, input_file.c_str(), 0, &err, input_file.length(), 0);
CHECK( "ERROR : can not load a geometry" );
iBase_EntityHandle volume;
err = getFirstVolume(geom, volume);
if (err)
return err;
// get the bounding box of the brick and calculate its approximate center
double minX, minY, minZ, maxX, maxY, maxZ;
iGeom_getEntBoundBox(geom, volume, &minX, &minY, &minZ,
&maxX, &maxY, &maxZ, &err);
CHECK("Failed to get bounding box.");
double cntrX = (minX + maxX) / 2.0;
double cntrY = (minY + maxY) / 2.0;
double cntrZ = (minZ + maxZ) / 2.0;
// get brick faces
iBase_EntityHandle* all_faces = NULL;
int af_alloc = 0;
int af_size = 0;
iGeom_getEntAdj(geom, volume, iBase_FACE, &all_faces, &af_alloc,
&af_size, &err);
CHECK("Failed to get faces.");
// This is a check that is always applicable for a brick.
// Check that the face sense relative to the brick is FORWARD if the normal
// points outward and REVERSED if the normal points inward
for (i = 0; i < af_size; i++) { // for all faces
// get face sense compared by volume
int face_sense;
iGeom_getEntNrmlSense(geom, all_faces[i], volume, &face_sense, &err);
CHECK("Failed to get face sense.");
if (0==face_sense)
continue; // this is introduced because for facets we do not easily define face orientation
double clsstX, clsstY, clsstZ, nrmlX, nrmlY, nrmlZ;
iGeom_getEntNrmlPlXYZ(geom, all_faces[i], cntrX, cntrY, cntrZ,
&clsstX, &clsstY, &clsstZ, &nrmlX, &nrmlY, &nrmlZ, &err);
CHECK("Failed to get closest point and normal direction.");
double dotPrdct = nrmlX * (cntrX - clsstX) + nrmlY * (cntrY - clsstY)
+ nrmlZ * (cntrZ - clsstZ);
int normalDir = 1;
if (dotPrdct > 0) // normal is same dir as vector from closest to center
normalDir = -1;
// check that face sense is forward if the normal points outward from
// the brick and reversed if the normal points inward
if (face_sense != normalDir) {
std::cerr << "Error: face sense does not match direction of normal."
<< std::endl;
return 1;
}
}
err = checkEdgeOrientation(geom, volume);
if (err)
return err;
#if defined (HAVE_OCC)
input_file = STRINGIFY(SRCDIR)"/";
input_file += FILE_NAME1;
iGeom_deleteAll(geom, &err);
iGeom_load(geom, input_file.c_str(), 0, &err, input_file.length(), 0);
CHECK( "ERROR : can not load a geometry" );
err = getFirstVolume(geom, volume);
if (err)
return err;
err = checkEdgeOrientation(geom, volume);
if (err)
return err;
input_file = STRINGIFY(SRCDIR)"/";
input_file += FILE_NAME2;
iGeom_deleteAll(geom, &err);
iGeom_load(geom, input_file.c_str(), 0, &err, input_file.length(), 0);
CHECK( "ERROR : can not load a geometry" );
err = getFirstVolume(geom, volume);
if (err)
return err;
err = checkEdgeOrientation(geom, volume);
if (err)
return err;
input_file = STRINGIFY(SRCDIR)"/";
input_file += FILE_NAME3;
iGeom_deleteAll(geom, &err);
iGeom_load(geom, input_file.c_str(), 0, &err, input_file.length(), 0);
CHECK( "ERROR : can not load a geometry" );
err = getFirstVolume(geom, volume);
if (err)
return err;
err = checkEdgeOrientation(geom, volume);
if (err)
return err;
#endif
std::cout << "All tests are passed." << std::endl;
return 0;
}
| static int print_error | ( | const char * | desc, |
| int | err, | ||
| iGeom_Instance | geom, | ||
| const char * | file, | ||
| int | line | ||
| ) | [static] |
Definition at line 32 of file test_edge_orient.cc.
{
char buffer[1024];
iGeom_getDescription( geom, buffer, sizeof(buffer) );
buffer[sizeof(buffer)-1] = '\0';
std::cerr << "ERROR: " << desc << std::endl
<< " Error code: " << err << std::endl
<< " Error desc: " << buffer << std::endl
<< " At : " << file << ':' << line << std::endl
;
return 1; // must always return false or CHECK macro will break
}