Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... ·...

48
Microstation V8 VBA 二次开发 第一章 概述 ............................................................................................................................................................ 3 1.1 如何加载、运行宏? ................................................................................................................................ 3 加载工程 .................................................................................................................................................. 3 运行宏 ...................................................................................................................................................... 4 1.2 工程管理器 ............................................................................................................................................... 4 1.3 宏对话框介绍 ........................................................................................................................................... 7 1.4 VBA编辑器................................................................................................................................................ 8 1.5 Microstation VBA环境变量 ...................................................................................................................... 9 练习题: ........................................................................................................................................................ 10 第二章 理解V8 VBA对象 .................................................................................................................................... 11 2.1 对象的属性 ............................................................................................................................................. 11 2.2 对象的方法 ............................................................................................................................................. 11 2.3 过程和子函数的调用 ............................................................................................................................. 12 2.4 V8 VBA对象结构图 ................................................................................................................................ 12 自动化对象模型 .................................................................................................................................... 13 应用(Application)对象结构 ............................................................................................................. 14 模型参考(ModelReference)对象结构.............................................................................................. 15 参考(Attachment)对象结构.............................................................................................................. 16 激活设置(ActiveSettings)对象结构................................................................................................. 17 第三章 DGN文件操作 ......................................................................................................................................... 42 3.1 Application对象 ....................................................................................................................................... 42 3.2 DGN文件属性 ......................................................................................................................................... 43 3.3 DGN文件操作 ......................................................................................................................................... 44 直接打开 ................................................................................................................................................ 44 在内存中打开 ........................................................................................................................................ 45 创建DGN文件 ....................................................................................................................................... 46 练习题: ........................................................................................................................................................ 47 第四章 DGN元素操作 ......................................................................................................................................... 18 4.1 元素类型 ................................................................................................................................................. 18 4.2 选择元素 .................................................................................................................................................. 20 手工选择 ................................................................................................................................................ 21 围栅(Fence....................................................................................................................................... 21 选择按(Select By............................................................................................................................. 23 4.3 添加/创建元素 ......................................................................................................................................... 25 CadInputQueue对象 .............................................................................................................................. 25 面向Element对象的代码方式 .............................................................................................................. 28 用户交互输入 ........................................................................................................................................ 32 4.4 删除元素 .................................................................................................................................................. 34 4.5 修改元素 .................................................................................................................................................. 35 练习题: ........................................................................................................................................................ 36 第五章 常用对象介绍 .......................................................................................................................................... 37 围栅(Fence............................................................................................................................................... 37

Transcript of Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... ·...

Page 1: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发

目 录 第一章 概述 ............................................................................................................................................................ 3

1.1 如何加载、运行宏? ................................................................................................................................ 3 加载工程 .................................................................................................................................................. 3 运行宏 ...................................................................................................................................................... 4

1.2 工程管理器 ............................................................................................................................................... 4 1.3 宏对话框介绍 ........................................................................................................................................... 7 1.4 VBA编辑器................................................................................................................................................ 8 1.5 Microstation VBA环境变量 ...................................................................................................................... 9 练习题: ........................................................................................................................................................ 10

第二章 理解V8 VBA对象 .................................................................................................................................... 11 2.1 对象的属性 ............................................................................................................................................. 11 2.2 对象的方法 ............................................................................................................................................. 11 2.3 过程和子函数的调用 ............................................................................................................................. 12 2.4 V8 VBA对象结构图 ................................................................................................................................ 12

自动化对象模型 .................................................................................................................................... 13 应用(Application)对象结构 ............................................................................................................. 14 模型参考(ModelReference)对象结构.............................................................................................. 15 参考(Attachment)对象结构.............................................................................................................. 16 激活设置(ActiveSettings)对象结构................................................................................................. 17

第三章 DGN文件操作 ......................................................................................................................................... 42 3.1 Application对象 ....................................................................................................................................... 42 3.2 DGN文件属性 ......................................................................................................................................... 43 3.3 DGN文件操作 ......................................................................................................................................... 44

直接打开 ................................................................................................................................................ 44 在内存中打开 ........................................................................................................................................ 45 创建DGN文件 ....................................................................................................................................... 46

练习题: ........................................................................................................................................................ 47 第四章 DGN元素操作 ......................................................................................................................................... 18

4.1 元素类型 ................................................................................................................................................. 18 4.2 选择元素 .................................................................................................................................................. 20

手工选择 ................................................................................................................................................ 21 围栅(Fence)....................................................................................................................................... 21 选择按(Select By)............................................................................................................................. 23

4.3 添加/创建元素 ......................................................................................................................................... 25 CadInputQueue对象 .............................................................................................................................. 25 面向Element对象的代码方式 .............................................................................................................. 28 用户交互输入 ........................................................................................................................................ 32

4.4 删除元素 .................................................................................................................................................. 34 4.5 修改元素 .................................................................................................................................................. 35 练习题: ........................................................................................................................................................ 36

第五章 常用对象介绍 .......................................................................................................................................... 37 围栅(Fence)............................................................................................................................................... 37

Page 2: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

层(Level) ................................................................................................................................................... 38 基本元素(Cell、Linestring、Shape、Text) ............................................................................................ 38

青岛市勘察测绘研究院 第 2 页 共 2 页

Page 3: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

第一章 概述

VB 和 VBA 是专业的程序开发人员和业余开发人员都可以用的,完全的面向对象编程环

境。VB 是很多商业软件(有些可能就是我们平时用的软件)的主要开发平台。VBA 具有 VB

的大部分功能,但 VBA 应用程序不能编译成单独运行的可执行文件或 ActiveX 控件,只能

在诸如 Microsoft Word,Microsoft Excel 或者 MicroStation V8 这样的宿主应用程序中

运行。VB 具有丰富的用户窗体程序包,包括制作 VB/VBA 程序或宏的用户界面所需的控件和

元素。

1.1 如何加载、运行宏?

在 Microstation 中运行 VBA 宏(VBA 程序通常叫做“宏”)之前,必须加载 VBA 宏所在

的 VBA 工程。

加载工程

工程通常是 VBA 程序的完整集合,包含一个或多个宏,文件后缀为.mvba。

加载一个 VBA 工程

青岛市勘察测绘研究院 第 3 页 共 3 页

Page 4: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

1. 选择菜单[工具] [宏] [工程管理器];

2. 单击工具栏上的“加载工程” 图标;

3. 在弹出的“加载工程”对话框上,选择要加载的 VBA 工程文件(.mvba);

4. 单击“确定”,所选的工程就出现在 VBA 工程管理器对话框上了。

另一种加载 VBA 工程的方法

1. 在“键入”窗口,输入:VBA LOAD <工程文件名(带路径)>

2. 选择菜单[工具] [宏] [工程管理器],所选的工程就出现在 VBA 工程管理器对话框

上了。

运行宏

在运行宏之前,首先确认包含该宏的 VBA 工程已经加载。

用宏对话框

1. 点击“加载工程”对话框上的“宏”按钮,当前所有工程包含的宏的列表就显示出来;

2. 在“宏所在”下拉框里选择要运行的宏所在的工程,列表中就仅仅列出所选工程的宏;

3. 选择相应的宏,点击“运行”按钮,宏就立即执行了。

另一种运行宏的方法

在“键入”窗口,输入:VBA RUN <宏的名称>,例如:Module1 模块中的 MyTest 过程

(或函数),可以输入:VBA Run Module1.MyTest

命令行方式加载并运行宏

在“键入”窗口,输入:VBA RUN [工程名]<宏的名称>,例如:调用 VbaTest1 工程中

Module1 中的 MyTest 过程(或函数),可以输入:VBA Run [VbaTest1]Module1.MyTest

用菜单或工具按钮运行宏

选择菜单[工作空间] [自定义],弹出对话框,插入自己的菜单、工具按钮或工具框架,

然后在键入(KeyIn)框里输入:VBA RUN [工程名]<宏的名称>,即同上述“命令行方式加

载并运行宏”。

1.2 工程管理器

工程管理器提供了加载、运行、管理 VBA 宏的所有功能。选择菜单[实用] [宏] [工

青岛市勘察测绘研究院 第 4 页 共 4 页

Page 5: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

程管理器],打开工程管理器对话框。

工程管理器像Microstation其他如管理文件和设置等的对话框一样,也没有下拉菜单,

而是在工程管理器界面顶上有一排工具栏,通过它来管理 VBA 工程和宏。每个工具的详细

描述如下:

新建工程

新建工程图标用于创建一个新的 VBA 工程。点击该图标,弹出创建 VBA 工程对话框,

输入工程名和文件所在的路径。

加载工程

加载工程图标用于加载一个已存在的 VBA 工程到工程管理器。点击该图标,出现加载

工程对话框,选择.mvba 文件,点击“确定”按钮就将所选文件的内容加载进来了。

像 Microstation 其他加载各种文件的对话框一样,可以选择某一系统配置变量来设置

要选择的文件的路径,或者也可以选择对话框上的菜单[目录] [当前工作目录]来设置。

卸载工程

卸载工程图标用于卸载一个当前加载在内存上的 VBA 工程,在未选择任何工程时,它

是灰色的,不可选择。点击该图标就立即将将工程卸载掉。如果当前工程的某个宏正处于

运行状态,那么会在卸载之前停止执行。

另存为

另存为图标用于将选中的工程复制为另一份工程文件,但是并不修改工程模块本身的

名称。例如,当前加载的一个名称为“macros2”模块的工程处于选中状态,选择另存为图

标,将创建另一个工程文件,即使该工程名和原始的工程名不一样,也会包含名为“macros2”

的模块。

青岛市勘察测绘研究院 第 5 页 共 5 页

Page 6: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

VBA 编辑器

VBA 编辑器图标用于显示编辑窗口及其里面的内容。所有加载的工程都显示在编辑窗口

里,所以没必要打开 VB 编辑窗口前从工程管理器中选择一个工程。因为在 VB 编辑窗口不

能创建工程,所以在打开编辑窗口之前就应该创建或加载相应的工程。

宏图标用于显示宏对话框,在这个对话框里列举出了所有加载工程的全部可用的宏。

详见“宏对话框”。

开始记录

该图标用于记录 Microstation 里的操作,并把它保存成 VBA 宏。当未选择任何工程时,

它是灰色的,不可选择。

停止记录

该图标用于停止记录 Microstation 里的操作,当未开始记录宏之前,它是灰色,不可

选的。一旦点击了该图标,刚才所记录的宏就只能在 VBA 编辑器里进行添加或修改了。

暂停记录

该图标用于暂时停止记录宏,以便可以进行其它操作或命令,而这些操作或命令不会

记录到宏里。当未开始记录宏之前,它也是灰色,不可选的。一旦暂停记录,Microstation

里的任何操作都不会记录到宏里,要继续记录,则需再点击一次该图标。

其它功能:

工程管理器还有重命名工程、添加或修改工程描述以及设置工程自动加载的功能。下

面将介绍这几项功能。另外,在工程管理器对话框的工程列表区域,单击右键,会弹出一

个菜单,功能和相应工具栏上的是一样的。

重命名工程

工程管理器的名称一栏是可编辑的,也就是说可以直接点击当前高亮选中的工程的名

称来编辑它,或者单击右键,在弹出菜单中选择“重命名”。

添加、编辑工程描述

工程管理器的工程描述一栏也是可编辑的,就是说可以直接点击当前高亮选中的工程

的工程描述来编辑它。虽然实际上没有字数限制,由于受对话框显示范围的影响,只能在

有限的地方显示工程描述,不能完全显示,如果把鼠标悬浮于工程描述栏上,会出现一个

悬浮标签来显示完整的工程描述。

青岛市勘察测绘研究院 第 6 页 共 6 页

Page 7: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

自动加载工程

要设置某工程自动加载,先加载该工程到工程管理器中来,然后点击该工程的“自动

加载”一栏,出现一个对钩号,这就表明下次启动 Microstation 时该工程就会自动加载。

注:要先在配置变量 MS_VBASEARCHDIRECTORIES 里指定相应的路径,否则该工程不会

自动加载。如果用户没有设置自动加载的工程,当打开工程管理器时,会自动加载

MS_VBANEWPROJECTDIRECTORY 里指定的第一个路径下的 Default.mvba 工程。

1.3 宏对话框介绍

在该对话框里列出了所有加载工程或选中工程的全部可用宏。其功能描述如下:

察看工程内容

宏对话框或者列出所有加载工程的宏,或者列出所选工程的宏,这取决于对话框启动

的方式。

如果标有“宏的位置”标签的下拉框显示“所有标准工程”,那么宏列表里将列出当前

所有加载工程的全部宏。这个下拉框还可以选择仅列出一个工程的宏。

运行宏

在对话框里选择一个宏,点击该按钮,就可以运行该宏。

调试宏

以调试模式启动所选择的宏。

编辑宏

在 VBA 编辑器中打开所选中的宏。

青岛市勘察测绘研究院 第 7 页 共 7 页

Page 8: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

删除宏

将所选中的宏从所在工程中删除。

1.4 VBA 编辑器

Microstation VBA 编辑器窗口具有和其它程软件 VBA 一样的标准特征,如 Microsoft

Word,Microsoft Excel,MicroStation V8 以及任意包含 VBA 的程序,它展现给业余或专

业开发人员一个友好而完整的编程环境。打开(选择主菜单[实用] [宏] [VBA 编辑器])

VBA 编辑器,它提供了一套丰富的工具和功能。如果要开始一个新工程,首先要用工程管理

器(选择工程管理器工具条上的“新工程”图标)创建并加载该工程,这也是录制宏之前

要做的工作。

从工程管理器或命令行加载的工程的所有文件就出现在[工程]窗口里,在这儿插入一

个或多个 VB 窗体、模块或类模块,就可以开始程序的创建过程了。也许最快的往工程里写

一些代码的方法就是插入一个代码模块,从 VBA 编辑器的主菜单[插入]选择[模块],VBA 编

辑器就在工程里插入了一个叫做 Module1 的空模块(该模块名自动出现在模块目录里),同

时也在自己的代码窗口里打开等待编辑。通过属性窗口可以修改该模块的名称。

对象浏览器是 VBA编辑环境最有用的工具之一。打开VBA编辑器,选择菜单[视图] [对

象浏览器]或按 F2 功能键,打开对象浏览器,就列出当前程序里所有可用的对象。

从 类 库 选 择 下 拉 框 中 选 择 MicroStationDGN , 在 对 象 浏 览 器 里 就 显 示 出

MicroStationDGN 对象库里所有的方法、属性和事件。在左栏里单击某一个类,就会在右栏

青岛市勘察测绘研究院 第 8 页 共 8 页

Page 9: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

里显示该类的所有成员。

1.5 Microstation VBA 环境变量

Microstation 里有几个与 VBA 相关的环境变量,主要用于设置新建 VBA 工程的路径、

已有工程的搜寻路径等等。

要快速找到这些变量,可以打开配置对话框(主菜单[工作空间] [配置]),在左边列

表框里选择“VBA”项。

新建 VBA 工程的路径

MicroStation 的配置变量 MS_VBANEWPROJECTDIRECTORY 决定了新建 VBA 工程的缺省路

径,该变量的缺省值为“\Bentley\Workspace\standards\vba\”。

MS_VBANEWPROJECTDIRECTORY 可以设置多个路径,但是只有第一个有效,其他将被忽略

掉。

工程搜寻路径

变量 MS_VBASEARCHDIRECTORIES 决定了用名称加载工程时,MicroStation 在哪些路径

下搜寻工程。该变量设置了自动加载工程的位置。要选择一个工程设为自动加载,详见“自

动加载工程”。

标准工程的名称

青岛市勘察测绘研究院 第 9 页 共 9 页

Page 10: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

MS_VBAAUTOLOADPROJECTS和MS_VBAREQUIREDPROJECTS配置变量决定了哪些工程在启动

时自动加载。如果两变量都做了设置,则 MS_VBAREQUIREDPROJECTS 变量下的工程优先加载。

自动保存

MS_VBASAVEONRUN配置变量决定了修改的VBA工程在执行时是否自动保存。缺省值是1,

表示工程会自动保存;如不需自动保存,则将该变量值设为 0即可。

从内存或磁盘打开工程

练习题:

1、 在 D:\V8VBA\目录下新建一 VBA 工程,命名为 MyTest.mvba,工程描述为“我的 VBA 测

试工程”,将其设置为自动加载。

2、 在上述工程里,录制一个宏,设置当前层为 20 层,颜色为 4号色,线宽为 3,添加一条

线、一个 Cell,并打开宏察看源代码。将图形删除,再运行此宏,看运行结果。

3、 自己做一个菜单和按钮,使其可以运行上述宏。

青岛市勘察测绘研究院 第 10 页 共 10 页

Page 11: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

第二章 理解 V8 VBA 对象

Microstation 设计文件中的每个绘图元素都可以由 VB 中的某个对象来表示,对象也用

来表示诸如视图和视图组、符号库、围栅、字体等其他元素。还有相应的对象代表

Microstation 应用程序本身。总之,对象是在 Microstation VBA 编程过程中最基本的,而

且是必要的。利用 VBA 编辑器中的对象浏览器可以很方便的浏览、查询 V8 里的所有对象。

2.1 对象的属性

大多数对象,特别是表示图形元素的对象,都具有属性。对象的特征就叫做属性,比

如颜色、线宽、线型等。属性也能影响某个对象的行为,如 IsLock 属性就可以设置一个元

素是否锁定。

设置属性:对象名后面紧跟点号和属性名称,然后等号,后面是该属性的新值。例如,

要把一个叫“element1”的线元素的颜色改变为红色,代码可以这样写:

element1.Color = 3

但是,有些元素的属性是只读的,不能改变,例如 IsPlanar 属性用来检验一个元素是

否完全在同一个平面上。因为这是一种是否满足某种条件的检测,所以在满足某种条件才

做相应动作时是很有用的。接上面的例子,如果元素是平面的,那么就把 element1 的颜色

变为蓝色。

If element1.isPlanar = True Then element1.Color = 1

如果对象的属性只能“读”而不能被改变,该属性就叫做“只读”属性。在帮助中,

每个属性都会指明它是“读/写”还是“只读”。

2.2 对象的方法

方法是对象自身可以进行的动作或行为。例如,ShapeElement 对象具有 Area 方法,要

计算被 ShapeElement 对象“shape1”所封闭的面积,可以用以下代码:

Double dArea = shape1.area()

方法通常需要一些参数,用来指定如何执行某个行为,或者执行什么。例如,View 对

象有个用于视图放大的 Zoom 方法,该方法需要一个值来设置缩放的比率。以下代码就是用

青岛市勘察测绘研究院 第 11 页 共 11 页

Page 12: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

3 倍的比率放大当前视图:

view1.Zoom 3.0

2.3 过程和子函数的调用

VBA 中,最普通的方法就是过程和子函数,两者的主要区别是:子函数有返回值,而过

程没有。

调用过程的方式有两种:

1. 用 Call 语句,例如:Call OpenDesignFile ("d:\myDesign.dgn")

2. 过程名后面直接跟着参数,例如:OpenDesignFile "d:\myDesign.dgn"

注:用 Call 语句时,过程的参数必须用括号括起来;而只是用过程名时,就不需要括

号。

子函数调用类似于过程的调用,如果不需用到函数的返回值,可以用 Call 语句;如果

需要用函数的返回值,就要用括号将函数的实参括起来。

If DistanceXY(point1, point2) > 10 Then

userChoice = MsgBox ("Distance is too great.", vbOKCancel)

End If

这个例子包含两个函数的调用:DistanceXY 和 MsgBox,在调用语句中都用到了返回值,

所以括号是必需的。

2.4 V8 VBA 对象结构图

青岛市勘察测绘研究院 第 12 页 共 12 页

Page 13: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

自动化对象模型

Attachments

CrossHatchPatte

AccuDrawHi

Application

AreaPattern

Attachment

CadInputMess

CadInputQu

CellInformati

ElementEnumerator

ElementScanCriter

ExtendedInfomatio

Fence

Font

Fonts

GeoReferenceInformati

HatchPatter

IAttachmentEvents

IChangeTrackEve

ILocateCommandEve

IModalDialogEvent

RasterBlockType

RasterClipBoundary

RasterClipMask

RasterClipMasks

RasterColorMode

RasterColorModes

RasterCompressionMod

RasterCompressionMod

RasterEnumerator

RasterForm

RasterFormat

RasterInformatio

RasterManag

RasterBlockType

RasterBitmap

Raster

Pattern

NamedGroupMembe

ModelReferences

ModelReference

LocateCriteri

LineStyles

LineStyle

Levels

Level

ISaveAsEven

IRasterEven

IPrimitiveCommandEve

ElementCach

Element

DimensionStyl

DesignFile

DataBlock

DatabaseLin

CommandStat

ColorTable

CollectionEnumera

CellLibrary

CellInformationEnume

Microstation DGN

ViewViews

Workspace

ViewGroups

ViewGroup

VertexList

TextStyles

TextStyle

TagSets

TagSet

TagDefinitio

TagDefinitio

Settings

RenderingInformatio

Rasters

青岛市勘察测绘研究院 第 13 页 共 13 页

Page 14: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

应用(Application)对象结构

ActiveDesignFile{DesignFile} ActiveModelReference{ModelReference} ActiveSettings{Settings} ActiveWorkspace{Workspace} AttachedCellLibrary{CellLibrary} CadInputQueue{ CadInputQueue } Caption{String} CommandState{ CommandState } CurrentGraphicGroup{Long} FullName{String} HasActiveDesignFile{Bool} HasActiveModelRefernce{Bool} Height{Long} IsAcademicVersion{Bool} IsCellLibraryAttached{Bool} IsRegistered{Bool} IsSerialized{Bool} KeyinArguments{String} LeftPostion{Long} Name{String} Path{String} RasterManager{ RasterManager } TopPostion{Long} VBE{Object} Version{String} Visible{Bool} Width{Long}

Application

青岛市勘察测绘研究院 第 14 页 共 14 页

Page 15: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

模型参考(ModelReference)对象结构

Count{Long} Item{Attachments}

ModelReference

青岛市勘察测绘研究院

AnyElementsSelected{Bool} AsAttachment{ Attachment } Attachments{ Attachments } ControlElementCache{ElementCache} Description{String} DesignFile{ DesignFile } GlobalOrigin{Point3D} GraphicElementCache { ElementCache }Is3D{Bool} IsActive{ Bool } IsAttachment{Bool} IsElementSelected{Bool} IsHidden{ Bool } IsLocked{ Bool } IsReadOnly{Bool} Levels{ Levels } MasterUnit{MeasurementUnit} Name{String} ParentModelReference StorageUnit{ MeasurementUnit } SubUnit{ MeasurementUnit } SubUnitsPerMasterUnit{ Double } Type{MicrostationdModelType} UORsPerMasterUnit{ Double } UORsPer StorageUnit { Double } UORsPer SubUnit{ Double }

第 15 页 共 15 页

Page 16: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

参考(Attachment)对象结构

AnyElementsSelected{Bool} AsAttachment{ Attachment } AttachmentOringin{Point3D} Attachments{ Attachments } AttachName{ String } ControlElementCache{ElementCache} Description{String} DesignFile{ DesignFile } DisplayAsNested{Bool} DisplaysRasterReference{Bool} ElementLocatable{Bool} ElementSnappable{Bool} ElemenVisible{Bool} GlobalOrigin{Point3D} GraphicElementCache { ElementCache } Is3D{Bool} IsActive{ Bool } IsAttachment{Bool} IsElementSelected{Bool} IsHidden{ Bool } IsLocked{ Bool }

Count{Long} Item{Attachments}

Attachment

LogicalDescription{ String } LogicalName{ String } MasterOrigin{ Point3D } MasterUnit{ MeasurementUnit } Name{ String } NestLevel{Long} ParentModelReference{ModelReference} Presentation{MicrostationdRenderingMode} Rotation{ Bool } ScaleFactor{Double} ScaleMasterUnits{ Bool } StorageUnit{ MeasurementUnit } SubUnit{ MeasurementUnit } SubUnitsPerMasterUnit{ Double } Type{MicrostationdModelType} UORsPerMasterUnit{ Double } UORsPer StorageUnit { Double } UORsPer SubUnit{ Double } UsesLights{Bool}

IsReadOnly{Bool} IsTrueScale{Bool} Level{ Level} Levels{ Levels } LineStylesScaled{Bool}

青岛市勘察测绘研究院 第 16 页 共 16 页

Page 17: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

激活设置(ActiveSettings)对象结构

Angle{ Double } Angle LockEnable{ Bool } AreaModeHole{ Bool } AreaPatternDelta{ Point2D } AssociationLockEnable{ Bool } AxisAngle{ Double } AxisLockEnable{ Bool } AxisOrigin{ Double } BoresitLockEnable{Bool} CapMode{Integer} CellName{ String } CellStretchEnable{Bool} Color{Long} ColorName{ String } ConstrunctionPlaneLockEnable{ Bool } CurrentGraphicGroup{ Long } DepthLocakEnable{ Bool } ElementClass{MicrostationdElementClass } FenceClip{Bool} FenceOverlap{ Bool }

ActiveSettings

GridReference{Integer} GridUnits{Double} IsometricLockEnable{Bool} Level{Level} LevelLockEnable{Bool} LineStyle{ LineStyle } LineTeminator{String} LineWeight{Long} LocateTolerance{Integer} PatternAngle1{Double} PatternAngle2{Double} PatternCellName{String} PatternDelta{Point2D } PatternScale{ Double } PointCellName{String} Scale{Point3D} ScaleLockEnable{ Bool } SelectionSetLockEnable{ Bool } SnapLockEnable{Bool}

FenceVoid{ Bool } FillColor{ Long } FillMode{MicrostationdFillMode } Font{ Font} GraphicGroupLockEnable{ Bool } GridLockEnable {Bool}

TagIncrement{Integer} TerminatorScale{Double} TextNodeLockEnable{Bool} TextStyle{TextStyle} UnitLockEnable{Bool}

青岛市勘察测绘研究院 第 17 页 共 17 页

Page 18: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

第三章 DGN 元素操作

DGN 设计文件中的每个元素(包括图形的和非图形的)都可以通过该元素对象相应的函

数来操作,修改或读取元素的信息,对元素进行平移、旋转、删除等操作。例如,点击菜

单[元素] [信息],点中某个元素,弹出的窗口里所列出的所有元素信息都可以通过该元

素相应的属性来访问。

3.1 元素类型

即 MsdElementType 枚举变量的值。(注:有说明的均为常用类型。)

我们应该尽快熟悉这些元素类型,而且能够和实际的图形对起来。这对于以后的编程

是非常有帮助的。

枚 举 值 数 值 说 明

msdElementTypeCellLibraryHeader 1 (&H1) 符号(单元)库

msdElementTypeCellHeader 2 (&H2) 符号(单元)

msdElementTypeLine 3 (&H3) 线

msdElementTypeLineString 4 (&H4) 线串

msdElementTypeGroupData 5 (&H5) 组

msdElementTypeShape 6 (&H6) 多边形

msdElementTypeTextNode 7 (&H7) 文本结点

msdElementTypeDigSetData 8 (&H8)

msdElementTypeDesignFileHeader 9 (&H9) 设计文件头

msdElementTypeLevelSymbology 10 (&HA)

msdElementTypeCurve 11 (&HB) 曲线

msdElementTypeComplexString 12 (&HC) 复杂链

msdElementTypeConic 13 (&HD)

msdElementTypeComplexShape 14 (&HE) 复杂形

msdElementTypeEllipse 15 (&HF) 椭圆

msdElementTypeArc 16 (&H10) 弧

msdElementTypeText 17 (&H11) 文本

msdElementTypeSurface 18 (&H12)

青岛市勘察测绘研究院 第 18 页 共 18 页

Page 19: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

枚 举 值 数 值 说 明

msdElementTypeSolid 19 (&H13)

msdElementTypeBsplinePole 21 (&H15)

msdElementTypePointString 22 (&H16) 点串

msdElementTypeCone 23 (&H17) 圆锥体

msdElementTypeBsplineSurface 24 (&H18)

msdElementTypeBsplineBoundary 25 (&H19)

msdElementTypeBsplineKnot 26 (&H1A)

msdElementTypeBsplineCurve 27 (&H1B)

msdElementTypeBsplineWeight 28 (&H1C)

msdElementTypeDimension 33 (&H21) 标注

msdElementTypeSharedCellDefinition 34 (&H22)

msdElementTypeSharedCell 35 (&H23) 共享单元

msdElementTypeMultiLine 36 (&H24)

msdElementTypeTag 37 (&H25) 标签

msdElementTypeDgnStoreComponent 38 (&H26)

msdElementTypeDgnStoreHeader 39 (&H27)

msdElementType44 44 (&H2C)

msdElementTypeMicroStation 66 (&H42)

msdElementTypeRasterHeader 87 (&H57)

msdElementTypeRasterComponent 88 (&H58)

msdElementTypeRasterReference 90 (&H5A)

msdElementTypeRasterReferenceComponent 91 (&H5B)

msdElementTypeTableEntry 95 (&H5F)

msdElementTypeTable 96 (&H60)

msdElementTypeViewGroup 97 (&H61)

msdElementTypeView 98 (&H62) 视图

msdElementTypeLevelMask 99 (&H63)

msdElementTypeReferenceAttachment 100 (&H64)

msdElementTypeMatrixHeader 101 (&H65)

msdElementTypeMatrixIntegerData 102 (&H66)

msdElementTypeMatrixDoubleData 103 (&H67)

msdElementTypeMeshHeader 105 (&H69)

青岛市勘察测绘研究院 第 19 页 共 19 页

Page 20: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

枚 举 值 数 值 说 明

msdElementTypeReferenceOverride 108 (&H6C)

msdElementTypeNamedGroupHeader 110 (&H6E)

msdElementTypeNamedGroupComponent 111 (&H6F)

通常用 Select Case element.Type 语句或用 If element.Is*Element Then 语句来判

断是那种元素。示例代码如下:

Select Case语句:

’ oScanEnumerator 表示一个选择集,oElement 表示一个元素

Do While oScanEnumerator.MoveNext

Set oElement = oScanEnumerator.Current

Select Case oElement.Type

Case msdElementTypeCellHeader

Debug.Print oElement.AsCellElement.Name

Case msdElementTypeLineString

Debug.Print oElement.AsLineElement.Length

Case msdElementTypeShape

Debug.Print oElement.AsShapeElement.Area

'……

End Select

Loop

If element.Is*Element Then语句:

Do While oScanEnumerator.MoveNext

Set oElement = oScanEnumerator.Current

If oElement.IsCellElement Then

Debug.Print oElement.AsCellElement.Name

ElseIf oElement.IsLineElement Then

Debug.Print oElement.AsLineElement.Length

ElseIf oElement.IsShapeElement Then

Debug.Print oElement.AsShapeElement.Area

'……

Else

'......

End If

Loop

3.2 选择元素

我们通常是对一个选择集的元素进行操作,选择集的生成通常有以下三种方法:手工

选择、放置围栅、应用“选择按”功能,下面就分别介绍如何遍历选择集里的元素。

青岛市勘察测绘研究院 第 20 页 共 20 页

Page 21: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

首先介绍一下经常用到的 ElementEnumerator 对象。许多获得元素集的方法都返回

ElementEnumerator 对象,通过该对象就可以访问这些元素。程序从 ElementEnumerator 对

象里遍历元素之前,首先调用 MoveNext 方法,将指针指向下一个元素。因为在初始状态,

指针指向第一个元素之前的位置,所以检索第一个元素之前有必要调用 MoveNext 方法将指

针指向第一个元素。当 MoveNext 不能再向前时,就返回 FALSE,也就是说没有元素了。用

Current 可以获得当前元素;用 Reset 重新初始化,即将指针移回最初的位置,然后再用

MoveNext 将指针移到第一个元素位置。

具体例子将在下面的代码中介绍。

手工选择

通过 Microstation 里面的选择工具或强力选择器选择了若干个元素,这些元素就构成

了一个选择集,可以用 GetSelectedElements 获得。

下面的例子是将所选择的元素的颜色更改为 1号色: Sub ChangeColor()

Dim oEnumerator As ElementEnumerator ’定义一个选择集对象

’获得所选择的元素

Set oEnumerator = ActiveModelReference.GetSelectedElements

’对选择集进行遍历

Do While oEnumerator.MoveNext

Dim oElement As Element

Set oElement = oEnumerator.Current

oElement.Color = 1

oElement.Redraw msdDrawingModeNormal

oElement.Rewrite

Loop

ActiveModelReference.UnselectAllElements

End Sub

围栅(Fence)

在设计文件中放置了围栅,如何遍历围栅内的元素并对其进行操作?请看下面的代码。 Sub CopyFenceContents()

Dim fnc As Fence '定义围栅

Dim ee As ElementEnumerator '定义选择集

'定义保存 FENCE 状态的布尔变量

Dim saveClip As Boolean

青岛市勘察测绘研究院 第 21 页 共 21 页

Page 22: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

Dim saveOverlap As Boolean

Dim saveVoid As Boolean

'将当前 FENCE 状态保存起来,并将 Fence 设置为剪切和搭界。

With ActiveSettings

saveClip = .FenceClip

.FenceClip = True

saveOverlap = .FenceOverlap

.FenceOverlap = True

saveVoid = .FenceVoid

.FenceVoid = False

End With

Set fnc = ActiveDesignFile.Fence '获得当前设计文件的 Fence 对象

If Not fnc.IsDefined Then '判断是否放置了 Fence

ShowError "The fence is not defined"

Exit Sub

End If

Set ee = fnc.GetContents(True) '获得 Fence 里面的元素,保存在 ee 选择集里。

'遍历 ee 选择集

Do While ee.MoveNext

Dim ele As Element

Set ele = ee.Current'获得当前位置的元素

ele.Move Point3dFromXYZ(-15, 5, 0) '移动元素

ele.Rewrite

ele.Redraw

Loop

'恢复 Fence 原来的状态

With ActiveSettings

.FenceClip = saveClip

.FenceOverlap = saveOverlap

.FenceVoid = saveVoid

End With

End Sub

从上述示例代码可以看出,遍历围栅内的元素并对其进行操作,大致可以分为以下关

键的几步:

4、获得当前活动设计文件 ActiveDesignFile 的围栅对象 fnc;

5、 利用围栅对象 fnc 的 GetContents 方法获得选择集 ee;

6、 对选择集 ee 进行遍历,并对 ee 中的每个元素进行相应的操作。

这里关键的一个方法就是 GetContents,详细介绍如下:

GetContents 方法

创建并返回由围栅定义的元素集的选择集 ElementEnumerator。

该方法可能会改变设计文件,详见 VBA 帮助文档。

青岛市勘察测绘研究院 第 22 页 共 22 页

Page 23: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

该方法获得的元素取决于 Fence 的当前状态。

语法:

Set ElementEnumerator = object.GetContents [(CloneElementsIfClipping [,

IncludeLockedElements])]

参 数 描 述

object Fence 对象变量。

CloneElementsIfClipping 可选的,布尔变量。表示如果 Fence 置于剪切状态,如何处理

Fence 定义的元素。缺省值为 False。详见 VBA 帮助文档。

IncludeLockedElements

可选的,布尔变量。控制是否包括只读元素(锁定的元素和参

考文件中的元素)。如果元素不需修改,通常指定该参数为

TRUE。缺省值为 False。

按属性选择(Select By Attributes)

点击菜单[编辑] [根据属性选择],弹出以下界面:

用户可以根据层、元素类型、线型、颜色、Cell 名等属性选择元素。同样我们也可以通过

VBA 程序来实现类似的功能。

首先介绍 ElementScanCriteria 对象。该对象的相应方法可以指定层、元素类型、线

型、颜色等信息,我们把该对象作为扫描元素的一个标准(或依据),然后调用

青岛市勘察测绘研究院 第 23 页 共 23 页

Page 24: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

ActiveModelReference.Scan 方法,就可以把满足 ElementScanCriteria 标准的元素扫描出

来,并保存到一个选择集中。ElementScanCriteria 对象的方法主要是 ExcludeAll*和

Include*,前者用来排除某个属性的所有值,紧接着就用后者指定包括该属性的哪些值。

示例代码如下:

Dim mElement As Element

Dim mScanEnumerator As ElementEnumerator '定义层对象

Dim mLevel As Level

Set mLevel = ActiveDesignFile.Levels(1) '设置 mLevel 为 1 层

'定义元素选择标准对象

Dim oScanCriteria As ElementScanCriteria

Set oScanCriteria = New ElementScanCriteria

'包含哪些层(可以 Include 多个层),首先调用 ExcludeAllLevels

oScanCriteria.ExcludeAllLevels

oScanCriteria.IncludeLevel mLevel

'oScanCriteria.IncludeLevel ......

'包含哪些颜色

oScanCriteria.ExcludeAllColors

oScanCriteria.IncludeColor 2

'包含哪些元素类型(如果有多个类型,则用加号相连)

oScanCriteria.ExcludeAllTypes

oScanCriteria.IncludeType msdElementTypeArc + msdElementTypeCellHeader

'调用 Scan 进行扫描,并将返回的元素集赋给 mScanEnumerator 选择集

Set mScanEnumerator = ActiveModelReference.Scan(oScanCriteria)

'遍历 mScanEnumerator 选择集

Do While mScanEnumerator.MoveNext

Set mElement = mScanEnumerator.Current

'对当前元素进行操作

'......

Loop

Scan 方法

根据给定的扫描标准,对 Attachment、ElementCache 或 ModelReference 对象里的元

素进行扫描,生成 ElementEnumerator 选择集。

语法:

Set ElementEnumerator = object.Scan [(ScanCriteria)]

参 数 描 述

object Attachment、ElementCache 或 ModelReference 对象变量。指定在哪

个范围内搜索元素。

青岛市勘察测绘研究院 第 24 页 共 24 页

Page 25: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

ScanCriteria

可选的,ElementScanCriteria对象变量。限制哪些元素将被搜索出来,

并返回给ElementEnumerator选择集。

缺省值为 Nothing,结果将返回所有图形元素。

3.3 添加/创建元素

CadInputQueue 对象

第一章,我们在工程管理器中用录制宏来录制一段对图形的操作时,所有的键盘及鼠

标操作都被记录下来,由 CadInputQueue 对象的 SendCommand 或 SendKeyin 方法引用。下

面先了解一下 CadInputQueue 对象。

CadInputQueue 对象用于发送、接受 MicroStation 的 Keyin、命令及重置。程序用

SendCommand、SendDataPoint、 SendDragPoints、SendKeyin、SendLastInput、SendReset

或 SendTentativePoint 将输入发送给 MicroStation,用 GetInput 方法获得输入信息。

用 CadInputQueue 提供的方法可以实现 MicroStation 输入队列的处理,但是实现类似

标 准 MicroStation 命 令 最 好 的 方 式 还 是 引 用 IPrimitiveCommandEvents 或

IlocateCommandEvents 建立一个类。该内容将在接下来的“用户交互输入”予以详细介绍。

下面介绍 CadInputQueue 对象几个常用方法:

1、GetInput 方法

等待用户在 MicroStation Keyin 里或某一视图内的输入。

语法:

Set CadInputMessage = object.GetInput [(Type1 [, Type2 [, Type3 [, Type4]]])]

参 数 描 述

object CadInputQueue 对象变量。

Type1 可选的。用户输入类型 MsdCadInputType 枚举值。

Type2 可选的。用户输入类型 MsdCadInputType 枚举值。

Type3 可选的。用户输入类型 MsdCadInputType 枚举值。

Type4 可选的。用户输入类型 MsdCadInputType 枚举值。

说明:

GetInput 只有获得了合适的用户输入类型才会返回 CadInputMessage 值,可接受的用

户输入受可选参数的限制,如果未指定任何参数,则允许所有类型的输入。

青岛市勘察测绘研究院 第 25 页 共 25 页

Page 26: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

MsdCadInputType 枚举值

名 称 值

msdCadInputTypeCommand 1(&H1)

msdCadInputTypeReset 2(&H2)

msdCadInputTypeDataPoint 3(&H3)

msdCadInputTypeKeyin 4(&H4)

msdCadInputTypeAny 5(&H5)

msdCadInputTypeUnassignedCB 6(&H6)

CadInputMessage 对象

表示用户在 MicroStation Keyin 里或某一视图内的输入,也表示用程序产生的输入。

属 性 描 述

CommandKeyin

只读,字符串型。如果 CadInputMessage 代表命令,那么该值就是

MicroStation 在键入区输入的命令。

如果 IputType<> msdCadInputTypeKeyin 时不要调用该属性。

CursorButton 只读,长整型。

InputType 只读,MsdCadInputType 枚举型。表示输入类型。

Keyin

Point 只读,Point3d 型。返回用户输入或鼠标输入点的坐标。

ScreenPoint

View

示例代码:

Sub GetInput()

Dim oMessage As CadInputMessage

Application.ShowCommand "Running GetInput example"

Application.ShowPrompt "Enter any input. Enter reset to exit"

Application.ShowStatus ""

Do While True '循环,直到用户按下 Reset 键

Set oMessage = CadInputQueue.GetInput '获得用户输入

'判断用户输入,分别进行处理

Select Case oMessage.InputType

Case msdCadInputTypeKeyin

ShowStatus "Got the keyin: " & oMessage.Keyin

Case msdCadInputTypeCommand

ShowStatus "Got the command: " & oMessage.CommandKeyin

Case msdCadInputTypeReset

ShowStatus "got reset, will exit now"

青岛市勘察测绘研究院 第 26 页 共 26 页

Page 27: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

CommandState.StartDefaultCommand

Exit Sub

Case msdCadInputTypeDataPoint

Dim point As Point3d

point = oMessage.point

With point

ShowStatus "x = " & .x & ", y = " & .y & ", z = " & .Z

End With

End Select

Loop

End Sub

2、SendCommand 方法

发送一个字符串给 Microstation 输入对列,该字符串被解译成 Microstation 的命令。

语法:

object.SendCommand Command [, TreatLikeKeyboardInput]

参 数 描 述

object CadInputQueue 对象变量。

Command 字符串。Microstation 命令。

TreatLikeKeyboardInput 可选的。是否自动将 Microstation 界面上相应的图标按下。

例如:CadInputQueue.SendCommand "PLACE ARC ICON "

3、SendKeyin

发送一个 KeyIn 给 Microstation。相当于在键入区敲入命令。

语法:object.SendKeyin Keyin

参 数 描 述

object CadInputQueue 对象变量。

Keyin 字符串变量。

4、SendDataPoint

发送一个数据点给 Microstation。用该方法模拟用户输入坐标点,相当于鼠标左键的

作用。

语法:

object.SendDataPoint DataPoint [, ViewSpecifier [, Qualifier]]

青岛市勘察测绘研究院 第 27 页 共 27 页

Page 28: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

参 数 描 述

object CadInputQueue 对象变量。

DataPoint Point3d 变量。

ViewSpecifier 可选的。视图索引(1--8)或视图对象。

Qualifier 可选的。长整型。

示例代码:

Sub PlaceRedLines()

With CadInputQueue

Dim message As CadInputMessage

Dim pnt As Point3d

'发送给 Microstation 划线(place line)命令

.SendCommand "place line"

'.SendKeyin "place line" '也可以用 SendKeyin

pnt.x = 200: pnt.y = 200

.SendDataPoint pnt

pnt.x = 300: pnt.y = 300

.SendDataPoint pnt

.SendReset

End With

End Sub

5、SendReset

发送一个 Reset 给 Microstation。相当于鼠标右键的作用。

语法:object.SendReset

面向 Element 对象的代码方式

用 CadInputQueue 对象发送 Microstation 命令方式可以实现比如放置点符号、画线等

简单的功能,但是要想使程序具有灵活性,完成更加复杂的功能,就要利用 Element 对象

以及相关的创建元素的方法来实现。

基本思路是:

1、明确要创建哪种类型的元素,英文名称大概是什么;

2、创建元素,如果不知道方法,最好查 V8 VBA 帮助,在索引中输入关键词(创建元素的

方法一般以“Create”开头),马上定位到相应位置,然后选择合适的函数/方法,察看

更具体的帮助。

3、拷贝相应的函数到代码窗口,在函数后面敲空格或左括号,出现该函数的参数,逐一填

青岛市勘察测绘研究院 第 28 页 共 28 页

Page 29: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

上合适的参数。

4、函数会返回相应的元素 element 对象,将该对象加入到当前模型空间中:

ActiveModelReference.AddElement element。

5、调用 element.Rewrite 保存元素,element.Redraw 重绘图形。

下面以文本元素为例,分步讲解如下:

1、打开 VBA 编辑器,右键单击资源管理器,弹出菜单,选择[插入] [模块]

2、在代码窗口,建立一个叫 MyTest 的过程:输入 Sub MyTest(),回车后 VBA 自动在下一

行加上 End Sub。如图所示:

3、如果不清楚要创建的元素的英文名,可以随便找一个 DGN 图,按 Ctrl+I 查询任意一个

相同类型元素的属性,如果 Microstation 是英文版,则前面的单词就是元素类型,括

号里的数值为该类型的枚举值,如果是中文版,可以通过查找 MsdElementType 帮助查

到该元素的英文单词。如下图:

青岛市勘察测绘研究院 第 29 页 共 29 页

Page 30: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

4、用 V8 VBA 帮助,在索引中输入“createte”,查找创建 Text 的方法/函数,如下图:

注意:VBA 帮助提供的示例(Example)非常好,应充分利用,许多代码可以直接拷贝

过来,稍作修改就能为我所用。

5、编写代码,定义元素变量,输入 As 后,VBA 编辑器自动弹出对象类型提示,输入前几个

字母,就自动定位到相应位置,供用户选择,如下图所示:

注:可以直接定义为 TextElement,也可以定义成为一般的 Element。

元素类型(枚举值)

6、 创建元素

输入 Set oNewElement = ,然后粘贴刚才在 VBA 帮助中查到的创建文本元素的方法

CreateTextElement1,括号,弹出提示:

青岛市勘察测绘研究院 第 30 页 共 30 页

Page 31: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

如果仔细看了 CreateTextElement1 的说明及其示例程序,我们很快可以确定第一个参

数可以为 Nothing,第二个参数就是要写的文本字符串,第三个参数是在哪个位置写,第四

个参数为 Matrix3dIdentity。

7、添加到当前模型空间中。

ActiveModelReference.AddElement oNewElement

8、保存元素(即将元素写到实际的 DGN 文件中),重绘图形。

oNewElement.Rewrite

oNewElement.Redraw

9、将光标置于 MyTest 过程中,按下运行按钮(或按 F5 快捷键),然后切换到 Microstation

中察看运行结果。

完整代码如下:

Sub MyTest()

Dim oNewElement As Element

Set oNewElement = CreateTextElement1(Nothing, "测试文本", Point3dFromXY(100, 100),

Matrix3dIdentity)

’可以加上一些设置层、色等属性的代码

’……

ActiveModelReference.AddElement oNewElement

oNewElement.Rewrite

oNewElement.Redraw

End Sub

青岛市勘察测绘研究院 第 31 页 共 31 页

Page 32: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

用户交互输入

用 Microstation 的放置圆(Place Circle)工具创建一个元素的时候,在状态栏就出

现提示,告诉我们怎么做。用户输入数据点后,移动鼠标,圆的大小就呈现橡皮筋效果,

大小会动态的改变。

接下来我们就来看用程序如何处理用户的输入,从而实现特定的功能。除了用到前面

介绍过的 CadInputQueue 对象,还要用到放置元素时可以实现动态效果的 CommandState 对

象,以及用于处理用户交互的 IPrimitiveCommandEvents 接口。

CommandState 对象:

CommandState 用于执行一些自定义命令,实现类似于 Microstation 本身创建元素或修

改元素命令的功能。用户自定义命令会执行一个由 IPrimitiveCommandEvents 或

ILocateCommandEvents 实现的类。 如 果 自 定 义 命 令 用 来 创 建 元 素 , 则 用

IPrimitiveCommandEvents 接口;如果修改元素,就用 ILocateCommandEvents 接口。

Microstation 的命令分为视图操作命令、设置命令、元素创建/修改命令、实用命令。

视图操作命令:控制视图窗口的放大、缩小、全图等操作,如 FIT 和 WINDOW AREA 命

令。这些命令经常是需要用户鼠标点击视图窗口或拉框来获得数据点。这些命令在运行时

会将当前激活的创建或修改元素的命令挂起,视图操作命令结束时,挂起的命令会继续执

行。

设置命令:用于修改 Microstation 的当前的激活设置,如 ACTIVE COLOR 或 ACTIVE

LEVEL。

元素创建/修改命令:创建新元素的命令又叫基本(primitive)命令,它通过一个引

用 IPrimitiveCommandEvents 接口的类来实现。修改元素的命令又叫定位(locate)命令,

它通过一个引用 IPrimitiveCommandEvents 接口的类来实现。这样的命令总保持激活状态,

直到执行了另外一个元素创建/修改命令。用 VBA 程序结束元素创建/修改命令可以用

StartDefaultCommand 方法。

实用命令:如 COMPRESS DESIGN。

IPrimitiveCommandEvents 接口:

IPrimitiveCommandEvents接口的事件处理方法有:Keyin, DataPoint, Reset, Cleanup,

Dynamics 和 Start。

青岛市勘察测绘研究院 第 32 页 共 32 页

Page 33: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

用 “ CommandState.StartPrimitive New 类 名 ” 启 动 一 个 引 用 了

IPrimitiveCommandEvents 的类的实例(即对象),执行该用户自定义命令。和 Microstation

自身的元素创建/修改命令一样,也总保持激活状态,直到执行了另外一个元素创建/修改

命令。

CommandState 首先终止当前命令,为新命令建立默认环境,包括 Undo 边界、清除当前

高亮元素、重置精确绘图状态、调用前一个命令的 CleanUp 事件。初始化 Microstation 的

状态后,才调用该实例(对象)的 Start 事件。

Microstation 调用 Start 事件后,该自定义用户命令就成为当前的激活命令,直到

Microstation 调用了该命令的 CleanUp 事件。不管下一个命令是 Microstation 自身命令还

是用 VBA 或 MDL 创建的命令,Microstation 都会调用了该命令的 CleanUp 事件。

如果用户输入了数据点或单击 Reset 键,Microstation 会激发 DataPoint 事件或 Reset

事 件 。 要 使 移 动 鼠 标 时 具 有 橡 皮 筋 效 果 , 应 该 在 Start 事 件 中 用

CommandState.StartDynamics,这样每次在视图窗口中移动鼠标,都会激发 Dynamics 事件,

在该事件里编写代码,就可以实现橡皮筋效果。

IPrimitiveCommandEvents 接口的事件执行顺序为:

左键确认 DataPoint

右键放弃 CleanUp

鼠标移动 Dynamics

Reset

Start

前 一 个

命 令 的

CleanUp

下面用画多边形的例子来说明。

1、新建一个名称为 clsPlaceShape 的类模块,用于实现画多边形功能。

2、在模块或窗体里新建一过程,名称为 MyPlaceShape,在此过程中添加代码用

CommandState.StartPrimitive 调用 clsPlaceShape 类的实例。代码如下:

Sub MyPlaceShape()

CommandState.StartPrimitive New clsPlaceShape

End Sub

3、clsPlaceShape 的类模块代码:

Implements IPrimitiveCommandEvents ’引入 IPrimitiveCommandEvents 接口

Private pnts() As Point3d’定义多边形节点

Private m_intPntCounts As Integer’定义多边形节点个数

’类实例销毁前激发此事件

Private Sub IPrimitiveCommandEvents_Cleanup()

青岛市勘察测绘研究院 第 33 页 共 33 页

Page 34: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

End Sub

’点击鼠标左键时激发此事件

Private Sub IPrimitiveCommandEvents_DataPoint(Point As Point3d, ByVal View As View)

ReDim Preserve pnts(intPntCounts) ’用 Preserve 关键字,保存以前的多边形节点

pnts(intPntCounts) = Point

intPntCounts = intPntCounts + 1

CommandState.StartDynamics ’开始显示橡皮筋效果

End Sub

’鼠标移动时激发此事件,显示橡皮筋效果

Private Sub IPrimitiveCommandEvents_Dynamics(Point As Point3d, ByVal View As View, ByVal

DrawMode As MsdDrawingMode)

If intPntCounts > 1 Then

Dim ele As Element

Set ele = CreateShapeElement1(Nothing, pnts, msdFillModeUseActive)

ele.Redraw DrawMode ’临时画到图形区域

End If

End Sub

’如果键盘输入时,则激发此事件

Private Sub IPrimitiveCommandEvents_Keyin(ByVal Keyin As String)

End Sub

’右键结束命令时激发此事件

Private Sub IPrimitiveCommandEvents_Reset()

’画多边形,并保存到文件中

If intPntCounts > 0 Then AddShape pnts, msdDrawingModeNormal

CommandState.StartPrimitive Me ’重复该命令

intPntCounts = 0

ReDim pnts(0)

MsgBox "reset"

End Sub

’对象启动时激发此事件

Private Sub IPrimitiveCommandEvents_Start()

ShowCommand "放置 Block"

ShowPrompt "输入第一个点:"

CommandState.EnableAccuSnap ’使用捕捉

End Sub ’创建多边形

Private Function AddShape(points() As Point3d, intDrawMode As MsdDrawingMode) As

ShapeElement

Set AddShape = CreateShapeElement1(Nothing, points, msdFillModeUseActive)

ActiveModelReference.AddElement AddShape

AddShape.Redraw intDrawMode

End Function

3.4 删除元素

一般先将要删除的元素选择出来,生成一个选择集,然后在对该选择集的每个元素进

青岛市勘察测绘研究院 第 34 页 共 34 页

Page 35: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

行遍历时调用以下方法:object.RemoveElement Element

参 数 描 述

Object Attachment 或 ModelReference 对象变量。

Element Element 对象变量,表示要删除的元素。可以泛指元素,也可以特指

是哪种元素,比如 CellElement、LineStringElement 等。

说明:

RemoveElement 从屏幕上擦除了该元素,不必再调用 Redraw msdDrawingModeErase 来

刷新视图,也不必用 Rewrite 保存删除的结果。删除该元素后,不要试图对该元素进行其

他操作,否则会出错。

示例代码:

Do While mScanEnumerator.MoveNext

Set mElement = mScanEnumerator.Current

ActiveModelReference.RemoveElement mElement

Loop

3.5 修改元素

将某一元素的属性(如层、色、线型、线宽、Cell 名、原点等)赋予新的值,就可以

达到修改该元素的目的。注意:修改完,要用 Rewrite 方法保存所作的修改。

示例代码:

Dim ele As LineElement '定义线元素

Dim lvl As Level'定义层

Set lvl = ActiveModelReference.Levels("Level 1")

Dim ls As LineStyle '定义线型

Set ls = ActiveDesignFile.LineStyles("( Border )")

'修改线元素的属性

ele.Color = 2 '颜色改为 2 号色

Set ele.Level = lvl '层改为 1 层

Set ele.LineStyle = ls '线型改为( Border )

'保存修改的结果

ele.Rewrite

青岛市勘察测绘研究院 第 35 页 共 35 页

Page 36: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

练习题:

1、一文本文件保存了若干测量点的坐标及其点名,格式为“X,Y,点名”,请读取该文件,

在相应的(X,Y)位置放置 Cell(名称自定,放在 3 层 4 号色),并在右侧 10 个单位的

位置放置该点的点名(放在 4层 7号色),文字高度为 2.5。

2、手工选择若干元素,将其颜色改为 10 号色。

3、Fence 选中若干元素,将 Cell 元素的层改为 1层,而将文字删除。

4、打开一个 DGN 文件,将 4层 0号色的所有线元素导出到一个新的 DGN 文件中。

5、用户交互的方式实现画圆的功能,要求弹出窗口输入半径。

青岛市勘察测绘研究院 第 36 页 共 36 页

Page 37: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

第四章 常用对象介绍

围栅(Fence)

如何获得 Fence 里的元素,在第四章“4.2 选择元素”中已经有介绍,涉及到了

GetContens 方法。这里介绍另外几个常用的方法:

CreateElement 方法:

根据 Fence 图形创建一个元素,该元素可能为 Shape,也能为 Circel。

示例代码:

Dim fnc As Fence

Dim ele As Element

Set ele = fnc.CreateElement

Debug.Print ele.Type

DefineFromElement 方法:

根据一个已存在的元素创建 Fence。

示例代码:

Sub GetFenceElement(LBX As Single, LBY As Single, sngStep As Single)

'对每个格网形成的 FENCE 里面的元素进行处理

'格网左下角 X--LBX,左下角 Y--LBY,边长 sngStep

Dim fnc As Fence

Dim objEle_Shape As ShapeElement

Dim ee As ElementEnumerator

Dim objView As View

Dim objEle As Element

Dim ele As Element

Dim i As Integer

Set objView = ActiveDesignFile.Views(1)

Set fnc = ActiveDesignFile.Fence

’创建多边形

Dim points(0 To 4) As Point3d

points(0) = Point3dFromXY(LBX, LBY) '左下角

points(1) = Point3dFromXY(LBX + sngStep, LBY)

points(2) = Point3dFromXY(LBX + sngStep, LBY + sngStep)

points(3) = Point3dFromXY(LBX, LBY + sngStep)

points(4) = points(0)

Set objEle_Shape = CreateShapeElement1(Nothing, points, msdFillModeNotFilled)

’根据 objEle_Shape 元素,定义 Fence

fnc.DefineFromElement objView, objEle_Shape

’获得 Fence 里面的元素,遍历,处理

青岛市勘察测绘研究院 第 37 页 共 37 页

Page 38: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

Set ee = fnc.GetContents(True)

Do While ee.MoveNext

Set ele = ee.Current

’其他代码(省略)……

Loop

’其他代码(省略)……

Sub

另外,也经常用 Fence 实现 GIS 中的 Buffer 功能,比如搜索以某点为圆心,多少米范

围内部或搭界的所有文本元素,只要将上述代码稍作改动就可以了。

层(Level)

层是个对象,具有层索引号、层名等属性,可以控制层的打开、关闭等等。访问 DGN

文件的所有层,可以用 Levels 对象。

Level 常用属性、方法

属 性 描 述

Name 层名。

Number 层号。

IsActive 激活层。

IsDisplayed 控制层的显示。

示例代码: Dim lv As Level

Dim lvs As Levels

Set lvs = ActiveModelReference.Levels

MsgBox lvs.count, vbInformation, "层数"

'用层名引用

Set lv = lvs.Find("Level 3")

'用层号引用

Set lv = lvs.FindByNumber(3)

'直接引用 Levels 参数既可以用层名也可以用层号。

Set lv = ActiveModelReference.Levels(3) '激活该层,设置为当前层

lv.IsActive = True

基本元素(Cell、Linestring、Shape、Text)

CreateCellElement1 方法:

根据指定的元素创建一个 Cell。

青岛市勘察测绘研究院 第 38 页 共 38 页

Page 39: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

语法:

Set CellElement = object.CreateCellElement1 (Name, Elements, Origin [,

IsPointCell])

参 数 描 述

object Application 对象变量。可省略。

Name 字符串。赋予 Cell 的名字。

Elements Element()数组。构成 Cell 的若干元素。

Origin Cell 的原点。

IsPointCell 可选的。是否是点符号。

CreateCellElement2 方法:

从已连接的符号库中搜索指定的符号名添加 Cell 元素。

语法:

Set CellElement = object.CreateCellElement2 (CellName, Origin, Scale, TrueScale,

Rotation)

参 数 描 述

object Application 对象变量。可省略。

CellName 字符串。Cell 名。

Origin Point3d。Cell 的原点。

Scale Point3d。Cell 的比例。相当于 Keyin:AS=?设置当前比例。

TrueScale 可选的。表示当 DGN 文件或符号库的工作单位变化时,符号是否随

比例转换。

Rotation Matrix3d类型。元素旋转矩阵。如果无旋转,则为Matrix3dIdentity。

说明:

Scale:如 AS=2,则可以这样定义比例。

Dim pScale As Point3d

'CELL 的比例

pScale.x = 2

pScale.y = 2

pScale.Z = 2(如果是二维平面,则 Z 值会被忽略)

Rotation:3x3 的旋转矩阵。有多种方法可以构成旋转矩阵,详见 Matrix3d 的 V8 VBA

英文帮助。常用的方法之一是围绕某个坐标轴旋转多少度确定下来的旋转矩阵,函数为

Matrix3dFromAxisAndRotationAngle。代码如下:

青岛市勘察测绘研究院 第 39 页 共 39 页

Page 40: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

Dim oRotation As Matrix3d

oRotation = Matrix3dFromAxisAndRotationAngle(坐标轴, 旋转角度)

’坐标轴:0=x, 1=y, 2=z

’旋转角度单位是弧度,可以用 Radians(角度)函数转换。

CreateCellElement3 方法:

类似于 CreateCellElement2 方法,只是不指定比例和旋转矩阵。

语法:

Set CellElement = object.CreateCellElement3 (CellName, Origin, TrueScale)

CreateLineElement1 方法:

根据节点创建 LineElement 线元素,常用来创建线串。

语法:

Set LineElement = object.CreateLineElement1 (Template, Vertices)

参 数 描 述

object Application 对象变量。可省略。

Template

Element 类型。把已存在的元素看作模版,将其设置(如层、色、线

型等)赋予该元素。如果该参数为 Nothing,则创建的元素的设置采

用 Microstation 当前激活的设置。

Vertices Point3d 数组。线的节点。

CreateLineElement2 方法:

给定起点、终点创建 LineElement 线元素,常用来创建线段。

语法:

Set LineElement = object.CreateLineElement2 (Template, StartPoint, EndPoint)

参 数 描 述

object Application 对象变量。可省略。

Template

Element 类型。把已存在的元素看作模版,将其设置(如层、色、线

型等)赋予该元素。如果该参数为 Nothing,则创建的元素的设置采

用 Microstation 当前激活的设置。

StartPoint Point3d。起点。

EndPoint Point3d。终点。

CreateShapeElement1 方法:

根据节点创建多边形元素。

语法:

青岛市勘察测绘研究院 第 40 页 共 40 页

Page 41: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

Set ShapeElement = object.CreateShapeElement1 (Template, Vertices [, FillMode])

参 数 描 述

object Application 对象变量。可省略。

Template

Element 类型。把已存在的元素看作模版,将其设置(如层、色、线

型等)赋予该元素。如果该参数为 Nothing,则创建的元素的设置采

用 Microstation 当前激活的设置。

Vertices Point3d 数组。多边形节点。

FillMode 可选参数。MsdFillMode 常数。

CreateTextElement1 方法:

根据文本元素。

语法:

Set TextElement = object.CreateTextElement1 (Template, Text, Origin, Rotation)

参 数 描 述

object Application 对象变量。可省略。

Template

Element 类型。把已存在的元素看作模版,将其设置(如层、色、线

型等)赋予该元素。如果该参数为 Nothing,则创建的元素的设置采

用 Microstation 当前激活的设置。

Text 字符串。文本。

Origin Point3d。文本原点。

Rotation Matrix3d类型。元素旋转矩阵。如果无旋转,则为Matrix3dIdentity。

青岛市勘察测绘研究院 第 41 页 共 41 页

Page 42: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

第五章 DGN 文件操作

5.1 Application 对象

Application对象处于Microstation对象模型的最顶层,代表Microstation应用程序。

它的方法和属性都是全局的,在 VBA 工程的任何地方都可以用,而不需要 Application 对

象的显式引用,例如 ActiveModelReference 等同于 Application.ActiveModelReference。

可以通过 VB 来引用“Bentley Microstation DGN 8.0 Object Library”对象库,如下

图所示:

用下面的 VB 代码可以实现对 Microstation 应用程序的隐藏调用。

Dim appMS As MicroStationDGN.Application

Dim objDgnFile As MicroStationDGN.DesignFile

'创建 MicroStationDGN 应用程序的一个实例

Set appMS = New MicroStationDGN.Application

'使 MicroStationDGN 应用程序不可见

appMS.Visible = False

Set objDgnFile = appMS.OpenDesignFile("d:\test.dgn", False, msdV7ActionWorkmode)

'对 objDgnFile 设计文件的操作

'......

'......

objDgnFile.Close

'释放对象

Set objDgnFile = Nothing

Set appMS = Nothing

青岛市勘察测绘研究院 第 42 页 共 42 页

Page 43: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

在语法上 VB 和 VBA 完全一样,通常我们用在具体的应用软件环境中用 VBA 实现所需要

的功能,然后只需要做简单的改动,移植到 VB 中,用 VB 封装起来(因为 VBA 不能编译),

可以封装成为 EXE 可执行文件,也可以封装成 DLL 动态连接库,然后由 VBA 调用。但是,

运行这个 VB 程序时候也需要有应用软件环境,其实应用软件还是在后台运行的,你所操作

的就是当前应用软件打开的文件。

下面的代码就是以 Microstation V8 为父窗体的 VB 程序:

' 声明设置窗体为非模态的 Windows API 函数

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal

lpClassName As String, ByVal lpWindowName As Any) As Long

Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal

hWndNewParent As Long) As Long

Private Sub Form_Load()

Dim hwndMs, hWndForm As Variant

’找到 Microstation 应用程序句柄

hwndMs = FindWindow("MstnTop", 0&)

’当前窗体句柄

hWndForm = FindWindow(vbNullString, 窗体名.Caption)

’设置 Microstation 应用程序为当前窗体的父窗体

SetParent hWndForm, hwndMs

End Sub

5.2 DGN 文件属性

在 Microstation 中点击[文件] [属性],弹出以下对话框:

上述对话框里面的内容均可以用代码读取或修改,代码如下: 'ActiveDesignFile 表示当前打开的 DGN 文件

青岛市勘察测绘研究院 第 43 页 共 43 页

Page 44: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

With ActiveDesignFile

.Company = "青岛市勘察测绘研究院"

.Author = "信息中心"

.Client = "青岛市土地储备中心"

.Comments = "备注"

.Subject = "辽宁路定界"

.Keywords = "青岛 火车站 定界"

.Title = "青岛市土地储备中心辽宁路定界"

End With

5.3 DGN 文件操作

可以用程序打开 DGN 文件,有 2 种方式,直接打开和在内存中打开。还可以创建一个

DGN 文件。具体方法如下:

直接打开

OpenDesignFile 方法

语法:

Set DesignFile = object.OpenDesignFile (DesignFileName [, ReadOnly [, V7Action]])

参 数 描 述

Object Application 对象变量,通常省略。

DesignFileName 字符串变量,代表要打开的 DGN 文件名。如果不包括路径名,则搜索设

计文件的缺省位置;如果不包括扩展名,则自动为“.DGN”

ReadOnly 可选的。布尔变量。表示文件是否以只读方式打开。缺省值为 False,

即可读写方式。

V7Action

可选的。MsdV7Action 枚举变量的某个值。表示 V7 版本的 DGN 文件怎样

打开,该参数只有打开的文件是 V7 的并且 ReadOnly 为 False 才有效。

缺省值为 msdV7ActionAskUser。

说明:

OpenDesignFile返回刚刚打开的DesignFile对象,返回值等与ActiveDesignFile。

如果发生错误,有可能是该文件正在被其他程序打开。

如果要创建一个设计文件,而不是打开已存在的文件,应该用CreateDesignFile或

CopyDesignFile。

青岛市勘察测绘研究院 第 44 页 共 44 页

Page 45: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

在内存中打开

OpenDesignFileForProgram 方法

打开用程序控制的 DGN 文件。除非用程序调用 OpenDesignFileForProgram 方法,否则

用户不能直接操作该文件。

语法:

Set DesignFile = object.OpenDesignFileForProgram (DesignFileName [, ReadOnly])

参 数 描 述

Object Application 对象变量,通常省略。

DesignFileName 字符串变量。

ReadOnly 可选的。布尔变量。

说明:

如果 ReadOnly 参数为 False,但是用 OpenDesignFileForProgram 方法也不能对打开

的文件进行写操作,则它会尝试以只读方式打开。对该文件的任何模型用

ModelReference.IsReadOnly 可以确定该文件是否以只读方式打开的。

调用 DesignFile.Close 可以随时关闭打开的文件。如果调用 Close 方法后,还试图调

用 OpenDesignFileForProgram 返回的 DesignFile 对象的任何方法或属性(如调用文件的

层、元素、模型等),将出现错误。

如果没有调用 Close,一旦程序不再和 DesignFile 对象及其相关联的对象有联系的时

候,MicroStation 会自动关闭该文件。如果程序非正常退出,所有相关对象会自动释放,

由 MicroStation 关闭该文件。

向 OpenDesignFileForProgram 打开的文件里添加元素不能用 AddElement 方法,而要

用 CopyElement 方法。

对于用 OpenDesignFileForProgram 打开的文件模型不能用 ModelReference 的选择集

相关方法,否则会出错。

修改用OpenDesignFileForProgram打开的文件后,不会自动保存。当程序调用Rewrite

时,变化的元素保存到ElementCache里,而不是实际的文件里,需要调用Save方法将该修

改结果保存到DGN文件中。

示例代码:

青岛市勘察测绘研究院 第 45 页 共 45 页

Page 46: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

Dim objDgnFile As MicroStationDGN.DesignFile

’创建一个 DGN 文件

CreateDesignFile "seed2d", "D:\Test.dgn", False

’在内存中打开刚刚新建的文件

Set objDgnFile = OpenDesignFileForProgram("D:\Test.dgn")

’创建一个文本元素

Dim oNewElement As TextElement

Set oNewElement = CreateTextElement1(Nothing, "测试文本", Point3dFromXY(100, 100),

Matrix3dIdentity)

’将刚刚创建的文本元素添加到 objDgnFile 的第一个模型空间中

objDgnFile.Models(1).CopyElement oNewElement

’保存所作的修改

objDgnFile.Save

’关闭 objDgnFile 对象代表的文件,释放内存

objDgnFile.Close

Set objDgnFile = Nothing

创建 DGN 文件

CreateDesignFile 方法

根据种子文件创建一个 DGN 设计文件。

语法:

Set DesignFile = object.CreateDesignFile (SeedFileName, NewDesignFileName, Open)

参 数 描 述

object Application 对象变量,通常省略。

SeedFileName 字符串变量。种子文件名,不一定要包含路径。缺省后缀为“.DGN”。

比较典型的值是“Seed2d”或“Seed3d”。

NewDesignFileName

字符串变量。新建设计文件名。

如果不包含路径,则自动放到系统路径下;如果没有文件后缀,则自

动加上“.DGN”。

Open

布尔变量。表示新创建的文件是否创建后打开。(如果为 TRUE,则当

前文件首先被关闭)。

CreateDesignFile 返回值就取决于该参数,详见说明。

说明:

如果Open实参为TRUE,CreateDesignFile返回最近刚刚打开的DesignFile对象,该值

等与ActiveDesignFile;如果Open实参为FALSE,则CreateDesignFile返回值为Nothing。

如果想通过拷贝已有的文件来创建一个新文件,可以用 CopyDesignFile。

如果打开一个已有的 DGN 文件,可以用 OpenDesignFile。

青岛市勘察测绘研究院 第 46 页 共 46 页

Page 47: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

练习题:

1、 用 VB 创建一个 EXE 工程,引用 Microstation 对象库,创建一个 DGN 设计文件,并在

里面画一条起点(100,100),终点(200,200)的线,然后关闭 Microstation 应用程

序。

2、 用 VB 创建一个 DLL 工程,建立一个叫 clsCopyElement 的类,实现以下内容:打开上

述刚刚创建的 DGN 文件,将图上的线复制到一个新的 DGN 文件里。

3、 将上面的编写好的 DLL 工程编译成 DLL 文件,并在 V8 VBA 中引用该 DLL 文件,实现第

2步的功能。

青岛市勘察测绘研究院 第 47 页 共 47 页

Page 48: Microstation V8 VBA二次开发 - read.pudn.comread.pudn.com/downloads151/ebook/658844/... · Microstation V8 VBA二次开发培训教材 程管理器],打开工程管理器对话框。

Microstation V8 VBA 二次开发培训教材

第六章 参考文件的操作

第七章 MicroStation VBA 事件

第八章 VBA、MDL 交互

青岛市勘察测绘研究院 第 48 页 共 48 页