各位好:
现在已经知道 CNC (*.NC)文件中 X,Y,Z 是机床走刀坐标代码,
G,D,I,J,K,M,N,U,W,F,S,T 等代码是功能辅助代码,//---代码片段
G53Z0
G54
G90G0X0Y0
M9
M5
G0G53 X-250.0 Y-50.
M00
T00 M06
M03 S22000
G0X0Y0
G00X-34.390 Y-69.779 Z5.000
Z2.000
G01 Z-0.500 F70
//-------
可以看到,每行的功能辅助代码数量不定,但是,功能辅助代码后面必带有数值.
我需要解析成这样:
例如有这样几行:
T01 D1 M06
M03 S22000
M05
G00X-34.390Y-69.779Z5.000
解析为:
T=01
D=1
M=06
M=03
S=22000
M=05
G=00
X=-34.390
Y=-69.779
Y=-69.779
Z=5.000
其实就是解析为 |字母+数字| 这样的形式,但是每行的字母个数不同,数量也不同,并且数值不一定为3位小数,也可能是整数或者其他.顺便说说功能代码的含义:
T --刀具(Tool)
D --替补刀具
S --主轴转速(spindle)
M 和 G 代码要具体结合其后面的数值分析
例如:
M30 --程序完成
M00 --程序中断G53 --使用机床坐标系
G54 --相对机床坐标系

解决方案 »

  1.   

    思路:
    1,首先去掉空格和换行符
    例如:
    T01 D1 M06 
    M03 S22000 
    M05 
    G00X-34.390Y-69.779Z5.000 
    去掉后:T01D1M06M03S22000M05G00X-34.390Y-69.779Z5.000 
    2,根据你的要求,去掉后的字符串解析的规律为:
    遇到字母就是变量(例如:T或D),从这个字母以后到下一个字母以前都是这个字母的值,例如:T01D1
    字母T值是01,字母D值是1。
      

  2.   

    procedrue chang(p1,p2:pchar);//p1为原来的字符串,p2为新生成的字符串(必须先申请空间begin
      while p1^<>#0 do begin
         case p1^ of 
           'A'..'Z': begin
                         p2^:=#13,inc(p2);p2^:=#10;inc(p2);
                         p2^:=p1^;inc(p2);
                         p2^:='=';inc(p2);
                     end;
           '0'..'9','.': begin p2^:=p1^;inc(p2);end;
        end;
        inc(p1);
      end;
      p2^:=#0;end;
      

  3.   


    var
      str,h,w:string;
      i:integer;
    begin
      str := 'T01D1M06M03S22000M05G00X-34.390Y-69.779Z5.000';
      for i := 1 to Length(str) do
      begin
        if str[i] in ['A'..'Z'] then
        begin
          if h <> '' then
            ListBox1.Items.Add(h+'='+w);
          h := str[i];
          w := '';
        end;
        if str[i] in ['0'..'9'] then
          w := w + str[i];
      end;
    end;
      

  4.   

    用 xiaoxiao_8 的代码测试 16万行的 NC文件,平均耗时24 秒;
    用  bdmh 的代码测试,平均耗时 48 秒;现在我在想如何提高解析效率?先谢谢你们的回复
      

  5.   

    //给你一个改进的,应该能提高不少效率 
    procedrue chang(p1,p2:pchar); 
    //p1为原来的字符串, 
    //p2为新生成的字符串(必须先申请空间) 
    //字符串起始地址p2+2 begin 
      while p1^ <>#0 do begin 
        case p1^ of 
          'A'..'Z': begin 
      pint(p2)^:=$3d000a0d + (ord(p1^) shl 16);                     
      inc(p2,4); 
                    end; 
          '0'..'9',-','.': begin p2^:=p1^;inc(p2);end; 
        end; 
        inc(p1); 
      end; 
      p2^:=#0; end;
      

  6.   

    如果还想快,那就要用asm写函数了。
      

  7.   

    解析都是很快的,慢的地方,一般是显示,如果没显示,那就是因内存多次分配引起.
    像上面的ListBox1.Items.Add(h+'='+w);一般写语法解析,原理都差不多,效率相差都不大,基本就是PChar移动扫描,字串招描几十M,一般速度都不会超过1秒,
    但最终效率相差N大,基本就是因为加了显示/重复性的内存分配/释放引起.