cgma
brick.cpp File Reference
#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 Documentation

#define TEST_ENGINE   0

Definition at line 27 of file brick.cpp.


Function Documentation

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;
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines