2016-07-07 7 views
1

я пытаюсь извлечь данные из строки GCode, который может выглядеть как любой из следующих:Проверьте регулярное выражение группы существует в результате

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, чтобы я мог создать их вектор. Это легко сделать, когда у меня есть все 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

Я только начал GCode разбора библиотеки, которая поможет извлечь информацию : 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); 

Кроме того, вы можете прочитать весь файл GCode:

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 проверки, номера строк и несколько команд в одной строке.