社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python实现喇叭天线设计小工具(四)

微波射频网 • 4 年前 • 335 次点击  
摘要:本节主要介绍主调模块,以及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, TOP
import 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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/116384
 
335 次点击