2020年7月19日 星期日

如何傳遞上層變數到編譯過的模組當中

我們會將重要的函數或類別包裝到模組當中,再將模組編譯成.dll以保護程式碼不會被別人所看到(請參考:如何加密自動化檔案)。模組當中有些操作會引用到AEDT的系統變量,像是oProject、oDesign或是oEditor等等。舉例來說,下面程式碼為my_module.py的內容,my_module.py當中定義了函數add_1mm_sphere(x, y, z) ,其輸入參數為座標點。執行函式會在該輸入座標位置產生1mm半徑的圓球,請注意程式當中用到了oEditor物件。

my_module.py程式碼

def add_1mm_sphere(x, y, z):
    oEditor.CreateSphere(
        [
            "NAME:SphereParameters",
            "XCenter:=" , "{}mm".format(x),
            "YCenter:=" , "{}mm".format(y),
            "ZCenter:=" , "{}mm".format(z),
            "Radius:=" , "1mm"
        ], 
        [
            "NAME:Attributes",
            "Name:=" , "Sphere1",
            "Flags:=" , "",
            "Color:=" , "(143 175 143)",
            "Transparency:=" , 0,
            "PartCoordinateSystem:=", "Global",
            "UDMId:=" , "",
            "MaterialValue:=" , "\"vacuum\"",
            "SurfaceMaterialValue:=", "\"\"",
            "SolveInside:=" , True,
            "ShellElement:=" , False,
            "ShellElementThickness:=", "0mm",
            "IsMaterialEditable:=" , True,
            "UseMaterialAppearance:=", False,
            "IsLightweight:=" , False
        ])

我們先將my_module.py編譯成my_module.dll檔。然後在主程式main.py加入my_module.dll參考,並呼叫add_1mm_sphere(x, y, z)函式。注意oEditor在main.py當中被宣告。

main.py程式碼

import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.SetActiveEditor("3D Modeler")

import os
os.chdir(os.path.dirname(__file__))

import clr
clr.AddReference('my_module.dll')
import my_module

my_module.add_1mm_sphere(1,2,3)

在HFSS執行main.py,此時出現錯誤訊息如下:

(圖一) 錯誤訊息

此錯誤訊息表示my_module當中的oEditor未被定義。雖然oEditor在main.py有被定義,但oEditor顯然無法被模組所識別。此時加入一行程式碼my_module.oEditor = oEditor即可將上層main.py的oEditor傳入到my_module當中。

import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.SetActiveEditor("3D Modeler")

import os
os.chdir(os.path.dirname(__file__))

import clr
clr.AddReference('my_module.dll')
import my_module

my_module.oEditor = oEditor
my_module.add_1mm_sphere(1,2,3)

再次執行程式main.py即可正確產生圓球結構(如圖二)。

(圖二) 程式正確輸出

沒有留言:

張貼留言