本程序是用来提取数控代码的NC程序中路径点的XYZ坐标,并保存到文件中,用于后续文件的处理
//此程序用于提取NC代码中的XYZ坐标
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
struct Mypoint
{
float x;
float y;
float z;
};
using namespace std;
//利用空格分割字符串函数
void SplitEx(const string& strOrignal , char ch , vector<string>& vctString)
{
std::stringstream iss(strOrignal);
std::string item;
while(std::getline(iss , item , ch)) vctString.push_back(item);
return;
}
int main()
{
fstream nc_file("自己的文件路径\\");
std::string line;
ofstream OutFile("输出的文件名");
Mypoint point_tmp;
point_tmp.x = 0;
point_tmp.y = 0;
point_tmp.z = 0;
vector<Mypoint> point_list;
while(getline(nc_file,line))
{
//首先判断读取的这一行有没有有用的数据,是否包含XYZ
if ((line.find('X')!=string::npos)|(line.find('Y')!=string::npos)|(line.find('Z')!=string::npos))
{
//现在对于数据行已经提取出来了,接下来,利用空格分割字符串
std::vector<string> line_split;
SplitEx(line,' ',line_split);
string tmp;
for (size_t i = 0;i<line_split.size();++i)
{
std::string::size_type position = line_split[i].find('X');
if(position != string::npos)
{
tmp = line_split[i].substr(position +1,line_split[i].size());
point_tmp.x = stof(tmp);
}
position = line_split[i].find('Y');
if(position != string::npos)
{
tmp = line_split[i].substr(position +1,line_split[i].size());
point_tmp.y = stof(tmp);
}
position = line_split[i].find('Z');
if(position != string::npos)
{
tmp = line_split[i].substr(position +1,line_split[i].size());
point_tmp.z = stof(tmp);
}
}
point_list.push_back(point_tmp);
//cout<<line<<endl;
}
}
for(size_t j= 0;j<point_list.size();++j)
{
OutFile << point_list[j].x<<" "<<point_list[j].y<<" "<<point_list[j].z<<endl;
}
OutFile.close();
system("pause");
return 0;
}
这里我的想法是:要提取的数据行,必定包含X、Y、Z中的一个,对于一些G代码的辅助行,不需要进行处理
(line.find('X')!=string::npos)|(line.find('Y')!=string::npos)|(line.find('Z')!=string::npos)
利用上述语句来查找数据行
当定位到数据行之后,需要对指定的数据进行提取,我是根据空格分割字符串,这里不知道是参考了哪位大佬的程序,对分割之后的字符串判断首字符,首字母为“X”、“Y”或者“Z”,那么其后的数据便是我们需要提取的坐标,利用字符串提取字串的方法,进行提取
line_split[i].substr(position +1,line_split[i].size())
最后将string类型的字符串转换为对应的数据格式
point_tmp.z = stof(tmp)
下面是需要注意的地方:
这是一个简单的NC程序,可以看到前面还有一些除了数据的内容,这里需要将其删除成只保留N100……N110这样的数据行内容,不然会报错
最后导出的文件可以利用matlab绘制出刀具路径