tag_t instance[256];//导入组件后组件的tag
char* chapterName;//装配里面的instanceName
vector<tag_t> vecInstanceTag;//放四个组件的tag
vector<tag_t> vecPartSolidBody;//组件下的实体装的容器
vector<tag_t> vecWaveTag;//容器转链接后的tag(重要:12个体的tag)
tag_t part_tag;//装配里面的父部件的tag
double csysMtrix[9]; // z方向向量
//1.添加标准组件
void addComponentAssembly()
{
//获取工作图层
int layer_number;
UF_LAYER_ask_work_layer(&layer_number);
//获取工作部件
part_tag = UF_ASSEM_ask_work_part();
// 装配添加组件
const char* refsetName = "Entire Part";
chapterName = "name";
const char* instanceName = chapterName;
//获取part name
int n = enum0->GetProperties()->GetEnum("Value");
char name1[256];
sprintf_s(name1, "standardprt\\thimble%d.prt", n);
string partName1 = dll_fullpath + string(name1);
ss << "partName1" << partName1 << endl;
// 控制导入组件的方向
double zVec[3] = { 0.0,0.0,1.0 };
UF_MTX3_initialize_z(zVec, csysMtrix);
UF_PART_load_status_t errorStatus;
//导入点击的圆弧获取tag_t的instance,vecInstanceTag收集到了四个组件的tag值
for (int i = 0; i < theLastArcThimb.size(); i++)
{
UF_ASSEM_add_part_to_assembly(part_tag, partName1.c_str(), refsetName, instanceName, theLastArcThimb[i].screenPoints, csysMtrix, layer_number, &instance[i], &errorStatus);
vecInstanceTag.push_back(instance[i]);
}
}
//2.编辑标准件的表达式
void editExp(tag_t instance)
{
UF_initialize();
//Assemblies::Component* component1(dynamic_cast<Assemblies::Component*>(NXObjectManager::Get(instance)));
//
//PartLoadStatus* partLoadStatus2;
//theSession->Parts()->SetWorkComponent(component1, &partLoadStatus2);
//delete partLoadStatus2;
//设置为工作部件
UF_ASSEM_set_work_part(instance);
int type = enum0->GetProperties()->GetEnum("Value");
if (type == 0)
{
char TD[256];
sprintf_s(TD, "thimbleDiamter=%f", thimb.diameter);
UF_MODL_edit_exp(TD);//使用NXOPEN修改最佳,此处懒得改了,UF函数容易出问题
char TH[256];
sprintf_s(TH, "thimbleHight=%f", hightofthimb);
UF_MODL_edit_exp(TH);
char TcD1[256];
sprintf_s(TcD1, "thimbleCupDiamter=%f", thimb.diameter);
UF_MODL_edit_exp(TcD1);
char TcH1[256];
sprintf_s(TcH1, "thimbleCupHight=%f", thimb.diameter);
UF_MODL_edit_exp(TcH1);
uc1601(TD,1);
uc1601(TH, 1);
uc1601(TcD1,1);
uc1601(TcH1, 1);
}
UF_MODL_update();
//处理显示装配
Assemblies::Component* nullAssemblies_Component(NULL);
PartLoadStatus* partLoadStatus1;
theSession->Parts()->SetWorkComponent(nullAssemblies_Component, &partLoadStatus1);
delete partLoadStatus1;
UF_terminate();
}
//2.1抽取标准组件中的所有实体
vector<tag_t> GetInstanceBodies(tag_t compTag)
{
int nn = 0;
vector<tag_t> bodies;
tag_t tempOcc;
if (compTag != NULL_TAG)
{
int type = 0, subType = 0;
UF_OBJ_ask_type_and_subtype(compTag, &type, &subType);
tag_t* instanceToOcc;
if (type == 68)
{
int nnn = UF_ASSEM_ask_part_occs_of_inst(compTag, &instanceToOcc);
if (nnn)
{
tempOcc = instanceToOcc[0];
}
else
{
//ccc::cecho::echo("没找到", nnn, NumLine);
}
}
else if (type == 63)//occ
{
tempOcc = compTag;
}
tag_t member = NULL_TAG;
UF_ASSEM_cycle_objs_in_comp(tempOcc, &member);
while (member != NULL_TAG)
{
int type = 0, subType = 0;
UF_OBJ_ask_type_and_subtype(member, &type, &subType);
if (type == 70 && subType == UF_solid_body_subtype)
{
nn++;
bodies.push_back(member);
}
UF_ASSEM_cycle_objs_in_comp(tempOcc, &member);
}
if ((int)bodies.size() == 0)
{
//ccc::cecho::echo("数量为", (int)bodies.size(), NumLine);
}
}
else
{
uc1601("参数为空", 1);
}
return bodies;
}
//3.链接体
void waveGeomtryLink(tag_t waveTag)
{
Session* theSession = Session::GetSession();
Part* workPart(theSession->Parts()->Work());
Part* displayPart(theSession->Parts()->Display());
Features::Feature* nullFeatures_Feature(NULL);
Features::WaveLinkBuilder* waveLinkBuilder1;
waveLinkBuilder1 = workPart->BaseFeatures()->CreateWaveLinkBuilder(nullFeatures_Feature);
Features::WaveDatumBuilder* waveDatumBuilder1;
waveDatumBuilder1 = waveLinkBuilder1->WaveDatumBuilder();
Features::CompositeCurveBuilder* compositeCurveBuilder1;
compositeCurveBuilder1 = waveLinkBuilder1->CompositeCurveBuilder();
Features::WaveSketchBuilder* waveSketchBuilder1;
waveSketchBuilder1 = waveLinkBuilder1->WaveSketchBuilder();
Features::WaveRoutingBuilder* waveRoutingBuilder1;
waveRoutingBuilder1 = waveLinkBuilder1->WaveRoutingBuilder();
Features::WavePointBuilder* wavePointBuilder1;
wavePointBuilder1 = waveLinkBuilder1->WavePointBuilder();
Features::ExtractFaceBuilder* extractFaceBuilder1;
extractFaceBuilder1 = waveLinkBuilder1->ExtractFaceBuilder();
Features::MirrorBodyBuilder* mirrorBodyBuilder1;
mirrorBodyBuilder1 = waveLinkBuilder1->MirrorBodyBuilder();
extractFaceBuilder1->SetFaceOption(Features::ExtractFaceBuilder::FaceOptionTypeFaceChain);
waveLinkBuilder1->SetType(Features::WaveLinkBuilder::TypesBodyLink);
extractFaceBuilder1->SetFaceOption(Features::ExtractFaceBuilder::FaceOptionTypeFaceChain);
extractFaceBuilder1->SetAngleTolerance(45.0);
waveDatumBuilder1->SetDisplayScale(2.0);
extractFaceBuilder1->SetParentPart(Features::ExtractFaceBuilder::ParentPartTypeOtherPart);
mirrorBodyBuilder1->SetParentPartType(Features::MirrorBodyBuilder::ParentPartOtherPart);
extractFaceBuilder1->SetAssociative(true);
extractFaceBuilder1->SetMakePositionIndependent(false);
extractFaceBuilder1->SetFixAtCurrentTimestamp(false);
extractFaceBuilder1->SetHideOriginal(false);
extractFaceBuilder1->SetInheritDisplayProperties(false);
SelectObjectList* selectObjectList1;
selectObjectList1 = extractFaceBuilder1->BodyToExtract();
extractFaceBuilder1->SetCopyThreads(true);
Body* body1(dynamic_cast<Body*>(NXObjectManager::Get(waveTag)));
bool added1;
added1 = selectObjectList1->Add(body1);
NXObject* nXObject1;
nXObject1 = waveLinkBuilder1->Commit();
tag_t bod_Tag1 = null_tag;
UF_MODL_ask_feat_body(nXObject1->Tag(), &bod_Tag1);
vecWaveTag.push_back(bod_Tag1);//这里将每个体的tag值收集到
waveLinkBuilder1->Destroy();
}
//清空链接体
void removeLinkBodies() {
if (linkBodies.size() > 0)
{
for (int i = 0; i < linkBodies.size(); i++) {
UF_OBJ_delete_object(linkBodies[i]->Tag());
}
}
linkBodies.clear();
}
//删除装配体
void removeComponent1()
{
for (size_t i = 0; i < vecInstanceTag.size(); i++)
{
Session* theSession = Session::GetSession();
Part* workPart(theSession->Parts()->Work());
Part* displayPart(theSession->Parts()->Display());
bool notifyOnDelete1;
notifyOnDelete1 = theSession->Preferences()->Modeling()->NotifyOnDelete();
theSession->UpdateManager()->ClearErrorList();
std::vector<NXObject*> objects1(1);
Assemblies::Component* component1(dynamic_cast<Assemblies::Component*>(NXObjectManager::Get(vecInstanceTag[i])));
if (component1 == NULL) return;
//Assemblies::Component* component1(dynamic_cast<Assemblies::Component*>(workPart->ComponentAssembly()->RootComponent()->FindObject("COMPONENT thimble0 4")));
objects1[0] = component1;
int nErrs1;
nErrs1 = theSession->UpdateManager()->AddToDeleteList(objects1);
bool notifyOnDelete2;
notifyOnDelete2 = theSession->Preferences()->Modeling()->NotifyOnDelete();
}
}
//调用的主函数
void createThimble(struct Thimble)
{
try
{
UF_initialize();
addComponentAssembly();
for (size_t i = 0; i < vecInstanceTag.size(); i++)
{
//抽取实体
vector<tag_t>bodys=GetInstanceBodies(vecInstanceTag[i]);
//清空链接体存放容器
editExp(vecInstanceTag[i]);
for (int i = 0; i < bodys.size(); i++)
{
waveGeomtryLink(bodys[i]);
}
//UF_MODL_unite_bodies(bodiesInPart[0]->Tag(), bodiesInPart[1]->Tag());
//消除参数
if (vecWaveTag.size() > 0) {
uf_list_p_t bodyList = NULL;
UF_MODL_create_list(&bodyList);
for (int i = 0; i < vecWaveTag.size(); i++)
{
UF_MODL_put_list_item(bodyList, vecWaveTag[i]);
//char* value = (thimb.Brand).c_str();
}
UF_MODL_delete_body_parms(bodyList);
UF_MODL_delete_list(&bodyList);
vecWaveTag.clear();
}
}
//获取组件路径
int n = enum0->GetProperties()->GetEnum("Value");
char name1[256];
sprintf_s(name1, "standardprt\\thimble%d.prt", n);
string partName1 = dll_fullpath + string(name1);
//移除标准组件
removeComponent1();
UF_PART_close(UF_PART_ask_part_tag(partName1.c_str()), 0, 1);
UF_UI_write_listing_window(ss.str().c_str());
//设回原始工作坐标
UF_CSYS_set_wcs(wcsTagbefore);
UF_OBJ_delete_object(tempcsysTag);
UF_terminate();
}
catch (exception& ex)
{
}
}
【UG\NX二次开发】导入组件到建模环境(步骤
于 2023-11-09 21:13:06 首次发布