2016-07-07 71 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校驗,行號,以及多條命令。