VB和VBA开发CAD的知识.docx
- 文档编号:30702838
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:33
- 大小:29.34KB
VB和VBA开发CAD的知识.docx
《VB和VBA开发CAD的知识.docx》由会员分享,可在线阅读,更多相关《VB和VBA开发CAD的知识.docx(33页珍藏版)》请在冰豆网上搜索。
VB和VBA开发CAD的知识
VB和VBA开发CAD的知识
1、如何在VB中连接AutoCAD。
启动VB,引用AutoCAD类型库。
操作步骤:
从“工程”菜单中选择“引用”选项,启动“引用”对话框。
在“引用”对话框中,选择AutoCAD类型库,然后单击“确定”。
定义模块级变量AutoCAD应用程序(acadApp)和当前的文档(acadDoc)。
如果AutoCAD正在运行,使用GetObject函数将检索AutoCADApplication对象。
如果AutoCAD没有运行,使用CreateObject函数试图创建一个AutoCADApplication对象。
如果创建成功,会启动AutoCAD;如果失败,则会发生错误。
同时运行多个AutoCAD任务时,GetObject函数会返回Windows运行对象表中的第一个AutoCAD实例。
要显示AutoCAD图形窗口,需要将AutoCAD应用程序的Visible特性设置为TRUE。
使用acadDoc变量引用当前的AutoCAD图形。
示例:
DimacadAppAsAcadApplication
DimacadDocasAcadDocument
SubConnectToAcad()
OnErrorResumeNext
SetacadApp=GetObject(,"AutoCAD.Application")
IfErrThen
Err.Clear
SetacadApp=CreateObject("AutoCAD.Application")
IfErrThenEnd
EndIf
acadApp.Visible=True
SetacadDoc=acadApp.ActiveDocument
EndSub
2、如何使VB开发的程序不依赖于AutoCAD的版本。
启动VB,定义模块级变量AutoCAD应用程序(acadApp)和当前的文档(acadDoc)。
如果AutoCAD正在运行,使用GetObject函数将检索AutoCADApplication对象。
如果AutoCAD没有运行,使用CreateObject函数试图创建一个AutoCADApplication对象。
如果创建成功,会启动AutoCAD;如果失败,则会发生错误。
同时运行多个AutoCAD任务时,GetObject函数会返回Windows运行对象表中的第一个AutoCAD实例。
要显示AutoCAD图形窗口,需要将AutoCAD应用程序的Visible特性设置为TRUE。
使用acadDoc变量引用当前的AutoCAD图形。
示例:
DimacadAppAsObject
DimacadDocasObject
SubConnectToAcad()
OnErrorResumeNext
SetacadApp=GetObject(,"AutoCAD.Application")
IfErrThen
Err.Clear
SetacadApp=CreateObject("AutoCAD.Application")
IfErrThenEnd
EndIf
acadApp.Visible=True
SetacadDoc=acadApp.ActiveDocument
EndSub
与第一个问题相比较,可以看出,不引用具体的类型库以及使用通用的对象类型就可以达到通用性。
3、前期绑定和后期绑定
要创建一个使用前期绑定方式的对象变量,也就是说,在程序编译时就完成绑定,则对象变量在声明时应指定类ID,如:
DimacadAppAsAcadApplication。
使用AsObject子句声明对象变量,可以创建一个能包含任何类型对象引用的变量。
不过,该变量访问对象是后期绑定的,也就是说,绑定在程序运行时才进行,如:
DimacadAppAsObject。
前期绑定的变量引用可以提供更好的性能,但该变量只能存放声明中所指定的类的引用。
而后期绑定的变量引用可以提供更好的通用性。
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方法。
每一个对象都有用于特定目的的方法和特性,都有设置和检索扩展数据以及删除自己的方法。
7、创建图形对象
图形对象是在ModelSpace集合、PaperSpace集合或Block对象中创建的。
使用变量moSpace设置为当前模型空间。
本例使用AddLightweightPolyline方法创建一条分为两段的简单多段线,其端点坐标值分别是(2,4)、(4,2)和(6,4)。
DimmoSpaceAsAcadModelSpace
SetmoSpace=acadDoc.ModelSpace
SubAddLightWeightPolyline()
DimplineObjAsAcadLWPolyline
Dimpoints(0To5)AsDouble
'定义二维多段线的点
points(0)=2:
points
(1)=4
points
(2)=4:
points(3)=2
points(4)=6:
points(5)=4
'在模型空间中创建一个优化多段线对象
SetplineObj=moSpace.AddLightWeightPolyline(points)
EndSub
8、变体型变量(Variant)和数组
变体型变量是一种特殊的数据类型,可以包含任何类型的数据,固定长度的字符串数据和用户定义的类型除外。
变量还可以包含特殊值Empty、Error、Nothing和NULL。
可以使用VarType或TypeName函数来确定如何处理变量中的数据。
变体型变量用于和AutoCAD传递数组数据。
这表示使用对象的属性和方法时,如果输入数组作为参数,那么VBA自动将数组转换为变体型变量。
此外,从函数或者对象的属性返回的数组数据也将自动转换为变体型变量进行处理。
对第七个问题进行分析:
points数组作为参数时,将自动转换成变体型变量,然后才进行生成多段线的操作。
同时,如果返回点坐标的数组时,必须先定义一个变体型变量。
示例:
DimmoSpaceAsAcadModelSpace
SetmoSpace=acadDoc.ModelSpace
SubAddLightWeightPolyline()
DimplineObjAsAcadLWPolyline
Dimpoints(0To5)AsDouble
'定义二维多段线的点
points(0)=2:
points
(1)=4
points
(2)=4:
points(3)=2
points(4)=6:
points(5)=4
'在模型空间中创建一个优化多段线对象
SetplineObj=moSpace.AddLightWeightPolyline(points)
‘等效于
‘DimvpointsAsVariant
‘Vpoints=points
‘SetplineObj=moSpace.AddLightWeightPolyline(vpoints)
‘返回多段线的从标数组
‘DimvpointsAsVariant
‘vpoints=plineObj.Coordinates
‘比较vpoints和points,它们的维数相同,元素个数相同,值也相同。
EndSub
9、系统变量
Document对象提供了SetVariable和GetVariable方法,分别用于设置和检索AutoCAD系统变量。
例如,要将某个整数指定给MAXSORT系统变量,可设置为:
acadDoc.SetVariable"MAXSORT",100。
针对第七个问题,如果想让多段线的起点从上一次绘图的终点开始。
那么可以检索LASTPOINT系统变量。
示例:
DimmoSpaceAsAcadModelSpace
SetmoSpace=acadDoc.ModelSpace
SubAddLightWeightPolyline()
DimplineObjAsAcadLWPolyline
‘返回上一次给图最后输入的点坐标
DimptasVariant
Pt=acadDoc.GetVariable(“LASTPOINT”)
Dimpoints(0To5)AsDouble
'定义二维多段线的点
points(0)=pt(0):
points
(1)=pt
(1)
points
(2)=4:
points(3)=2
points(4)=6:
points(5)=4
'在模型空间中创建一个优化多段线对象
SetplineObj=moSpace.AddLightWeightPolyline(points)
EndSub
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添加一个扩展记录对象。
示例:
SubExample_XData()
'这个例子创建一条直线,并且添加扩展数据
'创建直线
DimlineObjAsAcadLine
DimstartPt(0To2)AsDouble,endPt(0To2)AsDouble
startPt(0)=1#:
startPt
(1)=1#:
startPt
(2)=0#
endPt(0)=5#:
endPt
(1)=5#:
endPt
(2)=0#
SetlineObj=ThisDrawing.ModelSpace.AddLine(startPt,endPt)
'初始化所有的扩展数据。
注意第一个值必须是应用程序名称,而它的组码必须是1001。
DimDataType(0To9)AsInteger
DimData(0To9)AsVariant
Dimreals3(0To2)AsDouble
DimworldPos(0To2)AsDouble
DataType(0)=1001:
Data(0)="Test_Application"
DataType
(1)=1000:
Data
(1)="Thisisatestforxdata"
DataType
(2)=1003:
Data
(2)="0"'层
DataType(3)=1040:
Data(3)=1.23479137438413E+40'实数
DataType(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)=-20
DataType(8)=1010:
Data(8)=reals3'实数
worldPos(0)=4:
worldPos
(1)=400.99999999:
worldPos
(2)=2.798989
DataType(9)=1011:
Data(9)=worldPos'worldspaceposition
'在直线上附着扩展数据
lineObj.SetXDataDataType,Data
'返回直线的扩展数据
DimxdataOutAsVariant
DimxtypeOutAsVariant
lineObj.GetXData"",xtypeOut,xdataOut
EndSub
示例:
SubExample_XRecordData()
'这个例子当扩展记录对象不存在时创建一个新的扩展记录对象,并且添加扩展记录数据。
DimTrackingDictionaryAsAcadDictionary,TrackingXRecordAsAcadXRecord
DimXRecordDataTypeAsVariant,XRecordDataAsVariant
DimArraySizeAsLong,iCountAsLong
DimDataTypeAsInteger,DataAsString,msgAsString
'UniqueidentifierstodistinguishourXRecordDatafromotherXRecordData
ConstTYPE_STRING=1
ConstTAG_DICTIONARY_NAME="ObjectTrackerDictionary"
ConstTAG_XRECORD_NAME="ObjectTrackerXRecord"
'连接扩展词典
OnErrorGoToCREATE
SetTrackingDictionary=ThisDrawing.Dictionaries(TAG_DICTIONARY_NAME)
SetTrackingXRecord=TrackingDictionary.GetObject(TAG_XRECORD_NAME)
OnErrorGoTo0
'返回当前的扩展记录数据
TrackingXRecord.GetXRecordDataXRecordDataType,XRecordData
'Ifwedon'thaveanarrayalreadythencreateone
IfVarType(XRecordDataType)AndvbArray=vbArrayThen
ArraySize=UBound(XRecordDataType)+1'返回扩展记录数据的元素个数
ArraySize=ArraySize+1'Increasetoholdnewdata
ReDimPreserveXRecordDataType(0ToArraySize)
ReDimPreserveXRecordData(0ToArraySize)
Else
ArraySize=0
ReDimXRecordDataType(0ToArraySize)AsInteger
ReDimXRecordData(0ToArraySize)AsVariant
EndIf
'添加新的扩展记录数据
'ForthissampleweonlyappendthecurrenttimetotheXRecord
XRecordDataType(ArraySize)=TYPE_STRING:
XRecordData(ArraySize)=CStr(Now)
TrackingXRecord.SetXRecordDataXRecordDataType,XRecordData
'ReadbackallXRecordDataentries
TrackingXRecord.GetXRecordDataXRecordDataType,XRecordData
ArraySize=UBound(XRecordDataType)
'RetrieveanddisplaystoredXRecordData
ForiCount=0ToArraySize
'Getinformationforthiselement
DataType=XRecordDataType(iCount)
Data=XRecordData(iCount)
IfDataType=TYPE_STRINGThen
msg=msg&Data&vbCrLf
EndIf
Next
MsgBox"ThedataintheXRecordis:
"&vbCrLf&vbCrLf&msg,vbInformation
ExitSub
CREATE:
'CreatetheentitiesthatholdourXRecordData
IfTrackingDictionaryIsNothingThen'Makesurewehaveourtrackingobject
SetTrackingDictionary=ThisDrawing.Dictionaries.Add(TAG_DICTIONARY_NAME)
SetTrackingXRecord=TrackingDictionary.AddXRecord(TAG_XRECORD_NAME)
EndIf
Resume
EndSub
以下是一些在开发人员手册中的关于扩展数据的示例。
将扩展数据指定给选择集中的所有对象
本例提示用户选择图形中的对象,然后将选定的对象置于选择集中,并且指定的扩展数据将附着到该选择集中的所有对象。
SubCh10_AttachXDataToSelectionSetObjects()
'创建选择集
DimssetAsObject
Setsset=ThisDrawing.SelectionSets.Add("SS1")
'提示用户选择对象
sset.SelectOnScreen
'定义扩展数据
DimappNameAsString,xdataStrAsString
appName="MY_APP"
xdataStr="Thisissomexdata"
DimxdataType(0To1)AsInteger
Dimxdata(0To1)AsVariant
'为每个数组定义值
'1001指示appName
xdataType(0)=1001
xdata(0)=appName
'1000指示字符串值
xdataType
(1)=1000
xdata
(1)=xdataStr
'遍历选择集中的所有图元
'将扩展数据设置和指定给每个图元
DimentAsObject
ForEachentInsset
ent.SetXDataxdataType,xdata
Nextent
EndSub
查看选择集中所有对象的扩展数据
本例显示上例所附着的扩展数据。
如果附着的扩展数据不是字符串(类型1000)类型,则需要修改此代码。
SubCh10_ViewXData()
'查找上例中创建的选择集
DimssetAsObject
Setsset=ThisDrawing.Selecti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB VBA 开发 CAD 知识
![提示](https://static.bdocx.com/images/bang_tan.gif)