2021年9月24日 星期五

結合PyAEDT抓取HFSS設定並輸出到網頁上

在一個python檔案當中,呼叫pyaedt及Streamlit模組,用少量的程式碼便可以將多個aedt當中的模擬設定參數顯示到網頁上面。

run.bat

set PATH=C:\Users\mlin\AppData\Local\Programs\Python\Python38\Scripts;%PATH%

streamlit run example.py
pause

example.py

import threading
import streamlit as st
import os
import pyaedt

projects = [r"D:\demo\bp_filter.aedt",
r"D:\demo\coaxbend.aedt",
r"D:\demo\corporate_feed.aedt"]

props = []
for p in projects:
app = pyaedt.Hfss(p,
'HFSSDesign1',
non_graphical=True,
new_desktop_session=True,
close_on_exit=True,
student_version=False)

props.append(app.get_setup('Setup1'))

app.close_desktop()

for pj, c, pr in zip(projects, st.columns(len(props)), props):
with c:
st.subheader(pj)
st.write(pr.props)


(圖一)顯示在網頁上的HFSS模擬設定

如何利用PyAEDT抓取HFSS已模擬完成的結果

利用PyAEDT抓取資料

import pyaedt
import matplotlib.pyplot as plt
app = pyaedt.Hfss("D:/demo_pyaedt/OptimTee.aedt",
'TeeModel',
non_graphical=True,
new_desktop_session=True,
close_on_exit=True,
student_version=False)
try:
f, m = [], []
x = app.post.get_report_data("dB(S(2,1))")

except:
pass
finally:
app.close_desktop()

for freq in x.solutions_data_mag['dB(S(2,1))']:
mag = x.solutions_data_mag['dB(S(2,1))'][freq]
f.append(freq[0])
m.append(-mag)
plt.plot(f, m)
plt.grid()
plt.xlabel('Freq')
plt.ylabel('mag')
plt.show()

 

(圖一) HFSS當中的S21
(圖二)PyAEDT抓取S21並繪圖


2021年9月23日 星期四

如何呼叫API查詢函式

PyAEDT的查詢功能較AEDT內建的API而言,較不容易使用。因為API查詢函數一般不需要下太多參數,我們可以在PyAEDT當中調用API的查詢函數,如下:

import pyaedt

app = pyaedt.Hfss3dLayout("D:/demo_pyaedt/Galileo_G87173_2042.aedt",
'Galileo_G87173_204',
non_graphical=True,
new_desktop_session=True,
close_on_exit=True,
student_version=False)
try:
modeler = app.modeler

oEditor = modeler.oeditor
print(oEditor.GetNets())
print(oEditor.FindObjects('Type', 'poly'))
print(oEditor.GetStackupLayerNames())
for i in oEditor.GetStackupLayerNames():
print(oEditor.GetLayerInfo(i))
except:
pass
finally:
app.close_desktop()
(圖一)查詢結果輸出


輸出EDB資料

 

from pyaedt import Edb

myedb = Edb("D:/demo_pyaedt/Galileo_G87173_2042.aedb", 'Galileo_G87173_204')

x = myedb.core_nets.nets
print(x.keys())

x = [i.PartName for i in myedb.core_components.get_component_list()]
print(x)

x = myedb.core_stackup.stackup_layers.layers
print(x.keys())

x = myedb.core_padstack.padstacks
print(x.keys())

x = myedb.core_primitives.polygons
y = ([(i.GetNet().GetName(), i.GetLayer().GetName()) for i in x])
print(y)

myedb.close_edb()

2021年7月19日 星期一

如何輸出訊息與清除訊息

程式執行過程可以輸出訊息到AEDT Message Manager來顯示進度或是錯誤等。以下程式碼可以將資料寫到Message Manager,最後並清除訊息。有趣的是,可以透過odesktop呼叫到AEDT的內建API做全域訊息清除。

# -*- coding: utf-8 -*-
import pyaedt

#%% 1
desktop = pyaedt.Desktop()
hfss = pyaedt.Hfss('test_project', 'test_design')

#%% 2
x = hfss.messenger

x.add_info_message('info message!')
x.add_warning_message('warning message!')
x.add_error_message('error message!')

for mtype in [0, 1, 2]:
x.add_message(mtype, str('Test!'), 'Global')

#%% 3
x.clear_messages(level=3)

#%% 4
odesktop = hfss.odesktop
odesktop.ClearMessages("", "", 2)



PyAEDT的編程流程

用PyAEDT寫程式的流程跟一般程式開發很不相同,更接近交互式的體驗。開發者可以邊添加程式碼,邊觀察AEDT的對應變化。比方說,使用者下了一行指令建立新的專案與設計,並執行程式,此時便可以看到新的專案連同設計加入AEDT當中。這時候我可以再回到編輯器,加入新的區段,並在區段內,在該設計當中加入新的變數,此時單獨執行該區段內的程式碼,便可以看到該變數加入到設計當中。

過往的AEDT程式設計,執行程式需重頭跑到尾。如果程式前面存在耗時的操作,每一次除錯便必須等待耗時的操作完成,這對開發人員是一種煎熬。PyAEDT搭配編輯器的區塊執行功能很大幅度的緩解了大型程式開發的痛苦,我們可以逐步擴充程式。如果有必要,甚至還可以跳回到之前區段修改某些條件,再回到最後的區段繼續執行。比方說程式寫到後面發現材料屬性忘了修改,我們可以回到前面區段加入並執行材料屬性修改的程式碼,還可以在AEDT環境當中確認修改是否正確,再回到最後一段繼續開發即可。

剛開始接觸PyAEDT的時候,由於PyAEDT指令無法透過錄製來建立,我認為PyAEDT的開發必然相對耗時。但是自己動手做了一些操作之後,我開始對PyAEDT的編程有了不同的想法。這種互動式自動化編程可以小範圍修改並測試,再加上編輯器可以支援智能感知(Intellisense)來方便使用者選出適當的物件方法,這都會縮短程式開發的過程。




PyAEDT的範例與說明文檔

在PyAEDT官方頁面上可以找到許多的範例可供參考:https://aedtdocs.pyansys.com/examples/index.html

點進去之後,除了範例的說明,底下還有完整的Python檔可以下載。在IDE當中開啟該.py檔之後便可以執行並觀察執行結果。這是一個很好入門PyAEDT的方式。


當稍微熟悉PyAEDT之後,可以參考API文件來了解PyAEDT更完整的功能,API說明連結:

https://aedtdocs.pyansys.com/API/index.html



EDB建立PinGroup

為U2A5建立GND PinGroup,儲存之後匯入EDB from pyaedt import Edb edb = Edb(edbpath= r"D:\demo\Galileo_G87173_20454.aedb" , edbversion= '20...