1、VB和VBA开发CAD的知识VB和VBA开发CAD的知识1、如何在 VB 中连接 AutoCAD。 启动 VB ,引用 AutoCAD 类型库。操作步骤:从“工程”菜单中选择“引用”选项,启动“引用”对话框。在“引用”对话框中,选择 AutoCAD 类型库,然后单击“确定”。定义模块级变量 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc)。如果 AutoCAD 正在运行,使用 GetObject 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行,使用 CreateObject 函数试图创建一个 AutoCAD Applica
2、tion 对象。如果创建成功,会启动 AutoCAD;如果失败,则会发生错误。同时运行多个 AutoCAD 任务时,GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。 要显示 AutoCAD 图形窗口,需要将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。 使用 acadDoc 变量引用当前的 AutoCAD 图形。示例:Dim acadApp As AcadApplicationDim acadDoc as AcadDocumentSub ConnectToAcad()On Error Resume NextSet acadApp
3、 = GetObject(, AutoCAD.Application)If Err ThenErr.ClearSet acadApp = CreateObject(AutoCAD.Application)If Err Then EndEnd IfacadApp.Visible = TrueSet acadDoc = acadApp.ActiveDocumentEnd Sub2、如何使 VB 开发的程序不依赖于 AutoCAD 的版本。 启动 VB ,定义模块级变量 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc)。如果 AutoCAD 正在运行,使用 GetObj
4、ect 函数将检索 AutoCAD Application 对象。如果 AutoCAD 没有运行,使用 CreateObject 函数试图创建一个 AutoCAD Application 对象。如果创建成功,会启动 AutoCAD;如果失败,则会发生错误。同时运行多个 AutoCAD 任务时,GetObject 函数会返回 Windows 运行对象表中的第一个 AutoCAD 实例。 要显示 AutoCAD 图形窗口,需要将 AutoCAD 应用程序的 Visible 特性设置为 TRUE。 使用 acadDoc 变量引用当前的 AutoCAD 图形。示例:Dim acadApp As Obj
5、ectDim acadDoc as ObjectSub ConnectToAcad()On Error Resume NextSet acadApp = GetObject(, AutoCAD.Application)If Err ThenErr.ClearSet acadApp = CreateObject(AutoCAD.Application)If Err Then EndEnd IfacadApp.Visible = TrueSet acadDoc = acadApp.ActiveDocumentEnd Sub 与第一个问题相比较,可以看出,不引用具体的类型库以及使用通用的对象类型就可
6、以达到通用性。3、前期绑定和后期绑定 要创建一个使用前期绑定方式的对象变量,也就是说,在程序编译时就完成绑定,则对象变量在声明时应指定类 ID,如:Dim acadApp As AcadApplication。 使用 As Object 子句声明对象变量,可以创建一个能包含任何类型对象引用的变量。不过,该变量访问对象是后期绑定的,也就是说,绑定在程序运行时才进行,如:Dim acadApp As Object。 前期绑定的变量引用可以提供更好的性能,但该变量只能存放声明中所指定的类的引用。 而后期绑定的变量引用可以提供更好的通用性。4、依赖于版本和独立于版本 如果 CreateObject 或
7、 GetObject 函数使用的 ProgID 没有附加版本号,那么是独立于版本的,否则是依赖于版本的。例如,如果使用的是 CreateObject,则 CreateObject (AutoCAD.Application) 是独立于版本的,而 CreateObject (AutoCAD.Application.15) 是依赖于版本的。5、VB 代码到 VBA 代码的转换 在 VBA 的 IDE 环境中,使用“导入文件”将要转换的 VB 工程的模块、类模块以及窗体文件一一导入。接着将 VB 代码中所有的当前的文档 (acadDoc) 变量替换为 ThisDrawing,而AutoCAD 应用程序
8、 (acadApp) 变量替换为 Application。同时删除定义的 AutoCAD 应用程序 (acadApp) 和当前的文档 (acadDoc) 变量,删除与 AutoCAD 应用程序连接的代码。注意:要转换 VB 代码的窗体部分,则窗体必须是用 UserForm 创建的。6、图形对象和非图形对象 图形对象(也称为图元、实体对象)是组成图形的可见对象(例如直线、圆、光栅图像等)。非图形对象是指属于图形的一部分但不可见的(提示性的)对象,例如 Layers、 Linetypes、 DimStyles、 SelectionSets 等等。要创建这些对象,可使用 Add 方法。每一个对象都有
9、用于特定目的的方法和特性,都有设置和检索扩展数据以及删除自己的方法。7、创建图形对象 图形对象是在 ModelSpace 集合、 PaperSpace 集合或 Block 对象中创建的。 使用变量 moSpace 设置为当前模型空间。本例使用 AddLightweightPolyline 方法创建一条分为两段的简单多段线,其端点坐标值分别是 (2,4)、(4,2) 和 (6,4)。Dim moSpace As AcadModelSpaceSet moSpace = acadDoc.ModelSpaceSub AddLightWeightPolyline()Dim plineObj As Aca
10、dLWPolylineDim points(0 To 5) As Double 定义二维多段线的点points(0) = 2: points(1) = 4points(2) = 4: points(3) = 2points(4) = 6: points(5) = 4 在模型空间中创建一个优化多段线对象Set plineObj = moSpace.AddLightWeightPolyline(points)End Sub8、变体型变量(Variant)和数组变体型变量是一种特殊的数据类型,可以包含任何类型的数据,固定长度的字符串数据和用户定义的类型除外。变量还可以包含特殊值 Empty、Erro
11、r、Nothing 和 NULL。可以使用 VarType 或 TypeName 函数来确定如何处理变量中的数据。变体型变量用于和 AutoCAD 传递数组数据。这表示使用对象的属性和方法时,如果输入数组作为参数,那么 VBA 自动将数组转换为变体型变量。此外,从函数或者对象的属性返回的数组数据也将自动转换为变体型变量进行处理。对第七个问题进行分析:points数组作为参数时,将自动转换成变体型变量,然后才进行生成多段线的操作。同时,如果返回点坐标的数组时,必须先定义一个变体型变量。示例:Dim moSpace As AcadModelSpaceSet moSpace = acadDoc.Mo
12、delSpaceSub AddLightWeightPolyline()Dim plineObj As AcadLWPolylineDim points(0 To 5) As Double 定义二维多段线的点points(0) = 2: points(1) = 4points(2) = 4: points(3) = 2points(4) = 6: points(5) = 4 在模型空间中创建一个优化多段线对象Set plineObj = moSpace.AddLightWeightPolyline(points) 等效于Dim vpoints As VariantVpoints=pointsS
13、et plineObj = moSpace.AddLightWeightPolyline(vpoints) 返回多段线的从标数组Dim vpoints As Variantvpoints = plineObj.Coordinates 比较 vpoints 和 points,它们的维数相同,元素个数相同,值也相同。End Sub9、系统变量Document 对象提供了 SetVariable 和 GetVariable 方法,分别用于设置和检索 AutoCAD 系统变量。例如,要将某个整数指定给 MAXSORT 系统变量,可设置为:acadDoc.SetVariable MAXSORT, 100
14、。针对第七个问题,如果想让多段线的起点从上一次绘图的终点开始。那么可以检索 LASTPOINT系统变量。示例:Dim moSpace As AcadModelSpaceSet moSpace = acadDoc.ModelSpaceSub AddLightWeightPolyline()Dim plineObj As AcadLWPolyline 返回上一次给图最后输入的点坐标Dim pt as VariantPt=acadDoc.GetVariable(“LASTPOINT”)Dim points(0 To 5) As Double 定义二维多段线的点points(0) = pt(0): p
15、oints(1) = pt(1)points(2) = 4: points(3) = 2points(4) = 6: points(5) = 4 在模型空间中创建一个优化多段线对象Set plineObj = moSpace.AddLightWeightPolyline(points)End Sub10、图形数据和属性数据图形对象(也称为图元)是组成图形的可见对象(例如直线、圆、光栅图像等)。属性数据是保存图形对象的信息,比如圆可以代表电杆,那么圆就要保存电杆的信息如类型、地址、高度等。11、随图形一起保存于文件的内部属性数据和保存于数据库的外部属性数据属性数据可以保存于文件内部,比如扩展数据
16、和扩展记录数据,它是随图形对象一起保存的,删除图形对象,将自动清除属性数据,因而管理方便。属性数据也可以保存于外部数据库,常见的有文件,如文本文件、Excel文件等,还有数据库,如Access、Oracle等,它需要人工手动进行管理,但数据的存取高效,通常是通过句柄来实现它们之间的联结。12、图形对象的句柄和ID号图形对象的句柄在一个文档内是唯一的、递增的、永久的,保存于图形数据库,而图形对象的ID号在当前打开的应用程序的多文档内是唯一的,但是是暂时的、变化的,它不保存于图形数据库,而是每次打开时重新生成一次,因而每次打开时的值也是不一样的。对于单文档的操作,可以使用Handle来返回图形对象
17、的句柄,而用HandleToObject来获取图形对象。而对于多文档的操作,可以使用ObjectID来返回图形对象的ID号,而用ObjectIDToObject来获取图形对象。13、扩展数据和扩展记录数据可以将扩展数据(XData)和扩展记录数据(XRecordData)用作链接信息与图形中对象的方式。扩展数据和扩展记录数据的区别是:扩展数据有16K存储空间的限制,并且使用1000及以上的组码值,而扩展记录数据则没有空间和顺序的限制,并且组码在1000以下。还有一个不同之处是可以在选择集中操作扩展数据。ACAD提供了SetXData和GetXData的函数来设置和返回扩展数据,通常扩展数据需要
18、提供一个已经注册的应用程序(RegisteredApplication)名称作为不同程序之间的数据区分。ACAD也提供了SetXRecordData和GetXRecordData的函数来设置和返回扩展记录数据,但是由于扩展记录数据是保存于扩展词典(ExtensionDictionary)中的,因而要用HasExtensionDictionary来判断是否包含扩展词典,而用GetExtensionDictionary来返回扩展词典,如不存在,它就会创建一个。再通过扩展词典的GetObject来返回扩展记录对象,AddXRecord添加一个扩展记录对象。示例:Sub Example_XData()
19、 这个例子创建一条直线,并且添加扩展数据 创建直线Dim lineObj As AcadLineDim startPt(0 To 2) As Double, endPt(0 To 2) As DoublestartPt(0) = 1#: startPt(1) = 1#: startPt(2) = 0#endPt(0) = 5#: endPt(1) = 5#: endPt(2) = 0#Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt) 初始化所有的扩展数据。注意第一个值必须是应用程序名称,而它的组码必须是1001。Dim D
20、ataType(0 To 9) As IntegerDim Data(0 To 9) As VariantDim reals3(0 To 2) As DoubleDim worldPos(0 To 2) As DoubleDataType(0) = 1001: Data(0) = Test_ApplicationDataType(1) = 1000: Data(1) = This is a test for xdataDataType(2) = 1003: Data(2) = 0 层DataType(3) = 1040: Data(3) = 1.23479137438413E+40 实数Dat
21、aType(4) = 1041: Data(4) = 1237324938 距离DataType(5) = 1070: Data(5) = 32767 16位整数DataType(6) = 1071: Data(6) = 32767 32位整数DataType(7) = 1042: Data(7) = 10 比例因子reals3(0) = -2.95: reals3(1) = 100: reals3(2) = -20DataType(8) = 1010: Data(8) = reals3 实数worldPos(0) = 4: worldPos(1) = 400.99999999: worldP
22、os(2) = 2.798989DataType(9) = 1011: Data(9) = worldPos world space position 在直线上附着扩展数据lineObj.SetXData DataType, Data 返回直线的扩展数据Dim xdataOut As VariantDim xtypeOut As VariantlineObj.GetXData , xtypeOut, xdataOutEnd Sub示例:Sub Example_XRecordData() 这个例子当扩展记录对象不存在时创建一个新的扩展记录对象,并且添加扩展记录数据。Dim TrackingDic
23、tionary As AcadDictionary, TrackingXRecord As AcadXRecordDim XRecordDataType As Variant, XRecordData As VariantDim ArraySize As Long, iCount As LongDim DataType As Integer, Data As String, msg As String Unique identifiers to distinguish our XRecordData from other XRecordDataConst TYPE_STRING = 1Cons
24、t TAG_DICTIONARY_NAME = ObjectTrackerDictionaryConst TAG_XRECORD_NAME = ObjectTrackerXRecord 连接扩展词典On Error GoTo CREATESet TrackingDictionary = ThisDrawing.Dictionaries(TAG_DICTIONARY_NAME)Set TrackingXRecord = TrackingDictionary.GetObject(TAG_XRECORD_NAME)On Error GoTo 0 返回当前的扩展记录数据TrackingXRecord.
25、GetXRecordData XRecordDataType, XRecordData If we dont have an array already then create oneIf VarType(XRecordDataType) And vbArray = vbArray ThenArraySize = UBound(XRecordDataType) + 1 返回扩展记录数据的元素个数ArraySize = ArraySize + 1 Increase to hold new dataReDim Preserve XRecordDataType(0 To ArraySize)ReDi
26、m Preserve XRecordData(0 To ArraySize)ElseArraySize = 0ReDim XRecordDataType(0 To ArraySize) As IntegerReDim XRecordData(0 To ArraySize) As VariantEnd If 添加新的扩展记录数据 For this sample we only append the current time to the XRecordXRecordDataType(ArraySize) = TYPE_STRING: XRecordData(ArraySize) = CStr(N
27、ow)TrackingXRecord.SetXRecordData XRecordDataType, XRecordData Read back all XRecordData entriesTrackingXRecord.GetXRecordData XRecordDataType, XRecordDataArraySize = UBound(XRecordDataType) Retrieve and display stored XRecordDataFor iCount = 0 To ArraySize Get information for this elementDataType =
28、 XRecordDataType(iCount)Data = XRecordData(iCount)If DataType = TYPE_STRING Thenmsg = msg & Data & vbCrLfEnd IfNextMsgBox The data in the XRecord is: & vbCrLf & vbCrLf & msg, vbInformationExit SubCREATE: Create the entities that hold our XRecordDataIf TrackingDictionary Is Nothing Then Make sure we
29、have our tracking objectSet TrackingDictionary = ThisDrawing.Dictionaries.Add(TAG_DICTIONARY_NAME)Set TrackingXRecord = TrackingDictionary.AddXRecord(TAG_XRECORD_NAME)End IfResumeEnd Sub以下是一些在开发人员手册中的关于扩展数据的示例。将扩展数据指定给选择集中的所有对象本例提示用户选择图形中的对象,然后将选定的对象置于选择集中,并且指定的扩展数据将附着到该选择集中的所有对象。Sub Ch10_AttachXDat
30、aToSelectionSetObjects() 创建选择集Dim sset As ObjectSet sset = ThisDrawing.SelectionSets.Add(SS1) 提示用户选择对象sset.SelectOnScreen 定义扩展数据Dim appName As String, xdataStr As StringappName = MY_APPxdataStr = This is some xdataDim xdataType(0 To 1) As IntegerDim xdata(0 To 1) As Variant 为每个数组定义值1001 指示 appNamexd
31、ataType(0) = 1001xdata(0) = appName1000 指示字符串值xdataType(1) = 1000xdata(1) = xdataStr 遍历选择集中的所有图元 将扩展数据设置和指定给每个图元Dim ent As ObjectFor Each ent In ssetent.SetXData xdataType, xdataNext entEnd Sub查看选择集中所有对象的扩展数据本例显示上例所附着的扩展数据。如果附着的扩展数据不是字符串(类型 1000)类型,则需要修改此代码。Sub Ch10_ViewXData() 查找上例中创建的选择集Dim sset As ObjectSet sset = ThisDrawing.Selecti
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1