2013-06-19 51 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()); 
    } 
}