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脚本啦。

测试一下,转换前:

转换后:

posted @ 2021-01-25 20:10  叮叮当当sunny  阅读(2023)  评论(3编辑  收藏  举报