在HFSS中用vbs脚本跑马灯?

2022-01-12 来源:微波射频网 作者:94巨蟹座少年 字号:

学个Antenna是以天线仿真和调试为主,理论原理为辅的干货天线技术专栏,包括天线入门知识以及各类天线的原理简介、仿真软件建模、设计、调试过程及思路如有想看到的内容或技术问题,可以在文尾写下留言。

摘要:

经过前面两期的教学HFSS-API入门第一弹第二弹,已经可以完成部分常规的建模需求。本期整点好玩的,用HFSS来跑马灯。欢迎小伙伴们阅读、分享、再看,转发给更多有需要的人!喜欢的小伙伴可赞赏下作者哦。

本文使用的软件为MATLAB2019a和AnsysEM 18.2

简单介绍

常规的跑马灯,是指将多个发光二极管分别连接到单片机的某一并行端口处,通过编程控制这几个发光二极管依次点亮,如下面的动图所示:

HFSS-API入门第一弹:画个Box中对hfssBox函数的使用进行了详细介绍,如果再加上修改Box的颜色的透明度,加上延时操作,就可以利用MATLAB编写vbs脚本,在HFSS中Run Script实现“跑马灯”效果。

修改颜色和透明度函数

接下来先介绍修改物体颜色和透明度的函数:hfssSetColor,hfssSetTransparency。

1  % hfssSetColor(fid, ObjectName, Color)

2  % ObjectName:需要修改颜色的物体对应的名字.

3  % Color:RGB三色值.

4  % 实例:

5  % hfssSetColor(fid, 'Box1', [255, 255, 0]);

 

1  % hfssSetTransparency(fid, ObjectName, Value)

2  % ObjectName:需要修改颜色的物体对应的名字.

3   % Value:透明度值,在0到1之间;0代表完全不透明,1代表完全透明.

4  % 实例:

5  % hfssSetTransparency(fid,'Box1', 0)

这两个函数的使用自然是很简单。压缩的GIF动图预览如下:

那么这个效果是如何实现的呢?

新建工程,新建设计文件,定义变量,画Box,这四个常规步骤是很容易做到的,hfssSetColor和hfssSetTransparency这两个函数也可以对物体的颜色和透明度进行二次修改。剩下需要做的就是在vbs中进行延时,以及控制鼠标左键在非模型区域点击一下,使得物体不处于高亮状态,便于观察变色效果。

首先需要解决的延时问题,网络上随手搜索关键词vbs延时函数,可以找到wscript.sleep这个函数用法:

1  用法:Times为延迟时间(单位:毫秒)

2  wscript.sleep Times

新建一个txt文件,将后缀改为vbs,然后用记事本打开复制粘贴下面代码:

1  wscript.sleep 1000

2  msgbox("Hello")

3  wscript.sleep 1000

4  msgbox("This World!")

单独运行时正常可用的,但是在HFSS中Run Script发现如下图所示报错现象:

说明HFSS的vbs脚本中不支持该函数方法,联想到单片机中的delay函数都是自己写的,于是也在MATLAB里手撸了一个大概的延时函数:

1  % 延时函数的编写

2  fprintf(fid, 'Sub delay(ms)\n');

3  fprintf(fid, '    Dim i,value\n');

4  fprintf(fid, '    for i=1 to 7500*ms\n');

5  fprintf(fid, '        value=i+1\n');

6  fprintf(fid, '    next\n');

7  fprintf(fid, 'End Sub\n');

然后我们需要解决vbs脚本中控制鼠标左键点击的需求,这里也是一样百度关键词vbs模拟鼠标按键,找到下面的网站:

https://www.cnblogs.com/jinjiangongzuoshi/p/3821375.html

经过拆解分析后,转化为自己可使用的封装代码。

1  Class SetMouse

2  private S

3  private xls, wbk, module1

4  private reg_key, xls_code, x, y

5  Private Sub Class_Initialize()

