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脚本啦。
测试一下,转换前:
转换后:
请发表评论