CST自动化自学札记之二——Project Object→General Methods→AddToHistory
这两天学习了以前在网上下载的CST自动化的相关资料,并对照着动手练习了一下,对这方面的认识有所加深。
总的来说,关键在于要大致上理解通用编程中所涉及到的应用程序、对象及其方法,所以在CST online help中关于VBA编程这部分,开篇就简要论述了这部分内容。我在上一篇中以自己的理解重译了这部分内容(CST自动化自学札记之一——应用程序、对象及其方法)。
有了这些基本认识之后,可以看看网上快速起步的内容,下载一下已有的代码,自己动手实操一下,即时的反馈能激发学习的动力。网上关于CST自动化内容主要起源于《VBA Macros and Linking External Programs》这篇技术文档,包括国外的一些技术资料、国内在网上公开自己学习成果的麦克斯火,基本起源于这篇文档。事实上,相关内容在CST online help中基本上都有,只是因为文档内容组织方式的缘故,这篇技术文档相对更容易理解,而CST online help侧重于系统完备的介绍所有的功能。
看了相关资料后,我觉得从应用的角度来看,其实也没有想象中那么难。大致上有两种实现思路,一种是基于COM技术CST向外部其它应用软件提供接口,这样就可以实现其它应用软件与CST的通讯,完成诸如其它应用软件(比如MATLAB、Office、Python、VB等)控制CST的功能;另一种是通过VBA脚本自动化。这两种方式可以相互结合起来使用。通常我们熟悉什么应用软件,就可以采用什么软件来实现自动化。大部分人熟悉MATLAB,所以用matlab来控制CST,但我们发现他们的代码中其实包含了这两种思路。具体来说,代码中用invoke函数而不涉及到AddToHistory时,就是matlab直接控制CST,而用invoke函数同时用到AddToHistory方法时,就是借助CST的VBA功能。虽然新版本CST也提供了Python控制的途径,但Python在这里起到的作用更像是MATLAB,CST记录脚本依然是通过VBA,即对于CST而言,Python脚本与VBA脚本的地位是不同的。VBA在CST中起到了更基础的作用,当我们试图用matlab的invoke函数实现一个之前没有尝试过的功能时,我们还得去online help中查找相关的VBA对象及其相关方法。另外,如果野心更大,试图阅读和开发像集成到CST宏和后处理那样的功能,就得对VBA有更强的掌控力。除非CST新版本允许Python或Lua作为其录制脚本,否则VBA在CST中的地位是不可动摇的。
有了基本的认识后,读相关代码就很清晰了。当我读到CST-MATLAB-API-master的代码时,发现原来还可以写得这么整洁,其实就是用了函数的概念,将一大段冗长的代码打包,将可设置参数作为函数的参数来定义函数。
恰巧在微信群中一个网友问了一个这样的问题,在CST macro editor中运行VBA脚本后,重新打开工程文件发现工程中很多元素都没有了,这其实与MATLAB控制CST而不使用AddToHistory方法的原理是相似的。值得一提的是,CST macro editor中通过VBA脚本控制CST,和MATLAB控制CST还是有些差异的,在CST自带的VBA editor中,可以直接访问CST的对象,而不需要像外部应用软件一样使用创建对象的命令。更权威的描述见CST online help,摘录如下。
这是在CST自带VBA editor中编辑脚本的一点优势吧。当然这是在对VBA脚本较为熟悉的基础上,而对于大部分人而言,写VBA脚本可能比写MATLAB脚本要困难一些。为了回答这个网友的问题,同时为了检验我这两天的学习成效,我在CST自带VBA editor中,而不是在MATLAB中,尝试创建一个cube,并将这个操作保存在History list中。其实思路是一样的,只不过一个是在MATLAB中用AddToHistory方法,一个是在CST自带VBA editor中用AddToHistory方法。脚本如下:

执行结果见下图

这个案例虽然简单,但按这个思路,其它操作也可以按类似的方式实现。