2015年8月9日 星期日

Structure of AutoHotkey Script

開始上工打報告,除了看說明檔學AHK的語法、函數,有些程式撰寫的概念是在說明檔學不到的,身為業餘工程師(?)分享一些用血淚(?)堆出的心得~

單一檔案


  • 大概是老師輩比較常用的,攜帶方便,一個ahk檔和一個AutoHotkey.exe主檔就可以到處帶著走,不管電腦有沒有安裝AutoHotkey,或是電腦內AutoHotkey版本不一樣,只要把ahk檔拖曳到主檔就好了。
  • 老師輩的AHK大部分是以字母順序排序,而且hotstring以全部大寫設定
    • 優點:管理方便,搜尋快速(人眼搜尋就很快了)
    • 缺點:
      • 只有hotstring字母按順序,送出string沒什麼順序,明明是相似的內容(例如left、right)但彼此距離很遠。
      • 重複的string可能分給不同的hotstring而不自知。
  • CWY老師的script雖然是字母排列,但是兼顧系統分類,例如:
    • 「J」開頭通常是joint →  JGH 是glenohumeral joint
    • 「B」開頭是bone的某個部分 →  BFI 是femoral intertrochanteric region
    • 「Q」開頭指的是某個方位 →  QP 是posterior aspect。

多個檔案

  • 最近幾屆的學長姐開始區分不同用途的script,通常有一個打plain film,有一個打CT/MR,根據group可能再多一個打特殊檢查例如mammography。
  • 優缺點大致和單一檔案的情形相反:
    • 優點:
      • 各script所用的hotstring可以重複,同樣是「C0」,可以設定為Chest X-ray的normal report,也可以設定為Chest CT的normal template。
      • script內的hotstring較少,效能較好(影響不大),比較不會因為電腦lag出現使string延遲送出
    • 缺點:
      • 需要切換script,當然,通常打報告時會集中打同一種類的檢查,再打另一種類的檢查,並不如想像中要一直切換(除了值班時急診報告?)
      • 管理不易,有些通用hotstring要在每一個script都寫一次,例如 L 是left,R 是right,不論是哪一種報告的script都需要

樹狀結構

  • 學弟妹接觸AHK較多,開始會用樹狀結構,把某些hotstring寫在main.ahk,再各自有CT.ahk、CXR.ahk之類的,然後include main.ahk,大致也是我用的方法但底下會再細談
  • 優點和上一個類似,新增的優點是有main.ahk可以寫通用的hotstring
  • 缺點就是複雜,如果加上一堆hotkey、function、subroutine,因為AHK先天不嚴格的語言結構,有時候很難找到出錯的地方,debug不易。但如果每個script都是純粹的hotstring/string pairs,樹狀結構其實是最好的。

Some Tips

  • 我的script架構是樹狀,基本上就像其他程式語言的library一樣,分工合作!
  • 因為hotstring的數量不會太影響效能,所以原則上是能縮寫就縮寫,從word、phrase、sentence到paragraph,只要用縮寫就是會比較快!(當然,要記憶的hotstring較多)
  • 基於歷史因素,因為resident時打最多的是急診CT,main.ahk就包括general term以及CT/MR會用到的片語/句子/範本
    • 在script中以用途/部位分類:
      • history/title:哪幾個部位的CT、有沒有打顯影劑,事實上這部位是以dynamic hotstring去送出字串。
      • 方位:上下左右內外深淺,及搭配「aspect of」
      • 一般字詞:thickening, wall thickening, fat stranding, stenosis, narrowing之類的都有設定hotstring
      • 輔助詞:把finding串接成句子/不完整句的一些輔助詞,例如there is, is suspected, is noted, suggestive of, probably, showing, causing, nature to be determined之類的
      • 各部位:brain, neck, chest, body, MSK, intervention
    • 在各個部分,剛開始以字母排序但後來就隨意了,反正有Hotstring Helper可以查詢,不需要用Ctrl + F找
    • 通常hotstring以「1」結尾代表名詞複數,例如::nd::nodule,則:*:nd1::nodules,加星號表示不用ending character。但在形容詞/動詞則是詞性變化,例如::enl::enlarged, :*:enl1::enlargement;::sig::significant, :*:sig1::significantly。
    • 用數字也可以代表程度,例如brain atrophy、leukoaraiosis的罐頭敘述
    • 基本上hotstring以2個或3個字母為主,因為排列組合後其實很夠用,最最最常用的才是1個字母,不常用的或是template可用到4個字母。為了避免重複,以子音決定所用的hotstring。
    • 其他一些dynamic hotstring也會在main.ahk設定,為了避免dynamic hotstring和一般的hotstring相衝突,dynamic hotstring常以特殊字元結尾當作trigger(例如 =, /)
  • Plain film的ahk以CXR, KUB, MSK plain film為主,然後在最後一行include main.ahk
    • main.ahk裡的auto-execute section無法被執行(函數的定義還會在),所以需要用到的dynamic hotstring需要在plain film重新寫入。
    • 如果有重複的function、subroutine名稱會出錯,考慮加上namespace的概念,例如main_func和plain_func以區分。
    • hotstring是先搶先贏制,所以plain film中的hotstring會優先於最後一行include進來的main.ahk。例如::ll::left lung,則main.ahk的::ll::on the left side就沒作用
    • Hotkey無法重複定義,但如果用dynamic hotkey則可以啟動、停止、覆蓋舊的hotkey
    • 在確認報告(F3)時,會check報告內容(plain film報告不分段)再送出
      • 句首字母大寫
      • 兩個以上的點「..」變成一個點「.」:打報告時以「.」來觸發hotstring(雖然沒有證據證明,但我覺得按空白鍵觸發比較容易在string還沒全部送出前就穿插在句子中間)
      • 「.,」變成「,」:需要補充句子(例如要加上more on the right side.)則以「,」觸發hotstring
      • 如果有三個字母/數字就接著句點,表示hotstring打錯或是沒觸發,出現提醒。
    • 打plain film時,active的視窗是PACS還是可以按F3送出報告。
    • 因為plain film有時候會爆量打不完,所以hotstring要盡量用1-2個字母,就像嘸蝦米輸入法一樣,一碼/兩碼都有對應的字(雖然很多要死背)。
  • 另外還有mammography的ahk
  • 一旦發現有字詞沒有hotstring一定要馬上新增,不能偷懶!
  • 少用到的字母如Z, X, Y, Q等都可以用來當hotstring,例如前面提到的Q當作某個aspect(記法:Quadrant)、Z當作和某個檢查/臨床correlation(記法:coRRelation)的敘述

沒有留言:

張貼留言