UGNX 一对多属性操作常用函数
如下操作使用NXOPEN的接口也能处理,但遇到大量同样操作的时候效率非常低,使用UF的接口效率提升非常明显
//获取指定标题的一个或者多个属性值 vector<string> GetObjsAttrsOneTitleUF(tag_t obj, const string &title) { int cnt = 0; UF_ATTR_iterator_t attrIte; vector<string> res; UF_CALL(UF_ATTR_init_user_attribute_iterator(&attrIte)); attrIte.type = UF_ATTR_any;//"FACE_BUBBLE_INFO" attrIte.title = (char*)title.c_str(); UF_ATTR_info_t *infos; UF_ATTR_get_user_attributes(obj, &attrIte, &cnt, &infos); if (cnt > 0) { for (size_t i = 0; i < cnt; i++) { if (UF_ATTR_string == infos[i].type) { res.emplace_back(infos[i].string_value); //UDS::ECHO("%s = %s (STRING)\n", infos[i].title, infos[i].string_value); UF_free(infos[i].string_value); } } //UF_ATTR_free_user_attribute_info_array(cnt, infos);//耗时很久 UF_free(infos); } return res; } //为对象添加指定标题的一个属性值,若有重复则跳过 void AddObjStrValUF(tag_t obj, const string &title, const string &value) { if (!COMN_NX::IsTagValid(obj) || title.empty() || value.empty()) { return; } vector<string> vals = GetObjsAttrsOneTitleUF(obj, title); if (std::find(vals.begin(), vals.end(), value) != vals.end()) { return; } UF_ATTR_set_string_user_attribute(obj, title.c_str(), vals.size(), value.c_str(), TRUE); } //删除指定标题的所有属性值 void DeleteAttrTitleAllUF(tag_t obj, const string &title) { if (COMN_NX::IsTagValid(obj) && !title.empty()) { vector<string> vals = GetObjsAttrsOneTitleUF(obj, title); if (!vals.empty()) { int cnt = vals.size(); for (int i = 0; i < cnt; i++) { UF_CALL(UF_ATTR_delete_user_attribute_with_title_and_type(obj, title.c_str(), UF_ATTR_any, UF_ATTR_LAST_ELEMENT, TRUE)); } } } } //删除指定标题下的一个属性值,其他成员不变 void DeleteAttrByValUF(tag_t obj, const string &title, const string &value) { if (!COMN_NX::IsTagValid(obj) || title.empty() || value.empty()) { return; } vector<string> vals = GetObjsAttrsOneTitleUF(obj, title); auto it = std::find(vals.begin(), vals.end(), value); if (it != vals.end()) { int cnt = vals.size(); for (int i = 0; i < cnt; i++) { UF_CALL(UF_ATTR_delete_user_attribute_with_title_and_type(obj, title.c_str(), UF_ATTR_any, UF_ATTR_LAST_ELEMENT, TRUE)); } vals.erase(it); if (!vals.empty()) { cnt = vals.size(); for (int i = 0; i < cnt; i++) { UF_ATTR_set_string_user_attribute(obj, title.c_str(), i, vals[i].c_str(), TRUE); } } } }
浙公网安备 33010602011771号