专注 汽车覆盖件模具制造相关 CAM软件(UGNX/PM)的应用及二次开发

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);
            }
        }

    }
}

 

posted @ 2025-01-10 09:43  NX开发  阅读(82)  评论(0)    收藏  举报
博主联系方式 QQ: 2650877179 email:fthj0537@foxmail.com