2013-06-19 49 views
0

我目前正在开发一个项目。但我并不擅长C#。我需要做的是打开一个G代码文件并从中读取数据并通过USB将它发送给CNC机器。我可以读取数据并发送。但现在我想读取一行并通过USB发送,然后读取下一行。下面我附上了我用来读取G代码文件和其他相关数据的代码。一次只读一行

开G代码文件和读取到一个文本框的所有数据:

private void btnopen_Click(object sender, EventArgs e) 
    { 
     //OpenFileDialog1.ShowDialog(); 
     OpenFileDialog file = new OpenFileDialog(); 
     file.FileName = ""; 
     file.Title = "Open A Text document."; 
     file.Filter = "(*.gc)|*.gc|(*.etf)|*.etf|(*.txt)|*.txt|(*.GC)|*.GC|(*.tap)|*.tap"; 
     DialogResult result = file.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      System.IO.StreamReader OpenFile = new System.IO.StreamReader(file.FileName); 


      textBox1.Text = OpenFile.ReadToEnd(); 

      OpenFile.Close(); 


     } 

读XYZ从打开的文件坐标:

private void button1_Click(object sender, EventArgs e) 
    { 


     Regex Gcode = new Regex("[ngxyzf][+-]?[0-9]*\\.?[0-9]*", RegexOptions.IgnoreCase); 
     MatchCollection m = Gcode.Matches(this.textBox1.Text); 


     double X, Y, Z, F; 


     int g_code = 0; 
     int x_code = 0, y_code = 0, z_code = 0; 
     float x = 0, y = 0, z = 0; 


     foreach (Match n in m) 
     { 

      if (n.Value.StartsWith("G")) 
      { 
       g_code = Convert.ToInt32(ExtractNumbers(n.Value)); 
      } 

      if (n.Value.StartsWith("X")) 
      { 
       x = float.Parse(ExtractNumbers(n.Value)); 
       x = x * 1000; 
       x_code = Convert.ToInt32(x); 

      } 

      if (n.Value.StartsWith("Y")) 
      { 
       y = float.Parse(ExtractNumbers(n.Value)); 
       y = y * 1000; 
       y_code = Convert.ToInt32(y); 

      } 

      if (n.Value.StartsWith("Z")) 
      { 
       z = float.Parse(ExtractNumbers(n.Value)); 
       z = z * 1000; 
       z_code = Convert.ToInt32(z); 
      } 
     } 


     ExchangeInputAndOutputReports(g_code,x_code, y_code,z_code); 

}

+5

你看着TextReader.ReadLine? –

+0

[从一行文件逐行读取数据]的可能重复(http://stackoverflow.com/questions/15274917/read-data-from-a-file-line-by-line) –

回答

0

你只是读整个文件一次。你可以做到这一点,然后从你的内存对象中读取每一行,或者你可以直接从文件中直接读取一行。第二种方法更详细,更容易理解,但如果在中间发生错误或发生了某些情况,则很容易使文件保持打开状态。

这里是展示了如何读取线一次一个演示程序... http://www.dotnetperls.com/file-readlines

1

而不是

textBox1.Text = OpenFile.ReadToEnd(); 

你会想

string line = OpenFile.ReadLine(); 
while (line != null) 
{ 
    // do something with line 
    line = OpenFile.ReadLine(); 
} 
3

的位重构将有助于改进您的代码。
首先从按钮单击中提取代码并构建一个私有方法,该方法接收一个字符串并操作线上存在的命令。 然后修改,打开该文件在一次读取一行,并呼吁各行提取的方法,该方法...

using(StreamReader OpenFile = new System.IO.StreamReader(file.FileName)) 
{ 
    string textLine = string.Empty; 
    // Loop until the end of file and call the operation for the line 
    while((textLine = OpenFile.ReadLine()) != null) 
     ExecuteLine(textLine); 
} 

private void ExecuteLine(string line) 
{ 
    Regex Gcode = new Regex("[ngxyzf][+-]?[0-9]*\\.?[0-9]*", RegexOptions.IgnoreCase); 
    MatchCollection m = Gcode.Matches(line); 
    .... 
} 

当然,不要忘了从按钮也呼吁新的私有方法单击以保留以前的功能。

private void button1_Click(object sender, EventArgs e) 
{ 
    ExecuteLine(textBox1.Text); 
} 
0

您无法逐行读取gcode文件,因为:A)您可以在一行中包含多个命令。 B)一个命令可能跨越多行。

你可以使用我的G代码的解析库:https://github.com/chrismiller7/GCodeNet

而且做这样的事情:

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

     cmd.SetParameterValue(ParameterType.X, X); 
     cmd.SetParameterValue(ParameterType.Y, Y); 
     cmd.SetParameterValue(ParameterType.Z, Z); 
     ExchangeInputAndOutputReports(cmd.ToGCode()); 
    } 
}