程序模板语法

KUI支持以程序模板生成程序或程序段的功能。

程序模板的使用场景有switch/textbox/combobox/menu中的action参数取值为程序段模板时和menu的生成程序功能。可以将若干符合程序模板语法的语句写成一个编码格式为"带标签的UTF-8"或"GBK"的文件,将文件名作为"生成程序"函数的参数,或者直接将若干符合程序模板语法的语句写在一个三引号''' '''中,作为"程序段模板"函数的参数。具体使用方法见相应控件的说明。

从V2.5开始,未初始化的宏变量和KUI自定义变量在KUI脚本中使用其值时会报错"脚本执行错误"

程序模板可以包含任意符合KUI脚本语法的语句和一些会生成程序的模板语句,模板语句中的字符在生成程序时不变,变量则用其值来替代。例如 ''' G01 X#500'''在生成程序时(假设#500值为100),会生成程序G01 X100;

每次运行模板语句时都会生成相应的程序语句,所以当使用KUI脚本语法中的循环语句时,循环语句中的模板语句将生成若干遍程序语句。

session

session为包含在双大括号 {{ }} 中语句块,session中的语句块可以分为若干行书写,其生成的程序语句中间不会换行,仅有一行。

V2.5新增

// session的一种用法是和ISNOTNULL一起使用,下面的代码包含多行,生成程序时将生成一行语句,
{{G71
IF ISNOTNULL[#503]  THEN   
P#500 
ENDIF 
X100 Z0}}

LINE函数

LINE函数支持在生成程序的过程中生成字符串,例如:LINE["#500=10"]该写法的生成程序结果为#500=10

(())脚本注释符

(())符号表示脚本注释符,脚本注释符内的内容不会被生成到程序中。例如:((脚本注释))该写法内容仅在脚本中可以看到,不会被生成到程序中。

生成程序进度条

如果生成程序需要系统进行大量的计算,会导致系统在生成程序时后台在不断的计算,该功能可以在系统进行后台计算时,生成一个进度条,提示用户正在生成程序。写法为SET_PROGRESS_MIN_MAX[参数1, 参数2]SET_PROGRESS_CUR[xx]

其中,参数1: 为进度条的最小值 参数2: 为进度条的最大值。 SET_PROGRESS_MIN_MAX[0, 0]表示无限进度条、 SET_PROGRESS_CUR[xx]表示当前进度条的进度

menu("程序进度条", 生成程序('''SET_PROGRESS_MIN_MAX[0, 100]
#v1=0
WHILE #v1<100000 DO
#v2=[SIN[RAD[#v1]]*COS[RAD[#v1]]+100]/7
G01 X#v2
#v1=#v1+1
SET_PROGRESS_CUR[#v1/1000]
ENDWHILE''', show_progress=True, is_file=False))   # 生成程序时有进度条提示

解析当前程序段

kui的lua脚本中增加函数 _parse_para() 解析当前程序段,并返回一个表。分析当前行的程序并进行处理替换,一般配合程序段替换使用。

示例1:

当前程序段有G代码、X代码、Z代码,实现:G代码保留、X代码值修改为当前机床坐标、Z代码值在原有值上加1处理。

with page(456, 800, id="page1", text=(白色, f20x10, 左对齐), bg_color=(24, 24, 24)):

    prog((1, 1, 456, 400))

    menu("第一页", "page1")
    menu("程序段解析", 程序段替换("程序段解析-无序.lua"))

文件:程段解析-无序.lua

local function __main__(...)
  local val1, val2=_parse_para({a=0})
  local k1 = val1["G"]
  local k2 = val1["X"]
  local k3 = val1["Z"]
      if k3 ~= nil then
          _line({str=_concat_as_string("G", k1," X", _var({no=5201}), " Z", k3+1)})
      elseif k2 ~= nil then
          _line({str=_concat_as_string("G", k1," X", _var({no=5201}))})
      elseif k1 ~= nil then
          _line({str=_concat_as_string("G", k1)})
      else
          _line({str="(脚本错误)"})
      end
end

__main__()

示例2:

当前程序段有G代码、X代码、Z代码、Y代码,实现:按原有代码顺序进行修改,G代码保留、X代码值修改为X轴绝对坐标、Z代码值修改为Z轴绝对坐标、Y代码值修改为Y轴绝对坐标。

with page(456, 800, id="page1", text=(白色, f20x10, 左对齐), bg_color=(24, 24, 24)):

    prog((1, 1, 456, 400))

    menu("第一页", "page1")
    menu("程序段解析", 程序段替换("程序段解析-有序.lua"))

文件:程段解析-有序.lua

local function __main__(...)
    local _parts = {}
    for i, pair in ipairs(_parse_para({a=1})) do
        for k, v in pairs(pair) do
            if k == "X" then
                table.insert(_parts, "X" .. string.format("%.3f", _var({no=5201})) .. " ")
            elseif k == "Y" then
                table.insert(_parts, "Y" .. string.format("%.3f", _var({no=5202})) .. " ")
            elseif k == "Z" then
                table.insert(_parts, "Z" .. string.format("%.3f", _var({no=5203})) .. " ")
            else
                table.insert(_parts, k .. v .. " ")
            end
        end
    end

    if 1 == _msg_box({msg="是否修改该行程序?",option=1,title="提示"}) then
        if #_parts > 0 then
            _line({str = table.concat(_parts)})  -- 拼接非空部分
        end
    end

end

__main__()