实体密度属性设置函数分为两个,具体如下所述:
-
SetBodyDensityAttr
:负责初始化材料属性并调用WriteBodyAttr
完成密度设置。 -
WriteBodyAttr
:负责具体的密度值写入、材料创建或更新,并将材料与几何体关联。
1、SetBodyDensityAttr
函数
-
功能:设置几何体(Body)的密度属性。
-
输入参数:
-
body_tag
:几何体的标签(tag)。 -
_attr
:材料名称或属性名称。 -
_value
:密度值(字符串形式)。
-
-
主要逻辑:
-
初始化材料属性结构体
UF_SF_material_prop_t
。 -
设置密度属性类型为表达式(
UF_SF_MULTI_PROP_EXPRESSION
)。 -
调用
WriteBodyAttr
函数,将密度值写入几何体属性。 -
释放材料属性结构体的内存。
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
:密度值(字符串形式)。
-
-
主要逻辑:
-
根据单位类型调整密度值的格式(如
"e-6"
或"e-9"
)。 -
检查是否已存在同名材料:
-
如果不存在,创建新材料并设置密度属性。
-
使用
UF_MODL_create_exp_tag
创建表达式标签。 -
调用
UF_SF_create_material
创建材料。 -
将材料与几何体关联。
-
更新模型。
-
如果存在,更新现有材料的密度属性。
-
-
释放动态分配的内存(如
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;
}