NX开发,多列多行内容,写入树列表,根据列筛选,重新写入树列表

  1. 这个是表格读取的内容,根据 尺寸  宽高比   直径   筛选对应的行

尺寸  宽高比  直径   3个值的所有组合有8种, 第一次写逻辑时候是全部列出来可能的过滤组合。

#define Num_id         0// 部件ID
#define Num_size       1// 尺寸
#define Num_D_range    2// 直径范围
#define Num_D          3// 直径
#define Num_WH         4// 轮宽比
#define Num_W          5// 轮宽

// 数模号  尺寸  直径范围 直径 宽高比 轮宽
// SKT   尺寸  直径范围  直径  轮宽比  轮宽
// 0      1      2       3     4          5
struct singleMsg
{
    int colNum;//列号
    string title;//  
    string val;//值
    int rowW;//宽度
    singleMsg()
    {
        colNum = -1;
        title = "";
        val = "";
        rowW = 50;
    }
    singleMsg(int num,string _title, int _rowW,  string _val="")
    {
        colNum = num;
        title = _title;
        val = _val;
        rowW = _rowW;
    }

};

//获取某列的值
vector<NXString> Tire_Create::GetSizeVal(const  vector < vector<singleMsg>>& _v, int type)
{
    vector<NXString>vT;
    vector<string>_vT;// NXString 无法直接比较 通过string来比较是否重复
    vT.push_back("");
    _vT.push_back("");
    for (int i = 0; i < _v.size(); i++)
    {

        string temp = _v[i][type].val;
        if (type == 1)
        {
            if (temp.find("p") != -1 || temp.find("P") != -1)
            {
                temp = temp.substr(1, 3);
            }
           // g_allSearch[temp].push_back(_v[i]);
        }
       // temp = m_Winapi::str::trim(temp);
        auto it = std::find(_vT.begin(), _vT.end(), temp);
        if (it == _vT.end())
        {
            vT.push_back(temp.c_str());
            _vT.push_back(temp);
        }

    }

    return vT;
}