6      Set xls = CreateObject("Excel.Application")

7      Set S = CreateObject("wscript.Shell")

8      reg_key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\$\\Excel\\Security\\AccessVBOM"

9      reg_key = Replace(reg_key, "$", xls.Version)

10      S.RegWrite reg_key, 1, "REG_DWORD"

11   xls_code = _

12      "Private Type POINTAPI : X As Long : Y As Long : End Type" & vbCrLf & _

13    "Private Declare Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long" & vbCrLf & _

14    "Private Declare Function GetCursorPos Lib ""user32"" (lpPoint As POINTAPI) As Long" & vbCrLf & _

15    "Private Declare Sub mouse_event Lib ""user32"" Alias ""mouse_event"" " _

16    & "(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)" & vbCrLf & _

17    "Public Function getx() As Long" & vbCrLf & _

18    "Dim pt As POINTAPI : GetCursorPos pt : getx = pt.X" & vbCrLf & _

19    "End Function" & vbCrLf & _

20    "Public Function gety() As Long" & vbCrLf & _

21    "Dim pt As POINTAPI: GetCursorPos pt : gety = pt.Y" & vbCrLf & _

22    "End Function"

23    Set wbk = xls.Workbooks.Add

24    Set module1 = wbk.VBProject.VBComponents.Add(1)

25    module1.CodeModule.AddFromString xls_code

26End Sub

27Private Sub Class_Terminate

28    xls.DisplayAlerts = False

29    wbk.Close

30    xls.Quit

31End Sub

32Public Sub getpos( x, y)

33    x = xls.Run("getx")

34    y = xls.Run("gety")

35End Sub

36Public Sub move(x,y)

37        xls.Run "SetCursorPos", x, y

38End Sub

39Public Sub clik(keydown)

40    Select Case UCase(keydown)

41    Case "LEFT"

42    xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0

43    Case "RIGHT"

44    xls.Run "mouse_event", &H8 + &H10, 0, 0, 0, 0

45    Case "MIDDLE"

46    xls.Run "mouse_event", &H20 + &H40, 0, 0, 0, 0

47    Case "DBCLICK"

48    xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0

49    xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0

50    End Select

51End Sub

52End Class

由于这段代码过长,直接在MATLAB中用fprintf写入到vbs脚本得一行一行处理,于是将其单独复制到一个mouse_control.txt文件里,通过MATLAB的读写文件操作,将这段代码追加写入到vbs脚本文末,作为可调用的函数进程。

上面代码第8行之所以是双斜杠,是为了将单斜杠写入到vbs脚本中。

reg_key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\$\\Excel\\Security\\AccessVBOM"

有了上面的代码后,鼠标点的移动和左键点击事件可以在MATLAB中写入:

1  clear;clc;

2  path = mfilename('fullpath');

