解析G代码【C#】

获取字母后数字

 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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值