关于VB和VBA开发CAD的一些知识
(2009-05-31 21:07:34)
标签:
杂谈 |
分类: VB |
[转帖]关于VB和VBA开发CAD的一些知识(全集)关于VB和VBA开发CAD的一些知识(一)编者:尹凡(efan2000) 时间:2003年4月
1、如何在 VB 中连接 AutoCAD。启动 VB ,引用 AutoCAD 类型库。操作步骤:从“工程”菜单中选择“引用”选项,启动“引用”对话框。在“引用”对话框中,选择 AutoCAD 类型库,然后单击“确定”。 定义模块级变量 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc)。如果 AutoCAD 正在运行,使用 GetObject 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行,使用 CreateObject 函数试图创建一个 AutoCAD Application 对象。如果创建成功,会启动 AutoCAD;如果失败,则会发生错误。 同时运行多个 AutoCAD 任务时,GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。要显示 AutoCAD 图形窗口,需要将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。 使用 acadDoc 变量引用当前的 AutoCAD 图形。 示例: Dim acadApp As AcadApplication Dim acadDoc as AcadDocument Sub ConnectToAcad()
On Error Resume Next Set acadApp = GetObject(, "AutoCAD.Application") If Err Then Err.Clear Set acadApp = CreateObject("AutoCAD.Application") If Err Then End End If acadApp.Visible = True Set acadDoc = acadApp.ActiveDocument End Sub
2、如何使 VB 开发的程序不依赖于 AutoCAD 的版本。启动 VB ,定义模块级变量 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc)。如果 AutoCAD 正在运行,使用 GetObject 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行,使用 CreateObject 函数试图创建一个 AutoCAD Application 对象。如果创建成功,会启动 AutoCAD;如果失败,则会发生错误。 同时运行多个 AutoCAD 任务时,GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。要显示 AutoCAD 图形窗口,需要将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。 使用 acadDoc 变量引用当前的 AutoCAD 图形。 示例: Dim acadApp As Object Dim acadDoc as Object Sub ConnectToAcad()
On Error Resume Next Set acadApp = GetObject(, "AutoCAD.Application") If Err Then Err.Clear Set acadApp = CreateObject("AutoCAD.Application") If Err Then End End If acadApp.Visible = True Set acadDoc = acadApp.ActiveDocument End Sub 与第一个问题相比较,可以看出,不引用具体的类型库以及使用通用的对象类型就可以达到通用性。
3、前期绑定和后期绑定要创建一个使用前期绑定方式的对象变量,也就是说,在程序编译时就完成绑定,则对象变量在声明时应指定类 ID,如:Dim acadApp As AcadApplication。使用 As Object 子句声明对象变量,可以创建一个能包含任何类型对象引用的变量。不过,该变量访问对象是后期绑定的,也就是说,绑定在程序运行时才进行,如:Dim acadApp As Object。前期绑定的变量引用可以提供更好的性能,但该变量只能存放声明中所指定的类的引用。而后期绑定的变量引用可以提供更好的通用性。
4、依赖于版本和独立于版本如果 CreateObject 或 GetObject 函数使用的 ProgID 没有附加版本号,那么是独立于版本的,否则是依赖于版本的。例如,如果使用的是 CreateObject,则 CreateObject ("AutoCAD.Application") 是独立于版本的,而 CreateObject ("AutoCAD.Application.15") 是依赖于版本的。
5、VB 代码到 VBA 代码的转换在 VBA 的 IDE 环境中,使用“导入文件”将要转换的 VB 工程的模块、类模块以及窗体文件一一导入。接着将 VB 代码中所有的当前的文档 (acadDoc) 变量替换为 ThisDrawing,而AutoCAD 应用程序 (acadApp) 变量替换为 Application。同时删除定义的 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc) 变量,删除与 AutoCAD 应用程序连接的代码。注意:要转换 VB 代码的窗体部分,则窗体必须是用 UserForm 创建的。
6、图形对象和非图形对象图形对象(也称为图元、实体对象)是组成图形的可见对象(例如直线、圆、光栅图像等)。非图形对象是指属于图形的一部分但不可见的(提示性的)对象,例如 Layers、 Linetypes、 DimStyles、 SelectionSets 等等。要创建这些对象,可使用 Add 方法。每一个对象都有用于特定目的的方法和特性,都有设置和检索扩展数据以及删除自己的方法。
(未完待续)如果大家有什么好的建议和要求,可以提出来,也希望大家来共同完善和改进。
--------------------------------------------------------------------------------
关于VB和VBA开发CAD的一些知识(二)编者:尹凡(efan2000) 时间:2003年4月
7、创建图形对象图形对象是在 ModelSpace 集合、 PaperSpace 集合或 Block 对象中创建的。使用变量 moSpace 设置为当前模型空间。 本例使用 AddLightweightPolyline 方法创建一条分为两段的简单多段线,其端点坐标值分别是 (2,4)、(4,2) 和 (6,4)。 Dim moSpace As AcadModelSpace Set moSpace = acadDoc.ModelSpace Sub AddLightWeightPolyline() Dim plineObj As AcadLWPolyline Dim points(0 To 5) As Double
' 定义二维多段线的点 points(0) = 2: points(1) = 4 points(2) = 4: points(3) = 2 points(4) = 6: points(5) = 4
' 在模型空间中创建一个优化多段线对象 Set plineObj = moSpace.AddLightWeightPolyline(points) End Sub
8、变体型变量(Variant)和数组变体型变量是一种特殊的数据类型,可以包含任何类型的数据,固定长度的字符串数据和用户定义的类型除外。变量还可以包含特殊值 Empty、Error、Nothing 和 NULL。可以使用 VarType 或 TypeName 函数来确定如何处理变量中的数据。 变体型变量用于和 AutoCAD 传递数组数据。这表示使用对象的属性和方法时,如果输入数组作为参数,那么 VBA 自动将数组转换为变体型变量。此外,从函数或者对象的属性返回的数组数据也将自动转换为变体型变量进行处理。对第七个问题进行分析:points数组作为参数时,将自动转换成变体型变量,然后才进行生成多段线的操作。同时,如果返回点坐标的数组时,必须先定义一个变体型变量。示例: Dim moSpace As AcadModelSpace Set moSpace = acadDoc.ModelSpace Sub AddLightWeightPolyline() Dim plineObj As AcadLWPolyline Dim points(0 To 5) As Double
' 定义二维多段线的点 points(0) = 2: points(1) = 4 points(2) = 4: points(3) = 2 points(4) = 6: points(5) = 4
' 在模型空间中创建一个优化多段线对象 Set plineObj = moSpace.AddLightWeightPolyline(points)
‘ 等效于 ‘Dim vpoints As Variant ‘Vpoints=points ‘Set plineObj = moSpace.AddLightWeightPolyline(vpoints)
‘ 返回多段线的从标数组 ‘Dim vpoints As Variant ‘vpoints = plineObj.Coordinates
‘ 比较 vpoints 和 points,它们的维数相同,元素个数相同,值也相同。 End Sub
9、系统变量 Document 对象提供了 SetVariable 和 GetVariable 方法,分别用于设置和检索 AutoCAD 系统变量。例如,要将某个整数指定给 MAXSORT 系统变量,可设置为:acadDoc.SetVariable "MAXSORT", 100。针对第七个问题,如果想让多段线的起点从上一次绘图的终点开始。那么可以检索 LASTPOINT系统变量。示例: Dim moSpace As AcadModelSpace Set moSpace = acadDoc.ModelSpace Sub AddLightWeightPolyline() Dim plineObj As AcadLWPolyline
‘ 返回上一次给图最后输入的点坐标 Dim pt as Variant Pt=acadDoc.GetVariable(“LASTPOINT”)
Dim points(0 To 5) As Double
' 定义二维多段线的点 points(0) = pt(0): points(1) = pt(1) points(2) = 4: points(3) = 2 points(4) = 6: points(5) = 4
' 在模型空间中创建一个优化多段线对象 Set plineObj = moSpace.AddLightWeightPolyline(points) End Sub
(未完待续)如果大家有什么好的建议和要求,可以提出来,也希望大家来共同完善和改进。
--------------------------------------------------------------------------------
关于VB和VBA开发CAD的一些知识(三)编者:尹凡(efan2000) 时间:2003年5月
10、图形数据和属性数据图形对象(也称为图元)是组成图形的可见对象(例如直线、圆、光栅图像等)。属性数据是保存图形对象的信息,比如圆可以代表电杆,那么圆就要保存电杆的信息如类型、地址、高度等。
11、随图形一起保存于文件的内部属性数据和保存于数据库的外部属性数据属性数据可以保存于文件内部,比如扩展数据和扩展记录数据,它是随图形对象一起保存的,删除图形对象,将自动清除属性数据,因而管理方便。属性数据也可以保存于外部数据库,常见的有文件,如文本文件、Excel文件等,还有数据库,如Access、Oracle等,它需要人工手动进行管理,但数据的存取高效,通常是通过句柄来实现它们之间的联结。
12、图形对象的句柄和ID号图形对象的句柄在一个文档内是唯一的、递增的、永久的,保存于图形数据库,而图形对象的ID号在当前打开的应用程序的多文档内是唯一的,但是是暂时的、变化的,它不保存于图形数据库,而是每次打开时重新生成一次,因而每次打开时的值也是不一样的。对于单文档的操作,可以使用Handle来返回图形对象的句柄,而用HandleToObject来获取图形对象。而对于多文档的操作,可以使用ObjectID来返回图形对象的ID号,而用ObjectIDToObject来获取图形对象。
13、扩展数据和扩展记录数据可以将扩展数据(XData)和扩展记录数据(XRecordData)用作链接信息与图形中对象的方式。扩展数据和扩展记录数据的区别是:扩展数据有16K存储空间的限制,并且使用1000及以上的组码值,而扩展记录数据则没有空间和顺序的限制,并且组码在1000以下。还有一个不同之处是可以在选择集中操作扩展数据。ACAD提供了SetXData和GetXData的函数来设置和返回扩展数据,通常扩展数据需要提供一个已经注册的应用程序(RegisteredApplication)名称作为不同程序之间的数据区分。ACAD也提供了SetXRecordData和GetXRecordData的函数来设置和返回扩展记录数据,但是由于扩展记录数据是保存于扩展词典(ExtensionDictionary)中的,因而要用HasExtensionDictionary来判断是否包含扩展词典,而用GetExtensionDictionary来返回扩展词典,如不存在,它就会创建一个。再通过扩展词典的GetObject来返回扩展记录对象,AddXRecord添加一个扩展记录对象。
code:
示例: Sub
Example_XRecordData()