/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ /* This example creates three externally defined functions to be available in the relations dialog: ptk_set_a & ptk_set_b are used from the left-hand side of relations to initialize double values to stored "A" and "B" variables. ptk_eval_ax_plus_b returns the computation of Ax+B, where x is an input to the function. These functions are available only while the Pro/TK application is running. Models can be saved with relations referencing these functions, but these models will have relation errors if retrieved while the application is not running. */ #include <ProToolkit.h> #include <ProRelSet.h> #include <ProParamval.h> #define PTK_SET_A "ptk_set_a" #define PTK_SET_B "ptk_set_b" static double stored_a; static double stored_b; /*==========================================================================*\ FUNCTION: UserRelFPropertySet PURPOSE: "Write" function for the assignment of the parameters used for calculation. \*==========================================================================*/ ProError UserRelFPropertySet (ProRelset* relset, ProMdl mdl, char* ext_func_name, ProParamvalue* args, ProParamvalue* input, ProAppData data) { if (input->type != PRO_PARAM_DOUBLE) return (PRO_TK_GENERAL_ERROR); if (strcmp (ext_func_name, PTK_SET_A) == 0) { stored_a = input->value.d_val; return (PRO_TK_NO_ERROR); } if (strcmp (ext_func_name, PTK_SET_B) == 0) { stored_b = input->value.d_val; return (PRO_TK_NO_ERROR); } return (PRO_TK_GENERAL_ERROR); } /*==========================================================================*\ FUNCTION: UserRelFGetAxPlusB PURPOSE: "Read" function for the calculation of the values. \*==========================================================================*/ ProError UserRelFGetAxPlusB (ProRelset* relset, ProMdl mdl, char* ext_func_name, ProParamvalue* args, ProAppData data, ProParamvalue* result) { double x = args [0].value.d_val; result->type = PRO_PARAM_DOUBLE; result->value.d_val = stored_a * x + stored_b; return (PRO_TK_NO_ERROR); } /*==========================================================================*\ FUNCTION: UserCustomRelFunctionsDefine PURPOSE: Define the functions that can be used by Pro/E users in relations. \*==========================================================================*/ int UserCustomRelFunctionsDefine () { ProRelfuncArg* args_array; stored_a = 5.5; stored_b = 13.1; /*--------------------------------------------------------------------------*\ Allocate the array of expected arguments and types for the get function. \*--------------------------------------------------------------------------*/ ProArrayAlloc (1, sizeof (ProRelfuncArg), 1, (ProArray*)&args_array); args_array [0].type = PRO_PARAM_DOUBLE; args_array [0].attributes = PRO_RELF_ATTR_NONE; /*--------------------------------------------------------------------------*\ Register the set functions. These functions should be used only on the LHS of relations, and they do not require or use any arguments. \*--------------------------------------------------------------------------*/ ProRelationFunctionRegister ("ptk_set_a", NULL, NULL, UserRelFPropertySet, NULL, PRO_B_TRUE, NULL); ProRelationFunctionRegister ("ptk_set_b", NULL, NULL, UserRelFPropertySet, NULL, PRO_B_TRUE, NULL); /*--------------------------------------------------------------------------*\ Register the computation function. This function should be used only on the RHS of relations. Type-checking is used to ensure that exactly one double argument was passed. \*--------------------------------------------------------------------------*/ ProRelationFunctionRegister ("ptk_eval_ax_plus_b", args_array, UserRelFGetAxPlusB, NULL, NULL, PRO_B_FALSE, NULL); return (PRO_TK_NO_ERROR); } #undef PTK_SET_A #undef PTK_SET_B