• 在HFSS中用vbs脚本跑马灯?


    学个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。

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

    代码分享区(在原文末尾)

    原文链接:在HFSS中用vbs脚本跑马灯? - RFASK射频问问

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

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

    ​END

    原文链接:在HFSS中用vbs脚本跑马灯? - RFASK射频问问

    作者:微波天线工程师

    应读者朋友们对这个系列文章的喜爱,也为了能够让老师更系统更全面地介绍MATLAB-HFSS-API相关知识,现推出“MALTAB-HFSS-API入门教程”系列课程,共25课时,欢迎大家加入课程学习!https://www.rfask.net/kc/v/41.html

    ​关于RFASK射频问问

    射频问问 (http://RFASK.NET) 是在"微波射频网 (http://MWRF.NET)”系列原创技术专栏基础上升级打造的技术问答学习平台,主要围绕射频芯片、微波电路、天线、雷达、卫星等相关技术领域,致力于为无线通信、微波射频、天线、雷达等行业的工程师,提供优质、原创的技术问答、专栏文章、射频课程等学习内容。更多请访问:http://www.rfask.net

  • 相关阅读:
    安卓常见设计模式3.2------工厂模式,工厂方法模式,抽象工厂模式对比(Kotlin版)
    Google 为造芯再掀“抢人大战”,英特尔 17 年老将加入
    LVGL_基础控件checkbox
    FreeRTOS教程2 任务管理
    prometheus配置grafana看板及alert告警文档
    Java EE——网络层IP协议的格式与内容解析
    块设备调用逻辑(linux 5.4)
    979. 在二叉树中分配硬币
    SwiftUI 导航设置
    Electron-Vue创建项目及踩坑记录
  • 原文地址:https://blog.csdn.net/qizu/article/details/126590035