/*
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"
static ProFileName message_file;
#define C_LOG(a) ProTKPrintf ("Status for %s is = %d\n", a, status ); \
ERROR_CHECK( a, "UgSktExtrusionCreate.c", status );
/*---------------------- Function Prototypes -------------------------*/
int ProDemoBaseExtrudeProtrCreate();
/*------------------------- External Data ----------------------------*/
ProError ProDemoSectCreate();
/*------------------------- Global Data -----------------------------*/
typedef struct tree_element_data
{
ProElement tree;
ProElement parent_element;
ProElemId elem_id;
ProValueData value_data;
} ProTreeElemdata;
ProError ProTestFeatElemAdd (ProTreeElemdata *elem);
/*===============================================================*\
FUNCTION : ProDemoBaseExtrudeProtrCreate
PURPOSE : Demonstrates the creation of the extruded protrusion
base feature.
\*===============================================================*/
int ProDemoBaseExtrudeProtrCreate()
{
ProTreeElemdata elem;
ProErrorlist errors;
ProMdl model;
ProModelitem model_item;
ProSelection model_sel;
ProFeature feature;
ProFeatureCreateOptions *opts = NULL;
ProElempath path;
ProElempathItem path_items[2];
ProSection section;
ProAsmcomppath comp_path;
ProAsmcomppath *p_comp_path = NULL;
ProElement parent_elem;
ProElement parent_elem2;
ProValue value;
double width;
double height;
double bite_radius;
double bite_height;
char name[PRO_NAME_SIZE];
ProBoolean alloc;
ProError status;
ProSelection * sketch_selection;
ProSelection * selection_array;
int n_select;
ProStringToWstring ( message_file, "utilities.txt" );
/*---------------------------------------------------------------*\
Allocate the element tree.
\*---------------------------------------------------------------*/
status = ProElementAlloc (PRO_E_FEATURE_TREE, &(elem.tree));
C_LOG(" ProElementAlloc");
/*---------------------------------------------------------------*\
Add the feature type element to the tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_FEATURE_TYPE;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_FEAT_PROTRUSION;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
/*---------------------------------------------------------------*\
Add the feature form element to the tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_FEATURE_FORM;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_EXTRUDE;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
/*---------------------------------------------------------------*\
Add the feature solid/surface/cut element to the tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_EXT_SURF_CUT_SOLID_TYPE;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_EXT_FEAT_TYPE_SOLID;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
/*---------------------------------------------------------------*\
Add the feature addition/removal material element to the tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_REMOVE_MATERIAL;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_EXT_MATERIAL_ADD;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
/*---------------------------------------------------------------*\
Add the feature thin element to the tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_FEAT_FORM_IS_THIN;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_EXT_FEAT_FORM_NO_THIN;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
/*---------------------------------------------------------------*\
Add the standard section element to the tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_STD_SECTION;
elem.value_data.type = -1;
elem.value_data.v.i = -1;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
/*---------------------------------------------------------------*\
Add the section depth elements to the element tree.
\*---------------------------------------------------------------*/
elem.parent_element = elem.tree;
elem.elem_id = PRO_E_STD_EXT_DEPTH;
elem.value_data.type = -1;
elem.value_data.v.i = -1;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
parent_elem2 = elem.parent_element;
elem.elem_id = PRO_E_EXT_DEPTH_FROM;
elem.value_data.type = -1;
elem.value_data.v.i = -1;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
parent_elem = elem.parent_element;
elem.elem_id = PRO_E_EXT_DEPTH_FROM_TYPE;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_EXT_DEPTH_FROM_BLIND;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
elem.parent_element = parent_elem;
elem.elem_id = PRO_E_EXT_DEPTH_FROM_VALUE;
elem.value_data.type = PRO_VALUE_TYPE_DOUBLE;
elem.value_data.v.d = 50.0;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
elem.parent_element = parent_elem2;
elem.elem_id = PRO_E_EXT_DEPTH_TO;
elem.value_data.type = -1;
elem.value_data.v.i = -1;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
parent_elem = elem.parent_element;
elem.elem_id = PRO_E_EXT_DEPTH_TO_TYPE;
elem.value_data.type = PRO_VALUE_TYPE_INT;
elem.value_data.v.i = PRO_EXT_DEPTH_TO_BLIND;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
elem.parent_element = parent_elem;
elem.elem_id = PRO_E_EXT_DEPTH_TO_VALUE;
elem.value_data.type = PRO_VALUE_TYPE_DOUBLE;
elem.value_data.v.d = 0.0;
status = ProTestFeatElemAdd (&elem);
C_LOG(" ProTestFeatElemAdd");
status = ProMdlCurrentGet (&model);
C_LOG(" ProMdlCurrentGet");
if ( status != PRO_TK_NO_ERROR ) return ( status );
status = ProMdlToModelitem( model, &model_item );
C_LOG(" ProMdlToModelitem");
status = ProSelectionAlloc (p_comp_path, &model_item,
&model_sel);
C_LOG(" ProSelectionAlloc");
status = ProMessageDisplay ( message_file,
"Select a Sketched Datum Curve Feature");
C_LOG(" ProMessageDisplay");
ProTKPrintf ( "Please Select a Sketched Datum Curve Feature \n");
status = ProSelect ( "feature", 1, NULL, NULL, NULL, NULL,
&sketch_selection, &n_select );
C_LOG(" ProSelect");
if ( n_select <= 0 ) return -1;
status = ProArrayAlloc ( n_select, sizeof (ProSelection),
1, ( ProArray *)&selection_array );
C_LOG(" ProArrayAlloc");
status = ProSelectionCopy ( sketch_selection[0], &selection_array[0] );
C_LOG(" ProSelectionCopy");
/*---------------------------------------------------------------*\
Create the protrusion using the section of the selected feature
\*---------------------------------------------------------------*/
status = ProArrayAlloc ( 1, sizeof (ProFeatureCreateOptions),
1, ( ProArray *)&opts );
C_LOG(" ProArrayAlloc");
opts[0] = PRO_FEAT_CR_DEFINE_MISS_ELEMS;
status = ProFeatureSketchedWithOptionsCreate ( model_sel, elem.tree,
opts, selection_array, PRO_REGEN_NO_FLAGS,
&feature, &errors );
C_LOG(" ProFeatureSketchedWithOptionsCreate");
status = ProArrayFree((ProArray*)&opts);
/*---------------------------------------------------------------*\
Free up the allocated memory.
\*---------------------------------------------------------------*/
status = ProElementFree (&elem.tree);
C_LOG(" ProElementFree");
return (status);
}
/*===============================================================*\
FUNCTION : ProTestFeatElemAdd
PURPOSE : Adds a generic feature element to the element tree.
\*===============================================================*/
ProError ProTestFeatElemAdd (ProTreeElemdata *elem)
{
ProElement element;
ProError status;
status = ProElementAlloc (elem->elem_id, &element);
C_LOG(" ProElementAlloc");
if(elem->value_data.type == PRO_VALUE_TYPE_INT)
{
status = ProElementIntegerSet (element, elem->value_data.v.i );
C_LOG( " ProElementIntegerSet" );
}
else if(elem->value_data.type == PRO_VALUE_TYPE_DOUBLE)
{
status = ProElementDoubleSet (element, elem->value_data.v.d );
C_LOG( " ProElementDoubleSet" );
}
status = ProElemtreeElementAdd (elem->parent_element, NULL, element);
C_LOG(" ProElemtreeElementAdd");
elem->parent_element = element;
return (status);
}
#undef C_LOG
#undef C_PRINT