tag_t partTag;
vector<tag_t> allpart_ins;//prt中所有部件的实例
/*获取dll完整路径*/
string GetProgramPath()
{
char filePath[MAX_PATH];
GetModuleFileNameA(_AtlBaseModule.GetModuleInstance(), filePath, MAX_PATH);
std::string strDllPath(filePath);
strDllPath = strDllPath.substr(0, strDllPath.find_last_of("\\") + 1);
return strDllPath;
}
//添加组件
void addcmp(double point[3], char* title)
{
string dllPath = GetProgramPath();
dllPath += "part\\";
dllPath.append(title);
UF_PART_load_status_t error_status;
UF_PART_open_quiet(dllPath.c_str(), &partTag, &error_status);
double mtx[6] = { xDir[0], xDir[1], xDir[2], yDir[0], yDir[1], yDir[2] };
int layer = 0;
tag_t instance = NULL_TAG;
UF_ASSEM_add_part_to_assembly(UF_PART_ask_display_part(), dllPath.c_str(), "MODEL", "1", point, mtx, layer, &instance, &error_status);
allpart_ins.clear();
if (instance != NULL_TAG)
{
allpart_ins.push_back(instance);
}
//释放
UF_PART_free_load_status(&error_status);
}
/*查找部件中的实体对象*/
void get_Cmp_Bodys(tag_t ins, vector<tag_t>& vec)
{
vec.clear();
//UF_faceted_model_type 139 UF_faceted_model_jt_body_subtype 3
//tag_t* part_occs;
//UF_ASSEM_ask_occs_of_part(UF_ASSEM_ask_work_part(), part, &part_occs);
tag_t* part_occs;
UF_ASSEM_ask_part_occs_of_inst(ins, &part_occs);
tag_t member = NULL_TAG;
UF_ASSEM_cycle_objs_in_comp(part_occs[0], &member);
int num = 0;
int type = UF_solid_type;
int subtype;
while (member != NULL_TAG)
{
UF_OBJ_ask_type_and_subtype(member, &type, &subtype);
if (subtype == UF_solid_body_subtype)
{
num++;
vec.push_back(member);
}
UF_ASSEM_cycle_objs_in_comp(part_occs[0], &member);
}
}
//输入体TAG链接体 ,返回链接体TAG
std::vector<tag_t> get_Link_body(std::vector<tag_t> body_tag)
{
std::vector<tag_t> links;
if (body_tag.size() > 0)
{
Session* theSession = Session::GetSession();
Part* workPart(theSession->Parts()->Work());
Part* displayPart(theSession->Parts()->Display());
Features::Feature* nullFeatures_Feature(NULL);
if (!workPart->Preferences()->Modeling()->GetHistoryMode())
{
throw NXException::Create("Create or edit of a Feature was recorded in History Mode but playback is in History-Free Mode.");
}
Features::WaveLinkBuilder* waveLinkBuilder1 = workPart->BaseFeatures()->CreateWaveLinkBuilder(nullFeatures_Feature);
Features::WaveDatumBuilder* waveDatumBuilder1 = waveLinkBuilder1->WaveDatumBuilder();
Features::CompositeCurveBuilder* compositeCurveBuilder1 = waveLinkBuilder1->CompositeCurveBuilder();
Features::WaveSketchBuilder* waveSketchBuilder1 = waveLinkBuilder1->WaveSketchBuilder();
Features::WaveRoutingBuilder* waveRoutingBuilder1 = waveLinkBuilder1->WaveRoutingBuilder();
Features::WavePointBuilder* wavePointBuilder1 = waveLinkBuilder1->WavePointBuilder();
Features::ExtractFaceBuilder* extractFaceBuilder1 = waveLinkBuilder1->ExtractFaceBuilder();
Features::MirrorBodyBuilder* 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->SetMakePositionIndependent(false);
extractFaceBuilder1->SetHideOriginal(false);
extractFaceBuilder1->SetInheritDisplayProperties(false);
extractFaceBuilder1->SetAssociative(false);
extractFaceBuilder1->SetFixAtCurrentTimestamp(true);
SelectObjectList* selectObjectList1 = extractFaceBuilder1->BodyToExtract();
extractFaceBuilder1->SetCopyThreads(true);
std::vector<TaggedObject*> objects1;
for (int i = 0; i < body_tag.size(); i++)
{
Body* body1 = (Body*)NXObjectManager::Get(body_tag[i]);
objects1.push_back(body1);
}
selectObjectList1->Add(objects1);
NXObject* nXObject1 = waveLinkBuilder1->Commit();
std::vector<NXOpen::NXObject*> nxobjects = waveLinkBuilder1->GetCommittedObjects();
for (int i = 0; i < nxobjects.size(); i++)
{
tag_t temp = nxobjects[i]->Tag();
UF_MODL_ask_feat_body(temp, &temp);
links.push_back(temp);
}
waveLinkBuilder1->Destroy();
}
return links;
}
void main()
{
addcmp(point, title); //添加组件
vector<tag_t> entitys;
vector<tag_t> linkBodys;
for (size_t k = 0; k < allpart_ins.size(); k++)
{
get_Cmp_Bodys(allpart_ins[k], entitys); //查找部件中的实体对象
linkBodys = get_Link_body(entitys); //链接体
for (size_t z = 0; z < linkBodys.size(); z++)
{
//移参
uf_list_p_t body_list;
UF_MODL_create_list(&body_list);
UF_MODL_put_list_item(body_list, linkBodys[z]);
UF_MODL_delete_body_parms(body_list);
UF_MODL_delete_list(&body_list);
all_lock_rings.push_back(linkBodys[z]);
//UF_DISP_set_highlight(linkBodys[z], 1);
}
}
//删除组件,关闭组件窗口
for (size_t z = 0; z < allpart_ins.size(); z++)
{
UF_ASSEM_remove_instance(allpart_ins.at(z));//删除组件
}
if (partTag)
{
//关闭部件窗口
UF_PART_close(partTag, 0, 1);
partTag = NULL_TAG;
}
}
【UG\NX二次开发】添加组件到指定点
于 2023-11-09 15:47:39 首次发布