/*
Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*---------------------- Pro/Toolkit Includes ------------------------*/
#include <ProToolkit.h>
#include <ProMenu.h>
#include <ProObjects.h>
#include <ProMdl.h>
#include <ProModelitem.h>
#include <ProGeomitem.h>
#include <ProElement.h>
#include <ProValue.h>
#include <ProFeatType.h>
#include <ProFeatForm.h>
#include <ProFeature.h>
#include <ProSection.h>
#include <ProSelection.h>
#include <ProHole.h>
#include <ProGeomitem.h>
#include <ProCurvedata.h>
#include <ProDtmCrv.h>
#include <ProSurfacedata.h>
#include <ProEdge.h>
#include <ProSolid.h>
#include "TestSect.h"
#include "TestSelect.h"
#include "UtilTree.h"
#include "UtilMessage.h"
/*---------------------- Pro/Develop Includes ------------------------*/
/*---------------------- Application Includes ------------------------*/
#include <TestError.h>
#define msgfil "feat"
/*---------------------- Application Typedefs ------------------------*/
typedef enum feat_create_type
{
AUTO_MODE = 1,
USER_MODE,
EDGE_SEL_MODE
}FeatCreateMode;
/*---------------------- Prototypes ----------------------------------*/
ProError CreateSectionFeature(FeatCreateMode mode);
ProError CreateSectionCopyAutoMode();
ProError CreateSectionCopyUserMode();
ProError CreateSectionCreateFromEdges();
ProError SectionInfoCollectUserMode(SketchInfo *sketch_info, ProSection *section);
ProError SectionInfoCollectAutoMode(SketchInfo *sketch_info, ProSection *section);
ProError SectionInfoCollectFromEdges(SketchInfo *sketch_info);
ProError PromptFeatureWithSection(ProFeature *feat, ProSection *section);
ProError PromptSketchProjectionIds (SketchInfo *sketch_info);
ProError GetSectionProjectionReference(ProSection *section, SketchInfo *sketch_info);
ProError CreateSketchFeatures(SketchInfo *sketch_info, ProFeature *feature);
extern void* calloc ( size_t num, size_t size );
/*---------------------- Code ----------------------------------*/
/*===============================================================*\
FUNCTION: SectionInfoCollectAutoMode
PURPOSE: Fills the sketch information from the section's information
\*===============================================================*/
ProError SectionInfoCollectAutoMode(SketchInfo *sketch_info, ProSection *section)
{
ProError status;
ProFeature feat;
ProGeomitem geom_item;
ProSurface place_surface, orient_surface;
UtilElemData elem_data;
ProElemId name_id;
status = PromptFeatureWithSection(&feat, section);
if(status != PRO_TK_NO_ERROR)
return status;
status = ProUtilElementFeatTypeGet(&feat, &name_id);
if(name_id != PRO_FEAT_CURVE)
return PRO_TK_BAD_CONTEXT;
sketch_info->solid = (ProSolid)feat.owner;
/* The surface on which the sketch is to be placed */
if (status == PRO_TK_NO_ERROR)
{
ProElempathItem path_items_surface [] =
{{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_SETUP_PLANE},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_PLANE}};
status = ProUtilElementFeatDataGet(feat, path_items_surface, 3, &elem_data);
if(PRO_TK_NO_ERROR == status)
{
status = ProSelectionModelitemGet((ProSelection)elem_data.val.p,
(ProModelitem *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "SectionInfoCollectAutoMode",
status, status != PRO_TK_NO_ERROR );
status = ProGeomitemToSurface (&geom_item, &place_surface);
TEST_CALL_REPORT("ProGeomitemToSurface", "SectionInfoCollectAutoMode",
status, status != PRO_TK_NO_ERROR );
sketch_info->prim_surface = place_surface;
}
}
if (status == PRO_TK_NO_ERROR)
{
ProElempathItem path_items_orient_ref [] =
{{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_SETUP_PLANE},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_PLANE_ORIENT_REF}};
status = ProUtilElementFeatDataGet(feat, path_items_orient_ref, 3, &elem_data);
if(PRO_TK_NO_ERROR == status)
{
status = ProSelectionModelitemGet((ProSelection)elem_data.val.p,
(ProModelitem *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "SectionInfoCollectAutoMode",
status, status != PRO_TK_NO_ERROR );
status = ProGeomitemToSurface (&geom_item, &orient_surface);
TEST_CALL_REPORT("ProGeomitemToSurface", "SectionInfoCollectAutoMode",
status, status != PRO_TK_NO_ERROR );
sketch_info->orient_surface = orient_surface;
}
}
if (status == PRO_TK_NO_ERROR )
{
ProElempathItem path_items_orient_dir [] =
{{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_SETUP_PLANE},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_PLANE_ORIENT_DIR}};
ProElempathItem path_items_orient_view_dir [] =
{{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_SETUP_PLANE},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_PLANE_VIEW_DIR}};
status = ProUtilElementFeatDataGet(feat, path_items_orient_dir, 3, &elem_data);
if(PRO_TK_NO_ERROR == status)
{
sketch_info->orient_dir = elem_data.val.i;
}
status = ProUtilElementFeatDataGet(feat, path_items_orient_view_dir, 3, &elem_data);
if(PRO_TK_NO_ERROR == status)
{
sketch_info->orient_view_dir = elem_data.val.i;
}
}
/* Get the section from the feature */
/*if(PRO_TK_NO_ERROR == status)
status = ProUtilFeatureSectionGet(feat, §ion);*/
if(PRO_TK_NO_ERROR == status)
status = ProSectionEpsilonGet(*section, &sketch_info->eps_val);
if(PRO_TK_NO_ERROR == status)
status = ProUtilCopySectionEntities(section, sketch_info);
if(PRO_TK_NO_ERROR == status)
status = GetSectionProjectionReference(section, sketch_info);
return status;
}
/*===============================================================*\
FUNCTION: SectionInfoCollectUserMode
PURPOSE: Fills the sketch information from user's information
\*===============================================================*/
ProError SectionInfoCollectUserMode(SketchInfo *sketch_info, ProSection *section)
{
ProError status;
ProSelection *sel = NULL;
int n_sel;
ProFeature feat;
ProGeomitem geom_item;
ProSurface place_surface, orient_surface;
UtilElemData elem_data;
ProElemId name_id;
ProElempathItem path_items_orient_dir [] =
{{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_SETUP_PLANE},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_PLANE_ORIENT_DIR}};
ProElempathItem path_items_orient_view_dir [] =
{{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_SETUP_PLANE},
{ PRO_ELEM_PATH_ITEM_TYPE_ID, PRO_E_STD_SEC_PLANE_VIEW_DIR}};
status = PromptFeatureWithSection(&feat, section);
if(PRO_TK_NO_ERROR != status)
return status;
status = ProUtilElementFeatTypeGet(&feat, &name_id);
if(name_id != PRO_FEAT_CURVE)
return PRO_TK_BAD_CONTEXT;
sketch_info->solid = (ProSolid)feat.owner;
/*status = ProUtilFeatureSectionGet(feat, section);*/
status = ProUtilCopySectionEntities(section, sketch_info);
/* select the surface on which the sketch is to be placed */
ProUtilMsgPrint(msgfil, (char *)"USER Select the placement of sketch or cancel :" );
n_sel = 0;
status = ProSelect((char *)"surface", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect", "SectionInfoCollectUserMode",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return status;
status = ProSelectionModelitemGet(sel[0], (ProFeature *)&geom_item);
if(geom_item.type != PRO_SURFACE)
return status;
status = ProGeomitemToSurface(&geom_item, &place_surface);
sketch_info->prim_surface = place_surface;
ProUtilMsgPrint(msgfil, (char *)"USER Select the orientation of sketch or cancel :" );
n_sel = 0;
status = ProSelect((char *)"surface", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect", "SectionInfoCollectUserMode",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return status;
status = ProSelectionModelitemGet(sel[0], (ProFeature *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "SectionInfoCollectUserMode",
status, status != PRO_TK_NO_ERROR );
if(geom_item.type != PRO_SURFACE)
return status;
status = ProGeomitemToSurface(&geom_item, &orient_surface);
TEST_CALL_REPORT("ProGeomitemToSurface", "SectionInfoCollectUserMode",
status, status != PRO_TK_NO_ERROR );
sketch_info->orient_surface = orient_surface;
status = PromptSketchProjectionIds (sketch_info);
if(PRO_TK_NO_ERROR != status)
return status;
status = ProUtilElementFeatDataGet(feat, path_items_orient_dir, 3, &elem_data);
if(PRO_TK_NO_ERROR == status)
{
sketch_info->orient_dir = elem_data.val.i;
}
status = ProUtilElementFeatDataGet(feat, path_items_orient_view_dir, 3, &elem_data);
if(PRO_TK_NO_ERROR == status)
{
sketch_info->orient_view_dir = elem_data.val.i;
}
sketch_info->eps_val = 0.001;
/* Get the section from the feature */
return status;
}
/*===============================================================*\
FUNCTION: SectionInfoCollectFromEdges
PURPOSE: Fills the sketch information from edge
and section information
\*===============================================================*/
ProError SectionInfoCollectFromEdges(SketchInfo *sketch_info)
{
ProError status;
ProSelection *sel = NULL;
int n_sel;
ProGeomitem geom_item;
ProSurface place_surface, orient_surface;
ProEdge edge;
int i;
ProUtilMsgPrint(msgfil,
(char *)"USER Select the edges to be projected as the sketch feature:" );
n_sel = 0;
status = ProSelect((char *)"edge", -1, NULL, NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || n_sel < 1)
return status;
status = ProSelectionModelitemGet(sel[0], (ProModelitem *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR)
return status;
sketch_info->solid = (ProSolid)geom_item.owner;
for(i = 0; i<n_sel; i++)
{
status = ProSelectionModelitemGet(sel[i], (ProModelitem *)&geom_item);
status = ProEdgeInit((ProSolid)geom_item.owner, geom_item.id, &edge);
TEST_CALL_REPORT("ProEdgeInit", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
status = ProArrayObjectAdd((ProArray*)&sketch_info->edges,
PRO_VALUE_UNUSED, 1, &edge);
}
/* select the surface on which the sketch is to be placed */
ProUtilMsgPrint(msgfil, (char *)"USER Select the placement of sketch or cancel :" );
n_sel = 0;
status = ProSelect((char *)"surface", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return status;
status = ProSelectionModelitemGet(sel[0], (ProFeature *)&geom_item);
if(geom_item.type != PRO_SURFACE)
return status;
status = ProGeomitemToSurface(&geom_item, &place_surface);
sketch_info->prim_surface = place_surface;
ProUtilMsgPrint(msgfil, (char *)"USER Select the orientation of sketch or cancel :" );
n_sel = 0;
status = ProSelect((char *)"surface", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return status;
status = ProSelectionModelitemGet(sel[0], (ProFeature *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
if(geom_item.type != PRO_SURFACE)
return status;
status = ProGeomitemToSurface(&geom_item, &orient_surface);
TEST_CALL_REPORT("ProGeomitemToSurface", "SectionInfoCollectFromEdges",
status, status != PRO_TK_NO_ERROR );
sketch_info->orient_surface = orient_surface;
status = PromptSketchProjectionIds (sketch_info);
if(PRO_TK_NO_ERROR != status)
return status;
sketch_info->orient_dir = PRO_SEC_ORIENT_DIR_UP; /* 1 */
sketch_info->orient_view_dir = PRO_SEC_VIEW_DIR_SIDE_ONE; /* 1 */
sketch_info->eps_val = 0.001;
/* Get the section from the feature */
return status;
}
/*===============================================================*\
FUNCTION: GetSectionProjectionReference
PURPOSE: Fills the projection of sketch information
from the section information
\*===============================================================*/
ProError GetSectionProjectionReference(ProSection *section, SketchInfo *sketch_info)
{
ProError status;
int i = 0, n_ids = 0;
ProIntlist p_id_list;
Pro2dEntdef *p_ent;
ProBoolean is_proj;
ProGeomitem geom_item;
ProSelection sel;
status = ProSectionEntityIdsGet(*section, &p_id_list, &n_ids);
TEST_CALL_REPORT("ProSectionEntityIdsGet", "GetSectionProjectionReference",
status, status != PRO_TK_NO_ERROR );
if(status != PRO_TK_NO_ERROR)
return status;
for(i=0; i<2; i++)
{
status = ProSectionEntityGet(*section, p_id_list[i], (Pro2dEntdef**)&p_ent);
TEST_CALL_REPORT("ProSectionEntityIdsGet", "GetSectionProjectionReference",
status, status != PRO_TK_NO_ERROR );
status = ProSectionEntityIsProjection(*section, p_id_list[i], &is_proj);
if (PRO_TK_NO_ERROR != status || is_proj != PRO_B_TRUE)
return PRO_TK_GENERAL_ERROR;
status = ProSectionEntityReferenceGet ( *section, p_id_list[i], &sel);
if (status == PRO_TK_NO_ERROR)
{
status = ProSelectionModelitemGet (sel, (ProModelitem *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "GetSectionProjectionReference",
status, status != PRO_TK_NO_ERROR );
if(i == 0)
status = ProUtilGetGeomItemToRef(&geom_item, &sketch_info->ref1);
if(i == 1)
status = ProUtilGetGeomItemToRef(&geom_item, &sketch_info->ref2);
if(PRO_TK_NO_ERROR != status)
return PRO_TK_GENERAL_ERROR;
}
}
return status;
}
/*===============================================================*\
FUNCTION: PromptFeatureWithSection
PURPOSE: Prompt the user to select a sketch feature
\*===============================================================*/
ProError PromptFeatureWithSection(ProFeature *feat, ProSection *section)
{
ProError status;
ProSelection *sel = NULL;
int n_sel, n, n_sections;
int range[2];
/* select the 3D-section */
ProUtilMsgPrint(msgfil, (char *)"USER Select a 3-D sketch:" );
n_sel = 0;
status = ProSelect((char *)"feature", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
TEST_CALL_REPORT("ProSelect", "PromptFeatureWithSection",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || n_sel != 1)
return status;
status = ProSelectionModelitemGet(sel[0], feat);
TEST_CALL_REPORT("ProSelectionModelitemGet", "PromptFeatureWithSection",
status, status != PRO_TK_NO_ERROR );
status = ProFeatureNumSectionsGet(feat, &n_sections);
TEST_CALL_REPORT("ProFeatureNumSectionsGet", "PromptFeatureWithSection",
status, status != PRO_TK_NO_ERROR );
if (n_sections < 1)
{
return(PRO_TK_GENERAL_ERROR);
}
range[0] = 0; range[1] = n_sections-1;
n = 0;
if ( range[0] != range[1] )
{
ProUtilMsgPrint((char *)"gen",(char *)"TEST %0s", (char *)"Specify section number to retrieve.");
ProUtilIntGet(range,&range[0],&n);
}
status = ProFeatureSectionCopy(feat, n, section);
TEST_CALL_REPORT("ProFeatureSectionCopy", "PromptFeatureWithSection",
status, status != PRO_TK_NO_ERROR );
return status;
}
ProError CreateSectionCopyAutoMode()
{
return CreateSectionFeature(AUTO_MODE);
}
ProError CreateSectionCopyUserMode()
{
return CreateSectionFeature(USER_MODE);
}
ProError CreateSectionCreateFromEdges()
{
return CreateSectionFeature(EDGE_SEL_MODE);
}
/*===============================================================*\
FUNCTION: CreateSectionFeature
PURPOSE: Creates a sketch feature from the different types of
input from the user
\*===============================================================*/
ProError CreateSectionFeature(FeatCreateMode mode)
{
ProError status;
SketchInfo sketch_info;
ProFeature copy_feat;
ProSection section;
status = ProUtilInitializeSketch(&sketch_info);
if(PRO_TK_NO_ERROR != status)
return status;
switch (mode)
{
case AUTO_MODE:
status = SectionInfoCollectAutoMode(&sketch_info, §ion);
break;
case USER_MODE:
status = SectionInfoCollectUserMode(&sketch_info, §ion);
break;
case EDGE_SEL_MODE:
status = SectionInfoCollectFromEdges(&sketch_info);
break;
}
if(PRO_TK_BAD_CONTEXT == status)
ProUtilMsgPrint(msgfil,
(char *)"USER Not supported in the selected type of feature");
if(PRO_TK_NO_ERROR == status)
status = CreateSketchFeatures(&sketch_info, ©_feat);
if(PRO_TK_NO_ERROR == status)
status = ProFeatureSectionCopy(©_feat, 0, &sketch_info.section);
if((AUTO_MODE == mode || USER_MODE == mode) && PRO_TK_NO_ERROR == status)
status = ProUtilCopySectionConstraints(&sketch_info, ©_feat, §ion);
status = ProUtilInitializeSketch(&sketch_info);
return status;
}
/*====================================================================*\
FUNCTION : CreateSketchFeatures()
PURPOSE : Creates sketch feature from sketch information
\*====================================================================*/
ProError CreateSketchFeatures(SketchInfo *sketch_info, ProFeature *feature)
{
ProError status;
ProErrorlist errors;
ProModelitem model_item;
ProSelection model_sel;
ProFeatureCreateOptions *opts = 0;
ProSection section;
ProAsmcomppath comp_path;
ProAsmcomppath *p_comp_path = NULL;
ProElement created_elemtree;
ProElement pro_e_feature_tree;
ProElement pro_e_std_section;
ProElement pro_e_std_sec_setup_plane;
ProSelection *sketch_refs;
ProValueData value_data;
UtilElemData elem_data;
ProElempathItem path_items [] = {{ PRO_ELEM_PATH_ITEM_TYPE_ID,
PRO_E_STD_SECTION},
{ PRO_ELEM_PATH_ITEM_TYPE_ID,
PRO_E_SKETCHER}};
/*---------------------------------------------------------------*\
Populating root element PRO_E_FEATURE_TREE
\*---------------------------------------------------------------*/
status = ProElementAlloc ( PRO_E_FEATURE_TREE, &pro_e_feature_tree );
/*---------------------------------------------------------------*\
Populating element PRO_E_FEATURE_TYPE
\*---------------------------------------------------------------*/
value_data.v.i = PRO_FEAT_CURVE; /* 949 */
status = ProUtilElemtreeElementAdd( pro_e_feature_tree, PRO_E_FEATURE_TYPE,
ELEM_VALUE_TYPE_INT, &value_data.v.i);
/*---------------------------------------------------------------*\
Populating element PRO_E_CURVE_TYPE
\*---------------------------------------------------------------*/
value_data.v.i = PRO_CURVE_TYPE_SKETCHED; /* 0 */
status = ProUtilElemtreeElementAdd( pro_e_feature_tree, PRO_E_CURVE_TYPE,
ELEM_VALUE_TYPE_INT, &value_data.v.i);
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
\*---------------------------------------------------------------*/
status = ProElementAlloc ( PRO_E_STD_SECTION, &pro_e_std_section );
status = ProElemtreeElementAdd ( pro_e_feature_tree, NULL,
pro_e_std_section );
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
-> PRO_E_STD_SEC_SETUP_PLANE
\*---------------------------------------------------------------*/
status = ProElementAlloc ( PRO_E_STD_SEC_SETUP_PLANE,
&pro_e_std_sec_setup_plane );
status = ProElemtreeElementAdd ( pro_e_std_section, NULL,
pro_e_std_sec_setup_plane );
sketch_refs = ( ProSelection *) calloc ( 2, sizeof ( ProSelection ));
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
-> PRO_E_STD_SEC_SETUP_PLANE
-> PRO_E_STD_SEC_PLANE
\*---------------------------------------------------------------*/
status = ProUtilCopySelectionSurf((ProSolid)sketch_info->solid,
sketch_info->prim_surface, &(value_data.v.r));
status = ProSelectionCopy( value_data.v.r, &sketch_refs[0]);
TEST_CALL_REPORT("ProSelectionCopy", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
if(PRO_TK_NO_ERROR != status)
return status;
status = ProUtilElemtreeElementAdd( pro_e_std_sec_setup_plane, PRO_E_STD_SEC_PLANE,
ELEM_VALUE_TYPE_SELECTION, value_data.v.r);
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
-> PRO_E_STD_SEC_SETUP_PLANE
-> PRO_E_STD_SEC_PLANE_VIEW_DIR
\*---------------------------------------------------------------*/
value_data.v.i = sketch_info->orient_view_dir; /*PRO_SEC_VIEW_DIR_SIDE_ONE 1 */
status = ProUtilElemtreeElementAdd( pro_e_std_sec_setup_plane, PRO_E_STD_SEC_PLANE_VIEW_DIR,
ELEM_VALUE_TYPE_INT, &value_data.v.i);
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
-> PRO_E_STD_SEC_SETUP_PLANE
-> PRO_E_STD_SEC_PLANE_ORIENT_DIR
\*---------------------------------------------------------------*/
value_data.v.i = sketch_info->orient_dir; /* PRO_SEC_ORIENT_DIR_UP 1*/
status = ProUtilElemtreeElementAdd( pro_e_std_sec_setup_plane, PRO_E_STD_SEC_PLANE_ORIENT_DIR,
ELEM_VALUE_TYPE_INT, &value_data.v.i);
/*---------------------------------------------------------------*\
Populating element PRO_E_STD_SECTION
-> PRO_E_STD_SEC_SETUP_PLANE
-> PRO_E_STD_SEC_PLANE_ORIENT_REF
\*---------------------------------------------------------------*/
status = ProUtilCopySelectionSurf((ProSolid)sketch_info->solid,
sketch_info->orient_surface, &(value_data.v.r));
status = ProSelectionCopy( value_data.v.r, &sketch_refs[1]);
TEST_CALL_REPORT("ProSelectionCopy", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
if(PRO_TK_NO_ERROR != status)
return status;
status = ProUtilElemtreeElementAdd( pro_e_std_sec_setup_plane, PRO_E_STD_SEC_PLANE_ORIENT_REF,
ELEM_VALUE_TYPE_SELECTION, value_data.v.r);
/*---------------------------------------------------------------*\
Creating incomplete feature in the current model.
\*---------------------------------------------------------------*/
status = ProMdlToModelitem( sketch_info->solid, &model_item );
TEST_CALL_REPORT("ProMdlToModelitem", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProSelectionAlloc (p_comp_path, &model_item,
&model_sel);
TEST_CALL_REPORT("ProSelectionAlloc", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&opts);
opts[0]= PRO_FEAT_CR_INCOMPLETE_FEAT;
status = ProFeatureWithoptionsCreate (model_sel, pro_e_feature_tree,
opts, PRO_REGEN_NO_FLAGS, feature, &errors);
TEST_CALL_REPORT("ProFeatureWithoptionsCreate", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProArrayFree((ProArray*)&opts);
/* Using the element tree from created feature */
status = ProFeatureElemtreeExtract ( feature, p_comp_path,
PRO_FEAT_EXTRACT_NO_OPTS, &created_elemtree );
TEST_CALL_REPORT("ProFeatureElemtreeExtract", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProUtilElementTreeDataGet(created_elemtree, path_items, 2, &elem_data);
section = (ProSection)elem_data.val.p;
sketch_info->section = section;
/*---------------------------------------------------------------*\
Creating a 3-D section
\*---------------------------------------------------------------*/
status = ProUtilSketchSectionBuild (section, sketch_info, sketch_refs );
/*---------------------------------------------------------------*\
Redefining the feature to make it complete.
\*---------------------------------------------------------------*/
if(PRO_TK_NO_ERROR == status)
{
status = ProSelectionAsmcomppathGet (model_sel, &comp_path);
TEST_CALL_REPORT("ProSelectionAsmcomppathGet", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions),
1, (ProArray*)&opts);
opts[0]= PRO_FEAT_CR_DEFINE_MISS_ELEMS;
status = ProFeatureWithoptionsRedefine (&comp_path, feature, created_elemtree,
opts, PRO_REGEN_NO_FLAGS, &errors);
TEST_CALL_REPORT("ProFeatureWithoptionsRedefine", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProArrayFree((ProArray*)&opts);
}
/*---------------------------------------------------------------*\
Free up the allocated memory.
\*---------------------------------------------------------------*/
status = ProFeatureElemtreeFree (feature, created_elemtree );
TEST_CALL_REPORT("ProFeatureElemtreeFree", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
status = ProElementFree (&pro_e_feature_tree );
TEST_CALL_REPORT("ProElementFree", "CreateSketchFeatures",
status, status != PRO_TK_NO_ERROR );
return (status);
}
/*===============================================================*\
FUNCTION: PromptSketchProjectionIds
PURPOSE: Enquire the user about the projection reference
\*===============================================================*/
ProError PromptSketchProjectionIds (SketchInfo *sketch_info)
{
ProError status = PRO_TK_NO_ERROR;
ProSelection *sel;
int num_sel;
ProGeomitem geom_item;
if(sketch_info->ref2.type == GEOM_UNUSED)
{
ProUtilMsgPrint(msgfil,
(char *)"USER Select the two projection references of the sketch");
num_sel = 0;
status = ProSelect ((char *)"edge,surface", 2, NULL, NULL, NULL, NULL, &sel, &num_sel);
TEST_CALL_REPORT("ProSelect", "PromptSketchProjectionIds",
status, status != PRO_TK_NO_ERROR );
if (status != PRO_TK_NO_ERROR || num_sel < 2)
return (status);
status = ProSelectionModelitemGet(sel[0], (ProModelitem *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "PromptSketchProjectionIds",
status, status != PRO_TK_NO_ERROR );
status = ProUtilGetGeomItemToRef(&geom_item, &sketch_info->ref1);
if(PRO_TK_NO_ERROR == status)
{
status = ProSelectionModelitemGet(sel[1], (ProModelitem *)&geom_item);
TEST_CALL_REPORT("ProSelectionModelitemGet", "PromptSketchProjectionIds",
status, status != PRO_TK_NO_ERROR );
status = ProUtilGetGeomItemToRef(&geom_item, &sketch_info->ref2);
}
}
return status;
}
/*====================================================================*\
FUNCTION : SketchFeatureCreate
PURPOSE : Create menu for differnt input of sketch creation
\*====================================================================*/
ProError SketchFeatureCreate() /* Out: Direction of feature creation */
{
ProError status;
int menu_id;
int action;
/*------------------------------------*\
Menu for creation of sketch feature with
different input
\*------------------------------------*/
ProMenuFileRegister( (char *)"TKSectionCreate", (char *)"tksectioncreate.mnu", &menu_id );
status = ProMenubuttonActionSet( (char *)"TKSectionCreate",(char *)"-Manual Section Copy",
(ProMenubuttonAction)CreateSectionCopyUserMode, NULL, 0);
TEST_CALL_REPORT( "CreateSectionCopy", "ProMenubuttonActionSet",
status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet( (char *)"TKSectionCreate", (char *)"-Auto Section Copy",
(ProMenubuttonAction)CreateSectionCopyAutoMode, NULL, 0);
TEST_CALL_REPORT( "CreateSectionCopy", "ProMenubuttonActionSet",
status, status != PRO_TK_NO_ERROR );
status = ProMenubuttonActionSet( (char *)"TKSectionCreate", (char *)"-Section Creation From Edges",
(ProMenubuttonAction)CreateSectionCreateFromEdges, NULL, 0);
TEST_CALL_REPORT( "CreateSectionCopy", "ProMenubuttonActionSet",
status, status != PRO_TK_NO_ERROR );
status = ProMenuCreate( PROMENUTYPE_MAIN, (char *)"TKSectionCreate", &menu_id );
if( status == PRO_TK_NO_ERROR )
{
status = ProMenuProcess( (char *)"TKSectionCreate", &action );
}
return status;
}