AutoCADR14与VB
2006-02-27 11:43:42 来源:WEB开发网核心提示:前言在AutoCADR14发展工具中,VBA算是最让程式发展人员注目,AutoCADR14与VB,全新的发展介面加上与MicrosoftOffice使用相同发展语言,对於我们这些发展人员,另外Autodesk并未宣布AutoCADR14支援VirtualBasic,因此若您选择VirtualBasic来开发程式也许会面
前言在AutoCADR14发展工具中,VBA算是最让程式发展人员注目,全新的发展介面加上与MicrosoftOffice使用相同发展语言,对於我们这些发展人员,可真是一大震撼,不过在高兴之余却听说目前这版
AutoCADR14只支援VBA而不支援VirtualBasic,需要到R14下一版才支援,实在令人失望。
如果您也曾因听说R14不支援VirtualBasic而放弃VirtualBasic,那您可错过一个快速且容易的发展语言,笔者在一次与同事闲聊的偶然机会中意外发现,VirtualBasic可以当做AutoCADR14的发展工具,笔者虽为C 的忠诚拥护者,见到VirtualBasic也不禁为它喝采,废话不多说,现在就为您说明如何使用VirtualBasic控制AutoCADR14。
启始设定
在开始说明前请读者先拿出你们的R14光碟,并执行光碟中vbainst\setup.exe程式,安装程式除了安装VBA发展工具外,最重要的是安装了AutoCAD的Object说明书。
当您安装完说明书後请执行VirtualBasic,并开始一个空白专案。如图1,在VirutualBasic中选取「专案→设定引用项目→AutoCADR14ObjectLibrary」。在引用项目加入了ACADObjectLibrary後,就可以在VB用「检视→浏览物件」来查看可使用的AutoCAD物件,若熟悉VirtualBasic应该了解,当物件可以浏览时,也就代表Virtual
Basic可以使用此物件,至此我们已完成了所需的设定。
建立R14物件
您可依下面步骤建立R14物件。
1.因为ACAD物件在大部分副程式中都会使用到,因此把ACADobject设为全域变数。
DimacadAppAsObject'建立全域的ACADobject
2.可以选择在LoadForm或任何其他副程式中建立R14物件,下面范例是在LoadForm时建立R14物件,但请特别注意,必须将Visible属性设为TURE,否则将会发觉硬碟拼命转,但萤幕上却没任何变化。
PRivateSubForm_Load()
OnErrorResumeNext
`如果目前系统中已有执行R14则取得已执行R14物件
SetacadApp=GetObject(,“AutoCAD.application")
IfErrThen
Err.Clear
`如果目前系统尚未有执行R14则建立R14物件(
SetacadApp=CreateObject(“AutoCAD.Application")
EndIf
acadApp.Visible=True`请务必将物件Visible属性设为true
EndSub
3.您已经可以试著去执行这个程式,建议您,若系统已执行R14,请先结束R14程式,否则无法看到执行结果,因为程式取得物件还未对物件做任何处理,您会发现当执行这个程式则程式会启动R14,从执行的过程您是否体会到VirtualBasic的方便,连程式都不必Complier,甚至不必先存档就可以执行。
在R14中画(10,10)至(100,100)的方框
当建立acadApp物件後,就可以使用物件所提供的method,下面范例就是利用AddLinemethod来画出一个四方形,读者可能会对
acadApp.ActiveDocument.ModelSpace.AddLine这行指令的语法感到困惑,
其实若查看ACAD的Objectmodel(如图3)就可以很清楚了解,addLine是ModelSpaceEntitiesCollectionObject物件的methos,而ModelSpaceEntitiesCollectionObject的父物件是DocumentObject,DocumentObject的父物件是ApplicationObject,因此要由acadApp物件来建立Line物件当然必须透过DocumentObject与ModelSpaceObject;另外值得注意的是,画完line後记得执行acadApp.Updatemethod才能让方框即时显示在萤幕上。
PrivateSubDrawBox_Click()
Dimp1(0To2)AsDouble
Dimp2(0To2)AsDouble
Dimp3(0To2)AsDouble
Dimp4(0To2)AsDouble
DimlineObjAsObject
`设定点座标
p1(0)=10#
p1(1)=10#
p1(2)=0#
p2(0)=100#
p2(1)=10#
p2(2)=0#
p3(0)=100#
p3(1)=100#
p3(2)=0#
p4(0)=10#
p4(1)=100#
p4(2)=0#
`划第一点到第二点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p1,p2)
`划第二点到第三点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p2,p3)
`划第三点到第四点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p3,p4)
`划第四点到第一点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p4,p1)
acadApp.Update
EndSub
读取图档中modelspace的所有text及mtext文字
请读者先看下面范例程式,您是否吓一跳,这绝对是真的,下面这段程式码真的可以读取图档中modelspace的所有text及mtext文字,acadobject将您目前开启的图档中所有绘图物件都放在ActiveDocument中,而ActiveDocument中所有Modelspace中的物件都放ModelSpace中,因此我们由ActiveDocument.ModelSpace物件的
itemmethod中取出物件,并依物件的EntityType属性来判断是否为文字,及可取出图档中所有文字了。
PrivateSubQueryString_Click()
DimiAsInteger
DimretObjAsObject
WithacadApp.ActiveDocument.ModelSpace
Fori=0To.Count-1Step1
SetretObj=.Item(i)
IfretObj.EntityType=acTextOrretObj.EntityType=acMtextThen
StringList.AddItemretObj.TextString,0
EndIf
Nexti
EndWith
StringList.Refresh
EndSub
将图档中所有Line的资料写入资料库
想将CAD资料写入Database吗?在VirtualBasic中当然没问题,请先依图4所示在VirutualBasic中选取「专案→设定引用项目→MicrosoftDAO3.5ObjectLibrary」,以便在VirtualBasic中使用DAO,下面范例将建立test.mdb资料库并将图档中所有Line的资料写入Database中,有关资料库的建立方式您可参考VirtualBasicOnlineBook的说明,图5为利用access开起启test.mdb所显示的程式执行结果
。
PrivateSubWLineDB_Click()
DimMyDBAsDatabase,MyWsAsWorkspace
DimLineTdAsTableDef
DimLineFlds(7)AsField
DimfilePathAsString
DimrstLineAsRecordset
DimiAsInteger
DimretObjAsObject
DimretPtAsVariant
filePath=App.Path “\test.mdb"
`Createworkspaces
SetMyWs=DBEngine.Workspaces(0)
`CreateDatabase
SetMyDB=MyWs.CreateDatabase(filePath,dbLangGeneral,dbVersion30)
`CreateTable
SetLineTd=MyDB.CreateTableDef(“Lines")
`设定栏位资料
SetLineFlds(0)=LineTd.CreateField(“LINE_ID",dbLong)`使其成为计数资料栏。
LineFlds(0).Attributes=dbAutoIncrField
SetLineFlds(1)=LineTd.CreateField(“LINE_P1X",dbDouble)
SetLineFlds(2)=LineTd.CreateField(“LINE_P1Y",dbDouble)
SetLineFlds(3)=LineTd.CreateField(“LINE_P1Z",dbDouble)
SetLineFlds(4)=LineTd.CreateField(“LINE_P2X",dbDouble)
SetLineFlds(5)=LineTd.CreateField(“LINE_P2Y",dbDouble)
SetLineFlds(6)=LineTd.CreateField(“LINE_P2Z",dbDouble)
`将栏位加入Table
LineTd.Fields.AppendLineFlds(0)
LineTd.Fields.AppendLineFlds(1)
LineTd.Fields.AppendLineFlds(2)
LineTd.Fields.AppendLineFlds(3)
LineTd.Fields.AppendLineFlds(4)
LineTd.Fields.AppendLineFlds(5)
LineTd.Fields.AppendLineFlds(6)
MyDB.TableDefs.AppendLineTd
SetrstLine=MyDB.OpenRecordset(“Lines")
WithacadApp.ActiveDocument.ModelSpace
Fori=0To.Count-1Step1
SetretObj=.Item(i)
IfretObj.EntityType=acLineThen
rstLine.AddNew
retPt=retObj.startPoint
rstLine!LINE_P1X=retPt(0)
rstLine!LINE_P1Y=retPt(1)
rstLine!LINE_P1Z=retPt(2)
retPt=retObj.startPoint
rstLine!LINE_P2X=retPt(0)
rstLine!LINE_P2Y=retPt(1)
rstLine!LINE_P2Z=retPt(2)
rstLine.Update
EndIf
Nexti
EndWith
rstLine.Close
MyDB.Close
EndSub
将图档中所有Line的资料写入Excel活页簿
VirtualBasic可以控制AutoCAD,当然也可控制Excel或其他Office程式,读者请先依图6所示在VirutualBasic中选取「专案→设定引用项目→MicrosoftExcel5.0ObjectLibrary,在VB中启动Excel的过程与启动AutoCAD物件的方式相同,下面范例将图档中Line的资料写入Excel活页簿中,当然也可以利用Excel来处理运算与分析的功能,以往需要借由ADS或ARX的计算能力才能完成的工作,都可藉由此方式完成
。
PrivateSubExport2Excel_Click()
DimexcelAppAsObject
DimcellPosAsString
DimiAsInteger
OnErrorResumeNext
SetexcelApp=GetObject(,“Excel.Application")
IfErrThen
Err.Clear
`如果目前系统尚未有执行Excel则建立Excel物件(
SetexcelApp=CreateObject(“excel.Application")
EndIf
excelApp.Visible=True`请务必将物件Visible属性设为true
excelApp.Workbooks.Add
WithacadApp.ActiveDocument.ModelSpace
Fori=0To.Count-1Step1
SetretObj=.Item(i)
IfretObj.EntityType=acLineThen
rstLine.AddNew
retPt=retObj.startPoint
cellPos=“A" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(0)
cellPos=“B" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(1)
cellPos=“C" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(2)
retPt=retObj.endPoint
cellPos=“D" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(0)
cellPos=“E" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(1)
cellPos=“F" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(2)
EndIf
Nexti
EndWith
EndSub
在VirtualBasic中使用OCX
读者或许会疑惑,为什麽会有这个主题?虽然VirtualBasic功能强大,但程式开发者应该都了解,新的开发工具最好能使用旧的程式码,否则以往所写的运算式或演算法都需改写的话,就更麻烦且不切实际,利用OCX可将旧c或c 程式改写并提供给VirtualBasic使用。
在使用OCX之前必须先将OCX注册,此范例注册方式为Regsvr32printer.ocx,并请依图7所示在VirutualBasic中选取「专案→设定使用元件」,并点取「printerActiveXControlmodual」,printer
ocx程式请参考程式列表1(编注:此程式因过於庞大,请至CADesigner的Homepage上参看),范例中的OCX中只包含一个QueryPrinter()的Method,目地为读取系统中Printer清单,下面范例将OCX所取得资料显示在EditBox中。
PrivateSubListPrinter_Click()
PrinterListText.Text=PrnOcx.QueryPrinter
PrinterListText.Refresh
EndSub
程式所有使用的元件清单
元件型态元件名称
ButtonDrawBox
ButtonWLineDB
ButtonExport2Excel
ButtonListPrinter
ButtonQueryString
ListBoxStringList
EditBoxPrinterListText
OCXPrnOcx
後记
看过上面的说明您是否也心动於VirtualBasic强大功能,事实上如果好好利用VirtualBasic可以简易作出以前不易作出的功能,不过如果您非常在乎执行速度,您还是必须使用ARX来开发较为适当,另外Autodesk并未宣布AutoCADR14支援VirtualBasic,因此若您选择VirtualBasic来开发程式也许会面临未知的问题,虽然如此但VirtualBasic仍是值得探究的开发工具。->
AutoCADR14只支援VBA而不支援VirtualBasic,需要到R14下一版才支援,实在令人失望。
如果您也曾因听说R14不支援VirtualBasic而放弃VirtualBasic,那您可错过一个快速且容易的发展语言,笔者在一次与同事闲聊的偶然机会中意外发现,VirtualBasic可以当做AutoCADR14的发展工具,笔者虽为C 的忠诚拥护者,见到VirtualBasic也不禁为它喝采,废话不多说,现在就为您说明如何使用VirtualBasic控制AutoCADR14。
启始设定
在开始说明前请读者先拿出你们的R14光碟,并执行光碟中vbainst\setup.exe程式,安装程式除了安装VBA发展工具外,最重要的是安装了AutoCAD的Object说明书。
当您安装完说明书後请执行VirtualBasic,并开始一个空白专案。如图1,在VirutualBasic中选取「专案→设定引用项目→AutoCADR14ObjectLibrary」。在引用项目加入了ACADObjectLibrary後,就可以在VB用「检视→浏览物件」来查看可使用的AutoCAD物件,若熟悉VirtualBasic应该了解,当物件可以浏览时,也就代表Virtual
Basic可以使用此物件,至此我们已完成了所需的设定。
建立R14物件
您可依下面步骤建立R14物件。
1.因为ACAD物件在大部分副程式中都会使用到,因此把ACADobject设为全域变数。
DimacadAppAsObject'建立全域的ACADobject
2.可以选择在LoadForm或任何其他副程式中建立R14物件,下面范例是在LoadForm时建立R14物件,但请特别注意,必须将Visible属性设为TURE,否则将会发觉硬碟拼命转,但萤幕上却没任何变化。
PRivateSubForm_Load()
OnErrorResumeNext
`如果目前系统中已有执行R14则取得已执行R14物件
SetacadApp=GetObject(,“AutoCAD.application")
IfErrThen
Err.Clear
`如果目前系统尚未有执行R14则建立R14物件(
SetacadApp=CreateObject(“AutoCAD.Application")
EndIf
acadApp.Visible=True`请务必将物件Visible属性设为true
EndSub
3.您已经可以试著去执行这个程式,建议您,若系统已执行R14,请先结束R14程式,否则无法看到执行结果,因为程式取得物件还未对物件做任何处理,您会发现当执行这个程式则程式会启动R14,从执行的过程您是否体会到VirtualBasic的方便,连程式都不必Complier,甚至不必先存档就可以执行。
在R14中画(10,10)至(100,100)的方框
当建立acadApp物件後,就可以使用物件所提供的method,下面范例就是利用AddLinemethod来画出一个四方形,读者可能会对
acadApp.ActiveDocument.ModelSpace.AddLine这行指令的语法感到困惑,
其实若查看ACAD的Objectmodel(如图3)就可以很清楚了解,addLine是ModelSpaceEntitiesCollectionObject物件的methos,而ModelSpaceEntitiesCollectionObject的父物件是DocumentObject,DocumentObject的父物件是ApplicationObject,因此要由acadApp物件来建立Line物件当然必须透过DocumentObject与ModelSpaceObject;另外值得注意的是,画完line後记得执行acadApp.Updatemethod才能让方框即时显示在萤幕上。
PrivateSubDrawBox_Click()
Dimp1(0To2)AsDouble
Dimp2(0To2)AsDouble
Dimp3(0To2)AsDouble
Dimp4(0To2)AsDouble
DimlineObjAsObject
`设定点座标
p1(0)=10#
p1(1)=10#
p1(2)=0#
p2(0)=100#
p2(1)=10#
p2(2)=0#
p3(0)=100#
p3(1)=100#
p3(2)=0#
p4(0)=10#
p4(1)=100#
p4(2)=0#
`划第一点到第二点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p1,p2)
`划第二点到第三点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p2,p3)
`划第三点到第四点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p3,p4)
`划第四点到第一点
SetlineObj=acadApp.ActiveDocument.ModelSpace.AddLine(p4,p1)
acadApp.Update
EndSub
读取图档中modelspace的所有text及mtext文字
请读者先看下面范例程式,您是否吓一跳,这绝对是真的,下面这段程式码真的可以读取图档中modelspace的所有text及mtext文字,acadobject将您目前开启的图档中所有绘图物件都放在ActiveDocument中,而ActiveDocument中所有Modelspace中的物件都放ModelSpace中,因此我们由ActiveDocument.ModelSpace物件的
itemmethod中取出物件,并依物件的EntityType属性来判断是否为文字,及可取出图档中所有文字了。
PrivateSubQueryString_Click()
DimiAsInteger
DimretObjAsObject
WithacadApp.ActiveDocument.ModelSpace
Fori=0To.Count-1Step1
SetretObj=.Item(i)
IfretObj.EntityType=acTextOrretObj.EntityType=acMtextThen
StringList.AddItemretObj.TextString,0
EndIf
Nexti
EndWith
StringList.Refresh
EndSub
将图档中所有Line的资料写入资料库
想将CAD资料写入Database吗?在VirtualBasic中当然没问题,请先依图4所示在VirutualBasic中选取「专案→设定引用项目→MicrosoftDAO3.5ObjectLibrary」,以便在VirtualBasic中使用DAO,下面范例将建立test.mdb资料库并将图档中所有Line的资料写入Database中,有关资料库的建立方式您可参考VirtualBasicOnlineBook的说明,图5为利用access开起启test.mdb所显示的程式执行结果
。
PrivateSubWLineDB_Click()
DimMyDBAsDatabase,MyWsAsWorkspace
DimLineTdAsTableDef
DimLineFlds(7)AsField
DimfilePathAsString
DimrstLineAsRecordset
DimiAsInteger
DimretObjAsObject
DimretPtAsVariant
filePath=App.Path “\test.mdb"
`Createworkspaces
SetMyWs=DBEngine.Workspaces(0)
`CreateDatabase
SetMyDB=MyWs.CreateDatabase(filePath,dbLangGeneral,dbVersion30)
`CreateTable
SetLineTd=MyDB.CreateTableDef(“Lines")
`设定栏位资料
SetLineFlds(0)=LineTd.CreateField(“LINE_ID",dbLong)`使其成为计数资料栏。
LineFlds(0).Attributes=dbAutoIncrField
SetLineFlds(1)=LineTd.CreateField(“LINE_P1X",dbDouble)
SetLineFlds(2)=LineTd.CreateField(“LINE_P1Y",dbDouble)
SetLineFlds(3)=LineTd.CreateField(“LINE_P1Z",dbDouble)
SetLineFlds(4)=LineTd.CreateField(“LINE_P2X",dbDouble)
SetLineFlds(5)=LineTd.CreateField(“LINE_P2Y",dbDouble)
SetLineFlds(6)=LineTd.CreateField(“LINE_P2Z",dbDouble)
`将栏位加入Table
LineTd.Fields.AppendLineFlds(0)
LineTd.Fields.AppendLineFlds(1)
LineTd.Fields.AppendLineFlds(2)
LineTd.Fields.AppendLineFlds(3)
LineTd.Fields.AppendLineFlds(4)
LineTd.Fields.AppendLineFlds(5)
LineTd.Fields.AppendLineFlds(6)
MyDB.TableDefs.AppendLineTd
SetrstLine=MyDB.OpenRecordset(“Lines")
WithacadApp.ActiveDocument.ModelSpace
Fori=0To.Count-1Step1
SetretObj=.Item(i)
IfretObj.EntityType=acLineThen
rstLine.AddNew
retPt=retObj.startPoint
rstLine!LINE_P1X=retPt(0)
rstLine!LINE_P1Y=retPt(1)
rstLine!LINE_P1Z=retPt(2)
retPt=retObj.startPoint
rstLine!LINE_P2X=retPt(0)
rstLine!LINE_P2Y=retPt(1)
rstLine!LINE_P2Z=retPt(2)
rstLine.Update
EndIf
Nexti
EndWith
rstLine.Close
MyDB.Close
EndSub
将图档中所有Line的资料写入Excel活页簿
VirtualBasic可以控制AutoCAD,当然也可控制Excel或其他Office程式,读者请先依图6所示在VirutualBasic中选取「专案→设定引用项目→MicrosoftExcel5.0ObjectLibrary,在VB中启动Excel的过程与启动AutoCAD物件的方式相同,下面范例将图档中Line的资料写入Excel活页簿中,当然也可以利用Excel来处理运算与分析的功能,以往需要借由ADS或ARX的计算能力才能完成的工作,都可藉由此方式完成
。
PrivateSubExport2Excel_Click()
DimexcelAppAsObject
DimcellPosAsString
DimiAsInteger
OnErrorResumeNext
SetexcelApp=GetObject(,“Excel.Application")
IfErrThen
Err.Clear
`如果目前系统尚未有执行Excel则建立Excel物件(
SetexcelApp=CreateObject(“excel.Application")
EndIf
excelApp.Visible=True`请务必将物件Visible属性设为true
excelApp.Workbooks.Add
WithacadApp.ActiveDocument.ModelSpace
Fori=0To.Count-1Step1
SetretObj=.Item(i)
IfretObj.EntityType=acLineThen
rstLine.AddNew
retPt=retObj.startPoint
cellPos=“A" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(0)
cellPos=“B" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(1)
cellPos=“C" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(2)
retPt=retObj.endPoint
cellPos=“D" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(0)
cellPos=“E" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(1)
cellPos=“F" Trim(str(i 1))
excelApp.Range(cellPos).Select
excelApp.ActiveCell.FormulaR1C1=retPt(2)
EndIf
Nexti
EndWith
EndSub
在VirtualBasic中使用OCX
读者或许会疑惑,为什麽会有这个主题?虽然VirtualBasic功能强大,但程式开发者应该都了解,新的开发工具最好能使用旧的程式码,否则以往所写的运算式或演算法都需改写的话,就更麻烦且不切实际,利用OCX可将旧c或c 程式改写并提供给VirtualBasic使用。
在使用OCX之前必须先将OCX注册,此范例注册方式为Regsvr32printer.ocx,并请依图7所示在VirutualBasic中选取「专案→设定使用元件」,并点取「printerActiveXControlmodual」,printer
ocx程式请参考程式列表1(编注:此程式因过於庞大,请至CADesigner的Homepage上参看),范例中的OCX中只包含一个QueryPrinter()的Method,目地为读取系统中Printer清单,下面范例将OCX所取得资料显示在EditBox中。
PrivateSubListPrinter_Click()
PrinterListText.Text=PrnOcx.QueryPrinter
PrinterListText.Refresh
EndSub
程式所有使用的元件清单
元件型态元件名称
ButtonDrawBox
ButtonWLineDB
ButtonExport2Excel
ButtonListPrinter
ButtonQueryString
ListBoxStringList
EditBoxPrinterListText
OCXPrnOcx
後记
看过上面的说明您是否也心动於VirtualBasic强大功能,事实上如果好好利用VirtualBasic可以简易作出以前不易作出的功能,不过如果您非常在乎执行速度,您还是必须使用ARX来开发较为适当,另外Autodesk并未宣布AutoCADR14支援VirtualBasic,因此若您选择VirtualBasic来开发程式也许会面临未知的问题,虽然如此但VirtualBasic仍是值得探究的开发工具。->
更多精彩
赞助商链接