// 旧方法  全部罗列 所有过滤组合
vector < vector<singleMsg>> Tire_Create::Search(const  vector < vector<singleMsg>>& _v)
{
    string _sizeVal = enum0->ValueAsString().GetLocaleText();
    string _W_H = enum_WH->ValueAsString().GetLocaleText();
    string   _D_RangeVal = string_D->Value().GetLocaleText();
  
   // UGAPI::msg::print(_sizeVal);
    UGAPI::msg::print(_D_RangeVal);
   // UGAPI::msg::print(_W_H);
    // 尺寸  宽高比 直径
    // 1     0      0
    if (_sizeVal.empty() && _D_RangeVal.empty() && _W_H.empty())
    {
        vector<NXString>vSize = GetSizeVal(_v, 1);
        vector<NXString>vW_H = GetSizeVal(_v, 4);
        vector<NXString>vD = GetSizeVal(_v, 3);
        enum0->SetEnumMembers(vSize);
        enum_WH->SetEnumMembers(vW_H);
        enum_D->SetEnumMembers(vD);
        string_D->SetListItems(vD);
        enum0->GetProperties()->SetEnum("Value", 0);
        enum_WH->GetProperties()->SetEnum("Value", 0);
        enum_D->GetProperties()->SetEnum("Value", 0);
        return _v;
    }

    // 尺寸  宽高比 直径 1
    // 1     0      0
    bool ABB = _sizeVal.empty() == false && _W_H.empty() && _D_RangeVal.empty(); if (ABB) UGAPI::msg::print("1 0 0");
  

    // 尺寸  宽高比 直径 2
    // 1     1      0
    bool AAB = _sizeVal.empty() == false && _W_H.empty() == false && _D_RangeVal.empty() ; if (AAB) UGAPI::msg::print("1 1 0");

     // 尺寸  宽高比 直径 3
     // 1     1      1
    bool AAA = _sizeVal.empty() == false && _W_H.empty() == false && _D_RangeVal.empty() == false ; if (AAA) UGAPI::msg::print("1 1 1");

      // 尺寸  宽高比 直径  4
     // 1     0      1
    bool ABA = _sizeVal.empty() == false && _W_H.empty() && _D_RangeVal.empty() == false; if (ABA) UGAPI::msg::print("1 0 1");

      // 尺寸  宽高比 直径  5
     // 0     0      1
    bool BBA = _sizeVal.empty() && _W_H.empty() && _D_RangeVal.empty()  == false; if (BBA) UGAPI::msg::print("0 0 1");


    // 尺寸  宽高比 直径  6
    // 0     1      0
    bool BAB = _sizeVal.empty() && _W_H.empty() == false && _D_RangeVal.empty() ; if (BAB) UGAPI::msg::print("0 1 0");


    // 尺寸  宽高比 直径  7
    // 0     1      1
    bool BAA = _sizeVal.empty() && _W_H.empty() == false && _D_RangeVal.empty() == false; if (BAA) UGAPI::msg::print("0 1 1");

    vector < vector<singleMsg>>vT;
    vector<NXString>vRange;


    // SKT   尺寸  直径范围  直径  轮宽比  轮宽
    // 0      1      2       3     4      5
    for (size_t i = 0; i < _v.size(); i++)
    {

        string temp = _v[i][1].val;
        string w_h = _v[i][4].val;
        string _d = _v[i][3].val;
        if (temp.find("p") != -1 || temp.find("P") != -1)
        {
            temp = temp.substr(1, 3);
        }

        if (ABB)// 1 0 0       1
        {
          
            if (strcmp(_sizeVal.c_str(), temp.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
        }
        else if (ABA)//1 0 1     2
        {          
            if (strcmp(_sizeVal.c_str(), temp.c_str()) == 0 && strcmp(_d.c_str(), _D_RangeVal.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
        }
        else if (AAB)//1 1 0   3
        {
            if (strcmp(_sizeVal.c_str(), temp.c_str()) == 0 && strcmp(w_h.c_str(), _W_H.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
        }
        else if (AAA)//1 1 1     4
        {
            if (strcmp(_sizeVal.c_str(), temp.c_str()) == 0 && strcmp(w_h.c_str(), _W_H.c_str()) == 0 && strcmp(_D_RangeVal.c_str(), _d.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
        }
        else if (BBA)//0 0 1    5
        {
            if (strcmp(_d.c_str(), _D_RangeVal.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
          
           
        }
        else if (BAB)// 0 1 0    6
        {

            if (strcmp(w_h.c_str(), _W_H.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
        }
        else if (BAA)// 0 1 1    7
        {

            if (strcmp(_d.c_str(), _D_RangeVal.c_str()) == 0 && strcmp(w_h.c_str(), _W_H.c_str()) == 0)
            {
                vT.push_back(_v[i]);
            }
        }
    }

    vector<NXString>vSize = GetSizeVal(vT, 1);
    vector<NXString>vW_H = GetSizeVal(vT, 4);
    vector<NXString>vD = GetSizeVal(vT, 3);


    //1 0 0
    if (ABB)
    {
        enum_D->SetEnumMembers(vD);
        enum_WH->SetEnumMembers(vW_H);
        string_D->SetListItems(vD);
        UGAPI::msg::print("ABB");
    }

    // 1 0 1
     if (ABA)
    {
        enum_WH->SetEnumMembers(vW_H);
        UGAPI::msg::print("ABA");
    }

    // 1 1 0
    if (AAB)
    {
        enum_D->SetEnumMembers(vD);
        UGAPI::msg::print("AAB");
        string_D->SetListItems(vD);
    }

    // 1  1  1


   
    // 0 0 1
    if (BBA)
    {
        enum0->SetEnumMembers(vSize);
        enum_WH->SetEnumMembers(vW_H);
        UGAPI::msg::print("BBA");
    }

    // 0 1 0

    if (BAB)
    {
        string_D->SetListItems(vD);
        enum_D->SetEnumMembers(vD);
        enum0->SetEnumMembers(vSize);
        UGAPI::msg::print("BAB");
    }

    // 0 1 1
    if (BAA)
    {      
        enum0->SetEnumMembers(vSize);
        UGAPI::msg::print("BAA");
    }

  

    return vT;
}

下面是使用 函数比较器,代码量减少了很多。


#include <functional>

// 定义过滤器函数类型
using FilterT = std::function<bool(const vector<singleMsg>&)>;

// num 是传入列号
bool filter_T(const vector<singleMsg>&row,int num,string value)
{
    string temp = row[num].val;
    if (num==1)
    {
        if (temp.find("p") != -1 || temp.find("P") != -1)
        {
            temp = temp.substr(1, 3);
        }
    }

    return value.empty() || strcmp(temp.c_str(), value.c_str()) == 0;
}

bool applyFilters(const std::vector<FilterT>& filters, const vector<singleMsg>&row)
{
    for (const auto &filter: filters)
    {
        if (filter(row)==false)
        {
            return false;
        }
    }
    return true;
}

// 优化后的过滤函数
vector < vector<singleMsg>>Tire_Create::Search_N(const  vector < vector<singleMsg>>& _v)
{
   // 当前枚举选的值
    string _sizeVal = enum0->ValueAsString().GetLocaleText();
    string _W_H = enum_WH->ValueAsString().GetLocaleText();
    string  _D_RangeVal = string_D->Value().GetLocaleText();

  
    vector<FilterT>_filters;

    // 每个枚举添加过滤器
    _filters.push_back(bind(filter_T, std::placeholders::_1, Num_size, _sizeVal));
    _filters.push_back(bind(filter_T, std::placeholders::_1, Num_D, _D_RangeVal));
    _filters.push_back(bind(filter_T, std::placeholders::_1, Num_WH, _W_H));

    vector < vector<singleMsg>>vT;
    for (const auto &row :_v)
    {
        if (applyFilters(_filters,row))
        {
            vT.push_back(row);
        }      
    }

    // 从过滤后的行内容 重新提取对应列的值 
    vector<NXString>vSize = GetSizeVal(vT, Num_size);
    vector<NXString>vW_H = GetSizeVal(vT, Num_WH);
    vector<NXString>vD = GetSizeVal(vT, Num_D);

    if (_sizeVal.empty())
    {
        enum0->SetEnumMembers(vSize);
    }
    if (_D_RangeVal.empty())
    {
        string_D->SetListItems(vD);
    }
    if (_W_H.empty())
    {
        enum_WH->SetEnumMembers(vW_H);
    }
    return vT;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值