在HFSS中用vbs腳本跑馬燈?
學(xué)個(gè)Antenna是以天線仿真和調(diào)試為主,理論原理為輔的干貨天線技術(shù)專欄,包括天線入門(mén)知識(shí)以及各類天線的原理簡(jiǎn)介、仿真軟件建模、設(shè)計(jì)、調(diào)試過(guò)程及思路。如有想看到的內(nèi)容或技術(shù)問(wèn)題,可以在文尾寫(xiě)下留言。
摘要:
經(jīng)過(guò)前面兩期的教學(xué)HFSS-API入門(mén)第一彈,第二彈,已經(jīng)可以完成部分常規(guī)的建模需求。本期整點(diǎn)好玩的,用HFSS來(lái)跑馬燈。歡迎小伙伴們閱讀、分享、再看,轉(zhuǎn)發(fā)給更多有需要的人!喜歡的小伙伴可贊賞下作者哦。
本文使用的軟件為MATLAB2019a和AnsysEM 18.2
簡(jiǎn)單介紹
常規(guī)的跑馬燈,是指將多個(gè)發(fā)光二極管分別連接到單片機(jī)的某一并行端口處,通過(guò)編程控制這幾個(gè)發(fā)光二極管依次點(diǎn)亮,如下面的動(dòng)圖所示:
在HFSS-API入門(mén)第一彈:畫(huà)個(gè)Box中對(duì)hfssBox函數(shù)的使用進(jìn)行了詳細(xì)介紹,如果再加上修改Box的顏色的透明度,加上延時(shí)操作,就可以利用MATLAB編寫(xiě)vbs腳本,在HFSS中Run Script實(shí)現(xiàn)“跑馬燈”效果。
修改顏色和透明度函數(shù)
接下來(lái)先介紹修改物體顏色和透明度的函數(shù):hfssSetColor,hfssSetTransparency。
1 % hfssSetColor(fid, ObjectName, Color) 2 % ObjectName:需要修改顏色的物體對(duì)應(yīng)的名字. 3 % Color:RGB三色值. 4 % 實(shí)例: 5 % hfssSetColor(fid, 'Box1', [255, 255, 0]); |
1 % hfssSetTransparency(fid, ObjectName, Value) 2 % ObjectName:需要修改顏色的物體對(duì)應(yīng)的名字. 3 % Value:透明度值,在0到1之間;0代表完全不透明,1代表完全透明. 4 % 實(shí)例: 5 % hfssSetTransparency(fid,'Box1', 0) |
這兩個(gè)函數(shù)的使用自然是很簡(jiǎn)單。壓縮的GIF動(dòng)圖預(yù)覽如下:
那么這個(gè)效果是如何實(shí)現(xiàn)的呢?
新建工程,新建設(shè)計(jì)文件,定義變量,畫(huà)Box,這四個(gè)常規(guī)步驟是很容易做到的,hfssSetColor和hfssSetTransparency這兩個(gè)函數(shù)也可以對(duì)物體的顏色和透明度進(jìn)行二次修改。剩下需要做的就是在vbs中進(jìn)行延時(shí),以及控制鼠標(biāo)左鍵在非模型區(qū)域點(diǎn)擊一下,使得物體不處于高亮狀態(tài),便于觀察變色效果。
首先需要解決的延時(shí)問(wèn)題,網(wǎng)絡(luò)上隨手搜索關(guān)鍵詞vbs延時(shí)函數(shù),可以找到wscript.sleep這個(gè)函數(shù)用法:
1 用法:Times為延遲時(shí)間(單位:毫秒) 2 wscript.sleep Times |
新建一個(gè)txt文件,將后綴改為vbs,然后用記事本打開(kāi)復(fù)制粘貼下面代碼:
1 wscript.sleep 1000 2 msgbox("Hello") 3 wscript.sleep 1000 4 msgbox("This World!") |
單獨(dú)運(yùn)行時(shí)正常可用的,但是在HFSS中Run Script發(fā)現(xiàn)如下圖所示報(bào)錯(cuò)現(xiàn)象:
說(shuō)明HFSS的vbs腳本中不支持該函數(shù)方法,聯(lián)想到單片機(jī)中的delay函數(shù)都是自己寫(xiě)的,于是也在MATLAB里手?jǐn)]了一個(gè)大概的延時(shí)函數(shù):
1 % 延時(shí)函數(shù)的編寫(xiě) 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腳本中控制鼠標(biāo)左鍵點(diǎn)擊的需求,這里也是一樣百度關(guān)鍵詞vbs模擬鼠標(biāo)按鍵,找到下面的網(wǎng)站:
https://www.cnblogs.com/jinjiangongzuoshi/p/3821375.html |
經(jīng)過(guò)拆解分析后,轉(zhuǎn)化為自己可使用的封裝代碼。
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 |
由于這段代碼過(guò)長(zhǎng),直接在MATLAB中用fprintf寫(xiě)入到vbs腳本得一行一行處理,于是將其單獨(dú)復(fù)制到一個(gè)mouse_control.txt文件里,通過(guò)MATLAB的讀寫(xiě)文件操作,將這段代碼追加寫(xiě)入到vbs腳本文末,作為可調(diào)用的函數(shù)進(jìn)程。
上面代碼第8行之所以是雙斜杠,是為了將單斜杠寫(xiě)入到vbs腳本中。
reg_key = "HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\$\\Excel\\Security\\AccessVBOM" |
有了上面的代碼后,鼠標(biāo)點(diǎn)的移動(dòng)和左鍵點(diǎn)擊事件可以在MATLAB中寫(xiě)入:
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 % 填寫(xiě)路徑 9 % tmpPrjFile:生成的aedt或者h(yuǎn)fss(安裝hfss15以下的后綴名為.hfss)項(xiàng)目文件的路徑名 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 % 創(chuàng)建一個(gè)可讀寫(xiě)vbs腳本文件. 18 fid = fopen(tmpScriptFile, 'wt'); 19 20 %創(chuàng)建一個(gè)新的HFSS項(xiàng)目并插入一個(gè)新的設(shè)計(jì)文件. 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 % 畫(huà)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 % 點(diǎn)擊鼠標(biāo)左鍵 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 % 保存項(xiàng)目文件到指定路徑 50 hfssSaveProject(fid, tmpPrjFile,1); 51 52 % 延時(shí)函數(shù)的編寫(xiě) 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 % 鼠標(biāo)控制 61 fid1=fopen('mouse_control.txt'); %打開(kāi)文本文件 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('程序出現(xiàn)異常!'); 75 fclose(fid); 76end |
按個(gè)人情況按圖索驥地修改tmpPrjFile,tmpScriptFile ,hfssExePath這幾個(gè)路徑和Design_name,使用的時(shí)候記得將mouse_control.txt和該vbs_horse_race_lamp.m文件單獨(dú)拎出來(lái),與hfssapi-by-Jianhui Huang放在同一個(gè)總文件夾內(nèi)。點(diǎn)擊運(yùn)行即可生成vbs腳本(在自行賦值的tmpScriptFile的這個(gè)路徑下)。vbs腳本可以直接點(diǎn)擊運(yùn)行,或者在HFSS軟件中Run Script。
基礎(chǔ)性地寫(xiě)代碼編注釋還是挺費(fèi)時(shí)間和精力的,希望大家多點(diǎn)贊分享。
代碼分享區(qū)
hfssapi-by-Jianhui Huang
下載鏈接(后續(xù)代碼持續(xù)在下面鏈接更新):
https://pan.baidu.com/s/1N0EE3Uv7krkypfzi9vxCvg
提取碼:o5p5
代碼已封裝好打包為p文件不可修改,每次重新下載覆蓋,按函數(shù)注釋進(jìn)行掉包即可!
注釋事項(xiàng):MATLAB生成vbs腳本的.m文件與hfssapi-by-Jianhui Huang放在同一個(gè)總文件夾內(nèi)。不要在examples文件夾內(nèi)運(yùn)行.m文件!
END
*本文的圖片部分來(lái)自AnsysEM 18.2軟件
*歡迎左側(cè)一鍵轉(zhuǎn)發(fā)至朋友圈,同時(shí)右側(cè)在看與點(diǎn)贊
本期原創(chuàng)工程師:94巨蟹座少年
本文為MWRF.NET原創(chuàng)文章,未經(jīng)允許不得轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)聯(lián)系market#mwrf.net(#換成@)