Catalog
HFSS GUI Scripts (二): 创建图形界面脚本

前情回顾: HFSS GUI Scripts

这个坑从 17 年的时候就埋下了一直没填,最近在整理文件时突然想起之前写的 HFSS 脚本于是决定来填下坑🕵️‍♀️。其实在第一篇文章之后我自己还写了 “第二代” 脚本,不过当时就懒得更新了。而且写第一篇文章的时候思路比较混乱,没有介绍什么有用的信息,所以这篇文章我还是从头讲起。

HFSS Script 概述

最早开始接触 HFSS 脚本是本科做 SRTP 的时候,需要要画非常复杂的物理结构,结果我还真是一点一点的手动操作,还列了一个非常详细的流程图,每操作完一次就画“正”字。可以说那时候的我简直就是科研小白,后来误打误撞发现可以用脚本来控制软件自动画三维模型,然后又捣鼓了好久才成功,用的也是用 VBscript 写的脚本(那会 HFSS 只支持 vbjava,vb 的代码格式说多了都是泪😭)。当时 HFSS 推荐的也是使用 vb 脚本,早期的《HFSS Scripting Guide》也都是以 vb 代码作为参考例程。

再到后来,硕士期间用 HFSS 做高频电磁场仿真,经常花费大量时间在重复操作上,所以我又再次想到了写脚本。本以为要回到写 vb 的日子,结果发现 HFSS18 开始支持 Python 脚本,因此我也彻底转移到了对 python 脚本的研究上。

从头到尾我算是经历了从老旧的 vb 到与时俱进的 python 的过渡,由于介绍 HFSS 脚本的资料和教程相对较少,所以基本上都是靠自己摸索出了一套编写脚本的流程,也算是成功在科研道路上偷偷懒了。目前 HFSS 脚本比较成体系的资料有 mradway/hycohanzHFSS Lib,主要特点都是进行了很多顶层的封装,有兴趣的朋友可以参考。

HFSS 与 IronPython

HFSS 支持的 python 脚本实际上是 IronPython,关于这个语言我在之前一篇文章中有背景介绍,简而言之,使用 ipy 你可以快速调用 CLR 然后打开新世界的大门。值得高兴都是,ipy 它又双叒叕更新了,没有死掉语言才是好语言。

