2016-07-07 74 views
1

存在正则表达式组我试图从线G-码的,可以像任何的提取数据如下:检查结果中

G01 X10. Y20. Z3.0 F15. 
G00X.500Y-10. 
G01 Y10.X20.150 

现在我已经创造了我,完美匹配与此正则表达式组:

(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?) 

这似乎是工作很好。我得到的三组数据,对每个结果,例如:

G01 X10. Y20. Z3.0 F15. 
G01 | G | 01 
X10. | X | 10. 
Y20. | Y | 20. 
Z3.0 | Z | 3.0 
F15. | F | 15. 

我希望做的是能够检查其值输入字符串,所以我可以提取数据并进行位置的命令。以上面的例子,我想提取X,Y和Z值,以便我可以创建它们的Vector。当我拥有所有3个值时,这很容易实现,但如果输入字符串是G01 X10. Y5.0,如何检查第一组中是否存在值?

回答

1

为了做到这一点,我决定迭代每个正则表达式匹配,然后检查第一组是X,Y还是Z,并且使用switch语句改变了我的3D矢量的值。下面是万一别人的代码想产生类似:

public static void ExtractAll(string gcode) 
{ 
    dataPos = Vector3.zero; 

    var match = Regex.Matches(gcode, @"(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?)"); 
    for (int i = 0; i < match.Count; i++) 
    { 
     switch (match[i].Groups[1].Value) 
     { 
      case "X": 
       dataPos.x = float.Parse(match[i].Groups["val"].Value); 
       break; 
      case "Y": 
       dataPos.y = float.Parse(match[i].Groups["val"].Value); 
       break; 
      case "Z": 
       dataPos.z = float.Parse(match[i].Groups["val"].Value); 
       break; 
     } 
    } 
    print(dataPos); 
} 

注意要使用你需要包括它的正则表达式的命名空间: using System.Text.RegularExpressions;

2

我刚开始一个G代码的解析库,这将有助于中提取信息:https://github.com/chrismiller7/GCodeNet

你可以使用它像下面这样:

var cmd = Command.Parse("G01 X10. Y20. Z3.0 F15."); 
var X = cmd.GetParameterValue(ParameterType.X); 
var Y = cmd.GetParameterValue(ParameterType.Y); 
var Z = cmd.GetParameterValue(ParameterType.Z); 

此外,你可以读取整个G代码文件:

var gcodeFile = new GCodeFile(File.ReadAllText("file.gcode")); 
foreach (var cmd in gcodeFile.Commands) 
{ 
    var X = cmd.GetParameterValue(ParameterType.X); 
    var Y = cmd.GetParameterValue(ParameterType.Y); 
    var Z = cmd.GetParameterValue(ParameterType.Z); 
} 

的GCodeFile类将处理在单行注释,CRC校验,行号,以及多条命令。