mccad 发表于 2008-12-6 23:11:00

VSTA – 未来的 VBA 开发工具

<p>前段时间,有文章说明,新版本的AutoCAD将提供一种新的开发工具VSTA。但对于VSTA,大家的了解应该都不多吧。</p><p>以下文章其实是2006年底发表的文章,那时AutoCAD 2008版本正在测试,到目前已经是两年时间了。文章并没有说到哪个版本会用到VSTA,但其实2009版本没有,2010版本从目前看可能性也不太大,毕竟微软自己还没有大量使用。</p><p><strong>VSTA – 未来的 VBA 开发工具</strong></p><p>作者:&nbsp; Jerry Winters – VB CAD, Inc.<br/>发表时间:2006年11月<br/>翻译:mccad - mjtd.com</p><p>VBA 是基于 VB6 开发平台。 VB6 在多年前已经被 VB.NET 所代替。 而 VBA 在未来也将被 VSTA (Visual Studio Tools for Applications) 所代替。我们将带大家一起关注未来AutoCAD 中VBA的未来是什么样的。我们将讲解VSTA带来的新特性及强大的功能。 </p><p><strong>VSTA 介绍</strong></p><p>VSTA 在前几年还有另外一个名称。是 VSA (Visual Studio for Applications)。VSTA, 和 VBA 一样,用于软件供应商提供给用户对软件进行定制的工具。除AutoCAD外,Microsoft Excel是大家最熟悉的使用VBA的软件。 </p><p>VBA 已经有相当长的时间了。而且它一直相当不错。但微软并不想将VBA移植到64位平台上使用。这意味着新版本的Windows (VISTA)在64位平台将无法支持VBA。 </p><p>Autodesk 已采取方案以确保大家至今所创建的VBA项目将仍然能够在VISTA 64 上运行,我们将认真做好开始学习和执行代码以及项目以让其符合VSTA的要求。 <br/></p><p></p><p>这是前端的 Microsoft Office InfoPath 2007。InfoPath 是一个有利于创建用于数据录入和显示的表单。InfoPath 是第一个集成VSTA的程序。通过菜单我们可以进入InfoPath的VSTA环境:</p><p>工具 &gt; 编程 &gt; Microsoft Visual Studio Tools for Applications。&nbsp;</p>

mccad 发表于 2008-12-6 23:18:00

<p>这就是 VSTA。让我们看看在VSTA工程中要使用的是哪些工具:&nbsp;</p><p></p><p>上页的最后一个图像显示一个模板,它在我们进行VSTA开发时用到的。“Windows Form” (窗体)相当于一个空白的VBA用户窗体。 模板上已经有些控件了,随时可以使用。“Explorer From”(浏览器窗体), 例如,其中的TreeView 和 ListView 控件也放到位置上了。</p><p>如果我们要插入一个“Windows窗体”,我们该怎么做呢?让我们来看看VSTA工具箱的控件吧。&nbsp;</p><p></p><p>看看所有这些控件!非常多。大家可以对比一下上面的控件列表和下面所显示的VBA控件。&nbsp;</p><p></p>

mccad 发表于 2008-12-6 23:23:00

<p>但控件数量的多少并不足以说明我们迁移到VSTA版是一件好事。</p><p>现在,再看看下面的图片:</p><p></p><p>似曾相识?之前好象看过吧。它看起来就象前一幅的图像。VSTA有66个控件。VB 2005 Express Edition 有66个控件。难道是用 VB 2005 Express Edition 让我们看到VSTA 会带给我们什么? </p><p>这是VB Express中添加项目的对话框。可以看到,它们的区别只是VB Express中有“关于对话框”而VSTA中没有。<br/></p><p></p><p>到目前,我们已经知道: <br/>1&nbsp;VSTA 已经在Microsoft Office InfoPath 2007中使用。<br/>2&nbsp;VSTA 只在非常少的其它程序中使用。 <br/>3&nbsp;VSTA 尚未在任何其它Office程序中使用。 <br/>4&nbsp;VBA 不支持64位环境。 <br/>5&nbsp;世界正走向64位环境。 <br/>6&nbsp;Autodesk 已经逐步让VBA可用于64位的AutoCAD版本。<br/>7&nbsp;VB 2005 Express 与 VSTA并没有多少区别。 <br/>8&nbsp;VSTA 目前尚不能在AutoCAD中使用。 <br/>9&nbsp;我们已经有一段时间(我不能说有多久)在学习并且让我们的代码转移到.net环境。 <br/></p>

