/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*---------------------- Pro/Toolkit Includes ------------------------*/
#include "ProToolkit.h"
#include "ProFeature.h"
#include "ProElemId.h"
#include "ProStdSection.h"
#include "ProElement.h"
#include "ProFeatType.h"
#include "ProFeatForm.h"
#include "ProSelection.h"
#include "ProHole.h"
/*---------------------- MACRO ---------------------------------------*/
/* UG_HOLE_LOG : Macro to log the calls to functions
inputs :
a - name of the function getting called
b - error return by the function called
*/
#define UG_HOLE_LOG( a, b ) ProTKPrintf(" Return value of function %s is %d\n", a, b );
/*---------------------- Function Prototypes -------------------------*/
/*------------------------- External Data ----------------------------*/
/*------------------------- Global Data -----------------------------*/
/*===============================================================*\
FUNCTION : ProDemoHoleCreate
PURPOSE : Demonstrates the creation of a straight linear hole
\*===============================================================*/
ProError ProDemoHoleCreate()
{
ProError status;
ProElement feat_elemtree;
ProElement elem_feattype;
ProElement elem_featform;
ProElement elem_hle_com;
ProElement elem_hle_type_new;
ProElement elem_hle_stan_type;
ProElement elem_diameter;
ProElement elem_hole_std_depth;
ProElement elem_hole_depth_to;
ProElement elem_hole_depth_to_type;
ProElement elem_ext_depth_to_value;
ProElement elem_ext_depth_to_ref;
ProElement elem_hole_depth_from;
ProElement elem_hole_depth_from_type;
ProElement elem_ext_depth_from_value;
ProElement elem_ext_depth_from_ref;
ProElement elem_hle_placement;
ProElement elem_hle_prim_ref;
ProElement elem_hle_pl_type;
ProElement elem_hle_dim_ref1;
ProElement elem_hle_dim_dist1;
ProElement elem_hle_dim_ref2;
ProElement elem_hle_dim_dist2;
ProValue value;
ProValueData value_data;
ProSelection *p_selection;
int n_selection;
ProFeatureCreateOptions *options = 0;
ProFeature created_feature;
ProErrorlist p_errors;
ProMdl model;
ProModelitem model_item;
ProSelection model_selection;
ProReference reference;
/* Start of Element Tree Creation */
/* Adding the root element */
status = ProElementAlloc ( PRO_E_FEATURE_TREE, &feat_elemtree );
/* Adding the element for feature type */
ProTKPrintf(" PRO_E_FEATURE_TYPE \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_FEATURE_TYPE, &elem_feattype );
UG_HOLE_LOG (" ProElementAlloc ", status);
status = ProElementIntegerSet ( elem_feattype, PRO_FEAT_HOLE);
UG_HOLE_LOG (" ProElementIntegerSet ", status );
status = ProElemtreeElementAdd ( feat_elemtree, NULL, elem_feattype );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* Adding the element for feature form */
ProTKPrintf(" PRO_E_FEATURE_FORM \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_FEATURE_FORM , &elem_featform );
status = ProElementIntegerSet ( elem_featform, PRO_HLE_TYPE_STRAIGHT);
UG_HOLE_LOG (" ProElementIntegerSet ", status );
status = ProElemtreeElementAdd ( feat_elemtree, NULL, elem_featform );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* Adding the common element for hole information */
ProTKPrintf(" PRO_E_HLE_COM \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_COM, &elem_hle_com );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_COM", status);
status = ProElemtreeElementAdd ( feat_elemtree, NULL, elem_hle_com );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* Adding the element for hole type : Straight, Standard, Sketched */
ProTKPrintf(" PRO_E_HLE_TYPE_NEW \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_TYPE_NEW, &elem_hle_type_new );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_TYPE_NEW ", status);
status = ProElementIntegerSet ( elem_hle_type_new, PRO_HLE_NEW_TYPE_STRAIGHT);
UG_HOLE_LOG (" ProElementIntegerSet ", status );
status = ProElemtreeElementAdd ( elem_hle_com, NULL, elem_hle_type_new );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* Specifying the Diameter of the Hole */
ProTKPrintf(" PRO_E_DIAMETER \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_DIAMETER, &elem_diameter );
UG_HOLE_LOG (" ProElementAlloc PRO_E_DIAMETER ", status);
status = ProElementDoubleSet ( elem_diameter, (double) 100.0);
UG_HOLE_LOG (" ProElementDoubleSet ", status );
status = ProElemtreeElementAdd ( elem_hle_com, NULL, elem_diameter );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* Adding an element for the Standard Depth
|--PRO_E_HOLE_STD_DEPTH
| |--PRO_E_HOLE_DEPTH_TO
| | |--PRO_E_HOLE_DEPTH_TO_TYPE
| | |--PRO_E_EXT_DEPTH_TO_VALUE
| | |--PRO_E_EXT_DEPTH_TO_REF
| |--PRO_E_HOLE_DEPTH_FROM
| |--PRO_E_HOLE_DEPTH_FROM_TYPE
| |--PRO_E_EXT_DEPTH_FROM_VALUE
| |--PRO_E_EXT_DEPTH_FROM_REF
*/
ProTKPrintf(" PRO_E_HOLE_STD_DEPTH \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HOLE_STD_DEPTH, &elem_hole_std_depth );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HOLE_STD_DEPTH ", status);
status = ProElemtreeElementAdd ( elem_hle_com, NULL, elem_hole_std_depth );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HOLE_DEPTH_TO \n", status);
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HOLE_DEPTH_TO, &elem_hole_depth_to );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HOLE_DEPTH_TO ", status);
status = ProElemtreeElementAdd ( elem_hole_std_depth, NULL, elem_hole_depth_to );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HOLE_DEPTH_TO_TYPE \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HOLE_DEPTH_TO_TYPE, &elem_hole_depth_to_type );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HOLE_DEPTH_TO_TYPE ", status);
status = ProElementIntegerSet ( elem_hole_depth_to_type, PRO_HLE_STRGHT_THRU_ALL_DEPTH);
UG_HOLE_LOG (" ProElementIntegerSet ", status );
status = ProElemtreeElementAdd ( elem_hole_depth_to, NULL, elem_hole_depth_to_type );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HOLE_DEPTH_FROM \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HOLE_DEPTH_FROM, &elem_hole_depth_from );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HOLE_DEPTH_FROM ", status);
status = ProElemtreeElementAdd ( elem_hole_std_depth, NULL, elem_hole_depth_from );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HOLE_DEPTH_FROM_TYPE \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HOLE_DEPTH_FROM_TYPE, &elem_hole_depth_from_type );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HOLE_DEPTH_FROM_TYPE ", status);
status = ProElementIntegerSet ( elem_hole_depth_from_type, PRO_HLE_STRGHT_NONE_DEPTH);
UG_HOLE_LOG (" ProElementIntegerSet ", status );
status = ProElemtreeElementAdd ( elem_hole_depth_from, NULL, elem_hole_depth_from_type );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* Adding elements related with the placement details
|--PRO_E_HLE_PLACEMENT
| |--PRO_E_HLE_PRIM_REF
| |--PRO_E_HLE_PL_TYPE
| |--PRO_E_HLE_DIM_REF1
| |--PRO_E_HLE_DIM_DIST1
| |--PRO_E_HLE_DIM_REF2
| |--PRO_E_HLE_DIM_DIST2
*/
ProTKPrintf(" PRO_E_HLE_PLACEMENT \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_PLACEMENT, &elem_hle_placement );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_PLACEMENT", status);
status = ProElemtreeElementAdd ( feat_elemtree, NULL, elem_hle_placement );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HLE_PRIM_REF \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_PRIM_REF, &elem_hle_prim_ref );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_PRIM_REF ", status);
ProTKPrintf("Select a surface for Hole Placement \n");
status = ProSelect ( "datum,surface", 1, NULL, NULL, NULL, NULL,
&p_selection, &n_selection);
if ( n_selection <= 0 ) return (0);
UG_HOLE_LOG (" ProSelect ", status);
status = ProSelectionToReference( p_selection[0], &reference );
UG_HOLE_LOG (" ProSelectionToReference ", status);
status = ProElementReferenceSet( elem_hle_prim_ref, reference );
UG_HOLE_LOG("ProElementReferenceSet", status );
status = ProElemtreeElementAdd( elem_hle_placement, NULL, elem_hle_prim_ref );
UG_HOLE_LOG( "ProElemtreeElementAdd", status );
ProTKPrintf(" PRO_E_HLE_PL_TYPE \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_PL_TYPE, &elem_hle_pl_type );
status = ProElementIntegerSet ( elem_hle_pl_type, PRO_HLE_PL_TYPE_LIN);
UG_HOLE_LOG (" ProElementIntegerSet ", status );
status = ProElemtreeElementAdd ( elem_hle_placement, NULL, elem_hle_pl_type );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HLE_DIM_REF1 \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_DIM_REF1, &elem_hle_dim_ref1 );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_DIM_REF1 ", status);
ProTKPrintf("Select a 1st Reference for Hole Placement \n");
status = ProSelect ( "datum,surface,edge", 1, NULL, NULL, NULL, NULL,
&p_selection, &n_selection);
if ( n_selection <= 0 ) return (0);
UG_HOLE_LOG (" ProSelect ", status);
status = ProSelectionToReference( p_selection[0], &reference );
UG_HOLE_LOG (" ProSelectionToReference ", status);
status = ProElementReferenceSet( elem_hle_dim_ref1, reference );
UG_HOLE_LOG("ProElementReferenceSet", status );
status = ProElemtreeElementAdd( elem_hle_placement, NULL, elem_hle_dim_ref1 );
UG_HOLE_LOG( "ProElemtreeElementAdd", status );
ProTKPrintf(" PRO_E_HLE_DIM_DIST1 \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_DIM_DIST1, &elem_hle_dim_dist1 );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_DIM_DIST1 ", status);
status = ProElementDoubleSet ( elem_hle_dim_dist1, (double) 100.0);
UG_HOLE_LOG (" ProElementDoubleSet ", status );
status = ProElemtreeElementAdd ( elem_hle_placement, NULL, elem_hle_dim_dist1 );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
ProTKPrintf(" PRO_E_HLE_DIM_REF2 \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_DIM_REF2, &elem_hle_dim_ref2 );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_DIM_REF2 ", status);
ProTKPrintf("Select a 2st Reference for Hole Placement \n");
status = ProSelect ( "datum,surface,edge", 1, NULL, NULL, NULL, NULL,
&p_selection, &n_selection);
if ( n_selection <= 0 ) return (0);
UG_HOLE_LOG (" ProSelect ", status);
status = ProSelectionToReference( p_selection[0], &reference );
UG_HOLE_LOG (" ProSelectionToReference ", status);
status = ProElementReferenceSet( elem_hle_dim_ref2, reference );
UG_HOLE_LOG("ProElementReferenceSet", status );
status = ProElemtreeElementAdd( elem_hle_placement, NULL, elem_hle_dim_ref2 );
UG_HOLE_LOG( "ProElemtreeElementAdd", status );
ProTKPrintf(" PRO_E_HLE_DIM_DIST2 \n");
ProTKPrintf(" ****************** \n");
status = ProElementAlloc ( PRO_E_HLE_DIM_DIST2, &elem_hle_dim_dist2 );
UG_HOLE_LOG (" ProElementAlloc PRO_E_HLE_DIM_DIST2 ", status);
status = ProElementDoubleSet ( elem_hle_dim_dist2, (double) 200.0);
UG_HOLE_LOG (" ProElementDoubleSet ", status );
status = ProElemtreeElementAdd ( elem_hle_placement, NULL, elem_hle_dim_dist2 );
UG_HOLE_LOG (" ProElemtreeElementAdd ", status);
/* End of Element Tree Creation */
/* Start of Feature Creation */
status = ProMdlCurrentGet ( &model );
UG_HOLE_LOG (" ProMdlCurrentGet ", status);
status = ProMdlToModelitem( model, &model_item );
UG_HOLE_LOG (" ProMdlToModelitem ", status);
status = ProSelectionAlloc( NULL, &model_item, &model_selection );
UG_HOLE_LOG (" ProSelectionAlloc ", status);
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&options);
options[0]= PRO_FEAT_CR_DEFINE_MISS_ELEMS;
status = ProFeatureWithoptionsCreate ( model_selection, feat_elemtree,
options, PRO_REGEN_NO_FLAGS, &created_feature, &p_errors );
UG_HOLE_LOG (" ProFeatureWithoptionsCreate ", status);
status = ProArrayFree((ProArray*)&options);
/* End of Feature Creation */
/* Freeing the resources */
status = ProElementFree( &feat_elemtree );
UG_HOLE_LOG (" ProElementFree ", status);
status = ProSelectionFree( &model_selection );
UG_HOLE_LOG (" ProSelectionFree ", status);
/* End of Freeing */
return ( status );
}
/*===============================================================*\
FUNCTION : UserElemtreeElementAdd
PURPOSE : Adding an element to the parent element / tree
input : parent_element, child_element, value_data
output : none
returns :
PRO_TK_NO_ERROR - Successfully added the element
PRO_TK_GENERAL_ERROR - Failed to add the element
any other return as returned by ProElemtreeElementAdd()
\*===============================================================*/