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
ParseGCode(string gcode) - {
- var commands = new List
(); -
- // 按行分割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