- 这个是表格读取的内容,根据 尺寸 宽高比 直径 筛选对应的行
尺寸 宽高比 直径 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;
}