3  i=strfind(path,'\');

4  path=path(1:i(end));

5  cd(path);

6  addpath(genpath(strcat(path,'hfssapi-by-Jianhui Huang')));

7try

8    % 填写路径

9    % tmpPrjFile:生成的aedt或者hfss(安装hfss15以下的后缀名为.hfss)项目文件的路径名

10    % tmpScriptFile:生成的vbs脚本文件的路径名

11   tmpPrjFile = 'F:\vbsScript\horse_race_lamp.aedt';

12    tmpScriptFile = 'F:\vbsScript\auto_code.vbs';

13

14    % hfssExePath:HFSS软件的路径

15    hfssExePath = 'D:\software\HFSS15\AnsysEM18.2\Win64\ansysedt.exe';

16

17    % 创建一个可读写vbs脚本文件.

18    fid = fopen(tmpScriptFile, 'wt');

19

20    %创建一个新的HFSS项目并插入一个新的设计文件.

21    hfssNewProject(fid);

22    Design_name='example';

23    hfssInsertDesign(fid, Design_name);

24    

25    Box_W=1;Box_L=1;Box_H=1;

26    % hfssVariableInsert(fid,DesignName,variableName, value, units,flag)

27    hfssVariableInsert(fid,Design_name,'Box_W', Box_W, 'mm',1);

28    hfssVariableInsert(fid,Design_name,'Box_L', Box_L, 'mm',1);

29    hfssVariableInsert(fid,Design_name,'Box_H', Box_H, 'mm',1);

30    

31    % 画Box

32    % hfssBox(fid, BoxName, Start, Size, Units, Color, Material, Transparency, flag)

33    hfssBox(fid, 'Box1', {'-Box_W/2', '-Box_L/2', '0mm'}, {'Box_W', 'Box_L', 'Box_H'}, 'mm',...

34        "(0 128 128)", "Rogers RO4350 (tm)", 0, 2);

35    % 点击鼠标左键

36    fprintf(fid, '\n');

37    fprintf(fid, 'Set mouse=New SetMouse\n');

38    fprintf(fid, 'mouse.getpos x,y\n');

39    fprintf(fid, 'mouse.move 1678,575\n');

40    fprintf(fid, 'delay(500)\n');

41    fprintf(fid, 'mouse.clik "dbclick"\n');

42    fprintf(fid, 'delay(500)\n');

43    fprintf(fid, '\n');

44    % 跑马灯

45    for num=0:20

46        hfssSetColor(fid, 'Box1', [randi(255,1), randi(255,1), randi(255,1)]);

47        fprintf(fid, 'delay(100)\n');

48    end

49    % 保存项目文件到指定路径

50    hfssSaveProject(fid, tmpPrjFile,1);

51    

52    % 延时函数的编写

53    fprintf(fid, 'Sub delay(ms)\n');

54    fprintf(fid, '    Dim i,value\n');

55    fprintf(fid, '    for i=1 to 7500*ms\n');

56    fprintf(fid, '        value=i+1\n');

57    fprintf(fid, '    next\n');

58    fprintf(fid, 'End Sub\n');

59    

60    % 鼠标控制

61    fid1=fopen('mouse_control.txt');  %打开文本文件

62    INDEX=0;

63    while ~feof(fid1)

64        strdata = fgetl(fid1);   % 读取一行, strdata是字符串

65        fprintf(fid, strdata);

66        fprintf(fid, '\n');

67    end

68    fclose(fid1);

69    

70    % Close the HFSS Script File.

71    fclose(fid);

72    disp('vbs脚本已生成!');

73catch

74    disp('程序出现异常!');

75    fclose(fid);

76end

按个人情况按图索骥地修改tmpPrjFile,tmpScriptFile ,hfssExePath这几个路径和Design_name,使用的时候记得将mouse_control.txt和该vbs_horse_race_lamp.m文件单独拎出来,与hfssapi-by-Jianhui Huang放在同一个总文件夹内点击运行即可生成vbs脚本(在自行赋值的tmpScriptFile的这个路径下)。vbs脚本可以直接点击运行,或者在HFSS软件中Run Script。

基础性地写代码编注释还是挺费时间和精力的,希望大家多点赞分享。

代码分享区

hfssapi-by-Jianhui Huang

下载链接(后续代码持续在下面链接更新):

https://pan.baidu.com/s/1N0EE3Uv7krkypfzi9vxCvg

提取码:o5p5

代码已封装好打包为p文件不可修改,每次重新下载覆盖,按函数注释进行掉包即可!

注释事项:MATLAB生成vbs脚本的.m文件与hfssapi-by-Jianhui Huang放在同一个总文件夹内。不要在examples文件夹内运行.m文件!

END

*本文的图片部分来自AnsysEM 18.2软件

*欢迎左侧一键转发至朋友圈,同时右侧在看与点赞

本期原创工程师:94巨蟹座少年

本文为MWRF.NET原创文章,未经允许不得转载,如需转载请联系market#mwrf.net(#换成@)