AutoCADR14与VB_VB.net_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

AutoCADR14与VB

作者:黑客防线网安VB教程基地 来源:黑客防线网安VB教程基地 浏览次数:0

本篇关键词:物件程式retPt执行
黑客防线网安网讯:前言在AutoCADR14发展工具中,VBA算是最让程式发展人员注目,全新的发展介面加上与MicrosoftOffice使用相同发展语言,对於我们这些发展人员,可真是一大震撼,不过在高兴之余却听说目前这版...
前言在AutoCADR14发展工具中VBA算是最让程式发展人员注目全新的发展介面加上与MicrosoftOffice使用相同发展语言,对於我们这些发展人员,可真是一大震撼,不过在高兴之余却听说目前这版
  AutoCADR14只支援VBA而不支援VirtualBasic,需要到R14下一版才支援,实在令人失望
  
  如果您也曾因听说R14不支援VirtualBasic而放弃VirtualBasic,那您可错过一个快速且容易的发展语言,笔者在一次与同事闲聊的偶然机会中意外发现,VirtualBasic可以当做AutoCADR14的发展工具,笔者虽为C 的忠诚拥护者,见到VirtualBasic也不禁为它喝采,废话不多说,现在就为您说明如何使用VirtualBasic控制AutoCADR14
  
  启始设定
  
  在开始说明前请读者先拿出你们的R14光碟,并执行光碟中vbainstsetup.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 “ est.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仍是值得探究的开发工具。->

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14479-1.html
网站维护教程更新时间:2012-04-03 01:06:44  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer