物理量的單位對於科學家和工程師來說至關重要。它們傳遞訊息非常有效,但遺憾的是,也可能導致代價高昂的錯誤。我們開發了一個插件,旨在幫助使用者在 JMP 中管理單位,從而減少此類錯誤。此插件利用 JMP 18 新增的 Python 整合功能,輕鬆實現 JMP 17 中難以實現的功能。本次示範將展示此插件的功能,以及它的開發過程,包括 Python 的使用、原始碼控制、測試、文件編寫和建置系統。
大家好,我叫埃文‧麥考克爾 (Evan McCorkle),是 JMP 的開發人員。今天我想和大家聊聊我使用 JMP 18 新增的 Python 整合功能開發的一個插件。這個插件用於物理單位換算。接下來,我將介紹我開發這個插件的原因、開發過程、使用的技術,以及其中用到的 JMP 18 Python 整合的一些細節。
我的訓練和早期職業生涯都是工程師專業。在訓練和職業生涯初期,我需要處理大量的不同單位制和各種單位,主要是美製單位和公制單位。我相信你們中的許多人也遇到過類似的情況,而且我相信你們中的許多人都知道,由於單位換算問題,曾經發生過許多代價高昂的重大事故。因此,我總是會使用一些工具來幫助我檢查單位換算。
我經常使用名為 Pint 的 Python 函式庫來實作這個功能。我最近在研究 JMP 18 的新 Python 集成,想知道能否將它與 JMP 現有的列單位標註功能結合?例如,使用者可以在某一列上新增單位,然後我們能否利用這個功能進行單位轉換、單位驗證等等?
這就是開發此外掛的初衷。該外掛程式的功能在於,當您匯入表格時,它可以偵測列中的括號單位,自動指派單位屬性並驗證這些單位。它可以讓您一目了然地查看整個表格及其單位,批量更改單位,確保系統能夠理解所使用的單位和縮寫,並自動確定簡單公式列的單位。
此插件的主要功能是轉換列的單位。例如,將英吋轉換為毫米。您可以直接轉換現有列,也可以建立新列。轉換資料時,它也會同時轉換列屬性,例如參考線、存取設定、規格限制等等。
除了這些功能之外,還有一個可瀏覽的資料庫,其中包含所有支援的單位及其組合方式,以及一個 JSL API。如果您對此感興趣,可以掃描螢幕上的二維碼,或訪問社區查找單位轉換插件。
關於插件的功能介紹就到這裡。接下來,我將介紹插件的開發過程。插件的原始碼控制我使用了 Git 和一個內部的 GitLab 實例。建置和部署插件時,我使用了自訂的解決方案,包括一個建置插件 JSL 文件和一個清單 JSL 文件,稍後我會詳細介紹。測試方面,我使用了 JSL Hamcrest 框架,你可以在 GitHub 上找到它。我是該框架的共同開發者之一。我們在 JMP 內部使用該框架來測試 JMP 本身,我也用它來測試這個插件。
文件主要使用 Markdown 文件,然後透過 Pandoc 轉換為 HTML,再匯入到插件中,最後使用 JMP 內建的 Web 瀏覽器在插件中顯示。所有功能均使用 JSL 和 Python 實現,並使用了 Python 中的 pint 庫。此外,還使用了其他工具,包括 JMP、VS Code、Git、Pandoc 和 Google Material Icons。
插件的頂層結構如下:建立資料夾、文件資料夾、原始碼資料夾、測試資料夾,以及自述文件(markdown格式)。測試文件是獨立存在的。建置資料夾包含建置外掛程式、清單檔案和工件子資料夾,工件子資料夾用於存放HTML檔案以及建置完成後JMP插件本身。文件資料夾主要包含螢幕截圖等內容。原始碼資料夾包含多個子資料夾、圖示資料夾和選單資料夾。選單資料夾包含一些非常簡單的JSL操作文件,它們只是作為JMPcust文件的入口點,原始碼資料夾(包含大部分程式碼)也使用了這些文件。此外,還有定義JMPcust檔案和新增載入JSL檔案。
清單檔案本質上是左側結構中所有檔案的列表,這些檔案最終都會被打包到 JMP 插件的歸檔檔案中,然後進行安裝。建置外掛程式的 JSL 腳本會執行 Pandoc 步驟,將 Markdown 轉換為 HTML,讀取清單文件,並使用 JSL Zip 歸檔 API 收集所有文件,然後將它們放入建置工件目錄中的 JMP 外掛程式檔案中。
每當我想新增功能時,我都會在來源圖示中新增一個圖示。然後我會在原始選單中添加一小段佔位程式碼,大部分程式碼也會添加到原始檔案中。我會將這三個文件添加到清單文件中,並編輯 JMP 插件的 Cust 文件,使其引用來源選單中的那段佔位代碼。之後,我就可以建立插件,開始開發該功能,並在測試檔案中新增測試案例。
來源選單中的子程式只會進行一些基本的驗證,例如尋找目前資料表之類的操作。然後它會包含主源文件,並呼叫 GUI。這樣做的目的是為了方便我們在測試中包含主源文件,從而在不調用 GUI 的情況下測試該功能。這很好地劃分了來源選單(點擊選單時互動調用的部分)和測試文件,它們都透過原始檔案運行。
最後,由於這個插件很大一部分都用到了新的 JMP 18 Python 集成,我想詳細講解一下它的工作原理。它主要包含三個部分。首先是插件載入檔案。每次載入插件時,我們都會嘗試安裝 Python 套件。 pint 就是其中之一。安裝它,並確保它已安裝成功。然後,我還有一個隨插件一起安裝的 com_jmp_unitconversion.py 檔案。接下來,我將使用這個完全限定名稱來導入它。
基本上,這個 Python 檔案裡的所有內容都是函數定義,它們都使用了 pint 函式庫。但實際上並沒有太多工作要做,只是函數定義而已。然後在核心 JSL 程式碼中,我使用完全限定名和 Python 整合將這些 Python 呼叫封裝在一個 JSL 函數中。這樣,在插件的其他部分,我就可以直接使用右側的 JSL 函數了。單位可以轉換嗎?英尺到公里?可以。英尺到毫升?不行。它只是使用了普通的 JSL 函數,但在內部,這些函數是透過 Python 整合傳遞給 Python 程式碼的。所有東西都在插件載入時設定好,我的所有 Python 程式碼都整齊地包含在這個套件裡,所以不會污染整個 Python 命名空間。
我就是這樣利用 JMP 18 中新增的 Python 整合功能開發了這個物理單位轉換插件。謝謝。