Maxwell的vbs腳本轉matlab


1.背景

Maxwell可以錄制腳本,方便地實現程序控制和自動化操作。

在maxwell菜單欄中選擇Tools→Record Script To File即可開啟錄制。

目前可選擇的語言有兩種,Python和vbs。

雖然Python非常火熱,vbs更像是不被關注的小眾語言。但Maxwell中的Python腳本是用Python2.7寫的,且需要很多的包支持,操作起來多有不便。相比之下,vbs是在windows下就可以直接運行的,且代碼緊湊,可用性更好。

之前在這篇博客(https://blog.csdn.net/tongguowei/article/details/100087107)中看到了使用Matlab控制Maxwell的方法,覺得甚好,因為Matlab計算環境的優勢不言而喻,且不需要任何額外的安裝操作。

上面這篇博客中給出了vbs和matlab代碼的對比,並說明了一些簡單的規則,但是沒有形成體系,不能自動完成轉換,而手動轉換的操作極為繁瑣,所以,下面給出詳細的轉換規則,並給出利用Matlab中的正則表達式自動轉換vbs代碼的m函數。

2.轉換規則

打開Maxwell錄制的腳本,可以發現其開頭有一段建立變量的過程:

這一段操作在Matlab中可以描述為:

iMaxwell = actxserver('Ansoft.ElectronicsDesktop');
Desktop = iMaxwell.GetAppDesktop();
Desktop.RestoreWindow;
Project = Desktop.SetActiveProject("Project1");
Design = Project.SetActiveDesign("Maxwell3DDesign1");
Editor = Design.SetActiveEditor("3D Modeler");

可以發現,簡單的單行語句可以直接完成轉換。

下面主要介紹復雜語句的轉換,如vbs腳本:

oEditor.ChangeProperty Array("NAME:AllTabs", Array("NAME:Machine", Array("NAME:PropServers",  _
  "Machine"), Array("NAME:ChangedProps", Array("NAME:Number of Poles", "MustBeInt:=", true, "Value:=",  _
  "4"), Array("NAME:Stray Loss Factor", "Value:=", "0.02"), Array("NAME:Frictional Loss", "Value:=",  _
  "130W"), Array("NAME:Windage Loss", "Value:=", "30W"), Array("NAME:Reference Speed", "MustBeInt:=",  _
  false, "Value:=", "1450rpm"))))

轉換為Matlab代碼:

invoke(Editor, 'ChangeProperty', ...
  {'NAME:AllTabs', {'NAME:Machine', {'NAME:PropServers',  ...
  'Machine'}, {'NAME:ChangedProps', {'NAME:Number of Poles', 'MustBeInt:=', true, 'Value:=',  ...
  '4'}, {'NAME:Stray Loss Factor', 'Value:=', '0.02'}, {'NAME:Frictional Loss', 'Value:=',  ...
  '130W'}, {'NAME:Windage Loss', 'Value:=', '30W'}, {'NAME:Reference Speed', 'MustBeInt:=',  ...
  false, 'Value:=', '1450rpm'}}}})

的方法。

轉換規則:

  1. Array()轉換為{};
  2. oEditor.ChangeProperty (...)轉換為invoke(Editor, 'ChangeProperty', ...);

  3. 雙引號替換為單引號。

特別說明,由於單引號在vbs語言中表示注釋,所以所有字符串都是由雙引號建立的,即字符串內不能再含有引號,需要使用引號時必須用ANSI 字符代碼表示,及Chr(34),這一點需特別注意。

如有時錄制結束后可以看到vbs代碼中含有不少的Chr(34):

3.自動轉換函數

考慮以上轉換規則,給出以下函數:

function vbs2m(filename)
data=importdata(filename);
for i=1:length(data)
    data{i}=regexprep(data{i},'Array\(','{');
    data{i}=regexprep(data{i},'(?<![Chr\(34,143 175 143])\)','}');
    data{i}=regexprep(data{i},'o([A-Za-z]+?)\.([A-Za-z]+?) (.+)','invoke\($1, "$2",  $3');
    data{i}=regexprep(data{i},'"(.*?)"',"'$1'");
    data{i}=regexprep(data{i},"' \& Chr\(34\) \& '",'"');
    if data{i}(end)=='_'
        data{i}=regexprep(data{i},'_$','...');
    else
        data{i}=regexprep(data{i},'(.)$','$1\);');
    end
end
fid=fopen(filename,'w');
for i=1:length(data)
    fprintf(fid,[data{i},'\n']);
end
fclose(fid);
end

使用方法,將待轉換的vbs腳本放在myvbstest.txt文件中,並放在matlab的工作目錄下,然后運行vbs2m('myvbstest.txt')即可,此時myvbstest.txt中存放的就是m腳本啦。

測試一下,轉換前:

轉換后:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM