NX二次开发——设置对象的密度(UF_MODL_set_body_density)

发布于:2025-05-18 ⋅ 阅读:(19) ⋅ 点赞:(0)

        在前几篇博客中我们已经探讨了如何设置实体的密度。在装配环境中,同样可以为组件设置密度。虽然不能直接对组件进行密度设置,但可以通过一种间接方式实现:在装配环境下,利用 UF_ASSEM_set_work_part_quietly() 函数以静默方式将组件设为工作部件,然后对该组件中的实体设置密度,从而间接完成装配环境中组件密度的设置。

具体代码及注释如下所示(注意单位转化)

//设置对象密度
void NXopen_AssignmentQuality::SetObjectDensity(int type)
{
	try
	{
		vector<NXOpen::TaggedObject *> ObjectTags = bodySelect0->GetProperties()->GetTaggedObjectVector("SelectedObjects");

		for (int i = 0; i < (int)ObjectTags.size(); i++)
		{
			bool is_occ;//判断是否为组件
			tag_t body = ObjectTags[i]->Tag();//用来存储选择对象的TAG
			tag_t owning_part, part = UF_PART_ask_display_part();

			// 判断是否为装配体中的实例对象
			is_occ = (UF_ASSEM_is_occurrence(body) && !UF_OBJ_is_object_a_promotion(body));
			if (is_occ)
			{
				body = UF_ASSEM_ask_prototype_of_occ(body);//输入对象的事例occurrence,返回对象的原型。如果输入的是未加载的部件则返回NULL_TAG。
				UF_OBJ_ask_owning_part(body, &owning_part);//获得对象所在部件的PartTag
				UF_ASSEM_set_work_part_quietly(owning_part, &part);//再不打开窗口,静默下,将组件中的对象设置为工作部件进行修改,因为密度修改只能该实体的密度,组件其实实体链接到装配环境中,就像不能修改装配体名字,只能修改实体零件名字,该链接到组件中完成名字修改
				UF_MODL_density_units_t units;			//units:磅/英寸=UF_MODL_pounds_inches;磅/英尺 = UF_MODL_pounds_feet;克/厘米 = UF_MODL_grams_centimeters;千克/米 = UF_MODL_kilograms_meters
				if (type == 1)
				{
					units = UF_MODL_pounds_inches;
				}
				else if (type == 2)
				{
					units = UF_MODL_pounds_feet;
				}
				else if (type == 3)
				{
					units = UF_MODL_grams_centimeters;
				}
				else if (type == 4)
				{
					units = UF_MODL_kilograms_meters;
				}
				double Volum = GetBodyVolum(body);		//克/mm^3		
				double Quality = double0->GetProperties()->GetDouble("Value");
				double density = (Quality / Volum) * 1000000;//kg/mm^3转化为g/cm^3
				UF_MODL_set_body_density(body, units, density);

				UF_ASSEM_set_work_part_quietly(part, &owning_part);
			}
			else
			{
				UF_MODL_density_units_t units;			//units:磅/英寸=UF_MODL_pounds_inches;磅/英尺 = UF_MODL_pounds_feet;克/厘米 = UF_MODL_grams_centimeters;千克/米 = UF_MODL_kilograms_meters
				if (type == 1)
				{
					units = UF_MODL_pounds_inches;
				}
				else if (type == 2)
				{
					units = UF_MODL_pounds_feet;
				}
				else if (type == 3)
				{
					units = UF_MODL_grams_centimeters;
				}
				else if (type == 4)
				{
					units = UF_MODL_kilograms_meters;
				}
				double Volum = GetBodyVolum(body);
				double Quality = double0->GetProperties()->GetDouble("Value");
				double density = (Quality / Volum) * 1000000;//kg/mm^3转化为g/cm^3
				UF_MODL_set_body_density(body, units, density);
			}
		}
	}
	catch (exception& ex)
	{
		//---- Enter your exception handling code here -----
		NXopen_AssignmentQuality::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
	}
	
}

关于实体设置密度的方式参考一下博客:

NX二次开发——设置体的密度(UF_MODL_set_body_density)-CSDN博客