首先,我们应该明白一些宏最基本的特点
1) 宏命令区分大小写。对于简单的/cast,/s之类的貌似无关紧要,但是对于/script的宏,一定要注意大小写!
2) 宏都是英文的……虽然貌似不懂英文也可以写,但是稍微懂一点还是有助于理解宏的。
3) 宏不是外挂。不要想着例如自动冰箭之类的宏,这是不可能的。
4) 宏命令是同时执行但是又分先后。所以触发公共CD的技能后面不能跟其他技能。
5) 宏命令的符号请使用半角。例如,.”不能用“,。
6)对于有多个返回的命令,需要用例如a,b,c=GetActionCooldown(x),那么a就是开始,b是长度,c是enable。如果不想要后 面的,例如b和c,那么a=GetActionCooldown(x)就可以,如果不想要前面的,例如a,可以用_,b,c= GetActionCooldown(x)
7) 每一个if和do后面都要跟一个end
暂时先想这几个……
然后看看怎么写
宏的结构很简单,if判断,然后then执行。单纯的执行命令,例如
/script UseAction(x)
相当于在任何情况下都执行。
例如
[/quote]/script if UnitName(“楼主”)==“ZealotMtg” then SendChatMessage(“此贴被评分,最近评分记录 威望:10(奇迹)”)[/quote]
那么,要想写出一个宏,首先就必须明白想要做什么。想象当你自己执行这个动作的时候,你的是如何判断的,然后用宏命令来执行即可。
举例来说,经常有人问,盗贼切割宏。想想如果你要答知放切割,那么怎么做呢?首先是判断有没有切割buff,如果有就继续砍没有就切割
/script if [检查切割的buff] then CastSpellByName(“邪恶攻击”) else CastSpellByName(“切割”) end
然后怎么判断有没有切割buff呢?试想如果是你,怎么判断?看清喊消一眼有没有切割的图标。人可以一眼看过去,电脑呢?全部看一遍咯,也就是说
local qgfor i=1,16,1 do b=UnitBuff(“player”,i)if b and string.find(b,”SliceDice”) then qg=1 breakendend
然后合起来就可以咯渗银
/script local qgfor i=1,16,1 do b=UnitBuff(“player”,i)if b and string.find(b,”SliceDice”) then qg=1 breakendendif qg==1 then CastSpellByName(“邪恶攻击”) else CastSpellByName(“切割”) end
写一个很简单,不是么?
了解最基本的方法以后,如何去提高呢?
1/ 看已经有的宏,学习前辈们的经验
2/ 多看看宏命令。不要求背下来(这也不现实),但是大约了解一下有那些命令是可以通过宏做到的。一些常用的,例如SendChatMessage, UseAction, CastSpellByName(““)之类的,如果能背下来将大大提高写宏效率。
3/ 长度优化:虽然有SuperMacro(强烈推荐)可以大大加大宏的长度,但是大道理不说,写那么长的宏不累么?
这是一个我很久以前写的1键换装宏,那个时候什么都不懂。
/script UseContainerItem(4,1)UseContainerItem(4,2)UseContainerItem(4,3)UseContainerItem(4,4)UseContainerItem(4,5)UseContainerItem(4,6)UseContainerItem(4,7)UseContainerItem(4,8)UseContainerItem(4,9)UseContainerItem(4,10)
很累不是么?如果现在写,我会写成
/script for i=1,10,1 do UseContainerItem(4,i) end
长度优化的方法有哪些:
i) 循环语句。For k=a,b,c do … end
以k=a为起始,k=b结束,每一步的间隔为c每次执行do后面的命令。K为任意变量
举例来说,下马宏
/script for k=1,16,1 do if string.find(UnitBuff(“player”,k),”mount”) then CancelBuff(k)breakendend
注意一个是b-a要整除c,一个是do里面尽量不要干涉变量k(或你选择的随便什么东西),否则容易造成死循环。例如
/script for i=1,3,1 do i=1SendChatMessage(“1”)end
每次do都会重置i到1,那么i永远到不了3,就会形成一个无限循环。你的WOW会马上失去响应……
另外,虽然一般见到的do里面都回含有k这个变量,例如我的例子里面就用了UnitBuff(“player”,k),但是这不是必须的。例如以下例子就不含有k
/script for k=1,100,1 do SendChatMessage(“大家一起鄙视我吧”) end
ii) 对某个需要经常出现的命令赋值:例如还是我之前那个换装宏,如果我不用for do end,那么我可以通过以下方法实现:
/script UCI=UseContainerItemUCI(4,1)UCI(4,2) ……
iii) 集合:有时候需要比较多个量,那么通过集合+循环可以减少长度,例如
/script local n,s,k,j,d,f={"Abomi","Sarge","Immol"},{"腐蚀术","痛苦诅咒","献祭"}for k=1,3 do f=nilfor j=1,16 do d=UnitDebuff("target",j)if d and strfind(d,n[k]) then f=1breakendendif not f then CastSpellByName(s[k])breakendend
By Oblind
有兴趣的可以试一下一个一个写会有多长……
iv) 插件:有些插件可以把一些很麻烦的命令简化,例如isBuffActive之类的。一般判断buff需要的是
/script for i=1,16,1 do b=UnitBuff(“target”,i)if b and string.find(b,”xx”) then yybreakendend
但是通过这个插件之需要
/script if isBuffActive(xxxx) then yyyy end
v) fuction命令简化:通过function命令可以达到类似于上面的效果,不过每次要载入比较麻烦。可以写到任意插件的LUA文件里面简化。
vi) 有时候很长的一个命令可以通过其他一个命令实现。例如我上次见到有人施放技能用
/script ActionButtonDown(x)ActionButtonUp(x)
汗……一个UscAction就好了嘛……
4/ 可读性优化。这就是个人习惯问题了。例如本人缩写一般
UCI=UseContainerItemCSB=CastSpellByNameSSC=SpellStopCasting()
这样写的好处就是就算加入了大量的缩写,我仍然能够看懂我写了什么东西。一旦有什么变化也方便修改。
5/ 适用性。使得这个宏用起来更加舒服也是非常重要的。举例来说,我的牧师当初有个宏提醒别人我在复活谁
/s 我正在复活%t
/script CastSpellByName(“复活术”)
但是有个问题,有时候我因为在战斗中点到制造噪音,怎么办呢?我就改为了
/script if (not UnitAffectingCombat(“player”)) then CastSpellByName(“复活术”)SendChatMessage(“我正在复活”..UnitName(“target”)) end
但是有时候仍然会制造噪音,只要我的目标不是我复活的人那么就会乱说话,那么我要当前目标是死人
/script if (not UnitAffectingCombat(“player”)) then if (UnitName(“target”)~=nil) and (UnitHealth(“target”)==0)) then CastSpellByName(“复活术”)SendChatMessage(“我正在复活”..UnitName(“target”) endend
好吧,又有问题就是,如果我不选目标那么我不能放复活术了。继续
/script if (not UnitAffectingCombat(“player”)) then CastSpellByName(“复活术”)if ((UnitName(“target”)~=nil) and (UnitHealth(“target”))) then SendChatMessage(“我正在复活”..UnitName(“target”) endend
至此这个宏才算写完。
先写这么多了,吃饭去也~
如果有错误或者补充,欢迎跟贴。另外加上WoWwiki的宏命令翻译,先翻译一部分,有时间再翻译剩下的。另外我的表达不太好,谁有兴趣吧我说的翻译成人话很欢迎 >_<
数控车床宏程序是非常灵活且因情况而异的,所以数控车床宏程序编程掌握以下参数即可:
普通加工程序直接用数值指定G代码和移动距离;例如,GO1和X100.0。使用用户宏程序时,数值可以直接指定或用变量指定。当用变量时,变量值可用程序或用MDI面板上的 *** 作改变。
例如:#1=#2+100;G01X#1F300。
量的表示:计算机允许使用变量名,用户宏程序不行。变量用变量符号(#)和后面的变量号指定。例如:#1,表达式可以用于指定变量号。
此时,表达式必须封闭在括号中。例如:#[#1+#2-12]。
变量根据变量号可以分成四种类型:#0空变量,该变量总是空,没有值能赋给该变量。#1-#33局部变量,局部变量只能用在宏程序中存储数据,例如,运算结果。当断电时,局部变量被初始化为空早竖。调用宏程序时,自变量对局部变量赋值。
#100-#199、#500-#999公共变量,公共变量在不同的宏程序中的意义相同。当断电时,变量#100-#199初始化为空。变量#500-#999的数据保存,即使断电也不丢失。#1000---系统变量。系统变量用于读和写CNC运行时各种数据的变化,例如,刀具的当前位置,补偿值。
局部变量和公共变量可以有0值或下面范围中的值:-1047到-10-29或-10-2到-1047,如果计算结果超出有效范围,则发出P/S报警NO.111。
当在程序中定兆咐义变量值时,小数点可以省略。例:当定义#1=123;变量#1的实际值是123.000。
为在程序中使用变量值,指定后跟变量号的地址。当用表达式指定变量时,要把表达式放在括号中。例如:G01X[#1+#2]F#3;
被引用变量的值根据地址的最小设定单位自动地舍入。例如:当G00X#/;以1/1000mm的单位执行时,CNC把123456赋值给变量#1,实际指令值为G00X12346.改变引用变量的值的符号,要把负号(-)放在#的前面。
例如:G00X-#1当引用未定义的变量时,变量及地址都被忽略。例如:当变族睁纯量#1的值是0,并且变量#2的值是空时,G00X#1Y#2的执行结果为G00X0。
扩展资料:
数控宏程序编程是用变量的方式进行数控编程的方法,数控宏程序分为A类和B类宏程序,其中A类宏程序比较老,编写起来也比较费时费力,B类宏程序类似于C语言的编程,编写起来也很方便。
不论是A类还B类宏程序,它们运行的效果都是一样的。
编写一些大批相似零件的时候,可以用宏程序编写,这样只需要改动几个数据就可以了,没有必要进行大量重复编程。
参考资料:百度百科-数控宏程序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)