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'}}}})
的方法。
转换规则:
- Array()转换为{};
-
oEditor.ChangeProperty (...)转换为invoke(Editor, 'ChangeProperty', ...);
- 双引号替换为单引号。
特别说明,由于单引号在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脚本啦。
测试一下,转换前:
转换后: