NX二开 实体设置密度属性,并确保材料与实体对象关联

   实体密度属性设置函数分为两个,具体如下所述:

  • SetBodyDensityAttr:负责初始化材料属性并调用 WriteBodyAttr 完成密度设置。

  • WriteBodyAttr:负责具体的密度值写入、材料创建或更新,并将材料与几何体关联。

 1、SetBodyDensityAttr 函数

  • 功能:设置几何体(Body)的密度属性。

  • 输入参数

    • body_tag:几何体的标签(tag)。

    • _attr:材料名称或属性名称。

    • _value:密度值(字符串形式)。

  • 主要逻辑

    1. 初始化材料属性结构体 UF_SF_material_prop_t

    2. 设置密度属性类型为表达式(UF_SF_MULTI_PROP_EXPRESSION)。

    3. 调用 WriteBodyAttr 函数,将密度值写入几何体属性。

    4. 释放材料属性结构体的内存。

    void SetBodyDensityAttr(tag_t body_tag, char* _attr, char* _value)
    {
    	UF_SF_material_prop_t property_values;
    	std::string unit = "GramPerCubicCentiMeter";	
    	UF_SF_init_matl_prop(&property_values);
    	property_values.isotropic.mass_density.type = UF_SF_MULTI_PROP_EXPRESSION;
    	WriteBodyAttr(body_tag, &property_values, UF_SF_neutral_material_types_e::UF_SF_MATERIAL_ISOTROPIC,(char *)unit.c_str(), _attr, _value);
    	UF_SF_free_matl_prop(&property_values);
    }

2、WriteBodyAttr 函数

  • 功能:将密度属性写入几何体,并关联材料。

  • 输入参数

    • body_tag:几何体的标签(tag)。

    • property_values:材料属性结构体指针。

    • mtye:材料类型(如各向同性材料 UF_SF_MATERIAL_ISOTROPIC)。

    • type:密度单位(如 "GramPerCubicCentiMeter")。

    • _attr:材料名称或属性名称。

    • _value:密度值(字符串形式)。

  • 主要逻辑

    1. 根据单位类型调整密度值的格式(如 "e-6" 或 "e-9")。

    2. 检查是否已存在同名材料:

      • 如果不存在,创建新材料并设置密度属性。

      • 使用 UF_MODL_create_exp_tag 创建表达式标签。

      • 调用 UF_SF_create_material 创建材料。

      • 将材料与几何体关联。

      • 更新模型。

      • 如果存在,更新现有材料的密度属性。

    3. 释放动态分配的内存(如 material_name)。

void WriteBodyAttr(tag_t body_tag, UF_SF_material_prop_p_t property_values,UF_SF_neutral_material_types_e mtye, char* type, char* _attr, char* _value)
{
	int    iret;
	tag_t  tmat, tunit, texp;
	char*  material_name;
	char temp[UF_MAX_EXP_LENGTH]={0};
	iret = UF_SF_locate_named_material(_attr, &tmat);
	// #define UF_UNIT_MASSDENSITY_g__mm3              "GramPerCubicMilliMeter"
	// #define UF_UNIT_MASSDENSITY_g__cm3              "GramPerCubicCentiMeter"
	// #define UF_UNIT_MASSDENSITY_kg__m3              "KilogramPerCubicMeter"
	// #define UF_UNIT_MASSDENSITY_kg__mm3             "KilogramPerCubicMilliMeter"		
	sprintf(temp,"%s%s",_value,"e-9");			
	if (!strcmp("GramPerCubicCentiMeter",type))
	{
		sprintf(temp,"%s%s",_value,"e-6");
	} 
	if ((NULL_TAG == tmat)&&(iret!=0))
	{
		NXOpen::Session *theSession = NXOpen::Session::GetSession();
		NXOpen::Part *workPart(theSession->Parts()->Work());	
		UF_MODL_create_exp_tag(temp, &texp); 	
		property_values->isotropic.mass_density.type = UF_SF_MULTI_PROP_EXPRESSION;
		property_values->isotropic.mass_density.multi.expression_tag = texp; 
		UF_SF_create_material(_attr, NULL, mtye, property_values, UF_SF_MATL_IS_EDITABLE, &tmat);
	}
	else
	{
		UF_SF_ask_material(tmat, &material_name, property_values);
		UF_free(material_name);	
		UF_MODL_create_exp_tag(temp, &texp); 
		property_values->isotropic.mass_density.multi.expression_tag = texp; 
		UF_SF_update_material(tmat,_attr,"*","*", property_values); 
	}  
	UF_SF_link_material(tmat, body_tag);
	UF_MODL_update();
	return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值