|
cgma
|
#include <cassert>#include "GeometryModifyTool.hpp"#include "GeometryQueryTool.hpp"#include "ModelQueryEngine.hpp"#include "RefVertex.hpp"#include "RefEdge.hpp"#include "RefFace.hpp"#include "Body.hpp"#include "AppUtil.hpp"#include "Loop.hpp"#include "CoEdge.hpp"#include "InitCGMA.hpp"#include <algorithm>Go to the source code of this file.
Defines | |
| #define | TEST_ENGINE 0 |
Functions | |
| void | check_valid_edge (RefEdge *edge) |
| void | check_valid_face (RefFace *face) |
| void | check_valid_loop (Loop *loop) |
| int | main (int argc, char *argv[]) |
| #define TEST_ENGINE 0 |
| void check_valid_edge | ( | RefEdge * | edge | ) |
Definition at line 180 of file brick.cpp.
{
// Check that start and end vertices are in the correct order
// by comparing vertex coordinates to edge position from start
// and end parameters.
double start_u, end_u;
edge->get_param_range( start_u, end_u );
CubitStatus s;
CubitVector start_p, end_p;
s = edge->position_from_u( start_u, start_p );
assert(CUBIT_SUCCESS == s);
assert( (start_p - edge->start_vertex()->coordinates()).length() < 1e-6 );
s = edge->position_from_u( end_u, end_p );
assert(CUBIT_SUCCESS == s);
assert( (end_p - edge->end_vertex()->coordinates()).length() < 1e-6 );
// Check reverse query from vertex to edge brings us back to the
// input edge.
DLIList<RefEntity*> ents;
edge->start_vertex()->get_parent_ref_entities( ents );
assert( ents.is_in_list( edge ) );
ents.clean_out();
edge->end_vertex()->get_parent_ref_entities( ents );
assert( ents.is_in_list( edge ) );
}
| void check_valid_face | ( | RefFace * | face | ) |
Definition at line 206 of file brick.cpp.
{
DLIList<RefEntity*> edges, parents;
face->get_child_ref_entities( edges );
double u_min, u_max, v_min, v_max, u, v;
if (face->is_parametric()) {
face->get_param_range_U( u_min, u_max );
face->get_param_range_V( v_min, v_max );
}
// Check that each edge is on the face
for (int i = 0; i < edges.size(); ++i) {
RefEdge* edge = dynamic_cast<RefEdge*>(edges.get_and_step());
assert(!!edge);
// Get three points to sample at
CubitVector p[3];
p[0] = edge->start_vertex()->coordinates();
p[1] = edge->center_point();
p[2] = edge->end_vertex()->coordinates();
// For each sample point
for (int j = 0; j < 3; ++j) {
// Check that point is on geometric surface
CubitVector close(p[j]);
face->move_to_surface( close );
assert( (close - p[j]).length() < 1e-6 );
// Check that point is within UV bounds
if (face->is_parametric()) {
CubitStatus s = face->u_v_from_position( p[j], u, v );
assert( CUBIT_SUCCESS == s );
assert( (u - u_min) > -1e-6 );
assert( (u_max - u) > -1e-6 );
assert( (v - v_min) > -1e-6 );
assert( (v_max - v) > -1e-6 );
}
}
}
// Check reverse query from edge to face brings us back to the
// input face.
for (int i = 0; i < edges.size(); ++i) {
parents.clean_out();
RefEntity* edge = edges.get_and_step();
edge->get_parent_ref_entities( parents );
assert( parents.is_in_list( face ) );
}
}
| void check_valid_loop | ( | Loop * | loop | ) |
Definition at line 258 of file brick.cpp.
{
DLIList<CoEdge*> coedges;
loop->ordered_co_edges( coedges );
CoEdge* prev = coedges.get_and_step();
for (int i = 0; i < coedges.size(); ++i) {
CoEdge* curr = coedges.get_and_step();
RefVertex* common_1 = prev->get_sense() == CUBIT_REVERSED ?
prev->get_ref_edge_ptr()->start_vertex() :
prev->get_ref_edge_ptr()->end_vertex() ;
RefVertex* common_2 = curr->get_sense() == CUBIT_REVERSED ?
curr->get_ref_edge_ptr()->end_vertex() :
curr->get_ref_edge_ptr()->start_vertex();
assert( common_1 == common_2 );
prev = curr;
}
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 34 of file brick.cpp.
{
// Start up CGM
CubitStatus result = InitCGMA::initialize_cgma(TEST_ENGINE);
if (CUBIT_SUCCESS != result) return 1;
// Create a brick
Body* brick = GeometryModifyTool::instance()->brick( 2, 2, 2 );
assert(brick != 0);
// Get all child RefEntities
DLIList<TopologyEntity*> query_results;
DLIList<RefFace*> surfaces;
DLIList<RefEdge*> curves;
DLIList<RefVertex*> points;
ModelQueryEngine::instance()->query_model( *brick, DagType::ref_face_type(), query_results );
CAST_LIST( query_results, surfaces, RefFace );
query_results.clean_out();
ModelQueryEngine::instance()->query_model( *brick, DagType::ref_edge_type(), query_results );
CAST_LIST( query_results, curves, RefEdge );
query_results.clean_out();
ModelQueryEngine::instance()->query_model( *brick, DagType::ref_vertex_type(), query_results );
CAST_LIST( query_results, points, RefVertex );
query_results.clean_out();
// Check expected number of child RefEntities
assert( surfaces.size() == 6 );
assert( curves.size() == 12 );
assert( points.size() == 8 );
// Cube should be 2x2x2 and centered at origin, so each vertex
// should have the coords (+/-1, +/-1, +/-1). Check that this
// is the case and put vertex pointers in an array in the canonical
// order for hexahedra.
RefVertex* corners[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < points.size(); ++i) {
RefVertex* vtx = points.get_and_step();
CubitVector pos = vtx->coordinates();
// all coordinate values are plus or minus one
assert( fabs(fabs(pos.x()) - 1) < 1e-12 );
assert( fabs(fabs(pos.y()) - 1) < 1e-12 );
assert( fabs(fabs(pos.z()) - 1) < 1e-12 );
int idx;
if (pos.x() < 0)
idx = pos.y() < 0 ? 0 : 3;
else
idx = pos.y() < 0 ? 1 : 2;
if (pos.z() > 0)
idx += 4;
// No duplicate vertices allowed
assert( corners[idx] == 0 );
corners[idx] = vtx;
}
// Now figure out which of the 12 edges each RefEdge is by
// checking the position of each attached vertex in the
// above 'corners' array, Put edge pointers in an array in
// the canonical edge order for a heaxahedron.
RefEdge* edges[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int i = 0; i < curves.size(); ++i) {
RefEdge* edge = curves.get_and_step();
int start_i = std::find( corners, corners + 8, edge->start_vertex() ) - corners;
int end_i = std::find( corners, corners + 8, edge->end_vertex() ) - corners;
assert( start_i < 8 );
assert( end_i < 8 );
int idx;
// If edge is lateral edge from bottom face to top
if (start_i < 4 && end_i >= 4) {
idx = start_i + 4;
assert( end_i == idx );
}
// If edge is lateral edge from top face to bottom
else if (start_i >= 4 && end_i < 4) {
idx = end_i + 4;
assert( start_i == idx );
}
// If edge is part of bottom face
else if (start_i < 4) {
if ((start_i + 1)%4 == end_i)
idx = start_i;
else if ((end_i + 1)%4 == start_i)
idx = end_i;
else
assert( false );
}
// If edge is part of top face
else {
if ((start_i - 3) % 4 + 4 == end_i)
idx = start_i + 4;
else if ((end_i - 3) % 4 + 4 == start_i)
idx = end_i + 4;
else
assert( false );
}
// Check no duplicate edges
assert( 0 == edges[idx] );
edges[idx] = edge;
}
// Face connectivity, specified by edge numbers
int std_faces[6][4] = { { 0, 5, 8, 4 },
{ 1, 6, 9, 5 },
{ 2, 7, 10, 6 },
{ 3, 4, 11, 7 },
{ 3, 2, 1, 0 },
{ 8, 9, 10,11 } };
RefFace* faces[6] = { 0, 0, 0, 0, 0, 0 };
DLIList< DLIList<RefEdge*> > loops;
for (int i = 0; i < surfaces.size(); ++i) {
// get ref edges
RefFace* face = surfaces.get_and_step();
face->ref_edge_loops( loops );
assert( loops.size() == 1 );
DLIList<RefEdge*> loop(loops.get());
//delete loops.get();
loops.clean_out();
// match loop of edges to one of the expected faces
assert( loop.size() == 4 );
int k;
for (k = 0; k < 6; ++k) {
int j;
for (j = 0; j < 4; ++j)
if (!loop.is_in_list(edges[std_faces[k][j]]))
break;
if (j == 4)
break;
}
assert( k < 6 ); // fail of didn't match any expected face
assert(0 == faces[k]); // no duplicates
faces[k] = face;
}
for (int i = 0; i < 12; ++i)
check_valid_edge( edges[i] );
for (int i = 0; i < 6; ++i)
check_valid_face( faces[i] );
for (int i = 0; i < 6; ++i) {
assert(faces[i]->number_of_Loops() == 1);
check_valid_loop( dynamic_cast<Loop*>(faces[i]->get_first_grouping_entity_ptr()) );
}
return 0;
}