网上已经有些大佬给出了解决方案,但是基本有两种,一种内部函数,另外一种就是导出程序的刀轨文件找坐标计算。使用内部函数进行操作,可以自己学习,不做解释。下面只是针对第二种进行说明,参考胡君老师的教程。
自己封装的函数:
//获取最低的Z的深度值
static double GetOperMinZz(tag_t groupTag);
// 读取文本文件内容 fileNamePath: 文件路径 vTextStrs: 存储读取内容的字符串向量 mode: 读取模式,0 - 读取所有行,1 - 跳过空行
static int ReadTextStrs(string fileNamePath, vector<string> &vTextStrs, int mode = 1);
//寻找字符串并返回位置,如果没有找到,返回-1
static int StrFind(string str, string s);
//取中间文本
static string StrSubmid(string str, string startStr, string endStr);
//获取最低的Z的深度值
double LiangFuns::UserUFBaseFun::GetOperMinZz(tag_t groupTag)
{
tag_t setup_tag = NULL_TAG;
UF_SETUP_ask_setup(&setup_tag);
//获得当前dll所在的路径GetDllPanthAndName()
string strNCfile = UserUFBaseFun::GetDllPanthAndName(1) + "//666.nc";
UF_SETUP_generate_program(setup_tag, groupTag, "MILL_3_AXIS", strNCfile.c_str(), UF_SETUP_OUTPUT_UNITS_METRIC);
vector<string> vTextDatas;
UserUFBaseFun::ReadTextStrs(strNCfile, vTextDatas);
double minZzVal = 0.0;
for (int i = 0; i<vTextDatas.size(); i++)
{
//HuUFBase::print(vTextDatas[i]);
string strLineDate = vTextDatas[i];
if (UserUFBaseFun::StrFind(strLineDate, " Z") != -1)
{
string strVal = UserUFBaseFun::StrSubmid(strLineDate, " Z", " ");
double zVal = atof(strVal.c_str());
//HuUFBase::print(zVal);
if (zVal<minZzVal)
minZzVal = zVal;
}
}
//HuUFBase::print(minZzVal);
remove(strNCfile.c_str());
return minZzVal;
}
// 读取文本文件内容 fileNamePath: 文件路径 vTextStrs: 存储读取内容的字符串向量 mode: 读取模式,0 - 读取所有行,1 - 跳过空行
int LiangFuns::UserUFBaseFun::ReadTextStrs(string fileNamePath, vector<string>& vTextStrs, int mode)
{
ifstream file(fileNamePath);
if (!file.is_open())
{
cerr << "无法打开文件: " << fileNamePath << endl;
return -1; // 文件打开失败
}
string line;
while (getline(file, line))
{
if (mode == 1)
{
if (line.empty())
continue; // 跳过空行
// 去掉行首空格并获取第一个非空字符
string temptrimstr = line.erase(0, line.find_first_not_of(" ")).substr(0, 1);
// 如果行不是注释行(不以#、!、/、*开头),则添加到vTextStrs中
if (temptrimstr != "#" && temptrimstr != "!" && temptrimstr != "/" && temptrimstr != "*" && temptrimstr != "%")
vTextStrs.push_back(line); // 添加有效行
}
else if (mode == 0)
{
vTextStrs.push_back(line);
}
}
file.close();
return 0; // 成功
}
//寻找字符串并返回位置,如果没有找到,返回-1
int LiangFuns::UserUFBaseFun::StrFind(string str, string s)
{
if (str.find(s) != string::npos)
return (int)str.find(s);
else
return -1;
}
//取中间文本
string LiangFuns::UserUFBaseFun::StrSubmid(string str, string startStr, string endStr)
{
int intStartIdx = str.find(startStr) + startStr.length();
int intEndIdx = intStartIdx + str.substr(intStartIdx, str.length() - intStartIdx).find(endStr);
return str.substr(intStartIdx, intEndIdx - intStartIdx);
}
函数调用:
//加工设置的TAG
tag_t setup_tag = NULL_TAG;
UF_SETUP_ask_setup(&setup_tag);
//获得根组的TAG
tag_t programRootgroup = NULL_TAG;
UF_SETUP_ask_program_root(setup_tag, &programRootgroup);
//获取成员列表
int count = 0;
tag_t * list = NULL;
UF_NCGROUP_ask_member_list(programRootgroup, &count, &list);
vector<vector<string>> vVProgrmDatas;
for (int i = 0; i<count; i++)
{
vector<string> vTempDatas;
//获取程序组名字
string strGroupName = UserUFBaseFun::GetTagName(list[i]);
if (strGroupName == "NONE")
continue;
//UserUFBaseFun::PrintMessage(strGroupName);
int count2 = 0;
tag_t * list2 = NULL;
UF_NCGROUP_ask_member_list(list[i], &count2, &list2);
if (count2 <= 0)
continue;
//获取刀具名字
tag_t toolTag = NULL_TAG;
UF_OPER_ask_cutter_group(list2[0], &toolTag);
string strToolName = UserUFBaseFun::GetTagName(toolTag);
//获取转数进给率
double spindleVal = 0.0;
UF_PARAM_ask_double_value(list2[0], UF_PARAM_SPINDLE_RPM, &spindleVal);
UF_PARAM_feedrate_t feed_value;
UF_PARAM_ask_subobj_ptr_value(list2[0], UF_PARAM_FEED_CUT, &feed_value);
double feedVal = feed_value.value;
string strZhuansu = UserUFBaseFun::double_toString(spindleVal, 2, true);
string strJingeilv = UserUFBaseFun::double_toString(feedVal, 2, true);
//获取部件余量
double stockVal = 0.0;
UF_PARAM_ask_double_value(list2[0], UF_PARAM_STOCK_PART, &stockVal);
string strYuliang = UserUFBaseFun::double_toString(stockVal, 2, true);
//获得加工时间
double operTimes = UserUFBaseFun::GetOperTime(list[i]);
string strOperTime = UserUFBaseFun::double_toString(operTimes, 2, true);
//获取最低的Z深度值
double operMinZz = UserUFBaseFun::GetOperMinZz(list[i]);
string strOperMinZz = UserUFBaseFun::double_toString(operMinZz, 2, true);
vTempDatas.push_back(strGroupName);
vTempDatas.push_back(strToolName);
vTempDatas.push_back(strZhuansu);
vTempDatas.push_back(strJingeilv);
vTempDatas.push_back(strYuliang);
vTempDatas.push_back(strOperTime);
vTempDatas.push_back(strOperMinZz);
vVProgrmDatas.push_back(vTempDatas);
vTempDatas.clear();
}