- UID
- 3635
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-4-5
- 最后登录
- 1970-1-1
|
发表于 2003-8-28 17:43:16
|
显示全部楼层
转贴Bentley技术邮件
VBA可以通过共享结构以及MDL函数和命令和MDL进行通讯。
例子代码:
VBA程序bentley\workspace\system\vba\examples\mdl2vba.mvba
MDL程序mdl\examples\vba2mdl
预备知识:C表达式计算器
C表达式函数用于在运行时分析和处理C表达式。MicroStation对话框管理器使用这些函数来计算存取字符串,设置和获取对话框条目的值。MDL调试器用这些函数来计算调试时输入的表达式。一个表达式中可以包含变量和函数引用。在一个变量或函数可以在表达式中使用之前,它们的名称必须作为一个符号使用mdlCExpression_symbolPublish函数公布。符号使用符号集来管理。一个MDL程序必须先创建一个符号集后才能发布一个符号。当符号集释放的时候,里面所有发布符号的定义都会被去除。一个符号集和创建它的MDL程序相关连,当MDL程序卸载了,对应的符号集也被释放。mdlCExpression_initializeSet指明符号集是全局的还是私有的。如果是全局的,那么所有的MDL程序都可以使用这个集合中的符号。当解析一个符号时,C表达式计算器首先查找对应的MDL程序的私有符号集,然后找全局符号集。如果都没找到,它会继续搜索MicroStation的内建函数列表。如果希望符号可以被对话框管理器的存取字符串使用,那么符号集要设置可视属性VISIBILITY_DIALOG_BOX。如果要被MicroStation的key-in预处理器使用,必须设置为全局的,可视属性为VISIBILITY_CALCULATOR。
Vba2mdl这个MDL程序中提供了两个函数和一个keyin命令让vba程序使用。
一个是mdl2VbaInfo_printStructure,功能是打印出共享的一个结构。
另一个是mdl2VbaInfo_function,功能是打印出vba调用时传递的三个参数值,并且将第二个参数值+3返回。
命令vba2mdlCommand的功能是将keyin调用时的字符串参数拷贝到共享结构中的一个字符串变量中。
还有个命令runVbaMacro是用于运行vba测试程序mdl2vba,其中可以看到一个有用的mdl函数mdlVBA_runMacro(项目名,模块名,宏名),用于在MDL程序中调用一个VBA写的宏。
让我们看看MDL程序中的main函数:
1. 使用mdlCExpression_initializeSet创建了一个可视属性为VISIBILITY_CALCULATOR的符号集。
2. 使用mdlCExpression_typeFromRsc从资源文件中读取共享结构mdl2VbaInfo,生成在内存中的定义。
3. 使用mdlCExpression_symbolPublish发布内存中的共享结构和前面提到的两个函数,使它们可以被vba程序访问和使用。
mdl2vba中只有一个宏Vba2MdlTest:
1. 使用GetCExpressionValue获取共享结构mdl2VbaInfo中的值
例如GetCExpressionValue("mdl2VbaInfo.d1", "vba2mdl")
2. 使用GetCExpressionValue调用MDL程序中的函数
例如result = GetCExpressionValue("mdl2VbaInfo_function (100.5, 10, 20)", "vba2mdl")
3. 使用SetCExpressionValue直接设置共享结构mdl2VbaInfo的值
例如SetCExpressionValue "mdl2VbaInfo.asciiString", "FOR THE ASCII STRING", "vba2mdl"
4. 通过执行keyin访问MDL程序中的命令
例如CadInputQueue.SendKeyin "mdl command vba2mdlCommand COPY THIS STRING"
至此我们可以看到VBA和MDL之间通过C表达式的通讯还是很简便易用的。
LiuJun
Bentley Shanghai
GeoSpatial AE
Tel: +86 21 3311 0228
Fax:+86 21 6375 8298
Email: jun.liu@Bentley.com |
|