今天写了一个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