请问有什么方法能把vba程序做成可执行文件
本帖最后由 作者 于 2007-6-9 23:30:27 编辑 <br /><br /> <p>就是双击可执行文件后,自动启动autocad,然后运行vba程序中的宏</p><p></p> 直接用VB吧 路边发表于2007-6-10 6:42:00static/image/common/back.gif直接用VB吧<p>没学过vb,不知道怎么实现?</p> 应买一本AUTOCAD VBA开发技术一书,就是明经通道出的。看后相信你会受益非浅的。那本书中有关于这个问题的详细说明。 tcsl9621发表于2007-6-10 14:38:00static/image/common/back.gif应买一本AUTOCAD VBA开发技术一书,就是明经通道出的。看后相信你会受益非浅的。那本书中有关于这个问题的详细说明。
<p>多谢提醒,我在明经的书中找到这一段了</p><p>明经两本vba的书我都在我的手上</p><p>但对我来说讲得深了点,我没怎么看</p> <p> <a href="http://soft.etcell.com/topicView.aspx?Id=36378">http://soft.etcell.com/topicView.aspx?Id=36378</a> </p><p>很详细了<p align="left">AutoCAD具有开放的体系结构,是一种极其灵活的应用系统,用户可以通过编程的方式对其进行定制,它允许用户和开发者采用各种方法对其进行扩充和修改,即二次开发,能最大限度地满足用户的特殊要求。我们先对以往AutoCAD二次开发中用到的方法简单做一回顾,然后以Visual Basic6.0为编程工具,详细讨论应用ActiveX对AutoCAD进行二次开发的方法。<br/>(一)AutoCAD二次开发中用到的方法<br/>1 AutoLISP<br/> AutoLISP(LIST Processing Language),它是一种表处理语言,是被解释执行的。它被嵌入在AutoCAD内部,作为二次开发的编程语言,她一直是低版本AutoCAD的首选编程语言。<br/>2 autocad 的script文件<br/> script 文件是成批集成Autocad命令的文本文件,可以在Autocad中运行,早期国内CAD二次开发中应用较为普遍,这种方法比较容易实现,通过在外部程序中按照要求将绘图参数融合进script文件,然后利用autocad定制菜单实现绘图。<br/>3 ADS<br/>ADS(AutoCAD Development System)是AutoCAD的C语言开发系统,它直接利用C语言编译器,将应用程序编译成可执行的文件在AutoCAD环境下运行,这种可执行的文件叫做ADS应用程序。ADS由于其速度快,又采用结构化的编程体系,因而很适合二次开发机械设计CAD、土木工程CAD等。<br/>4 ObjectARX<br/>ObjectARX是一种崭新的开发AutoCAD应用程序的工具,她以C 为编程语言,采用先进的面向对象的编程原理,提供可与AutoCAD直接交互的开发环境,能使用户方便快捷地开发出高效简洁的Auto CAD应用程序。ObjectARX并没有包含在AutoCAD中,可在AutoDESK公司网站中去下载,其最新版本是ObjectARX for AutoCAD 2000,它能够对AutoCAD进行完整的、先进的、面向对象的设计与开发,并且开发的应用程序速度更快、集成度更高、稳定性更强。ObjectARX是一种特定的C 编程环境,她包括一组动态链接库(DLL),这些库与AutoCAD在同一地址空间运行并能直接利用AutoCAD核心数据结构和代码,库中包含一组通用工具,使得二次开发者可以充分利用AutoCAD的开放结构,直接访问AutoCAD数据库结构、图形系统以及CAD几何造型核心,以便能在运行期间实时扩展AutoCAD的功能,创建能全面享受AutoCAD固有命令的新命令。<br/>5 VisualLISP<br/>VisualLISP已经被完整地集成到AutoCAD 2000中,她为开发者提供了崭新的、增强的集成开发环境,一改过去在AutoCAD中内嵌AtuoLISP运行引擎的机制,这样开发者可以直接使用AutoCAD中的对象和反应器,进行更底层的开发。用它开发程序的时间被缩短,原始代码能被保密;能帮助大家使用ActiveX对象及其事件;使大家很容易创建和分析LISP程序的运行情况。<br/>6 VBA<br/>VBA (即Mcrosoft office中的Visual Basic for Applications),被集成到AutoCAD 2000中。VBA为开发者提供了一种新的选择,也为用户访问AutoCAD 2000中丰富的技术框架打开一条新的通道。VBA和AutoCAD 2000中强大的ActiveX自动化对象模型的结合,代表了一种新型的定制AutoCAD的模式构架。通过VBA,我们可以操作AutoCAD,控制ActiveX和其它一些应用程序,使之相互之间发生互易活动。</p><p align="left">(二)Visual Basic应用ActiveX对AutoCAD进行二次开发<br/> (1)AutoCAD的对象模型<br/> 如果一个应用程序支持自动化,那么其他应用程序就可以通过其开放对象(Object)对其进行操作。对象本身包含自己的方法和属性。通过对象的方法和属性可以实现对象的操作及状态信息的收集或改变。例如,圆是AutoCAD中的一个对象,它的属性可以是圆心坐标、半径及所在层等性质,方法则有拷贝、镜像等操作。<br/>理解AutoCAD的对象模型是对其编程的基础。AutoCAD以层次结构组织对象。在顶层是Application对象(即AutoCAD 本身),其他对象均为Application对象的子对象。在Application对象下面是Preferences(设置)和Document(文档)对象。其中:<br/>◆AutoCAD的Application对象<br/>Application对象是应用程序对象。通过该对象,你可访问其它的对象,或指派对象的属性和方法。例如,应用程序对象具有Preferences(参数选择)属性,它返回Preferences(参数选择)对象。该对象提供访问在选项对话框中设定的注册信息(图形信息设定包含在Database Preferences对象)。应用程序对象的其它属性提供你访问应用程序指定数据,如应用程序的名称和版本、还有AutoCAD的窗口大小、位置和可见性等。应用程序对象的方法执行应用程序指定的动作,如列出、装载、卸载ADS和ARX应用程序,还有退出AutoCAD。<br/>应用程序对象也提供通过Documents(文档)集合链接到AutoCAD图形、通过MenuBar和MenuGroups集合链接到AutoCAD菜单和工具栏,还有通过称为VBE属性链接到VBA IDE。<br/>应用程序对象也是ActiveX界面的全局对象。也就是说应用程序对象的所有方法和属性在全局名称空间都是有效的。<br/>◆AutoCAD的Preferences对象<br/> 通过它可以获取或改变AutoCAD的设置。<br/>◆AutoCAD的Document对象。<br/> 是AutoCAD图形文件对象,它代表当前激活的DWG文件。Document对象下面有 Model Space(模型空间)和Paper Space(图纸空间)对象及Blocks(块)、Layers (层)、Plot(出图)、Selectionsets(选择集)、 views(视图)、 utility(功能)等一系列对象(集合),其含义与AutoCAD中相似。Model Space是当前图形文件中图形实体,如直线、圆、多义线等的集合,每个实体即是一个对象,可通过属性和方法改变实体或生成新实体。<br/> 对非图形实体,如层(layer)、线形(line type)等的访问则通过访问Document对象下面的相应的集合类型的子对象,如Layers 、LineTypes等来实现。集合类型的对象可以使用VB中所有的集合操作方法。Plot对象提供了访问Plot对话框中各选项的桥梁,使程序具有用不同方式控制AutoCAD出图的能力。Utility对象使用户在AutoCAD命令行与CAD交互成为可能,通过它可以处理整型、浮点型、字符型等用户输入,还可以接受点(Point)或角(Angle)等AutoCAD的特殊量。<br/> 对象是通过分层方式来组织的,应用程序对象为根对象。这种分层结构被归结为对象模型。<br/>(2)AutoCAD对象的使用<br/>要想在AutoCAD中使用Active Automation技术,首要条件是在VB6.0中选择AutoCAD作为其对象,并对需要操作的具体对象按照AutoCAD对象的树状结构逐级遍历。首先打开VB6.0,选择“工程/引用”菜单,在“引用”对话框中选择“AutoCAD Object Library”。<br/>按照VB的编程步骤,写入下面相应的程序代码,即可实现CAD中相应的操作。下面说明CAD中常用操作的实现方法:<br/> a.开始一个应用程序的VB语句<br/>Application对象位于AutoCAD层次对象结构的顶层,它代表AutoCAD本身,用户的应用程序也理所当然从Appliction对象的建立开始。<br/>Dim objacad As AutoCAD.AcadApplication ''定义Autocad程序对象<br/>Dim objdwg As AutoCAD.AcadDocument ''定义DWG文件对象<br/>Dim objcircle As AutoCAD.AcadCircle ''定义circle对象</p><p align="left">Set objacad = New AutoCAD.AcadApplication ''建立Autocad程序列程<br/>Set objdwg = objacad.Documents.Add ''建立名称为acab的DWG文件<br/>Set objcircle = objdwg.ModelSpace.AddCircle(cen, rad) ''在acab的DWG文件中画一个圆<br/> objdwg.SaveAs (sf) ''保存文件<br/> objdwg.Close ''关闭文件<br/> objacad.Quit ''推出 AutoCAD<br/> Set objdwg = Nothing ''释放acab的DWG文件占用的内存<br/> Set objacad = Nothing ''释放Autocad程序列程占用的内存<br/>另外,若AutoCAD已启动,则使用下面语句激活它:<br/>Set Acadapp = GetObject(, "Autocad.application") <br/>也可以使用下面语句启动AutoCAD:<br/> Set Acadapp = CreateObject("Autocad.application")<br/>其它:<br/> Acadapp.Visible = True ''使AutoCAD可见<br/>Set Acaddoc = Acadapp.ActiveDocument ''设Acaddoc为当前图形文件<br/>Set Mospace = Acaddoc.ModelSpace ''设Mospace为当前图形文件的模型空间<br/>以上程序段是应用程序初始化的过程,一般对AutoCAD图形文件的操作,主要是与Application、Document和Model Space等对象发生关系。<br/>Application对象是一系列对象的父对象,可以通过它的属性设置来改变AutoCAD的窗口设置。请看下面代码:<br/>acadapp.Top=100 ''设置AutoCAD窗口的位置<br/> Acadapp.Left=200<br/> Acadapp.Height=1000 ''调整AutoCAD窗口的大小<br/> acadapp.Width=800<br/> Acadapp.Caption="my first application" ''设置AutoCAD窗口的标题<br/> b.操作Document对象的VB语句<br/> Document对象提供了大多数AutoCAD的文件功能,可以通过它实现对文件的更新(New)、打开(Open)、输出(Export)、输入(Import)等操作,一般要先把Document对象设为Application对象的 ActiveDocument属性,以返回当前图形文件。<br/> Set Acaddoc=Application.ActiveDocument<br/> 请看下面的例子对文件的操作:<br/>Dim dwgname As String<br/>dwgname = "c:\acad\ struc.dwg"<br/>打开一个已有的CAD文件<br/> Acaddoc.Open dwgname <br/>建立一个新CAD文件acad.dwg<br/> Acaddoc.new("acad") <br/>Document对象还提供了两个十分有用的方法——SetVariable 和 GetVariable,通过它们可以得到或改变AutoCAD的系统变量。如:<br/> Acaddoc.SetVariable "Orthomode", 1 ''打开正交模式<br/>Dim cadver As String<br/>cadver=Acaddoc.Getvariable("Acadver") ''获取AutoCAD的版本号<br/>c.绘制直线对象的VB语句<br/>要描绘一条直线至少要有直线的起始点和终止点的坐标,如应用AddLine方法绘制一条直线,起始点坐标为:(10,10,0),终止点坐标为:(50,50,0)<br/>程序代码如下:<br/> Dim SP(0 To 2) As Double<br/> Dim EP(0 To 2) As Double<br/> SP(0) = 5<br/> SP(1) = 5<br/> SP(2) = 0<br/> EP(0) = 20<br/> EP(1) = 20<br/> EP(2) = 0<br/> mospace.AddLine SP, EP<br/> <br/>d.插入文本对象的VB语句<br/>文本的主要参数为插入点、文本高度、旋转角和字符串。AddText方法需要四个参数来产生一个文本。如产生一个Text对象:字符串为“岩土工程勘察CAD”,插入点坐标为:(10,10,0)文本高度为120。<br/>程序代码如下:<br/> Dim InsertP(0 To 2) As Double<br/> Dim TextHeight As Double<br/> Dim TextString As String<br/> Dim TextObj As Object<br/> InsertP(0) = 10<br/> InsertP(1) = 10<br/> InsertP(2) = 0<br/> TextHeight = 120<br/> TextString = "岩土工程勘察CAD "<br/> Set TextObj = mospace.AddText(TextString, InsertP,_ TextHeight)<br/>e.向图形中插入已有的一个图块的VB语句<br/>块处理是AutoCAD中经常使用的技术。块包括两种:一种是外部文件,使用块引用的方法加入到图形文件中;另一种是文件内部的块,该块的定义包含在当前图形中。内部块比较容易处理,可以对块进行编辑,也可以生成引用块。而采用外部文件时,有时为了图形输出的需要,必须将块引用用Xbind命令插入到图形文件中。<br/>如将一个图形中经常用到的图块BlockName1插入到点(20,20,0),其旋转角为0,比例因子为1。插入块的函数是InsertBlock,它返回一个块的引用实例对象BlockRef实际上;块也可以用InsertBlock函数插入到其它块中。块是可以嵌套的,但是它不能引用自身,否则会形成无穷的循环。<br/>程序代码如下:<br/> Private Sub Command3_Click()<br/> Dim BlockName As String<br/> Dim BlockRef As Object<br/> Dim InsertP(0 To 2) As Double<br/> Dim Xscale As Double, Yscale As Double<br/> Dim RotAngle As Double<br/> Dim Found As Boolean<br/> Dim EnTry As Variant<br/> InsertP(0) = 100<br/> InsertP(1) = 100<br/> InsertP(2) = 0<br/> BlockName = " BlockName1"<br/> ''查找所有的文件中已有图块<br/> For Each EnTry In acadDoc.Blocks<br/> If EnTry.Name = BlockName Then<br/> Found = True<br/> Exit For<br/> End If<br/> Next<br/> ''有则插入图块<br/> If Found Then<br/> SetBlockRef=acadDoc.ModelSpace.InsertBlock(_<br/>InsertP, BlockName, Xscale, Yscale, RotAngle)<br/> Else<br/> MsgBox "此图块名不存在。"<br/> End If<br/>End Sub<br/>f. 填充图形的VB语句<br/>本例提供的是画一个圆心为(3,3,0),半径为1的圆,然后填充这个圆的内部区域。具体过程如下:<br/> Dim hatchObj As AcadHatch<br/> Dim ptnName As String<br/> Dim ptnType As Long<br/> Dim b As Boolean<br/> Dim outerLoop(0 To 0) As Object<br/> ptnName = "ANSI31" '' 定义填充的样式<br/> patnType = 0<br/> b = True<br/> '' 在模型空间创建一个填充对象<br/> Set hatchObj = moSpace.AddHatch(ptnType, ptnName, b)<br/> ''创建填充的边界,画一个圆心为(3,3,0),半径为1的圆<br/> Dim center(0 To 2) As Double<br/> Dim radius As Double<br/> center(0) = 3: center(1) = 3: center(2) = 0<br/> radius = 1<br/> Set outerLoop(0) = moSpace.AddCircle(center, radius)<br/> '' 把填充边界传递给 hatchObj对象,并显示填充<br/> hatchObj.AppendOuterLoop (outerLoop)<br/> hatchObj.Evaluate<br/> Acaddoc.Regen True<br/>g.保存图形的VB语句<br/>保存活动的图形,以下示例以当前名称保存活动图形然后再以新的名称保存该图形。<br/>Sub Ch3_SaveActiveDrawing()<br/>'' 以当前名称保存活动图形<br/>Acaddoc.Save<br/>'' 以新的名称保存活动图形<br/>Acaddoc.SaveAs "MyDrawing.dwg"<br/>End Sub<br/>当然你会想到去检查活动图形是否存在有未保存的更改。在退出AutoCAD进程之前或开始一个新的图形之前这样做是一种好的习惯。使用Saved属性可以确定当前图形是否包含未保存的更改。<br/>测试图形是否有未保存的更改内容,检查图形是否有未保存的更改并由用户确定是否保存图形(如果取消,则直接跳到结束处)。如果确定的话,使用Save方法保存当前图形,程序如下:<br/>Sub Ch3_TestIfSaved()<br/>If Not (acaddoc.Saved) Then<br/>If MsgBox("你是否想保存该图形?",vbYesNo) = vbYes Then<br/>acaddoc.Save<br/>End If<br/>End If<br/>End Sub<br/>亦可使用Save或SaveAs方法保存图形,具体使用方法请查看相关资料。<br/>现在国内有不少介绍ActiveX编程及AutoCAD的资料,但迄今还未发现有完整讨论AutoCAD的ActiveX编程的书籍,目前最容易得到的资料就是Autodesk公司编写的随机帮助,其中有一章“ActiveX Automation",有全部对象的方法、属性说明。具体内容请查看AutoCAD的随机帮助文件。<br/>本节主要论述利用VB的ActiveX编程实现与AutoCAD的连接的技术及相关VB语句。其实用用VB编写具有DDE功能的程序来控制AutoCAD也是不错的方法,在Windows平台下,VB和AutoCAD都支持强有力的DDE(动态数据交换)功能,既能与AutoCAD交换各种复杂的数据结构,又能向AutoCAD发送命令,由此开发出的应用程序也足能满足用户的需要,下面我们简单讨论一下这方面的内容。<br/>(三)Visual Basic应用DDE实现对AutoCAD的控制<br/> DDE是Windows的强大功能之一,它可以使应用程序自动地接收由其它应用程序发送来的数据,当传送端的数据有变化时,接收端的数据也会随之改变,也可将命令或键盘输入传递给其它程序,实现远程控制。<br/> 在VB编程环境中,创建应用程序的方法很简单,VB中能和其它Window应用程序建立DDE通道的控件有文本框,标签和图片框。下面结合简单实例,说明VB应用程序与AutoCAD间建立DDE通道和交换数据的方法。<br/> 在VB中启动一个新项目,参见图(1)建立窗体,其中“建立链接”,“直线”,“标注”,“退出”为命令按钮,标有“Text1”的为文本框,用于建立DDE通道,并输入下面的事件代码。 <br/>Option Explicit<br/> Private Sub cmdLine_Click() ''画直线<br/> Text1.LinkExecute " [^3^3line 3,3 8,8 ^3]"<br/> End Sub<br/> Private Sub cmdText_Click() ''标注文字<br/> Text1.LinkExecute " [^3^3text 10,10 1 90 AUTOCAD!^10]"<br/> End Sub<br/> Private Sub cmdLink_click() ''建立链接<br/> Text1.LinkMode = 0<br/> Text1.LinkTopic = "autocad.dde|system"<br/> Text1.LinkMode = 2<br/> End Sub<br/> Private Sub cmdExit_click() ''退出<br/> End<br/> End Sub <br/> 运行此应用程序,注意在运行前,一定要先加载AutoCAD。单击“建立链接”按扭,cmdLink_Click()过程被执行,执行时设置文本框Text1的LinkTopic和LinkMode的属性,完成VB应用程序与AutoCAD间DDE通道的建立。LinkTopic属性用于通知AutoCAD由谁来提供数据,它被管道符“|”分成两部分,第一部分“AutoCAD.DDE”为应用程序名,第二部分“System”是通讯的主题。LinkMode属性用于切实建立链接,在LinkMode=0时,表示关闭以前的DDE通道,在LinkMode=2时,表示以手动模式激活DDE通道。</p><p align="left"> 在完成DDE链接后,VB应用程序就可以与AutoCAD间进行数据交换或命令传送了。单击“直线”按扭,cmdLine_Click()过程被执行,应用程序通过LinkExecute方法向AutoCAD发送命令,在AutoCAD中以点(3,3)和(8,8)为端心,画一条直线。语句中的^3相当于AutoCAD中的取消键Ctrl C,空格相当于AutoCAD中的回车键。单击“标注”按扭,执行cmdText_Click()过程,可在AutoCAD中显示以(10,10)为基点,高为1,旋转角度为90的字符串“AutoCAD!”。语句中的^10相当于AutoCAD中的回车键,在标注文字时不能用空格代替回车键。<br/>根据需要,可用上面的方法传送AutoCAD的其它命令,实现对AutoCAD的开发。<br/>(四)Visual Basic应用SCRIPT文件实现对AutoCAD的控制<br/> AutoCAD提供了一种被称为命令文件(SCRIPT 文件)的工具。它允许将不同的AutoCAD的命令组合在一起,并按照预先确定的顺序执行它们。AutoCAD的SCRIPT命令允许在图形编辑状态运行命令文件。输入SCRIPT命令并按回车就可以执行命令文件,AutoCAD会提示输入命令文件的名称。这是一种最简单实用的与AutoCAD接口的方法,结合VB开发工具,你可以方便地为你的工程软件增加绘图功能。下面我们提供一组VB代码,实现SCRIPT文件的自动生成。<br/>Private Sub Command4_Click()<br/>Open "c:\my documents\mycad.scr" For Output As #1‘建立一个SCR文件MYCAD.SCR<br/>Print #1, "limits 0,0 870,620" ‘设置绘图区域<br/>Print #1, "zoom all" ‘显示新的绘图界限<br/>Print #1, "setvar textsize 0.25" ‘设定文本高度<br/>Print #1, "layer new box c red box s box " ‘设置新层<br/>Print #1, "rectang w 2 5,5 " LTrim(Str(boxx 5)) "," LTrim(Str(boxy 5)) ‘绘制一矩形(5,5),(boxx 5,boxy 5)(其中:boxx,boxy为变量)<br/>Close #1<br/>End Sub<br/>此种方法只要用户了解AutoCAD命令的文本形式,在VB中可以方便生成SCRIPT文件,进而实现操纵AutoCAD的目的。<br/>还有其它一些与AutoCAD接口的方法,我们在这里就不再一一赘述。</p></p><p align="left">AutoCAD具有开放的体系结构,是一种极其灵活的应用系统,用户可以通过编程的方式对其进行定制,它允许用户和开发者采用各种方法对其进行扩充和修改,即二次开发,能最大限度地满足用户的特殊要求。我们先对以往AutoCAD二次开发中用到的方法简单做一回顾,然后以Visual Basic6.0为编程工具,详细讨论应用ActiveX对AutoCAD进行二次开发的方法。<br/>(一)AutoCAD二次开发中用到的方法<br/>1 AutoLISP<br/> AutoLISP(LIST Processing Language),它是一种表处理语言,是被解释执行的。它被嵌入在AutoCAD内部,作为二次开发的编程语言,她一直是低版本AutoCAD的首选编程语言。<br/>2 autocad 的script文件<br/> script 文件是成批集成Autocad命令的文本文件,可以在Autocad中运行,早期国内CAD二次开发中应用较为普遍,这种方法比较容易实现,通过在外部程序中按照要求将绘图参数融合进script文件,然后利用autocad定制菜单实现绘图。<br/>3 ADS<br/>ADS(AutoCAD Development System)是AutoCAD的C语言开发系统,它直接利用C语言编译器,将应用程序编译成可执行的文件在AutoCAD环境下运行,这种可执行的文件叫做ADS应用程序。ADS由于其速度快,又采用结构化的编程体系,因而很适合二次开发机械设计CAD、土木工程CAD等。<br/>4 ObjectARX<br/>ObjectARX是一种崭新的开发AutoCAD应用程序的工具,她以C 为编程语言,采用先进的面向对象的编程原理,提供可与AutoCAD直接交互的开发环境,能使用户方便快捷地开发出高效简洁的Auto CAD应用程序。ObjectARX并没有包含在AutoCAD中,可在AutoDESK公司网站中去下载,其最新版本是ObjectARX for AutoCAD 2000,它能够对AutoCAD进行完整的、先进的、面向对象的设计与开发,并且开发的应用程序速度更快、集成度更高、稳定性更强。ObjectARX是一种特定的C 编程环境,她包括一组动态链接库(DLL),这些库与AutoCAD在同一地址空间运行并能直接利用AutoCAD核心数据结构和代码,库中包含一组通用工具,使得二次开发者可以充分利用AutoCAD的开放结构,直接访问AutoCAD数据库结构、图形系统以及CAD几何造型核心,以便能在运行期间实时扩展AutoCAD的功能,创建能全面享受AutoCAD固有命令的新命令。<br/>5 VisualLISP<br/>VisualLISP已经被完整地集成到AutoCAD 2000中,她为开发者提供了崭新的、增强的集成开发环境,一改过去在AutoCAD中内嵌AtuoLISP运行引擎的机制,这样开发者可以直接使用AutoCAD中的对象和反应器,进行更底层的开发。用它开发程序的时间被缩短,原始代码能被保密;能帮助大家使用ActiveX对象及其事件;使大家很容易创建和分析LISP程序的运行情况。<br/>6 VBA<br/>VBA (即Mcrosoft office中的Visual Basic for Applications),被集成到AutoCAD 2000中。VBA为开发者提供了一种新的选择,也为用户访问AutoCAD 2000中丰富的技术框架打开一条新的通道。VBA和AutoCAD 2000中强大的ActiveX自动化对象模型的结合,代表了一种新型的定制AutoCAD的模式构架。通过VBA,我们可以操作AutoCAD,控制ActiveX和其它一些应用程序,使之相互之间发生互易活动。</p><p align="left">(二)Visual Basic应用ActiveX对AutoCAD进行二次开发<br/> (1)AutoCAD的对象模型<br/> 如果一个应用程序支持自动化,那么其他应用程序就可以通过其开放对象(Object)对其进行操作。对象本身包含自己的方法和属性。通过对象的方法和属性可以实现对象的操作及状态信息的收集或改变。例如,圆是AutoCAD中的一个对象,它的属性可以是圆心坐标、半径及所在层等性质,方法则有拷贝、镜像等操作。<br/>理解AutoCAD的对象模型是对其编程的基础。AutoCAD以层次结构组织对象。在顶层是Application对象(即AutoCAD 本身),其他对象均为Application对象的子对象。在Application对象下面是Preferences(设置)和Document(文档)对象。其中:<br/>◆AutoCAD的Application对象<br/>Application对象是应用程序对象。通过该对象,你可访问其它的对象,或指派对象的属性和方法。例如,应用程序对象具有Preferences(参数选择)属性,它返回Preferences(参数选择)对象。该对象提供访问在选项对话框中设定的注册信息(图形信息设定包含在Database Preferences对象)。应用程序对象的其它属性提供你访问应用程序指定数据,如应用程序的名称和版本、还有AutoCAD的窗口大小、位置和可见性等。应用程序对象的方法执行应用程序指定的动作,如列出、装载、卸载ADS和ARX应用程序,还有退出AutoCAD。<br/>应用程序对象也提供通过Documents(文档)集合链接到AutoCAD图形、通过MenuBar和MenuGroups集合链接到AutoCAD菜单和工具栏,还有通过称为VBE属性链接到VBA IDE。<br/>应用程序对象也是ActiveX界面的全局对象。也就是说应用程序对象的所有方法和属性在全局名称空间都是有效的。<br/>◆AutoCAD的Preferences对象<br/> 通过它可以获取或改变AutoCAD的设置。<br/>◆AutoCAD的Document对象。<br/> 是AutoCAD图形文件对象,它代表当前激活的DWG文件。Document对象下面有 Model Space(模型空间)和Paper Space(图纸空间)对象及Blocks(块)、Layers (层)、Plot(出图)、Selectionsets(选择集)、 views(视图)、 utility(功能)等一系列对象(集合),其含义与AutoCAD中相似。Model Space是当前图形文件中图形实体,如直线、圆、多义线等的集合,每个实体即是一个对象,可通过属性和方法改变实体或生成新实体。<br/> 对非图形实体,如层(layer)、线形(line type)等的访问则通过访问Document对象下面的相应的集合类型的子对象,如Layers 、LineTypes等来实现。集合类型的对象可以使用VB中所有的集合操作方法。Plot对象提供了访问Plot对话框中各选项的桥梁,使程序具有用不同方式控制AutoCAD出图的能力。Utility对象使用户在AutoCAD命令行与CAD交互成为可能,通过它可以处理整型、浮点型、字符型等用户输入,还可以接受点(Point)或角(Angle)等AutoCAD的特殊量。<br/> 对象是通过分层方式来组织的,应用程序对象为根对象。这种分层结构被归结为对象模型。<br/>(2)AutoCAD对象的使用<br/>要想在AutoCAD中使用Active Automation技术,首要条件是在VB6.0中选择AutoCAD作为其对象,并对需要操作的具体对象按照AutoCAD对象的树状结构逐级遍历。首先打开VB6.0,选择“工程/引用”菜单,在“引用”对话框中选择“AutoCAD Object Library”。<br/>按照VB的编程步骤,写入下面相应的程序代码,即可实现CAD中相应的操作。下面说明CAD中常用操作的实现方法:<br/> a.开始一个应用程序的VB语句<br/>Application对象位于AutoCAD层次对象结构的顶层,它代表AutoCAD本身,用户的应用程序也理所当然从Appliction对象的建立开始。<br/>Dim objacad As AutoCAD.AcadApplication ''定义Autocad程序对象<br/>Dim objdwg As AutoCAD.AcadDocument ''定义DWG文件对象<br/>Dim objcircle As AutoCAD.AcadCircle ''定义circle对象</p><p align="left">Set objacad = New AutoCAD.AcadApplication ''建立Autocad程序列程<br/>Set objdwg = objacad.Documents.Add ''建立名称为acab的DWG文件<br/>Set objcircle = objdwg.ModelSpace.AddCircle(cen, rad) ''在acab的DWG文件中画一个圆<br/> objdwg.SaveAs (sf) ''保存文件<br/> objdwg.Close ''关闭文件<br/> objacad.Quit ''推出 AutoCAD<br/> Set objdwg = Nothing ''释放acab的DWG文件占用的内存<br/> Set objacad = Nothing ''释放Autocad程序列程占用的内存<br/>另外,若AutoCAD已启动,则使用下面语句激活它:<br/>Set Acadapp = GetObject(, "Autocad.application") <br/>也可以使用下面语句启动AutoCAD:<br/> Set Acadapp = CreateObject("Autocad.application")<br/>其它:<br/> Acadapp.Visible = True ''使AutoCAD可见<br/>Set Acaddoc = Acadapp.ActiveDocument ''设Acaddoc为当前图形文件<br/>Set Mospace = Acaddoc.ModelSpace ''设Mospace为当前图形文件的模型空间<br/>以上程序段是应用程序初始化的过程,一般对AutoCAD图形文件的操作,主要是与Application、Document和Model Space等对象发生关系。<br/>Application对象是一系列对象的父对象,可以通过它的属性设置来改变AutoCAD的窗口设置。请看下面代码:<br/>acadapp.Top=100 ''设置AutoCAD窗口的位置<br/> Acadapp.Left=200<br/> Acadapp.Height=1000 ''调整AutoCAD窗口的大小<br/> acadapp.Width=800<br/> Acadapp.Caption="my first application" ''设置AutoCAD窗口的标题<br/> b.操作Document对象的VB语句<br/> Document对象提供了大多数AutoCAD的文件功能,可以通过它实现对文件的更新(New)、打开(Open)、输出(Export)、输入(Import)等操作,一般要先把Document对象设为Application对象的 ActiveDocument属性,以返回当前图形文件。<br/> Set Acaddoc=Application.ActiveDocument<br/> 请看下面的例子对文件的操作:<br/>Dim dwgname As String<br/>dwgname = "c:\acad\ struc.dwg"<br/>打开一个已有的CAD文件<br/> Acaddoc.Open dwgname <br/>建立一个新CAD文件acad.dwg<br/> Acaddoc.new("acad") <br/>Document对象还提供了两个十分有用的方法——SetVariable 和 GetVariable,通过它们可以得到或改变AutoCAD的系统变量。如:<br/> Acaddoc.SetVariable "Orthomode", 1 ''打开正交模式<br/>Dim cadver As String<br/>cadver=Acaddoc.Getvariable("Acadver") ''获取AutoCAD的版本号<br/>c.绘制直线对象的VB语句<br/>要描绘一条直线至少要有直线的起始点和终止点的坐标,如应用AddLine方法绘制一条直线,起始点坐标为:(10,10,0),终止点坐标为:(50,50,0)<br/>程序代码如下:<br/> Dim SP(0 To 2) As Double<br/> Dim EP(0 To 2) As Double<br/> SP(0) = 5<br/> SP(1) = 5<br/> SP(2) = 0<br/> EP(0) = 20<br/> EP(1) = 20<br/> EP(2) = 0<br/> mospace.AddLine SP, EP<br/> <br/>d.插入文本对象的VB语句<br/>文本的主要参数为插入点、文本高度、旋转角和字符串。AddText方法需要四个参数来产生一个文本。如产生一个Text对象:字符串为“岩土工程勘察CAD”,插入点坐标为:(10,10,0)文本高度为120。<br/>程序代码如下:<br/> Dim InsertP(0 To 2) As Double<br/> Dim TextHeight As Double<br/> Dim TextString As String<br/> Dim TextObj As Object<br/> InsertP(0) = 10<br/> InsertP(1) = 10<br/> InsertP(2) = 0<br/> TextHeight = 120<br/> TextString = "岩土工程勘察CAD "<br/> Set TextObj = mospace.AddText(TextString, InsertP,_ TextHeight)<br/>e.向图形中插入已有的一个图块的VB语句<br/>块处理是AutoCAD中经常使用的技术。块包括两种:一种是外部文件,使用块引用的方法加入到图形文件中;另一种是文件内部的块,该块的定义包含在当前图形中。内部块比较容易处理,可以对块进行编辑,也可以生成引用块。而采用外部文件时,有时为了图形输出的需要,必须将块引用用Xbind命令插入到图形文件中。<br/>如将一个图形中经常用到的图块BlockName1插入到点(20,20,0),其旋转角为0,比例因子为1。插入块的函数是InsertBlock,它返回一个块的引用实例对象BlockRef实际上;块也可以用InsertBlock函数插入到其它块中。块是可以嵌套的,但是它不能引用自身,否则会形成无穷的循环。<br/>程序代码如下:<br/> Private Sub Command3_Click()<br/> Dim BlockName As String<br/> Dim BlockRef As Object<br/> Dim InsertP(0 To 2) As Double<br/> Dim Xscale As Double, Yscale As Double<br/> Dim RotAngle As Double<br/> Dim Found As Boolean<br/> Dim EnTry As Variant<br/> InsertP(0) = 100<br/> InsertP(1) = 100<br/> InsertP(2) = 0<br/> BlockName = " BlockName1"<br/> ''查找所有的文件中已有图块<br/> For Each EnTry In acadDoc.Blocks<br/> If EnTry.Name = BlockName Then<br/> Found = True<br/> Exit For<br/> End If<br/> Next<br/> ''有则插入图块<br/> If Found Then<br/> SetBlockRef=acadDoc.ModelSpace.InsertBlock(_<br/>InsertP, BlockName, Xscale, Yscale, RotAngle)<br/> Else<br/> MsgBox "此图块名不存在。"<br/> End If<br/>End Sub<br/>f. 填充图形的VB语句<br/>本例提供的是画一个圆心为(3,3,0),半径为1的圆,然后填充这个圆的内部区域。具体过程如下:<br/> Dim hatchObj As AcadHatch<br/> Dim ptnName As String<br/> Dim ptnType As Long<br/> Dim b As Boolean<br/> Dim outerLoop(0 To 0) As Object<br/> ptnName = "ANSI31" '' 定义填充的样式<br/> patnType = 0<br/> b = True<br/> '' 在模型空间创建一个填充对象<br/> Set hatchObj = moSpace.AddHatch(ptnType, ptnName, b)<br/> ''创建填充的边界,画一个圆心为(3,3,0),半径为1的圆<br/> Dim center(0 To 2) As Double<br/> Dim radius As Double<br/> center(0) = 3: center(1) = 3: center(2) = 0<br/> radius = 1<br/> Set outerLoop(0) = moSpace.AddCircle(center, radius)<br/> '' 把填充边界传递给 hatchObj对象,并显示填充<br/> hatchObj.AppendOuterLoop (outerLoop)<br/> hatchObj.Evaluate<br/> Acaddoc.Regen True<br/>g.保存图形的VB语句<br/>保存活动的图形,以下示例以当前名称保存活动图形然后再以新的名称保存该图形。<br/>Sub Ch3_SaveActiveDrawing()<br/>'' 以当前名称保存活动图形<br/>Acaddoc.Save<br/>'' 以新的名称保存活动图形<br/>Acaddoc.SaveAs "MyDrawing.dwg"<br/>End Sub<br/>当然你会想到去检查活动图形是否存在有未保存的更改。在退出AutoCAD进程之前或开始一个新的图形之前这样做是一种好的习惯。使用Saved属性可以确定当前图形是否包含未保存的更改。<br/>测试图形是否有未保存的更改内容,检查图形是否有未保存的更改并由用户确定是否保存图形(如果取消,则直接跳到结束处)。如果确定的话,使用Save方法保存当前图形,程序如下:<br/>Sub Ch3_TestIfSaved()<br/>If Not (acaddoc.Saved) Then<br/>If MsgBox("你是否想保存该图形?",vbYesNo) = vbYes Then<br/>acaddoc.Save<br/>End If<br/>End If<br/>End Sub<br/>亦可使用Save或SaveAs方法保存图形,具体使用方法请查看相关资料。<br/>现在国内有不少介绍ActiveX编程及AutoCAD的资料,但迄今还未发现有完整讨论AutoCAD的ActiveX编程的书籍,目前最容易得到的资料就是Autodesk公司编写的随机帮助,其中有一章“ActiveX Automation",有全部对象的方法、属性说明。具体内容请查看AutoCAD的随机帮助文件。<br/>本节主要论述利用VB的ActiveX编程实现与AutoCAD的连接的技术及相关VB语句。其实用用VB编写具有DDE功能的程序来控制AutoCAD也是不错的方法,在Windows平台下,VB和AutoCAD都支持强有力的DDE(动态数据交换)功能,既能与AutoCAD交换各种复杂的数据结构,又能向AutoCAD发送命令,由此开发出的应用程序也足能满足用户的需要,下面我们简单讨论一下这方面的内容。<br/>(三)Visual Basic应用DDE实现对AutoCAD的控制<br/> DDE是Windows的强大功能之一,它可以使应用程序自动地接收由其它应用程序发送来的数据,当传送端的数据有变化时,接收端的数据也会随之改变,也可将命令或键盘输入传递给其它程序,实现远程控制。<br/> 在VB编程环境中,创建应用程序的方法很简单,VB中能和其它Window应用程序建立DDE通道的控件有文本框,标签和图片框。下面结合简单实例,说明VB应用程序与AutoCAD间建立DDE通道和交换数据的方法。<br/> 在VB中启动一个新项目,参见图(1)建立窗体,其中“建立链接”,“直线”,“标注”,“退出”为命令按钮,标有“Text1”的为文本框,用于建立DDE通道,并输入下面的事件代码。 <br/>Option Explicit<br/> Private Sub cmdLine_Click() ''画直线<br/> Text1.LinkExecute " [^3^3line 3,3 8,8 ^3]"<br/> End Sub<br/> Private Sub cmdText_Click() ''标注文字<br/> Text1.LinkExecute " [^3^3text 10,10 1 90 AUTOCAD!^10]"<br/> End Sub<br/> Private Sub cmdLink_click() ''建立链接<br/> Text1.LinkMode = 0<br/> Text1.LinkTopic = "autocad.dde|system"<br/> Text1.LinkMode = 2<br/> End Sub<br/> Private Sub cmdExit_click() ''退出<br/> End<br/> End Sub <br/> 运行此应用程序,注意在运行前,一定要先加载AutoCAD。单击“建立链接”按扭,cmdLink_Click()过程被执行,执行时设置文本框Text1的LinkTopic和LinkMode的属性,完成VB应用程序与AutoCAD间DDE通道的建立。LinkTopic属性用于通知AutoCAD由谁来提供数据,它被管道符“|”分成两部分,第一部分“AutoCAD.DDE”为应用程序名,第二部分“System”是通讯的主题。LinkMode属性用于切实建立链接,在LinkMode=0时,表示关闭以前的DDE通道,在LinkMode=2时,表示以手动模式激活DDE通道。</p><p align="left"> 在完成DDE链接后,VB应用程序就可以与AutoCAD间进行数据交换或命令传送了。单击“直线”按扭,cmdLine_Click()过程被执行,应用程序通过LinkExecute方法向AutoCAD发送命令,在AutoCAD中以点(3,3)和(8,8)为端心,画一条直线。语句中的^3相当于AutoCAD中的取消键Ctrl C,空格相当于AutoCAD中的回车键。单击“标注”按扭,执行cmdText_Click()过程,可在AutoCAD中显示以(10,10)为基点,高为1,旋转角度为90的字符串“AutoCAD!”。语句中的^10相当于AutoCAD中的回车键,在标注文字时不能用空格代替回车键。<br/>根据需要,可用上面的方法传送AutoCAD的其它命令,实现对AutoCAD的开发。<br/>(四)Visual Basic应用SCRIPT文件实现对AutoCAD的控制<br/> AutoCAD提供了一种被称为命令文件(SCRIPT 文件)的工具。它允许将不同的AutoCAD的命令组合在一起,并按照预先确定的顺序执行它们。AutoCAD的SCRIPT命令允许在图形编辑状态运行命令文件。输入SCRIPT命令并按回车就可以执行命令文件,AutoCAD会提示输入命令文件的名称。这是一种最简单实用的与AutoCAD接口的方法,结合VB开发工具,你可以方便地为你的工程软件增加绘图功能。下面我们提供一组VB代码,实现SCRIPT文件的自动生成。<br/>Private Sub Command4_Click()<br/>Open "c:\my documents\mycad.scr" For Output As #1‘建立一个SCR文件MYCAD.SCR<br/>Print #1, "limits 0,0 870,620" ‘设置绘图区域<br/>Print #1, "zoom all" ‘显示新的绘图界限<br/>Print #1, "setvar textsize 0.25" ‘设定文本高度<br/>Print #1, "layer new box c red box s box " ‘设置新层<br/>Print #1, "rectang w 2 5,5 " LTrim(Str(boxx 5)) "," LTrim(Str(boxy 5)) ‘绘制一矩形(5,5),(boxx 5,boxy 5)(其中:boxx,boxy为变量)<br/>Close #1<br/>End Sub<br/>此种方法只要用户了解AutoCAD命令的文本形式,在VB中可以方便生成SCRIPT文件,进而实现操纵AutoCAD的目的。<br/>还有其它一些与AutoCAD接口的方法,我们在这里就不再一一赘述。</p><br/> 楼上给的文章真是太详细了,谢谢了~~~ 好 文章啊 <p>恩~~好东西~好长啊·~先收藏</p> <p>应该是挺不错的,个人感觉VBA实用,而且又能很快升级成VB.net,虽然这两种语言还是有些差别的,现在VB.NET已经和C++不相上下了,以前VB应为没有继承,派生,不过现在.NET语言都有了这些功能,应该来说比较实用,理论上能生成任何想到的程序。</p>
页:
[1]
2