2020年7月3日 星期五

如何利用屬性視窗作為自動化程式參數輸入介面

AEDT允許使用者自訂專案(Project)以及設計(Design)的屬性。在專案及設計當中,屬性的主要目的是作為一個全域變數使用,比方說我們在設計的屬性視窗建立了一個變量r0=10mil(如圖一),並將設計當中所有圓柱的半徑值都設為r0。一旦我們修改r0=12mil,所有圓柱的半徑便會同時更改為12mil,這可以省去逐一修改所耗費的時間。

(圖一) 屬性做為"全域變數"使用

在自動化程式設計當中,屬性視窗也可以拿來作為參數輸入使用。使用者可以設定事先定義的屬性,接著執行程式。此時程式便會去讀取屬性值並根據屬性值執行動作。舉一個簡單的例子,在屬性視窗當中設定了m=10,n=5(如圖二)。

(圖二) 屬性做為"程式參數"使用

假設使用者在畫面選取了一個圓柱,執行下列程式便可以生成1mm間距,10x5的圓柱陣列結構(如圖三)。

oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.SetActiveEditor("3D Modeler")

p = oDesign.GetProperties('LocalVariableTab', "LocalVariables")
result = {}
for i in p:
    v = oDesign.GetPropertyValue("LocalVariableTab", 'LocalVariables', i)
    result[i] = v

m = int(result['m'])
n = int(result['n'])
for i in range(m):
    for j in range(n):
        if (i, j)==(0, 0):
            continue
        oEditor.DuplicateAlongLine(
            [
                "NAME:Selections",
                "Selections:=" , ','.join(oEditor.GetSelections()),
                "NewPartsModelFlag:=" , "Model"
            ], 
            [
                "NAME:DuplicateToAlongLineParameters",
                "CreateNewObjects:=" , True,
                "XComponent:=" , "{}mm".format(i),
                "YComponent:=" , "{}mm".format(j),
                "ZComponent:=" , "0mm",
                "NumClones:=" , "2"
            ], 
            [
                "NAME:Options",
                "DuplicateAssignments:=", False
            ], 
            [
                "CreateGroupsForNewObjects:=", False
            ])

(圖三) 程式讀取屬性m, n作為參數複製圓柱結構

把屬性視窗當成自動化程式的輸入介面可以省去操作介面開發的時間。由於屬性視窗原本就是AEDT專案設計的一部分,Windows及Linux都可支援。作爲操作介面,屬性視窗的缺點是沒辦法支援較為摩登的控件,像是滑桿或是下拉選單等。

為了讓使用者方便使用,在第一次執行程式時,我們會讓程式自動將參數及其預設值寫入屬性視窗當中,並輸出警告訊息提醒使用者屬性已被建立,緊接著關閉程式而不執行動作。當之後再度執行程式時,程式檢查屬性如已存在,程式才會讀取屬性值作為輸入參數並執行動作。這個技巧可以省去使用者自行建立屬性的麻煩。

沒有留言:

張貼留言