mccad 发表于 2008-12-6 23:26:00

VSTA 中的几个例子
接下来就来看看Microsoft 的 InfoPath 2007 程序。
与其花时间在InfoPath的 VSTA 环境,还不如看看运行在VB 2005 Express Edition中一些例子,并将其与VBA中相同功能的代码比较。
画线
VB.NET (和 VSTA)    <CommandMethod("DrawLineA")> _
Public Sub DrawLineA()
Dim myTransMan As DatabaseServices.TransactionManager
Dim myTrans As DatabaseServices.Transaction
Dim myDoc As ApplicationServices.Document
Dim myDWG As DatabaseServices.Database
Dim myBT As DatabaseServices.BlockTable
Dim myMS As DatabaseServices.BlockTableRecord
Dim myLine As DatabaseServices.Line
Dim StartPoint As New Geometry.Point3d(1, 2, 3)
Dim EndPoint As New Geometry.Point3d(4, 5, 6)
myLine = New DatabaseServices.Line(StartPoint, EndPoint)
myDoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument
myDWG = myDoc.Database
myTransMan = myDoc.TransactionManager
myTrans = myTransMan.StartTransaction
myBT = myDWG.BlockTableId.GetObject(OpenMode.ForRead)
myMS = myBT(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)
myMS.AppendEntity(myLine)
myTrans.AddNewlyCreatedDBObject(myLine, True)
myTrans.Commit()
myTrans.Dispose()
myTransMan.Dispose()
End Sub VBA    Sub DrawLineA()
Dim StartPoint(0 To 2) As Double
Dim EndPoint(0 To 2) As Double
StartPoint(0) = 1: StartPoint(1) = 2: StartPoint(2) = 3
EndPoint(0) = 4: EndPoint(1) = 5: EndPoint(2) = 6
ThisDrawing.ModelSpace.AddLine StartPoint, EndPoint
End Sub
好了,我知道你在想什么。这么多的代码就只画了一条线?
这是怎么回事?我们不使用VBA来避免那么多的程序垃圾?这里说说我们能做什么以减轻大家的痛苦。

mccad 发表于 2008-12-6 23:30:00

首先,当用VBA画一条线时,同样的动作也将发生在用VB.NET画一条线时。所有这些事务均需要处理但它们都是在后台处理的。打开块表和块表记录这些动作都进行了处理但它们都是在后台处理的。
其次,我们可以采取步骤来使编程更加简单。让我们花点时间来谈谈Snippet(代码段)。


在 VB.NET 按右键会显示弹出菜单。如果我们点击“Insert Snippet”(插入代码段),可看到一个树表。

代码段提供了一个简单的方法,我们写好一次的代码,以后可以重复使用。 <?xml version="1.0"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
   <Title>输入标题</Title>
   <Author>mccad (mjtd.com)</Author>
   <Description>输入说明</Description>
   <Shortcut>无</Shortcut>
</Header>
<Snippet>
   <Code Language="VB" Kind="Method"> <![CDATA[
   '这里插入代码
   ]]> </Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
上述文件显示了代码段的基本结构。代码段的文件扩展名为.snippet。上述文件命名为“Template.Snippet”。更改标题、作者、说明和代码区域后,大家都可以有一个代码段了。
在 VB.NET 中,我们使用代码段管理器来组织我们的代码段。


这样,我们就可以指定哪些文件夹包含代码段。

mccad 发表于 2008-12-6 23:32:00

第三,我们可在模块中创建我们自己的VBA等同代码:
以下是在 VB.NET 中的代码模块:
Imports Autodesk.AutoCAD
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Module ThisDrawing
Function ModelSpace_AddLine(ByVal StartPt As Point3d, ByVal EndPt As Point3d) _
      As DatabaseServices.Line
    Dim myTransMan As DatabaseServices.TransactionManager
    Dim myTrans As DatabaseServices.Transaction
    Dim myDoc As ApplicationServices.Document
    Dim myDWG As DatabaseServices.Database
    Dim myBT As DatabaseServices.BlockTable
    Dim myMS As DatabaseServices.BlockTableRecord
    Dim myLine As DatabaseServices.Line
    myLine = New DatabaseServices.Line(StartPt, EndPt)
    myDoc = ApplicationServices.Application.DocumentManager.MdiActiveDocument
    myDWG = myDoc.Database
    myTransMan = myDoc.TransactionManager
    myTrans = myTransMan.StartTransaction
    myBT = myDWG.BlockTableId.GetObject(OpenMode.ForRead)
    myMS = myBT(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)
    myMS.AppendEntity(myLine)
    myTrans.AddNewlyCreatedDBObject(myLine, True)
    myTrans.Commit()
    myTrans.Dispose()
    myTransMan.Dispose()
    Return myLine
