摘要:本节主要介绍主调模块,以及GUI模块的编写。
主 调模 块
终于到了主调模块了,之前的章节主要介绍了参数计算,波导查值,以及HFSS封装和调用等,所有准备工作已就绪,只差一个“主体”将这些模块调用起来,实现这个功能的便是主调模块main.py。
这一步的编写相对比较简单,按我个人习惯,还是采用了面向对象的编程思路,写一个叫Horn的对象,首先通过对象的初始化功能将输入参数导入进来,然后调用“波导查值”模块确定波导尺寸、“参数计算”模块计算喇叭尺寸,再调用“HFSS调用模块”,通过规定一系列建模动作(如第三节所述),完成HFSS建模和运算。
示意代码如下,如果对于建模的动作有不太明白了,请看上一篇文章的讲解。
import paraCalc import wg import sim class Horn : def __init__ (self , freq, HPE, HPH, wg_name= None ): self . freq = freq self . HPE = HPE self . HPH = HPH self . wg_name = wg_name self . wg_a, self . wg_b, self . horn_a, self . horn_b, self . horn_l = None , None , None , None , None def wg_size (self ): if self . wg_name is None : self . wg_a, self . wg_b = wg. check_by_freq(self . freq) else : self . wg_a, self . wg_b = wg. check_by_name(self . wg_name) return self . wg_a, self . wg_b def para (self ): self . wg_size() if (self . wg_a or self . wg_b) is None : print ('Input error!' ) else : self . horn_a, self . horn_b, self . horn_l = paraCalc. calc(self . freq, self . HPE, self . HPH, self . wg_a, self . wg_b) def realize_in_hfss (self ): h = sim. HFSS() # 设置变量 h. set_variable('wg_a' , self . wg_a) h. set_variable('wg_b' , self . wg_b) h. set_variable('wg_l' , self . wg_a* 1.5 ) h. set_variable('horn_a' , self . horn_a) h. set_variable('horn_b' , self . horn_b) h. set_variable('horn_l' , self . horn_l) h. set_variable('wg_t' , 0.5 ) h. set_variable('ab' , 75 / self . freq)
# 波导内腔 h. create_centered_rectangle('wg_a' , 'wg_b' , 0 , 'wg_in' ) h. create_centered_rectangle('wg_a' , 'wg_b' , 'wg_l' , 'wg_in_' ) h. connect('wg_in' , 'wg_in_' ) # 喇叭内腔 h. create_centered_rectangle('wg_a' , 'wg_b' , 'wg_l' , 'horn_in' ) h. create_centered_rectangle('horn_a' , 'horn_b' , 'wg_l+horn_l' , 'horn_in_' ) h. connect('horn_in' , 'horn_in_' ) # 波导外形 h. create_centered_rectangle('(wg_a+wg_t*2)' , '(wg_b+wg_t*2)' , '-wg_t' , 'wg' ) h. create_centered_rectangle('(wg_a+wg_t*2)' , '(wg_b+wg_t*2)' , 'wg_l' , 'wg_' ) h. connect('wg' , 'wg_' ) # 喇叭外形 h. create_centered_rectangle('(wg_a+wg_t*2)' , '(wg_b+wg_t*2)' , 'wg_l' , 'horn' ) h. create_centered_rectangle('(horn_a+wg_t*2)' , '(horn_b+wg_t*2)' , 'horn_l+wg_l' , 'horn_' ) h. connect('horn' , 'horn_' ) # 布尔运算生成喇叭,然后设为PEC h. unite('horn' , 'wg' ) h. unite('horn_in' , 'wg_in' ) h. subtract('horn' , 'horn_in' ) h. set_material('horn' ) # 生成区域并赋予辐射边界 h. create_region('ab' ) h. assign_radiation_region() h. insert_radiation_setup() # 设置端口 h. create_centered_rectangle('wg_a' , 'wg_b' , 0 , 'port' ) h. assign_port('port' ) h. insert_analysis_setup(self . freq) # 创建报告 h. create_reports() # 保存工程并运行 h. save_prj() h. run()if __name__ == '__main__' : f, E, H = 10 , 30 , 20 a_horn = Horn(f, E, H) a_horn. realize_in_hfss()
以上代码可能没有太多需要解释的,可以看到的是,定义好HFSS接口后,调用过程就很轻松愉快了。
图形交互界面模块
开篇提到过,Python实现图形界面的方法有很多,除了Tkinter属于自带包外,其他著名的包如PyQt、wxPython等都需要额外安装,考虑到我们的小程序功能单一,界面也不需要太花哨,采用Python自带的Tkinter是一种较为经济快捷的选择。
由于第一次写界面,代码质量可能有点差,实现效果也不怎么样,好在我们要做的东西功能简单,不会影响使用。(自我安慰。。。)
不废话,直接上代码。
from tkinter import Tk, Label, StringVar, Entry, Button, Frame, TOPimport main root = Tk() root. title('最佳喇叭计算 by kuangzl' ) root. geometry('420x280' ) root. resizable(width= False , height= False ) tip = Label(root, text= '由波束宽度计算喇叭尺寸, \n 使得该尺寸下增益最大化' , height= 3 , font= ('Microsoft YaHei UI' , 12 , 'italic' )) tip. pack(side= TOP) frm = Frame(root) frm. pack() Label(frm, text= '中频(GHz):' ). grid(row= 0 , column= 0 ) Label(frm, text= 'E面(deg):' ). grid(row= 1 , column= 0 ) Label(frm, text= 'H面(deg):' ). grid(row= 2 , column= 0 )
Label(frm, text= '波导宽(mm):' ). grid(row= 0 , column= 2 ) Label(frm, text= '波导窄(mm):' ). grid(row= 1 , column= 2 ) Label(frm, text= '喇叭宽(mm):' ). grid(row= 2 , column= 2 ) Label(frm, text= '喇叭窄(mm):' ). grid(row= 3 , column= 2 ) Label(frm, text= '喇叭长(mm):' ). grid(row= 4 , column= 2 )def calc (): f = float (v1. get()) E = float (v2. get()) H = float (v3. get()) horn = main. Horn(f, E, H) horn. para() v4. set(horn. wg_a) v5. set(horn. wg_b) v6. set(horn. horn_a) v7. set(horn. horn_b) v8. set(horn. horn_l)def hfss (): f = float (v1. get()) E = float (v2. get()) H = float (v3. get()) horn = main. Horn(f, E, H) horn. para() horn. realize_in_hfss() v1 = StringVar() Entry(frm, textvariable= v1, width= 8 ). grid(row= 0 , column= 1 , padx= 10 , pady= 5 ) v2 = StringVar() Entry(frm, textvariable= v2, width= 8 ). grid(row= 1 , column= 1 , padx= 10 , pady= 5 ) v3 = StringVar() Entry(frm, textvariable= v3, width= 8 ). grid(row= 2 , column= 1 , padx= 10 , pady= 5 ) v4 = StringVar() Label(frm, textvariable= v4, width= 10 ). grid(row= 0 , column= 3 ) v5 = StringVar() Label(frm, textvariable= v5, width= 10 ). grid(row= 1 , column= 3 ) v6 = StringVar() Label(frm, textvariable= v6, width= 10 ). grid(row= 2 , column= 3 ) v7 = StringVar() Label(frm, textvariable= v7, width= 10 ). grid(row= 3 , column= 3 ) v8 = StringVar() Label(frm, textvariable= v8, width= 10 ). grid(row= 4 , column= 3 ) Button(frm, text= 'calc' , command= calc). grid(row= 4 , column= 0 ) Button(frm, text= 'hfss' , command= hfss). grid(row= 4 , column= 1 ) root. mainloop()
这段代码实现的效果是这样的:
点击hfss按钮以后的效果:
小结 至此,该小程序已经完成了九成以上,作为自用已经毫无问题了!但如果还想将程序分享出来,则须打包成可执行文件(如exe),这一步貌似很简单,却有不少的坑,我将在下一节详细介绍。
本篇即到此为止,下一篇将会是终篇,谢谢各位观看(*^_^*)!
转载自:知乎@况泽灵
系列文章: 用Python实现喇叭天线设计小工具(一) 用Python实现喇叭天线设计小工具(二) 用Python实现喇叭天线设计小工具(三)
原创文章:
Excel也能调用HFSS?
模拟和矢量信号源进阶使用技巧 IQ正交调制器基础知识和测试详解 学个Antenna:Wi-Fi双频金属中框天线 学个Antenna:手机天线之宽带匹配原理 学个Antenna:手机天线入门
学个Antenna:HFSS脚本建模入门
Wi-Fi 6射频技术全面解析及Wi-Fi 7热点技术介绍
无线技术专栏:无线通信信号传输模型
使用矢网测量PA S11、S21和饱和功率的方法
学个Antenna:Matlab天线工具箱知多少(一)
原创干货:使用矢网测量PA S12 S22和功率的方法
ETC 天线技术概览(工作方式、极化方式、实现方式、技术革新点)
附加相位噪声测试方法
4G和5G基站天线工程知识和应用场景
噪声的意义及测量方法
非50欧系统阻抗的S参数测试
交调失真的意义及矢网实例测量方法
增益压缩的意义及矢网实操测量方法
S参数的意义及矢网实例测量方法
学个Antenna:偶极子天线馈电及倒V天线
从电磁波产生到对称阵子天线
张跃平教授:无线电科学与技术中的因子4