/*
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 "ProExtrude.h"
#include "ProModFeat.h"
#include "ProStdSection.h"
#include "ProElement.h"
#include "ProElempath.h"
#include "ProFeatType.h"
#include "ProFeatForm.h"
#include "ProSelection.h"
#include "ProSection.h"
#include "ProRevolve.h"
static ProFileName message_file;
#define C_LOG(a) ProTKPrintf ("Status for %s is = %d\n", a, status ); \
ERROR_CHECK( a, "UgSktRevolveCreate.c", status );
#define C_PRINT(a) ProTKPrintf ( "%s\n", a);
/*===============================================================*\
FUNCTION : UserSktRevolveProtrusionExtSkt()
PURPOSE : Create a revolved protrustion with external sketch
\*===============================================================*/
ProError UserSktRevolveProtrusionExtSkt()
{
ProErrorlist errors;
ProMdl model;
ProModelitem model_item;
ProSelection model_sel;
ProFeature feature;
ProFeatureCreateOptions *opts = 0;
ProElempath path;
ProElempathItem path_items[2];
ProSection section;
ProAsmcomppath comp_path;
ProAsmcomppath *p_comp_path = NULL;
ProElement pro_e_feature_tree;
ProElement pro_e_feature_type;
ProElement pro_e_feature_form;
ProElement pro_e_ext_surf_cut_solid_type;
ProElement pro_e_remove_material;
ProElement pro_e_feat_form_is_thin;
ProElement pro_e_rev_angle;
ProElement pro_e_rev_angle_from;
ProElement pro_e_rev_angle_from_type;
ProElement pro_e_rev_angle_from_val;
ProElement pro_e_rev_angle_to;
ProElement pro_e_rev_angle_to_type;
ProElement pro_e_rev_angle_to_val;
/* External Sketch */
ProElement pro_e_std_section;
ProElement pro_e_use_sketch ;
/* External Axis */
ProElement pro_e_revolve_axis;
ProElement pro_e_revolve_axis_opt ;
ProError status;
ProSelection * p_select;
int n_select;
ProReference external_sketch_ref;
ProReference external_axis_ref;
ProStringToWstring ( message_file, "msg_ugfeatcreat.txt" );
log_file = PTApplsUnicodeFopen ( "ug_sketched_curve.log", "w" );
status = ProMdlCurrentGet (&model);
if ( status != PRO_TK_NO_ERROR ) return ( status );
/*---------------------------------------------------------------*\
Populating root element PRO_E_FEATURE_TREE
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_FEATURE_TREE *** " );
status = ProElementAlloc ( PRO_E_FEATURE_TREE, &pro_e_feature_tree );
C_LOG( " ProElementAlloc " );
/*---------------------------------------------------------------*\
Populating element PRO_E_FEATURE_FORM
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_FEATURE_FORM *** " );
status = ProElementAlloc ( PRO_E_FEATURE_FORM, &pro_e_feature_form );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_feature_form, PRO_REVOLVE );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_feature_form );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_EXT_SURF_CUT_SOLID_TYPE
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_EXT_SURF_CUT_SOLID_TYPE *** " );
status = ProElementAlloc ( PRO_E_EXT_SURF_CUT_SOLID_TYPE, &pro_e_ext_surf_cut_solid_type );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_ext_surf_cut_solid_type, PRO_REV_FEAT_TYPE_SOLID );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_ext_surf_cut_solid_type );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REMOVE_MATERIAL
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REMOVE_MATERIAL *** " );
status = ProElementAlloc ( PRO_E_REMOVE_MATERIAL, &pro_e_remove_material );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_remove_material, PRO_REV_MATERIAL_ADD );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_remove_material );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_FEAT_FORM_IS_THIN
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_FEAT_FORM_IS_THIN *** " );
status = ProElementAlloc ( PRO_E_FEAT_FORM_IS_THIN, &pro_e_feat_form_is_thin );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_feat_form_is_thin, PRO_REV_FEAT_FORM_NO_THIN );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_feat_form_is_thin );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating compound element PRO_E_STD_REV_ANGLE
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REV_ANGLE *** " );
status = ProElementAlloc ( PRO_E_REV_ANGLE, &pro_e_rev_angle );
C_LOG( " ProElementAlloc" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_rev_angle );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REV_ANGLE
-> PRO_E_REV_ANGLE_FROM
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REV_ANGLE_FROM *** " );
status = ProElementAlloc ( PRO_E_REV_ANGLE_FROM, &pro_e_rev_angle_from );
C_LOG( " ProElementAlloc" );
status = ProElemtreeElementAdd ( pro_e_rev_angle, NULL, pro_e_rev_angle_from );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REV_ANGLE
-> PRO_E_REV_ANGLE_FROM
-> PRO_E_REV_ANGLE_FROM_TYPE
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REV_ANGLE_FROM_TYPE *** " );
status = ProElementAlloc ( PRO_E_REV_ANGLE_FROM_TYPE, &pro_e_rev_angle_from_type );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_rev_angle_from_type, PRO_REV_ANG_FROM_NONE );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_rev_angle_from, NULL, pro_e_rev_angle_from_type );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REV_ANGLE
-> PRO_E_REV_ANGLE_TO
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REV_ANGLE_TO *** " );
status = ProElementAlloc ( PRO_E_REV_ANGLE_TO, &pro_e_rev_angle_to );
C_LOG( " ProElementAlloc" );
status = ProElemtreeElementAdd ( pro_e_rev_angle, NULL, pro_e_rev_angle_to );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REV_ANGLE
-> PRO_E_REV_ANGLE_TO
-> PRO_E_REV_ANGLE_TO_TYPE
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REV_ANGLE_TO_TYPE *** " );
status = ProElementAlloc ( PRO_E_REV_ANGLE_TO_TYPE, &pro_e_rev_angle_to_type );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_rev_angle_to_type, PRO_REV_ANG_TO_ANGLE );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_rev_angle_to, NULL, pro_e_rev_angle_to_type );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REV_ANGLE
-> PRO_E_REV_ANGLE_TO
-> PRO_E_REV_ANGLE_TO_VAL
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REV_ANGLE_TO_VAL *** " );
status = ProElementAlloc ( PRO_E_REV_ANGLE_TO_VAL, &pro_e_rev_angle_to_val );
C_LOG( " ProElementAlloc " );
status = ProElementDoubleSet ( pro_e_rev_angle_to_val, 120.000000 );
C_LOG( " ProElementDoubleSet" );
status = ProElemtreeElementAdd ( pro_e_rev_angle_to, NULL, pro_e_rev_angle_to_val );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_STD_SECTION *** " );
status = ProElementAlloc ( PRO_E_STD_SECTION, &pro_e_std_section );
C_LOG( " ProElementAlloc" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL,
pro_e_std_section );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
-> PRO_E_SEC_USE_SKETCH
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_SEC_USE_SKETCH *** " );
status = ProMessageDisplay ( message_file, "USER Select Sketch :" );
C_LOG( " ProMessageDisplay" );
status = ProSelect ( "feature", 1, NULL, NULL,
NULL, NULL, &p_select, &n_select );
C_LOG( " ProSelect" );
if ( n_select <= 0 ) return -1;
else
{
status = ProSelectionToReference ( p_select[0], &external_sketch_ref );
C_LOG (" ProSelectionToReference ");
}
status = ProElementAlloc ( PRO_E_SEC_USE_SKETCH, &pro_e_use_sketch );
C_LOG( " ProElementAlloc " );
status = ProElementReferenceSet ( pro_e_use_sketch, external_sketch_ref );
C_LOG( " ProElementReferenceSet" );
status = ProElemtreeElementAdd ( pro_e_std_section, NULL,
pro_e_use_sketch );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REVOLVE_AXIS_OPT
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REVOLVE_AXIS_OPT *** " );
status = ProElementAlloc ( PRO_E_REVOLVE_AXIS_OPT, &pro_e_revolve_axis_opt );
C_LOG( " ProElementAlloc " );
status = ProElementIntegerSet ( pro_e_revolve_axis_opt, PRO_REV_AXIS_EXT_REF );
C_LOG( " ProElementIntegerSet" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL, pro_e_revolve_axis_opt );
C_LOG( " ProElemtreeElementAdd" );
/*---------------------------------------------------------------*\
Populating element PRO_E_REVOLVE_AXIS
\*---------------------------------------------------------------*/
C_PRINT( " *** Processing Element PRO_E_REVOLVE_AXIS *** " );
status = ProMessageDisplay ( message_file, "USER Select Revolve Axis :");
C_LOG( " ProMessageDisplay" );
status = ProSelect ( "edge,axis", 1, NULL, NULL,
NULL, NULL, &p_select, &n_select );
C_LOG( " ProSelect" );
if ( n_select <= 0 ) return -1;
else
{
status = ProSelectionToReference ( p_select[0], &external_axis_ref );
C_LOG (" ProSelectionToReference ");
}
status = ProElementAlloc ( PRO_E_REVOLVE_AXIS, &pro_e_revolve_axis );
C_LOG( " ProElementAlloc " );
status = ProElementReferenceSet ( pro_e_revolve_axis, external_axis_ref );
C_LOG( " ProElementReferenceSet" );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL,
pro_e_revolve_axis );
/*---------------------------------------------------------------*\
Creating feature in the current model.
\*---------------------------------------------------------------*/
status = ProMdlToModelitem( model, &model_item );
status = ProSelectionAlloc (p_comp_path, &model_item,
&model_sel);
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&opts);
opts[0]= PRO_FEAT_CR_DEFINE_MISS_ELEMS;
status = ProFeatureWithoptionsCreate (model_sel, pro_e_feature_tree,
opts, PRO_REGEN_NO_FLAGS, &feature, &errors);
C_LOG (" ProFeatureWithoptionsCreate");
status = ProArrayFree((ProArray*)&opts);
/*---------------------------------------------------------------*\
Free up the allocated memory.
\*---------------------------------------------------------------*/
status = ProElementFree (&pro_e_feature_tree );
C_LOG (" ProElementFree");
return (status);
}
#undef C_LOG
#undef C_PRINT