/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include <ProToolkit.h> #include <ProElement.h> #include <ProMfg.h> #include <ProFeature.h> typedef struct st_user_data { int dummy; } UserData; typedef struct st_user_elem_table { int elem_type; int value_type; } UserElemTable; ProError UserAuxNcseqCreate( ProMfg mfg, ProName feat_name, int oper_id, int retract_id, ProSelection ncseq_csys, ProName tool_name, ProFeature *p_ncseq); /*================================================================*\ FUNCTION: UserClcmdCreate() PURPOSE: Create a customized, manufacturing CL command. \*================================================================*/ ProError UserClcmdCreate( ProMfg mfg, /* manufacturing model */ int oper_id, /* operation identifier */ int retract_id, /* retraction plane identifier */ ProSelection ncseq_csys, /* NC sequence csys */ ProName tool_name /* name of the tool */ ) { ProError status; UserData data; ProFeature ncseq; ProName aux_name; /*----------------------------------------------------------------*\ Set up the user data required for the CL command creation. \*----------------------------------------------------------------*/ /*----------------------------------------------------------------*\ Create the auxiliary NC sequence. \*----------------------------------------------------------------*/ status = UserAuxNcseqCreate (mfg, aux_name, oper_id, retract_id, ncseq_csys, tool_name, &ncseq); /*----------------------------------------------------------------*\ Create the custom NC sequence. \*----------------------------------------------------------------*/ if (status == PRO_TK_NO_ERROR) status = UserCustomNcseqCreate (mfg, ncseq.id, data); return (status); } /*================================================================*\ FUNCTION: UserAuxNcseqCreate() PURPOSE: Create an auxiliary NC sequence. \*================================================================*/ ProError UserAuxNcseqCreate( ProMfg mfg, /* manufacturing model */ ProName feat_name, /* auxiliary NC sequence name */ int oper_id, /* operation identifier */ int retract_id, /* retraction plane identifier */ ProSelection ncseq_csys, /* NC sequence coordinate system */ ProName tool_name, /* tool name */ ProFeature *p_ncseq) /* auxiliary NC sequence feature */ { ProError status; ProErrorlist errors; /* error list */ ProSelection sel; /* selection for workpiece */ ProFeatureCreateOptions *opts = 0; static UserElemTable elem_tab[] = {{PRO_E_FEATURE_TYPE, PRO_VALUE_TYPE_INT }, {PRO_E_FEAT_NAME, PRO_VALUE_TYPE_WSTRING }, {PRO_E_OPERATION, PRO_VALUE_TYPE_INT }, {PRO_E_RETRACT, PRO_VALUE_TYPE_INT }, {PRO_E_CSYS, PRO_VALUE_TYPE_SELECTION }, {PRO_E_TOOL, PRO_VALUE_TYPE_WSTRING }}; /*----------------------------------------------------------------*\ Allocate the elements, set the values, and add them to the element tree. \*----------------------------------------------------------------*/ /*----------------------------------------------------------------*\ Get the ProSelection for the workpiece. \*----------------------------------------------------------------*/ if (status == PRO_TK_NO_ERROR) status = UserWpieceSelCreate (mfg, PRO_TK_NOT_USED, PRO_TK_NOT_USED, &sel); /*----------------------------------------------------------------*\ Create the auxiliary NC sequence. \*----------------------------------------------------------------*/ if (status == PRO_TK_NO_ERROR) { status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_NO_OPTS; status = ProFeatureWithoptionsCreate (sel, elem_tree, opts, PRO_REGEN_NO_FLAGS, p_ncseq, &errors); status = ProArrayFree((ProArray*)&opts); } return (status); } /*====================================================================*\ FUNCTION: UserCustomNcseqCreate() PURPOSE: Create a custom NC sequence. \*====================================================================*/ ProError UserCustomNcseqCreate( ProMfg mfg_model, /* manufacturing model */ int ref_ncseq_id, /* feature identifier of the referenced NC sequence */ UserData *data) /* user application data */ { ProError status = PRO_TK_NO_ERROR; ProElement elem, elem_tree; ProErrorlist errors; ProSelection sel; ProFeature custom_feat; int ii; ProFeatureCreateOptions *opts = 0; static UserElemTable elem_tab[] = { {PRO_E_FEATURE_TYPE, PRO_VALUE_TYPE_INT }, {PRO_E_REF_NCSEQ, PRO_VALUE_TYPE_INT }, {PRO_E_NCL_COMMANDS, ARRAY }}; int elem_type_size = sizeof(elem_tab)/sizeof(UserElemTable); /*----------------------------------------------------------------*\ Allocate the feature tree. \*----------------------------------------------------------------*/ status = ProElementAlloc (PRO_E_FEATURE_TREE, &elem_tree); /*----------------------------------------------------------------*\ Go through the entire element table. \*----------------------------------------------------------------*/ for (ii = 0; ii < elem_type_size; ii++) { status = ProElementAlloc (elem_tab[ii].elem_type, &elem); switch (elem_tab[ii].elem_type) { case PRO_E_FEATURE_TYPE: value_data.v.i = PRO_FEAT_BLD_PATH; break; case PRO_E_REF_NCSEQ: value_data.v.i = ref_ncseq_id; break; case PRO_E_NCL_COMMANDS: status = UserClcmdSet (elem, UserCheckClInput, data); break; default: return PRO_TK_GENERAL_ERROR; break; } /*----------------------------------------------------------------*\ Set the value to the element and add it to the element tree. \*----------------------------------------------------------------*/ } /*----------------------------------------------------------------*\ Get the workpiece selection handle. \*----------------------------------------------------------------*/ /*----------------------------------------------------------------*\ Create the custom NC sequence. \*----------------------------------------------------------------*/ if (status == PRO_TK_NO_ERROR) { status = ProArrayAlloc(1,sizeof(ProFeatureCreateOptions), 1, (ProArray*)&opts); opts[0]= PRO_FEAT_CR_NO_OPTS; status = ProFeatureWithoptionsCreate (sel, elem_tree, opts, PRO_REGEN_NO_FLAGS, &custom_feat, &errors); status = ProArrayFree((ProArray*)&opts); } return (status); } /*================================================================*\ FUNCTION: UserClcmdSet() PURPOSE: Set up the CL command element. \*================================================================*/ ProError UserClcmdSet( ProElement ncseq_elem, /* NC sequence element */ ProFunction UserCheckFunc, /* user-supplied check function */ UserData *data) /* user data */ { char c md[80]; wchar_t wcmd[80], *wlines[2]; ProElement cl_cmd_elem; double pos[3], axis[3]; ProError status; /*----------------------------------------------------------------*\ Set the CL command location and axis. \*----------------------------------------------------------------*/ /*----------------------------------------------------------------*\ Prepare the CL command string. \*----------------------------------------------------------------*/ ProTKSprintf (cmd, ``MOVETO/ %f,%f,%f'', ...); ProStringToWstring (wcmd, cmd); /*----------------------------------------------------------------*\ Check the data. \*----------------------------------------------------------------*/ if (UserCheckFunc == NULL || UserCheckFunc (data, pos)) { wlines[0] = wcmd; wlines[1] = NULL; /*----------------------------------------------------------------*\ Set up the CL command element and add it to element tree. \*----------------------------------------------------------------*/ status = ProClcmdElemCreate (wlines, 1, pos, axis, &cl_cmd_elem); if (status == PRO_TK_NO_ERROR) status = ProElemtreeElementAdd (ncseq_elem, NULL, cl_cmd_elem); } /*----------------------------------------------------------------*\ Set notifications, if necessary. \*----------------------------------------------------------------*/ if (status == PRO_TK_NO_ERROR) { ProNotificationSet (PRO_NCL_COMMAND_EXPAND, UserClcmdInterpretFunc); ProNotificationSet (PRO_NCL_COMMAND_EXPAND, UserClcmdLocationGetFunc); } return (status); }