从NC程序中提取路径点的XYZ

本程序是用来提取数控代码的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绘制出刀具路径
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值