/**********测量实体体积(录制)*********************************************************
std::vector<tag_t> body; //<I> 实体组
return //<0> 返回体积
*/
double ask_body_volume(std::vector<tag_t> body)
{
Session *theSession = Session::GetSession();
Part *workPart(theSession->Parts()->Work());
NXObject *nullNXObject(NULL);
MeasureBodyBuilder *measureBodyBuilder1;
measureBodyBuilder1 = workPart->MeasureManager()->CreateMeasureBodyBuilder(nullNXObject);
measureBodyBuilder1->SetAnnotationMode(MeasureBuilder::AnnotationTypeNone);
std::vector<Body *> bodies1;
std::vector<NXOpen::IBody *> objects;
for (int i = 0; i < body.size(); i++)
{
if (UF_ASSEM_is_occurrence(body[i]))
body[i] = UF_ASSEM_ask_prototype_of_occ(body[i]);
int type = 0, sub = 0;
UF_OBJ_ask_type_and_subtype(body[i], &type, &sub);
if (type == 70 && sub == UF_solid_body_subtype)//查询是否是实体
bodies1.push_back((dynamic_cast<Body *>(NXObjectManager::Get(body[i]))));
}
if (bodies1.size()>0)
{
BodyDumbRule *bodyDumbRule1;
bodyDumbRule1 = workPart->ScRuleFactory()->CreateRuleBodyDumb(bodies1);
std::vector<SelectionIntentRule *> rules1(1);
rules1[0] = bodyDumbRule1;
measureBodyBuilder1->BodyCollector()->ReplaceRules(rules1, false);
std::vector<Unit *> massUnits1(5);
Unit *unit1(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("SquareMilliMeter")));
massUnits1[0] = unit1;
Unit *unit2(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("CubicMilliMeter")));
massUnits1[1] = unit2;
Unit *unit3(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("Kilogram")));
massUnits1[2] = unit3;
Unit *unit4(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("MilliMeter")));
massUnits1[3] = unit4;
Unit *unit5(dynamic_cast<Unit *>(workPart->UnitCollection()->FindObject("Newton")));
massUnits1[4] = unit5;
MeasureBodies *measureBodies1;
measureBodies1 = workPart->MeasureManager()->NewMassProperties(massUnits1, 0.99, measureBodyBuilder1->BodyCollector());
NXString temp;
double body_volume = measureBodies1->CreateEmbeddedObject(MeasureBodies::ActiveValueVolume, &temp)->Value();
measureBodyBuilder1->Destroy();
return body_volume;
}
else
return 0;
}
/*结构体:实体属性*/
struct body_mass
{
double 体积;//mm^3
double 表面积;//mm^2
double 钢铁质量;//体积*0.00000785 kg
double 重量;//钢铁质量*9.8 n
double 质心[3];//mm
};
/**********测量实体一些属性(UF函数)*********************************************************
std::vector<tag_t> body; //<I> 实体组
body_mass *body_mass1; //<0> 返回一些属性组
*/
void ask_body_mass(std::vector<tag_t> body, body_mass *body_mass1)
{
tag_t *body1 = new tag_t[body.size()];
int k = 0;
for (int i = 0; i < body.size(); i++)
{
int type = 0, sub = 0;
UF_OBJ_ask_type_and_subtype(body[i], &type, &sub);
if (type == 70 && sub == UF_solid_body_subtype)//查询是否是实体
{
body1[k] = body[i];
k++;
}
}
int response = 2;
int type = 1;
int unit = 3;
int accuracy = 1;
int count = 0;
double acc_val[11] = { 0.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
double density = 1.0;
double massprop[47] = { 0 };
double massprop_stat[13];
if (k > 0)
{
UF_CALL(UF_MODL_ask_mass_props_3d(body1, k, type, unit, density, accuracy, acc_val, massprop, massprop_stat));
}
(*body_mass1).表面积 = massprop[0] * 100;
(*body_mass1).体积 = massprop[1] * 1000;
(*body_mass1).钢铁质量 = body_mass1->体积* 0.00000785;
(*body_mass1).重量 = body_mass1->钢铁质量*9.8;
(*body_mass1).质心[0] = massprop[3] * 10;
(*body_mass1).质心[1] = massprop[4] * 10;
(*body_mass1).质心[2] = massprop[5] * 10;
}
【UG\NX二次开发】NXOpen 测量实体体积(measureBodyBuilder)、UF 获取实体的一些属性(UF_MODL_ask_mass_props_3d)
于 2023-11-10 14:20:29 首次发布