[cgma-dev] OCCModifyEngine method implementations
Boyd Tidwell
bktidwell373 at gmail.com
Mon Dec 19 15:31:06 CST 2011
Tim and Jane,
In my testing I discovered a number of methods that hadn't been
implemented and, because they didn't seem to difficult, I implemented
them.
I am told that it is OK to share them with cgma so here they are. I
can't claim they are perfect but they passed all the testing I threw
at them.
Enjoy!
- Boyd
CubitStatus OCCModifyEngine::create_rectangle_surface( double width,
double height,
CubitVector plane,
BodySM *&sheet_body) const
{
//create points at the 4 corners
CubitVector pos1( width*0.5, height*0.5, 0 );
CubitVector pos2( -width*0.5, height*0.5, 0 );
CubitVector pos3( -width*0.5, -height*0.5, 0 );
CubitVector pos4( width*0.5, -height*0.5, 0 );
DLIList<CubitVector*> vec_list(4);
vec_list.append( &pos1 );
vec_list.append( &pos2 );
vec_list.append( &pos3 );
vec_list.append( &pos4 );
CubitStatus status = OCCModifyEngine::instance()->create_surface(
vec_list, sheet_body, 0, CUBIT_FALSE );
//rotate it so that it is aligned with the plane defined by vector 'plane'
CubitVector current_plane(0,0,1);
CubitVector axis_of_rotation = current_plane * plane;
double angle_of_rotation = axis_of_rotation.vector_angle(
current_plane, plane );
OCCQueryEngine::instance()->rotate( sheet_body, axis_of_rotation,
RADIANS_TO_DEGREES(angle_of_rotation) );
return status;
}
CubitStatus OCCModifyEngine::create_ellipse_surface( TBPoint *pt1,
TBPoint *pt3,
CubitVector center_point,
BodySM *&sheet_body) const
{
// make ellipse by creating two ellipse arcs in each sense direction
Curve *ellipse1 =
OCCModifyEngine::instance()->make_elliptical_Curve( pt1, pt3,
center_point, 0, 360, CUBIT_FORWARD );
if( NULL == ellipse1 )
return CUBIT_FAILURE;
DLIList<Curve*> curve_list(2);
curve_list.append( ellipse1 );
Curve *ellipse2 =
OCCModifyEngine::instance()->make_elliptical_Curve( pt1, pt3,
center_point, 0, 360, CUBIT_REVERSED );
if( NULL == ellipse2 )
return CUBIT_FAILURE;
curve_list.append( ellipse2 );
Surface *tmp_surface = OCCModifyEngine::instance()->make_Surface(
PLANE_SURFACE_TYPE, curve_list, NULL, false );
if( NULL == tmp_surface )
return CUBIT_FAILURE;
sheet_body = OCCModifyEngine::instance()->make_BodySM( tmp_surface );
if( NULL == sheet_body)
return CUBIT_FAILURE;
return CUBIT_SUCCESS;
}
CubitStatus OCCModifyEngine::create_ellipse_surface( double major_radius,
double minor_radius,
CubitVector plane,
BodySM *&sheet_body) const
{
//create the points
CubitVector tmp_pt( major_radius, 0, 0 );
TBPoint *pt1 = OCCModifyEngine::instance()->make_Point( tmp_pt );
tmp_pt.set( 0, minor_radius, 0 );
TBPoint *pt2 = OCCModifyEngine::instance()->make_Point( tmp_pt );
CubitVector center_point(0,0,0);
// make ellipse by creating two ellipse arcs in each sense direction
Curve *ellipse1 =
OCCModifyEngine::instance()->make_elliptical_Curve( pt1, pt2,
center_point, 0, 360, CUBIT_FORWARD );
if( NULL == ellipse1 )
return CUBIT_FAILURE;
DLIList<Curve*> curve_list(2);
curve_list.append( ellipse1 );
Curve *ellipse2 =
OCCModifyEngine::instance()->make_elliptical_Curve( pt1, pt2,
center_point, 0, 360, CUBIT_REVERSED );
if( NULL == ellipse2 )
return CUBIT_FAILURE;
curve_list.append( ellipse2 );
Surface *tmp_surface = OCCModifyEngine::instance()->make_Surface(
PLANE_SURFACE_TYPE, curve_list, NULL, false );
if( NULL == tmp_surface )
return CUBIT_FAILURE;
sheet_body = OCCModifyEngine::instance()->make_BodySM( tmp_surface );
if( NULL == sheet_body)
return CUBIT_FAILURE;
//rotate it so that it is aligned with the plane defined by vector 'plane'
CubitVector current_plane(0,0,1);
CubitVector axis_of_rotation = current_plane * plane;
double angle_of_rotation = axis_of_rotation.vector_angle(
current_plane, plane );
OCCQueryEngine::instance()->rotate( sheet_body, axis_of_rotation,
RADIANS_TO_DEGREES(angle_of_rotation) );
return CUBIT_SUCCESS;
}
Curve* OCCModifyEngine::make_elliptical_Curve( TBPoint const* point1,
TBPoint const* point2,
CubitVector ¢er_point,
double start_angle,
double end_angle,
CubitSense sense) const
{
GeometryType curve_type = ELLIPSE_CURVE_TYPE;
Curve *curve = make_Curve(curve_type, point1, point2, ¢er_point, sense );
if ( curve == NULL )
{
PRINT_ERROR("In OCCModifyEngine::make_elliptical_Curve\n"
" Cannot make Curve object.\n");
return (Curve *)NULL;
}
return curve;
}
CubitStatus OCCModifyEngine::create_circle_surface( TBPoint *pt1,
CubitVector center_point,
TBPoint *pt3,
BodySM *&sheet_body) const
{
TBPoint *tmp_pt = OCCModifyEngine::instance()->make_Point( center_point );
Curve *circle = OCCModifyEngine::instance()->create_arc_three( pt1,
tmp_pt, pt3, CUBIT_TRUE );
OCCQueryEngine::instance()->delete_solid_model_entities( tmp_pt );
DLIList<Curve*> curve_list(1);
curve_list.append( circle );
Surface *tmp_surface = OCCModifyEngine::instance()->make_Surface(
PLANE_SURFACE_TYPE, curve_list, NULL, false );
if( NULL == tmp_surface )
return CUBIT_FAILURE;
sheet_body = OCCModifyEngine::instance()->make_BodySM( tmp_surface );
if( NULL == sheet_body)
return CUBIT_FAILURE;
return CUBIT_SUCCESS;
}
CubitStatus OCCModifyEngine::create_circle_surface( TBPoint *pt1,
TBPoint *pt3,
CubitVector center_point,
BodySM *&sheet_body) const
{
TBPoint *tmp_center_pt = OCCModifyEngine::instance()->make_Point(
center_point );
CubitVector normal(0,0,0);
Curve *circle = OCCModifyEngine::instance()->create_arc_center_edge(
tmp_center_pt, pt1, pt3, normal, CUBIT_DBL_MAX, CUBIT_TRUE );
if( NULL == circle )
return CUBIT_FAILURE;
OCCQueryEngine::instance()->delete_solid_model_entities( tmp_center_pt );
DLIList<Curve*> curve_list(1);
curve_list.append( circle );
Surface *tmp_surface = OCCModifyEngine::instance()->make_Surface(
PLANE_SURFACE_TYPE, curve_list, NULL, false );
if( NULL == tmp_surface )
return CUBIT_FAILURE;
sheet_body = OCCModifyEngine::instance()->make_BodySM( tmp_surface );
if( NULL == sheet_body)
return CUBIT_FAILURE;
return CUBIT_SUCCESS;
}
CubitStatus OCCModifyEngine::create_circle_surface( double radius,
CubitVector plane,
BodySM *&sheet_body) const
{
CubitVector center_pt;
center_pt.set(0, 0, 0);
CubitVector pt2, pt3;
if (plane.x() > 0 )
{
pt2.set( 0, radius, 0 );
pt3.set( 0, 0, radius);
}
else if (plane.y() > 0)
{
pt2.set(radius, 0, 0);
pt3.set(0, 0, -radius);
}
else if (plane.z() > 0)
{
pt2.set(radius, 0, 0);
pt3.set(0, radius, 0);
}
else
{
PRINT_ERROR("In OCCModifyEngine::create_circle_surface\n"
" Invalid plane specified.\n");
return CUBIT_FAILURE;
}
CubitVector normal(plane.x(), plane.y(), plane.z());
TBPoint *tbpt1 = OCCModifyEngine::instance()->make_Point( center_pt );
TBPoint *tbpt2 = OCCModifyEngine::instance()->make_Point( pt2 );
TBPoint *tbpt3 = OCCModifyEngine::instance()->make_Point( pt3 );
Curve *circle = OCCModifyEngine::instance()->create_arc_center_edge(
tbpt1, tbpt2, tbpt3, normal, radius,
CUBIT_DBL_MAX, CUBIT_FALSE);
DLIList<Curve*> curve_list(1);
curve_list.append( circle );
Surface *tmp_surface = OCCModifyEngine::instance()->make_Surface(
PLANE_SURFACE_TYPE, curve_list, NULL, false );
if( NULL == tmp_surface )
return CUBIT_FAILURE;
sheet_body = OCCModifyEngine::instance()->make_BodySM( tmp_surface );
if( NULL == sheet_body)
return CUBIT_FAILURE;
return CUBIT_SUCCESS;
}
More information about the cgma-dev
mailing list