End Function
End Module
看看下面的代码如何?让我们看看怎样用它。
<CommandMethod("DrawLineB")> _
Public Sub DrawLineB()
Dim StPoint As New Geometry.Point3d(1, 2, 3)
Dim EnPoint As New Geometry.Point3d(4, 5, 6)
ThisDrawing.ModelSpace_AddLine(StPoint, EnPoint)
End Sub
这是不是更象我们之前所用到的代码?所以,少量的代码段动作和少量的模块工作,这样就可以伪装成 AutoCAD 2007 类型库。
现在我们要考虑如何才能做一些文件来使在 VB.NET 中处理 VBA。
<CommandMethod("FindDWGs")> _
Public Sub FindDWGs()
Dim myDir As New IO.DirectoryInfo("C:\Program Files\AutoCAD 2007")
Dim myFile As IO.FileInfo
For Each myFile In myDir.GetFiles("*.dwg", IO.SearchOption.AllDirectories)
MsgBox(myFile.FullName)
Next
End Sub
以下是VBA代码:
Sub FindDWGs()
GetDWGs "C:\Program Files\AutoCAD 2007"
End Sub
Sub GetDWGs(FolderIn As String)
Dim myFile As File
Dim mySub As Folder
Dim myFSO As New FileSystemObject
Dim myFolder As Folder
Set myFolder = myFSO.GetFolder(FolderIn)
For Each myFile In myFolder.Files
   Select Case LCase(Right(myFile.Name, 4))
   Case ".dwg"
    MsgBox myFile.Path
   End Select
Next
For Each mySub In myFolder.SubFolders
    GetDWGs mySub.Path
Next
End Sub

mccad 发表于 2008-12-6 23:34:00

<p><strong><u>AutoCAD 和 Office 的 VSTA 时机</u></strong>
        </p><p>说真的,什么时候VSTA将在AutoCAD使用?</p><p>由于与Autodesk的保密协议,这不能说。</p><p>那微软呢?什么时候VSTA会成为应用程序套装中的一部分?2007版是没有的,这已经是确切的信息。InfoPath是唯一带有VSTA的应用程序。那2008呢,这有可能。</p><p>在 Office 2007, VBA出现在Excel中但没有出现在InfoPath中。在Office 2007,VSTA在InfoPath中但没有在Excel中。好象微软不太可能会提供64位的VBA解决方案。</p><p><strong><u>VSTA是如何工作的?</u></strong>
        </p><p>让我们做一些猜测吧。还是保密的问题。 </p><p>VSTA好象将与VBA的方式进行工作。 </p><p>在VBA中,“vbarun”命令是用于启动VBA宏。一个类似的命令也可以用于运行VSTA命令。 </p><p>VBA文件保存为一个单一的.dvb文件。可能VSTA工程也将被保存成一个单一的文件。VBA文件通过将工程加入到“启动组”中实现“自动加载” 。</p><p><strong><u>回顾</u></strong></p><p>VSTA即将到来,指日可待。Autodesk 没有说到底何时使用,但已经让我们知道现在是开始学习.net API 和 Autodesk.AutoCAD 命令空间的时候了。64位是未来,而VBA将会过去。 </p><p>让我们团结起来,各位编程的兄弟姐妹们。学习.NET,你我都将会站起来,斜眼看着C++编程者说:“不要老是看不起我!!!” </p>

河伯 发表于 2008-12-6 23:42:00

<p>资料很好。关注VSTA已有一段时间,试过InfoPath 2007中VSTA,真不错。</p><p>AutoCAD嵌入VSTA是早晚的事,目前这方面资料太少。</p><p>下面网址是代理微软发售VSTA授权的公司,有些资源,请英文好的朋友翻译一些。</p><p><a href="http://www.summsoft.com/">http://www.summsoft.com/</a></p><p></p><p></p>

e2002 发表于 2008-12-15 10:09:00

看上去Autodesk 在一些方向上还是受到MS的制约啊...<br/><br/><br/>

chshsl 发表于 2008-12-19 08:20:00

是啊,受桌面系统控制的东东太多了!好多好的东西都被微软搞掉了,以后多元化就不存在了!
页: [1] 2
查看完整版本: VSTA – 未来的 VBA 开发工具