作为一名天线工程师,HFSS是是工作中使用频率非常高的仿真软件,其性能强大,且简单易用,并且支持用脚本进行二次开发。
然而,在日常工作中,仍然有些繁琐的操作,靠软件本身难以满足,比如画多个波束叠加的方向图,也就是一张图里面叠加多条方向图曲线,需要不停地复制、粘贴、修改馈电相位。。。既费时又容易出错。虽然可以编写脚本来实现自动化操作,然而工程一换,条件一变,又得重新编写,让人非常烦恼
又如,希望通过算法来优化天线图形,需要控制HFSS画图——导出结果——优化图形,依靠HFSS自身脚本则难以满足。
于是,我就构思写一个能从外部控制HFSS的小程序,具有简单的界面,并能通过手动输入参数,应对各种不同的工程文件,而且还要能形成exe文件,方便分享。
在网上查了一下,还真没找到实现类似功能的介绍,好在自己有一定的编程基础,于是花了两天时间,自己动手造了一个。。。
在这个过程中,我总结主要有三个难点(坑):
Ok,介绍完毕,Let's go!
这部分内容相对简单,我以前写过一个系列文章,其中就用到了这个技术。
Python可采用win32com模块来控制HFSS,如果没有win32com模块,则应调出命令提示符,输入pip install pywin32,安装该模块。
成功安装后,新建HFSS_controller.py,输入代码如下:
from win32com import client
class Handler:
def __init__(self):
self.oAnsoftApp = client.Dispatch('AnsoftHfss.HfssScriptInterface')
self.oDesktop = self.oAnsoftApp.GetAppDesktop()
self.oProject = self.oDesktop.GetActiveProject()
self.oDesign = self.oProject.GetActiveDesign()
self.prj_name = self.oProject.GetName()
self.des_name = self.oDesign.GetName()
接着打开HFSS——新建工程,然后运行以下代码(实例化Handler),可见已能成功获取当前打开的工程(Project)和设计(Design)的名称。
if __name__ == '__main__':
h = Handler()
print('Prj: ', h.prj_name)
print('Des: ', h.des_name)
>>> Prj: Project1
>>> Des: HFSSDesign1
同时注意到,在HFSS同一个窗口中选取其他Project和Design时,再次运行程序,输出结果也会发生相应变化,说明Python可有效控制HFSS。
注意:如果运行代码时没有打开HFSS,程序会自动打开HFSS,并创建一个新的工程,此时,如果电脑打开HFSS比较慢,会出现“假死”的情况。
Python的GUI实现途径很多,常用的有Tkinter、PyQt、Kivy等,选择Tkinter一是因为Python自带,无需额外安装,二是该例子很简单,Tkinter性能足亦,三是后续打包相对方便。
然而,选择Tkinter(简称Tk)的最主要缺点是:界面比较丑 。。。下面是其基本功能的实现代码。
from tkinter import *
from win32com import client
# HFSS控制器,代码见前,略
class Handler:
def __init__(self):
...
# 回调函数:对应“连接”按钮
def connect():
global h
h = Handler()
prj_name.set(h.prj_name)
des_name.set(h.des_name)
# GUI主界面设置
main = Tk()
main.geometry('300x200')
main.title('HFSS控制器')
# 1、控制按钮设置
connect_btn = Button(main, text='连接', command=connect)
connect_btn.grid(row=0, column=0)
# 2、显示Project信息
Label(main, text='工程名: ').grid(row=1, column=0)
prj_name = StringVar()
Label(main, textvariable=prj_name).grid(row=1, column=1)
# 3、显示Design信息
Label(main, text='设计名: ').grid(row=2, column=0)
des_name = StringVar()
Label(main, textvariable=des_name).grid(row=2, column=1)
# 运行(Loop)
main.mainloop()
运行以后,可以得到如下界面:
点击连接按钮,可以在界面中获取HFSS信息(同样注意,HFSS应是打开状态)。
当然,该段代码只是实现了最最基本的功能,此处可以尽情发挥脑洞,并结合HFSS的代码帮助.pdf(下图位置打开),开发控制HFSS的各种功能。
比如,加入了如下一段方法后,可以实现控制HFSS画矩形的功能。
class Handler:
def __init__(self):
... # 省略,详细见前
# 新增方法:画矩形
def draw_rec(self, x, y, z, name, axis='Z'):
self.oEditor = self.oDesign.SetActiveEditor("3D Modeler")
self.oEditor.CreateRectangle(
... # 代码省略,见pdf中CreateRectangle
)
# 回调函数:画矩形,对应“画矩形”按钮
def draw_a_rectangle():
h.draw_rec(100, 50, 0, 'a')
# 画矩形
rec_btn = Button(main, text='画一个矩形',
command=draw_a_rectangle)
rec_btn.grid(row=3, column=0)
然后即可实现在程序中控制HFSS画一个矩形。
如果你想将写好的程序发给其他人使用,就需要将py文件打包,例如在Windows电脑上运行,则需要打包成exe文件。
这个时候,将遇到Python的一个大坑 !网上教程一般会推荐采用pyinstaller打包,然后折腾半天后,你会发现打包的exe体积接近200Mb,而且打开速度巨慢无比!确实让人沮丧,这还如何分享??
然而我没有放弃,经过反复研究后,我发现核心原因是不能在集成环境(比如Anaconda )中的python.exe作为解释器来打包py,否则会载入太多无用的包,正确的操作步骤如下:
A、在官网下载纯净的python并安装,新建一个文件夹,拷贝py文件,然后在Pycharm 中:File——Settings——Project: XX(XX为你的工程名)——Project Interpreter,在下拉菜单中选择Show All,点击+号,然后选择纯净的python.exe,Pycharm会创建一个新的虚拟环境。
B、安装必要的模块:pywin32和pyinstaller,有两种安装方式:一是在刚才的界面中点击+号安装,二是在Pycharm集成的console中通过pip来安装,如下图(注意命令行前有venv标识,代表这是虚拟环境,这个时候安装的包不会影响虚拟环境外的Python)
注意:如果和我一样在一个不能联网的工作环境(不要问我为什么 ),则只能手动下载.whl或者.tar.gz文件,然后通过pip进行安装。
C、在命令行中输入
pyinstaller -F -w HFSS_controller.py
顺利的话则开始打包程序,完成后在当前目录下的dist文件夹出现可执行文件如下:
可见打包出来的exe只有10Mb左右,且运行顺利,NICE!
本文介绍了采用Python控制HFSS的思路,并通过Tk编写了一个简易的界面,然后通过Pyinstaller打包成exe,完成了一个可直接执行、带界面的HFSS控制程序。大家可以按照这个思路,构建属于自己的HFSS自动化小工具,并且分享给同事。