今天写了一个AutoHotKey脚本,功能是在鼠标选中一段格式为“[数字,数字,数字]”的文字后,按下热键“Alt+Shift+T”,脚本自动根据海伦公式(Heron's formula)计算以这三个数字为边长的三角形面积。
我的操作系统版本为Win7,AutoHotKey版本为1.1.23.05。
脚本效果如下:
然后晒下代码 getTrisArea.ahk :-)
; 已知三角形三边,使用海伦公式求解三角形面积 ; 三角形三边以格式 [side1, side2, side3] 给出,必须为正整数 ; Tsybius2014 2016/04/26 !+t:: ; 保存剪贴板中的内容到变量中 cborad=%ClipBoard% Send,^c ClipWait,1 input=%ClipBoard% ; 逻辑调用开始 ; 1、去除回车符、换行符、空格符、制表符 input:=Trim(input) StringReplace,input,input,`r,,All StringReplace,input,input,`n,,All StringReplace,input,input,%A_SPACE%,,All StringReplace,input,input,%A_TAB%,,All ; 2、使用正则表达式判断输入是否符合规范 isLegal=0 isLegal:=RegExMatch(input,"^\[[0-9]+,[0-9]+,[0-9]+\]$") IfEqual,isLegal,0,return ; 3、获取三条边的边长 input:=SubStr(input,2,StrLen(input)-2) ; 去除左右的方括号 StringSplit,sides,input,`, a=%sides1% b=%sides2% c=%sides3% ab=0 ab:=a+b ac=0 ac:=a+c bc=0 bc:=b+c ;Msgbox,%a% %b% %c% %ab% %ac% %bc% tmp=0 If(a>=bc){ tmp:=1 } Else If(b>=ac){ tmp:=1 } Else If(c>=ab){ tmp:=1 } IfEqual,tmp,1,return ; 4、使用海伦公式计算三角形面积 area=0 area:=GetArea(a,b,c) ; 5、输出结果 msgbox,0,本窗口5s后自动关闭,%area%,5 ; 逻辑调用结束 ; 回复脚本执行前剪贴板的内容 ClipBoard:=cborad return ; 函数:给定三边长度,根据海伦公式计算三角形面积 GetArea(a, b, c) { p=0 p:=(a+b+c)/2.0 area=0 area:=sqrt(p*(p-a)*(p-b)*(p-c)) return area }
总结下一些踩到的坑:
1、我没有找到AHK(即AutoHotKey,后同)中获取当前鼠标选中文本的函数,所以采用了变通的方式,即先将剪贴板中的内容保存到一个变量中,再将鼠标选中的文本保存到剪贴板中,用AHK获取剪贴板中的内容并处理,处理完毕后再将存储到变量中的原剪贴板内容恢复。
2、AHK使用的正则表达式支持PCRE,即Perl语言的正则表达式规则。
3、AHK的数组下标也是从1开始的,因而SubStr函数的参数也受其影响。
4、AHK的MsgBox有一个参数叫Timeout,这个设计不得不说很赞!
5、写脚本语言应比写高级语言的代码要谨慎,脚本语言的解释器有时候是不讲道理的。
END