April 27, 2020: IronPython 2.7.10 is now available!
(IronPython3 也已安排上:IronLanguages/ironpython3

How to build a GUI Script

其实不管用什么语言,对于非专业码代码的并不重要,关键还是是否能够快速入门。就个人使用 HFSS 的经历而言,需要使用脚本的地方大概有两类:

  1. 需要一次性完成大量重复操作或不方便手动画图的操作,比如画复杂的三维结构;
  2. 多个工程的情况,每个工程的重复步骤存在一些参数上的调整。

由于 HFSS 是一个相当依赖图形界面操作的软件,早期在 Windows 系统上支持比较好,很少情况下才会使用 CLI,习惯了图形界面,所以在使用 HFSS 时我也不喜欢纯靠脚本去运行软件。而且仅仅依赖命令行窗口其实是很难实现比较复杂的功能的,例如想用脚本调个参,不小心按错数字就得重新执行一次脚本,肯定远远没有图形界面的交互来的直观、方便。

我的早期 vb 脚本

这里我主要总结了我在编写 HFSS 图形界面脚本的方法,以及学习路线、代码结构,方便快速上手(有兴趣的可以进一步研究各个环节)

怎么使用 GUI Script

首先,一个 HFSS 图形界面脚本长什么样子:

这是目前我常常使用的两个脚本:

  1. 生成仿真所需要基本模型结构、材料参数;
  2. 对已有模型进行修改后重新设置端口和分配端口;

前面也提到,其实用 vb 完全也可以实现图形界面,我的第一个 GUI 脚本就是通过 vb 不断调用窗口然后点击下一步来完成参数修改和模型创建,功能十分单一而且中途出错只能关闭脚本重新开始。对于一个没怎么学过 vb 的人,很难实现更加复杂的功能和界面。

后来我的脚本都是使用 IronPython 来编写,它的图形化主要是依赖于通过 CLR 调用 Windows 下的图形界面 API,由于是原生界面,所以脚本性能也比较高。事实上这个 GUI 脚本在 Linux 上也可以运行,至于在 Linux 中的图形界面是调用的 Mono 还是 HFSS 包中自带了 .NET Core 博主暂时也没仔细研究。

脚本使用方法:
Menu -> Tools -> Run scripts -> Choose xxx.py

GUI Script 学习路线

根据个人经历,我认为当你需要编写一个 HFSS 脚本时首先应该考虑需要完成什么样的功能:如果想要最大程度实现自动化仿真,可以选择 “Route 1”;而如果你跟我一样只是需要一些辅助功能,并且需要适当的交互,那可以考虑学习 “Route 2” 来编写一个图形化的脚本。

Begin a HFSS script

GUI Script 代码结构

我重新整理了一下 Github 原来的 repository 并把两个现成的脚本都放了上去,这里简单介绍一下它们的代码架构。

程序初始化

对于 HFSS 脚本来说,使用之前必须要进行一系列 HFSS 相关的程序初始化,大致是以下这一段内容:

1
2
3
4
5
6
7
8
import ScriptEnv
ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
oDesktop.RestoreWindow()
oProject = oDesktop.GetActiveProject()
oDesign = oProject.GetActiveDesign()
oEditor = oDesign.SetActiveEditor("3D Modeler")
oDefinitionManager = oProject.GetDefinitionManager()
oModule = oDesign.GetModule("BoundarySetup")

这个脚本主要是用于辅助仿真,所以上面的初始化的目的是获取当前工程以及模型信息,同样的你也可以在这边使用命令完成新建工程等操作。值得注意的是,我的两个脚本中,只有第二个脚本使用到了 oDesign.GetModule("BoundarySetup"),因为 HFSS 是模块化的程序,所以有一些高级功能需要你额外去调用这个模块,这可以在《HFSS Scripting Guide》中查到。(写脚本前一定好好读手册)

为了实现图形界面,我们还需要从 CLR 中调取相关的 API,这里使用 IronPython 的优势就体现出来了,可以简单的通过 import clr 来实现。同时在上面的学习路线中也提到,首先要考虑你的图形界面包含的功能,比如文本框,选单,复合窗等等,然后再去 .NET 的文档中寻找对应的 namespace 和 class。这里我们常用的 namespace 有 System.Windows.FormsSystem.Drawing

1
2
3
4
5
6
7
import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')
from System.Drawing import Color, Point
from System.Windows.Forms import (Application, BorderStyle, Button,
Form, FormBorderStyle, Label, AnchorStyles, Panel, Screen, TextBox,
RadioButton, MessageBox, CheckBox, ListBox, ComboBox)

程序核心部分

程序核心部分主要是调用 HFSS 中的函数以及构造一个用于显示图形界面的 class。

HFSS 中的各类功能函数在其手册中可以找到,包括输入参数,返回值等等,你可以在脚本中将其再封装成一个个的自定义函数,方便调用。这里以简单的设置视图单位的函数为例:

1
2
3
4
5
6
7
def SetModelUnits(unit,rescale=False):
oEditor.SetModelUnits(
[
"NAME:Units Parameter",
"Units:=" , unit,
"Rescale:=" , rescale
])

到这里这个脚本其实已经可以按照命令行的形式来执行了,不过为了更加直观我们还需要添加 GUI 的功能。首先需要构造一个用于显示的表单类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class HFSSGUI(Form):
def __init__(self):
# class 自身初始化,声明一些变量,调用 Panel
# ... ...
self.setupPanel1()
self.setupPanel2()
self.Controls.Add(self.panel1)
self.Controls.Add(self.panel2)
def setupPanel1(self):
# 调用 panel 是为了区分各个功能区,更加直观
self.panel1 = Panel()
# 添加需要的组件
# ... ...
def setupPanel2(self):
self.panel2 = Panel()
# ... ...
# 定义一些函数来调用之前封装好的 HFSS 功能,并与各个组件绑定在一起
def functions():
# ... ...

一个简单的 GUI 脚本到这里基本结束,最后添加上两行代码就可以运行调试了:

1
2
form = HFSSGUI()
Application.Run(form)

进阶: more efficient way

我实现可视化脚本的方法本质上是利用 WinForm 来绘制界面然后绑定事件,在组件比较少或者初学时可以采用这种原生代码的方法来手扒一个图形界面。当组件比较多时,布局和视图逻辑上可能就会消耗很多时间,所以我们还可以借助第三方的工具 Visual Studio,这里介绍一个油管上的进阶版教程,有兴趣的可以学习一下:

Author: Phower
Link: https://phower.me/2020/05/hfss-gui-scripts-2/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • WeChat
    WeChat
  • AliPay
    AliPay
Comment