學(xué)個Antenna是以天線仿真和調(diào)試為主,理論原理為輔的干貨天線技術(shù)專欄,包括天線入門知識以及各類天線的原理簡介、仿真軟件建模、設(shè)計、調(diào)試過程及思路。如有想看到的內(nèi)容或技術(shù)問題,可以在文尾寫下留言。
摘要:
經(jīng)過前面兩期的教學(xué)HFSS-API入門第一彈,第二彈,已經(jīng)可以完成部分常規(guī)的建模需求。本期整點好玩的,用HFSS來跑馬燈。歡迎小伙伴們閱讀、分享、再看,轉(zhuǎn)發(fā)給更多有需要的人!喜歡的小伙伴可贊賞下作者哦。
本文使用的軟件為MATLAB2019a和AnsysEM 18.2
0 1簡單介紹
常規(guī)的跑馬燈,是指將多個發(fā)光二極管分別連接到單片機的某一并行端口處,通過編程控制這幾個發(fā)光二極管依次點亮。
在HFSS-API入門第一彈:畫個Box中對hfssBox函數(shù)的使用進行了詳細介紹,如果再加上修改Box的顏色的透明度,加上延時操作,就可以利用MATLAB編寫vbs腳本,在HFSS中Run Script實現(xiàn)“跑馬燈”效果。
0 2修改顏色和透明度函數(shù)
接下來先介紹修改物體顏色和透明度的函數(shù):hfssSetColor,hfssSetTransparency。
% hfssSetColor(fid, ObjectName, Color)% ObjectName:需要修改顏色的物體對應(yīng)的名字.% Color:RGB三色值.% 實例:% hfssSetColor(fid, ‘Box1’, [255, 255, 0]);
% hfssSetTransparency(fid, ObjectName, Value)% ObjectName:需要修改顏色的物體對應(yīng)的名字.% Value:透明度值,在0到1之間;0代表完全不透明,1代表完全透明.% 實例:% hfssSetTransparency(fid,‘Box1’, 0)
這兩個函數(shù)的使用自然是很簡單。壓縮的GIF動圖預(yù)覽如下:
那么這個效果是如何實現(xiàn)的呢?
新建工程,新建設(shè)計文件,定義變量,畫Box,這四個常規(guī)步驟是很容易做到的,hfssSetColor和hfssSetTransparency這兩個函數(shù)也可以對物體的顏色和透明度進行二次修改。剩下需要做的就是在vbs中進行延時,以及控制鼠標左鍵在非模型區(qū)域點擊一下,使得物體不處于高亮狀態(tài),便于觀察變色效果。
首先需要解決的延時問題,網(wǎng)絡(luò)上隨手搜索關(guān)鍵詞vbs延時函數(shù),可以找到wscript.sleep這個函數(shù)用法:
用法:Times為延遲時間(單位:毫秒)wscript.sleep Times
新建一個txt文件,將后綴改為vbs,然后用記事本打開復(fù)制粘貼下面代碼:
wscript.sleep 1000msgbox(“Hello”)wscript.sleep 1000msgbox(“This World!”)
單獨運行時正常可用的。
說明HFSS的vbs腳本中不支持該函數(shù)方法,聯(lián)想到單片機中的delay函數(shù)都是自己寫的,于是也在MATLAB里手擼了一個大概的延時函數(shù):
% 延時函數(shù)的編寫fprintf(fid, ‘Sub delay(ms)
’);fprintf(fid, ‘ Dim i,value
’);fprintf(fid, ‘ for i=1 to 7500*ms
’);fprintf(fid, ‘ value=i+1
’);fprintf(fid, ‘ next
’);fprintf(fid, ‘End Sub
’);
然后我們需要解決vbs腳本中控制鼠標左鍵點擊的需求,這里也是一樣百度關(guān)鍵詞vbs模擬鼠標按鍵,找到下面的網(wǎng)站:
https://www.cnblogs.com/jinjiangongzuoshi/p/3821375.html
經(jīng)過拆解分析后,轉(zhuǎn)化為自己可使用的封裝代碼。
Class SetMouseprivate Sprivate xls, wbk, module1private reg_key, xls_code, x, yPrivate Sub Class_Initialize() Set xls = CreateObject(“Excel.Application”) Set S = CreateObject(“wscript.Shell”) reg_key = “HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM” reg_key = Replace(reg_key, “$”, xls.Version) S.RegWrite reg_key, 1, “REG_DWORD” xls_code = _ “Private Type POINTAPI : X As Long : Y As Long : End Type” & vbCrLf & _ “Private Declare Function SetCursorPos Lib ”“user32”“ (ByVal x As Long, ByVal y As Long) As Long” & vbCrLf & _ “Private Declare Function GetCursorPos Lib ”“user32”“ (lpPoint As POINTAPI) As Long” & vbCrLf & _ “Private Declare Sub mouse_event Lib ”“user32”“ Alias ”“mouse_event”“ ” _ & “(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)” & vbCrLf & _ “Public Function getx() As Long” & vbCrLf & _ “Dim pt As POINTAPI : GetCursorPos pt : getx = pt.X” & vbCrLf & _ “End Function” & vbCrLf & _ “Public Function gety() As Long” & vbCrLf & _ “Dim pt As POINTAPI: GetCursorPos pt : gety = pt.Y” & vbCrLf & _ “End Function” Set wbk = xls.Workbooks.Add Set module1 = wbk.VBProject.VBComponents.Add(1) module1.CodeModule.AddFromString xls_codeEnd SubPrivate Sub Class_Terminate xls.DisplayAlerts = False wbk.Close xls.QuitEnd SubPublic Sub getpos( x, y) x = xls.Run(“getx”) y = xls.Run(“gety”)End SubPublic Sub move(x,y) xls.Run “SetCursorPos”, x, yEnd SubPublic Sub clik(keydown) Select Case UCase(keydown) Case “LEFT” xls.Run “mouse_event”, &H2 + &H4, 0, 0, 0, 0 Case “RIGHT” xls.Run “mouse_event”, &H8 + &H10, 0, 0, 0, 0 Case “MIDDLE” xls.Run “mouse_event”, &H20 + &H40, 0, 0, 0, 0 Case “DBCLICK” xls.Run “mouse_event”, &H2 + &H4, 0, 0, 0, 0 xls.Run “mouse_event”, &H2 + &H4, 0, 0, 0, 0 End SelectEnd SubEnd Class
由于這段代碼過長,直接在MATLAB中用fprintf寫入到vbs腳本得一行一行處理,于是將其單獨復(fù)制到一個mouse_control.txt文件里,通過MATLAB的讀寫文件操作,將這段代碼追加寫入到vbs腳本文末,作為可調(diào)用的函數(shù)進程。
上面代碼第8行之所以是雙斜杠,是為了將單斜杠寫入到vbs腳本中。
reg_key = “HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM”
有了上面的代碼后,鼠標點的移動和左鍵點擊事件可以在MATLAB中寫入:
fprintf(fid, ‘Set mouse=New SetMouse
’);fprintf(fid, ‘% move后面是電腦鼠標需要移動的坐標點,通過mousexy確定坐標點fprintf(fid, ’mouse.move 1678,575
‘);fprintf(fid, ’delay(500)
‘);fprintf(fid, ’mouse.clik “dbclick”
‘);fprintf(fid, ’delay(500)
‘);fprintf(fid, ’
‘);
用MATLAB進行整體的vbs腳本寫入,整段代碼如下所示,可在文末下載鏈接下載。
clear;clc;path = mfilename(’fullpath‘);i=strfind(path,’‘);path=path(1:i(end));cd(path);addpath(genpath(strcat(path,’hfssapi-by-Jianhui Huang‘)));try % 填寫路徑 % tmpPrjFile:生成的aedt或者hfss(安裝hfss15以下的后綴名為.hfss)項目文件的路徑名 % tmpScriptFile:生成的vbs腳本文件的路徑名 tmpPrjFile = ’F:vbsScripthorse_race_lamp.aedt‘; tmpScriptFile = ’F:vbsScriptauto_code.vbs‘;
% hfssExePath:HFSS軟件的路徑 hfssExePath = ’D:softwareHFSS15AnsysEM18.2Win64ansysedt.exe‘;
% 創(chuàng)建一個可讀寫vbs腳本文件。 fid = fopen(tmpScriptFile, ’wt‘);
%創(chuàng)建一個新的HFSS項目并插入一個新的設(shè)計文件。 hfssNewProject(fid); Design_name=’example‘; hfssInsertDesign(fid, Design_name); Box_W=1;Box_L=1;Box_H=1; % hfssVariableInsert(fid,DesignName,variableName, value, units,flag) hfssVariableInsert(fid,Design_name,’Box_W‘, Box_W, ’mm‘,1); hfssVariableInsert(fid,Design_name,’Box_L‘, Box_L, ’mm‘,1); hfssVariableInsert(fid,Design_name,’Box_H‘, Box_H, ’mm‘,1); % 畫Box % hfssBox(fid, BoxName, Start, Size, Units, Color, Material, Transparency, flag) hfssBox(fid, ’Box1‘, {’-Box_W/2‘, ’-Box_L/2‘, ’0mm‘}, {’Box_W‘, ’Box_L‘, ’Box_H‘}, ’mm‘,。。。 “(0 128 128)”, “Rogers RO4350 (tm)”, 0, 2); % 點擊鼠標左鍵 fprintf(fid, ’
‘); fprintf(fid, ’Set mouse=New SetMouse
‘); fprintf(fid, ’mouse.getpos x,y
‘); fprintf(fid, ’mouse.move 1678,575
‘); fprintf(fid, ’delay(500)
‘); fprintf(fid, ’mouse.clik “dbclick”
‘); fprintf(fid, ’delay(500)
‘); fprintf(fid, ’
‘); % 跑馬燈 for num=0:20 hfssSetColor(fid, ’Box1‘, [randi(255,1), randi(255,1), randi(255,1)]); fprintf(fid, ’delay(100)
‘); end % 保存項目文件到指定路徑 hfssSaveProject(fid, tmpPrjFile,1); % 延時函數(shù)的編寫 fprintf(fid, ’Sub delay(ms)
‘); fprintf(fid, ’ Dim i,value
‘); fprintf(fid, ’ for i=1 to 7500*ms
‘); fprintf(fid, ’ value=i+1
‘); fprintf(fid, ’ next
‘); fprintf(fid, ’End Sub
‘); % 鼠標控制 fid1=fopen(’mouse_control.txt‘); %打開文本文件 INDEX=0; while ~feof(fid1) strdata = fgetl(fid1); % 讀取一行, strdata是字符串 fprintf(fid, strdata); fprintf(fid, ’
‘); end fclose(fid1); % Close the HFSS Script File. fclose(fid); disp(’vbs腳本已生成!‘);catch disp(’程序出現(xiàn)異常!‘); fclose(fid);end
按個人情況按圖索驥地修改tmpPrjFile,tmpScriptFile ,hfssExePath這幾個路徑和Design_name,使用的時候記得將mouse_control.txt和該vbs_horse_race_lamp.m文件單獨拎出來,與hfssapi-by-Jianhui Huang放在同一個總文件夾內(nèi)。點擊運行即可生成vbs腳本(在自行賦值的tmpScriptFile的這個路徑下)。vbs腳本可以直接點擊運行,或者在HFSS軟件中Run Script。
基礎(chǔ)性地寫代碼編注釋還是挺費時間和精力的,希望大家多點贊分享。
編輯:jq
-
仿真
+關(guān)注
關(guān)注
50文章
4048瀏覽量
133431 -
API
+關(guān)注
關(guān)注
2文章
1487瀏覽量
61831 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4308瀏覽量
62445 -
hfss
+關(guān)注
關(guān)注
32文章
167瀏覽量
50263
發(fā)布評論請先 登錄
相關(guān)推薦
評論