Skip to main content
18-Opal
November 18, 2021
Solved

Prepare Pipe LineStock Parameter

  • November 18, 2021
  • 1 reply
  • 1767 views

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

 

 

 

 

 

 

Best answer by RPN

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");

 

1 reply

16-Pearl
November 19, 2021

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

RPN18-OpalAuthorAnswer
18-Opal
November 19, 2021

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");

 

16-Pearl
November 22, 2021

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