解析G代码【C#】
【代码】解析G代码【C#】
说明
2025年更新:
G代码本质是文本文件 txt 。
所以可以用string获取。 // C语言,C#语言,。。。
N0010 G00 X500 Y500 Z500 F200;
N0020 M08;
N0030 M03 S150;
1截取字符串用正则表达式,先截取一行。 【/r/n】回车,换行
2截取行号,【换行符+N】或者【空白+N】,获取数值
3截取G功能码,【空白+G】,获取数值 0x20,0x47
4获取坐标,【空白+X】,获取数值 0x20,0x58
,【空白+Y】,获取数值 0x20,0x59
,【空白+Z】,获取数值
,【空白+A】,获取数值
,【空白+B】,获取数值
,【空白+C】,获取数值
5获取速度,【空白+F】,获取数值
6截取M功能码,【空白+M】,获取数值
7截取S功能码,【空白+S】,获取数值
8.。。。。按自己需求再添加
9截取;字符码,当前行分号后面的字符串作废。
正则表达式不会用的话可以问 【 Ai 】
关于更多G代码功能,可以去了解3D打印机,MarLin固件,grbl固件源码。
获取字母后数字:
cnc.need_F = Get_G_Value(input, @"[Ff]\d+", out cnc.F速度);// 字母后的数字
cnc.need_G = Get_G_Value(input, @"[Gg]\d+", out cnc.G指令);// 字母后的数字
cnc.need_X = Get_G_Value(input, @"[Xx][-+]?\d+\.?\d+", out cnc.X坐标);// 字母后的数字
cnc.need_Y = Get_G_Value(input, @"[Yy][-+]?\d+\.?\d+", out cnc.Y坐标);// 字母后的数字
cnc.need_Z = Get_G_Value(input, @"[Zz][-+]?\d+\.?\d+", out cnc.Z坐标);// 字母后的数字
public bool Get_Value64(Match match, out double num)
{
//match = Regex.Match(match.Value, @"[-]?\d+\.?\d+"); // - .【去字母】
match = Regex.Match(match.Value, @"[-]?\d+\.?(\d+)?"); // - .【去字母】
if (double.TryParse(match.Value, out num)) return true;
return false;
}
public bool Get_G_Value(string input, string pattern, out double i64)// 字母后的数字
{// 自裁出匹配条件的数据
//MatchCollection matches = Regex.Matches(input, pattern);
//Match matches = (Match)Regex.Matches(input, pattern);
//foreach (Match match in matches)
//{
// return int.Parse( match.Value);
//}
Match X字母;
//X字母 = Regex.Match(input, $@"[{pattern}][-+]?\d+\.?\d+");// 字母后数字 X+123.456
X字母 = Regex.Match(input,pattern);// 字母后数字 X+123.456
return Get_Value64(X字母, out i64);// 去字母
}
下面是一个使用C#编写的解析G代码的示例方法:
下面是一个使用C#编写的解析G代码的示例方法:
csharp
using System;
using System.Collections.Generic;
public class GCodeParser
{
public static List<GCodeCommand> ParseGCode(string gcode)
{
var commands = new List<GCodeCommand>();
// 按行分割G代码
var lines = gcode.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
// 忽略空行和注释行
if (string.IsNullOrWhiteSpace(line) || line.Trim().StartsWith(";"))
{
continue;
}
// 分割行为指令和参数
var parts = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 0)
{
continue;
}
// 第一个部分是指令
var command = new GCodeCommand();
command.Instruction = parts[0].ToUpper();
// 其余部分是参数
for (int i = 1; i < parts.Length; i++)
{
var parameter = parts[i];
// 分割参数名和值
var equalsIndex = parameter.IndexOf('=');
if (equalsIndex > 0)
{
var parameterName = parameter.Substring(0, equalsIndex);
var parameterValue = parameter.Substring(equalsIndex + 1);
command.Parameters[parameterName] = parameterValue;
}
else
{
// 参数没有指定名称,默认使用字母序号作为参数名
command.Parameters[i.ToString()] = parameter;
}
}
commands.Add(command);
}
return commands;
}
}
public class GCodeCommand
{
public string Instruction { get; set; }
public Dictionary<string, string> Parameters { get; set; }
public GCodeCommand()
{
Parameters = new Dictionary<string, string>();
}
}
使用示例:
csharp
var gcode = "G1 X10 Y20 Z30" + Environment.NewLine +
"G2 X50 Y50 R20" + Environment.NewLine +
"G28" + Environment.NewLine +
"; This is a comment" + Environment.NewLine +
"G90";
var commands = GCodeParser.ParseGCode(gcode);
foreach (var command in commands)
{
Console.WriteLine("Instruction: " + command.Instruction);
foreach (var parameter in command.Parameters)
{
Console.WriteLine("Parameter: " + parameter.Key + " = " + parameter.Value);
}
Console.WriteLine();
}
输出结果:
Instruction: G1
Parameter: 1 = X10
Parameter: 2 = Y20
Parameter: 3 = Z30
Instruction: G2
Parameter: 1 = X50
Parameter: 2 = Y50
Parameter: 3 = R20
Instruction: G28
Instruction: G90
正则表达式:
用正则表达式提取文本字母G后面的double类型的数字。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string text = "Some text with G3.14 and g2.718 and other stuff";
Regex regex = new Regex(@"(?i)[Gg]([0-9]+(\.[0-9]+)?)");
MatchCollection matches = regex.Matches(text);
foreach (Match match in matches)
{
if (match.Groups.Count > 1)
{
Console.WriteLine(match.Groups[1].Value);
}
}
}
}
这段代码使用正则表达式
(?i)[Gg]([0-9]+(\.[0-9]+)?)
来匹配文本中字母 “G” 或 “g” 后面的 double 类型小数,并将其输出。正则表达式中的
(?i)
表示不区分大小写,
[Gg]
匹配 “G” 或 “g”,后面的[0-9]+(\.[0-9]+)?
匹配一个或多个数字,以及可选的小数点和一个或多个数字。
+表示多个
更多推荐
所有评论(0)