|
cgma
|
a test of whether the edge to face sense is correct for a cylinder created by the geometry engine More...
#include <cmath>#include <iostream>#include "BasicTopologyEntity.hpp"#include "Body.hpp"#include "CoEdge.hpp"#include "CubitBox.hpp"#include "GeometryModifyTool.hpp"#include "GroupingEntity.hpp"#include "InitCGMA.hpp"#include "RefEdge.hpp"#include "SenseEntity.hpp"Go to the source code of this file.
Functions | |
| bool | testSense () |
| int | main (int argc, char **argv) |
a test of whether the edge to face sense is correct for a cylinder created by the geometry engine
This test uses the geometry engine to create a cylinder and checks to see whether the coedge sense entities have the correct senses. It is a regression test, since this was a problem for cylinders created with the OCC geometry engine.
Definition in file edgeFaceSense.cpp.
| int main | ( | int | argc, |
| char ** | argv | ||
| ) |
Definition at line 28 of file edgeFaceSense.cpp.
{
CubitStatus status = InitCGMA::initialize_cgma();
if (CUBIT_SUCCESS != status)
{
return 1;
}
if (!testSense())
{
return 2;
}
return 0;
}
| bool testSense | ( | ) |
Definition at line 44 of file edgeFaceSense.cpp.
{
GeometryModifyTool *modToolPtr = GeometryModifyTool::instance();
double height = 10.0;
double radius = 2.5;
double tol = 4e-5;
Body *cylBodyPtr = modToolPtr->cylinder(height, radius, radius, radius);
// assumes that the body contains one covolume corresponding to one volume
// and that the volume has one shell
GroupingEntity *cylShellPtr = cylBodyPtr->get_first_sense_entity_ptr()->
get_basic_topology_entity_ptr()->get_first_grouping_entity_ptr();
BasicTopologyEntity *vertSurfPtr = NULL;
double topZVal = 0.0;
double bottomZVal = 0.0;
SenseEntity* cylCoFacePtr = cylShellPtr->get_first_sense_entity_ptr();
while (cylCoFacePtr != NULL)
{
CubitBox boundingBox =
cylCoFacePtr->get_basic_topology_entity_ptr()->bounding_box();
if (fabs(boundingBox.z_range() - height) < tol)
{
topZVal = boundingBox.max_z();
bottomZVal = boundingBox.min_z();
vertSurfPtr = cylCoFacePtr->get_basic_topology_entity_ptr();
break;
}
}
if (vertSurfPtr == NULL)
{
std::cout << "Failed to find vertical face." << std::endl;
return false;
}
CoEdge *topCoEdgePtr = NULL;
CoEdge *bottomCoEdgePtr = NULL;
GroupingEntity *vsLoopPtr = vertSurfPtr->get_first_grouping_entity_ptr();
while (vsLoopPtr != NULL &&
(topCoEdgePtr == NULL || bottomCoEdgePtr == NULL))
{
SenseEntity *coEdgePtr = vsLoopPtr->get_first_sense_entity_ptr();
while (coEdgePtr != NULL &&
(topCoEdgePtr == NULL || bottomCoEdgePtr == NULL))
{
CubitBox edgeBoundBox =
coEdgePtr->get_basic_topology_entity_ptr()->bounding_box();
if (edgeBoundBox.z_range() < tol)
{
if (fabs(edgeBoundBox.max_z() - topZVal) < tol)
{
topCoEdgePtr = dynamic_cast<CoEdge*>(coEdgePtr);
}
else if (fabs(edgeBoundBox.max_z() - bottomZVal) < tol)
{
bottomCoEdgePtr = dynamic_cast<CoEdge*>(coEdgePtr);
}
}
coEdgePtr = coEdgePtr->next();
}
vsLoopPtr = vsLoopPtr->next();
}
if (topCoEdgePtr == NULL || bottomCoEdgePtr == NULL)
{
std::cout << "Failed to find top and/or bottom coedge." << std::endl;
return false;
}
// determine the orientation of the top edge from parametrization
bool topRHCC = false; // top right-handed counterclockwise
RefEdge* topEdgePtr = topCoEdgePtr->get_ref_edge_ptr();
double startParam = topEdgePtr->start_param();
double endParam = topEdgePtr->end_param();
double startDeltaParam = (endParam - startParam) / 64;
CubitVector startVec, startDeltaVec;
topEdgePtr->position_from_u(startParam, startVec);
topEdgePtr->position_from_u(startDeltaParam, startDeltaVec);
CubitVector normal = startVec * startDeltaVec; // cross product
if (normal.z() > 0)
{
std::cout << "Top edge is parametrized/oriented counterclockwise "
<< std::endl
<< " around top face looking down from above." << std::endl;
topRHCC = true;
}
else
{
std::cout << "Top edge is parametrized/oriented clockwise "
<< std::endl
<< " around top face looking down from above." << std::endl;
}
// determine the orientation of the bottom edge from parametrization
bool bottomLHCC = false; // bottom left-handed counterclockwise
RefEdge* bottomEdgePtr = bottomCoEdgePtr->get_ref_edge_ptr();
startParam = bottomEdgePtr->start_param();
endParam = bottomEdgePtr->end_param();
startDeltaParam = (endParam - startParam) / 64;
bottomEdgePtr->position_from_u(startParam, startVec);
bottomEdgePtr->position_from_u(startDeltaParam, startDeltaVec);
normal = startVec * startDeltaVec; // cross product
if (normal.z() > 0)
{
std::cout << "Bottom edge is parametrized/oriented clockwise "
<< std::endl
<< " around bottom face looking up from below." << std::endl;
}
else
{
std::cout << "Bottom edge is parametrized/oriented counterclockwise "
<< std::endl
<< " around bottom face looking up from below." << std::endl;
bottomLHCC = true;
}
// report what is expected and what the result is
bool expectSameSense = (topRHCC == bottomLHCC);
std::cout << "The coedges of the vertical cylinder surface should have"
<< std::endl << " " << (expectSameSense ? "the same sense." :
"different senses.") << std::endl;
if (topCoEdgePtr->get_sense() == bottomCoEdgePtr->get_sense())
{
std::cout << "The senses are the same." << std::endl;
}
else
{
std::cout << "The senses are different." << std::endl;
}
// fail the test if necessary
if (expectSameSense &&
topCoEdgePtr->get_sense() != bottomCoEdgePtr->get_sense())
{
std::cout << "FAILED TEST." << std::endl;
return false;
}
else if (!expectSameSense &&
topCoEdgePtr->get_sense() == bottomCoEdgePtr->get_sense())
{
std::cout << "FAILED TEST." << std::endl;
return false;
}
// pass the test
std::cout << "PASSED TEST." << std::endl;
return true;
}