Community Tip - Want the oppurtunity to discuss enhancements to PTC products? Join a working group! X
Hello, I'm not able to set LineStock Parameter with multiple values. If I use the following code, the BEND_ANGLE values are NOT set, and after this call, it is not longer possible to modify the line stock values in Creo manually. Technical Support seems not capable to give an answer. Here my Code, tk_linestockparam_Single_Debug() is an helper, code not here but the debug output.
For testing have an assembly open, including one linestock, the code uses the name MYLINESTOCK.
If somebody has an idea 🤗
/*
Here the struct info
typedef struct _pro_lnstk_param_memb_
{
ProName name;
ProParamvalue value;
} ProLnstkParamMemb;
typedef enum
{
PROLNSTKPRM_SINGLE,
PROLNSTKPRM_MULTIPLE
} ProLnstkParamType;
typedef struct _pro_lnstk_param_
{
ProName name;
ProLnstkParamType param_type;
union {
ProParamvalue value;
ProLnstkParamMemb *members;
} lnstk_param_value;
} ProLnstkParam;
*/
ProError
GetLineStockByName_Test (
ProSolid model,
char* InputName,
ProLnstk *LineStock
)
{
// Creo
ProError tk_status;
char LineStockName[PRO_NAME_SIZE];
ProLnstk *LineStocks;
//Runtime
int rval = PRO_TK_E_NOT_FOUND;
int array_size = 0;
int i = 0;
tk_status = ProAssemblyLnstksCollect( (ProAssembly) model, &LineStocks);
tk_status = ProArraySizeGet (LineStocks, &array_size);
for (i = 0; i < array_size ; i++) {
ProWstringToString(LineStockName,LineStocks[i].name);
if ( strcmp(LineStockName,InputName) ) {
continue;
}
rval= PRO_TK_NO_ERROR;
*LineStock = LineStocks[i];
break;
}
ProArrayFree ((ProArray*)&LineStocks);
return rval;
}
// Static Test Values
static double BendAngleVals[] = { 90.0, 45.0, 60.0, 30.0};
ProError
MyLnstkParametersSet_Test3 ()
{
ProError tk_status;
ProParamvalueType param_value_type;
ProParamvalue param_value;
ProLnstk LineStock;
ProLnstkParam *LnstkParams;
ProLnstkParam LnstkParam;
ProLnstkParamMemb *LnstkParamMembers;
ProLnstkParamMemb LnstkParamMember;
ProMdl model;
ProParamvalue Paramvalue;
int i;
int nValues;
double dVal;
TK_DEBUG00("in MyLnstkParametersSet_Test3");
tk_status = ProMdlCurrentGet (&model);
if (tk_status == PRO_TK_E_NOT_FOUND) {
return tk_status;
}
// MYLINESTOCK or any other name here must be within the active assembly
tk_status = GetLineStockByName_Test (model,"MYLINESTOCK" ,&LineStock);
if (tk_status == PRO_TK_E_NOT_FOUND) {
return tk_status;
}
tk_status = ProArrayAlloc (0, sizeof (ProLnstkParam), 1, (ProArray*)&LnstkParams);
//
// Alloc an Array at LnstkParam.lnstk_param_value.members
//
tk_status = ProArrayAlloc (0, sizeof (ProLnstkParamMemb), 1, (ProArray*)&LnstkParam.lnstk_param_value.members); REPORT_TK_CALL("MyLnstkParametersSet_Test3()","ProArrayAlloc()",tk_status,tk_status != PRO_TK_NO_ERROR);
LnstkParam.name[0] = '\0';
TK_DEBUG01("Configure form Obj LnstkParam Name '%s'","BEND_ANGLE");
ProStringToWstring(LnstkParam.name,"BEND_ANGLE");
LnstkParam.param_type = PROLNSTKPRM_MULTIPLE;
for ( i = 0 ; i < 4 ; i++ ) {
dVal = BendAngleVals[i];
TK_DEBUG01 ("add value %6.3f",dVal);
LnstkParamMember.name[0] = '\0';
TK_DEBUG00("ProParamvalueSet in LnstkParamMember");
tk_status = ProParamvalueSet(&LnstkParamMember.value, (void*)&dVal, PRO_PARAM_DOUBLE);
TK_DEBUG00("ProArrayObjectAdd to LnstkParamMembers");
//
// Now add this member
//
tk_status = ProArrayObjectAdd ((ProArray*)&LnstkParam.lnstk_param_value.members, PRO_VALUE_UNUSED , 1, &LnstkParamMember); REPORT_TK_CALL("MyLnstkParametersSet_Test3()","ProArrayObjectAdd()",tk_status,tk_status != PRO_TK_NO_ERROR);
tk_status = ProArraySizeGet(LnstkParam.lnstk_param_value.members, &nValues);
TK_DEBUG01("ProArraySizeGet LnstkParam.lnstk_param_value.members nValues %d",nValues);
}
// tk_linestockparam_Single_Debug(LnstkParam);
tk_status = ProArrayObjectAdd ((ProArray*)&LnstkParams, PRO_VALUE_UNUSED, 1, &LnstkParam); REPORT_TK_CALL("MyLnstkParametersSet_Test3()","ProArrayObjectAdd()",tk_status,tk_status != PRO_TK_NO_ERROR);
tk_status = ProArraySizeGet(LnstkParams, &nValues);
TK_DEBUG01("ProArraySizeGet LnstkParams nValues %d",nValues);
TK_DEBUG00("Call ProLnstkParametersSet()");
tk_status = ProLnstkParametersSet( &LineStock,LnstkParams); REPORT_TK_CALL("MyLnstkParametersSet_Test3()","ProLnstkParametersSet()",tk_status,tk_status != PRO_TK_NO_ERROR);
TK_DEBUG00("Call ProArrayFree()");
tk_status = ProArrayFree( (ProArray*)&LnstkParam.lnstk_param_value.members ); REPORT_TK_CALL("MyLnstkParametersSet_Test3()","ProArrayFree()",tk_status,tk_status != PRO_TK_NO_ERROR);
tk_status = ProArrayFree( (ProArray*)&LnstkParams ); REPORT_TK_CALL("MyLnstkParametersSet_Test3()","ProArrayFree()",tk_status,tk_status != PRO_TK_NO_ERROR);
return PRO_TK_NO_ERROR;
}
Here the Debug Out
# 11:37:23 in MyLnstkParametersSet_Test3
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayAlloc() 0
# 11:37:23 Configure form Obj LnstkParam Name 'BEND_ANGLE'
# 11:37:23 add value 90.000
# 11:37:23 ProParamvalueSet in LnstkParamMember
# 11:37:23 ProArrayObjectAdd to LnstkParamMembers
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayObjectAdd() 0
# 11:37:23 ProArraySizeGet LnstkParam.lnstk_param_value.members nValues 1
# 11:37:23 add value 45.000
# 11:37:23 ProParamvalueSet in LnstkParamMember
# 11:37:23 ProArrayObjectAdd to LnstkParamMembers
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayObjectAdd() 0
# 11:37:23 ProArraySizeGet LnstkParam.lnstk_param_value.members nValues 2
# 11:37:23 add value 60.000
# 11:37:23 ProParamvalueSet in LnstkParamMember
# 11:37:23 ProArrayObjectAdd to LnstkParamMembers
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayObjectAdd() 0
# 11:37:23 ProArraySizeGet LnstkParam.lnstk_param_value.members nValues 3
# 11:37:23 add value 30.000
# 11:37:23 ProParamvalueSet in LnstkParamMember
# 11:37:23 ProArrayObjectAdd to LnstkParamMembers
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayObjectAdd() 0
# 11:37:23 ProArraySizeGet LnstkParam.lnstk_param_value.members nValues 4
# 11:37:23 +++++++++++++++++++++++
# 11:37:23 ps_linestockparam_Single_Debug
# 11:37:23 +++++++++++++++++++++++
# 11:37:23 PRO_PARAM_DOUBLE is 50
# 11:37:23 PRO_PARAM_STRING is 51
# 11:37:23 PRO_PARAM_INTEGER is 52
# 11:37:23 PRO_PARAM_BOOLEAN is 53
# 11:37:23 PROLNSTKPRM_SINGLE is 0
# 11:37:23 PROLNSTKPRM_SINGLE is 1
# 11:37:23 ParamName is 'BEND_ANGLE'
# 11:37:23 linestockparamtype 1 SINGLE is 0 MULTIPLE is 1
# 11:37:23 LinestockParamType is PROLNSTKPRM_MULTIPLE
# 11:37:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 11:37:23 tk_status 0 nValues in members 4
# 11:37:23 k 0 member Name ''
# 11:37:23 Type Get tk_status 0 for member Name '' paramValueType 50
# 11:37:23 Value is PRO_PARAM_DOUBLE 50
# 11:37:23 param str value[0] '90.000000000'
# 11:37:23 k 1 member Name ''
# 11:37:23 Type Get tk_status 0 for member Name '' paramValueType 50
# 11:37:23 Value is PRO_PARAM_DOUBLE 50
# 11:37:23 param str value[1] '45.000000000'
# 11:37:23 k 2 member Name ''
# 11:37:23 Type Get tk_status 0 for member Name '' paramValueType 50
# 11:37:23 Value is PRO_PARAM_DOUBLE 50
# 11:37:23 param str value[2] '60.000000000'
# 11:37:23 k 3 member Name ''
# 11:37:23 Type Get tk_status 0 for member Name '' paramValueType 50
# 11:37:23 Value is PRO_PARAM_DOUBLE 50
# 11:37:23 param str value[3] '30.000000000'
# 11:37:23 Done ps_linestockparam_Single_Debug()
# 11:37:23 -------------------------------------
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayObjectAdd() 0
# 11:37:23 ProArraySizeGet LnstkParams nValues 1
# 11:37:23 Call ProLnstkParametersSet()
# 11:37:23 MyLnstkParametersSet_Test3() ProLnstkParametersSet() 0
# 11:37:23 Call ProArrayFree()
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayFree() 0
# 11:37:23 MyLnstkParametersSet_Test3() ProArrayFree() 0
Solved! Go to Solution.
Hello Jean Claude,
I must apologize, I oversaw an eMail from Michael Wunder. He corrected my sample code, and this fixed the issue.
It is required to tag the member with the same name. I checked it on extract, and got always a blank value. Now the code is working, thanks to support and Mr. Wunder👍
ProStringToWstring(LnstkParam.name,"BEND_ANGLE");
LnstkParam.param_type = PROLNSTKPRM_MULTIPLE;
for ( i = 0 ; i < 4 ; i++ ) {
dVal = BendAngleVals[i];
TK_DEBUG01 ("add value %6.3f",dVal);
LnstkParamMember.name[0] = '\0';
// It is required to tag the member with the same name
ProStringToWstring(LnstkParamMember.name,"BEND_ANGLE");
Dear member,
Thank you for posting this question regarding LINESTOCK parameter file. As mentioned in the Creo Help documentation : "A line stock is a set of parameters that define material, grade, outside diameter, and other parameters of pipeline segments. Piping stores the parameters in the line stock feature. Before you create a pipeline, you must define a line stock. You can assign different line stocks to different line segments of the same pipeline because they may have different outside diameters, materials, and grades. Keep in mind that the system determines a pipeline’s physical (solid) shape based on the line stock from which it actually derived the pipe. You can edit line stock parameters using the LineStock dialog box, and you can add user-defined attributes to the list. You can also read and write a line stock to a .stk file. You can set up a library of line stocks that you can retrieve to route a particular pipeline. "
Regarding the User defined parameters BEND_ANGLE is a valid parameter with MIN_BEND_ANGLE and MAX_BEND_ANGLE
Please review Creo Help for Line Stock Parameter Files and Report Table Parameters Applicable to Piping and let us know if this help.
Best regards
Jean Claude
Hello Jean Claude,
I must apologize, I oversaw an eMail from Michael Wunder. He corrected my sample code, and this fixed the issue.
It is required to tag the member with the same name. I checked it on extract, and got always a blank value. Now the code is working, thanks to support and Mr. Wunder👍
ProStringToWstring(LnstkParam.name,"BEND_ANGLE");
LnstkParam.param_type = PROLNSTKPRM_MULTIPLE;
for ( i = 0 ; i < 4 ; i++ ) {
dVal = BendAngleVals[i];
TK_DEBUG01 ("add value %6.3f",dVal);
LnstkParamMember.name[0] = '\0';
// It is required to tag the member with the same name
ProStringToWstring(LnstkParamMember.name,"BEND_ANGLE");
Dear member,
Thank you for confirming the resolution with the information from Michael, our Toolkit expert.
We will close this discussion.
If you appreciated the community service , do not hesitate to use it again in the future.
kind regards
Jean Claude