本节主题
创建和打开图形
要创建新图形或打开现有图形,请使用 DocumentCollection 对象的方法。Add 方法用于根据一个图形模板创建新图形并将此图形添加到 DocumentCollection 中。Open 方法用于打开现有图形文件。
本例使用 Add 方法根据 acad.dwt 图形模板文件创建新图形。
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
<CommandMethod("NewDrawing", CommandFlags.Session)> _
Public Sub NewDrawing()
'' 指定要使用的模板文件,如果模板不存在,就使用默认设置
Dim strTemplatePath As String = "acad.dwt"
Dim acDocMgr As DocumentCollection = Application.DocumentManager
Dim acDoc As Document = acDocMgr.Add(strTemplatePath)
acDocMgr.MdiActiveDocument = acDoc
End Sub
本例使用 Open 方法打开现有图形。在打开图形前,代码将检查文件是否存在。
Imports System.IO
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
<CommandMethod("OpenDrawing", CommandFlags.Session)> _
Public Sub OpenDrawing()
Dim strFileName As String = "C:\campus.dwg"
Dim acDocMgr As DocumentCollection = Application.DocumentManager
If (File.Exists(strFileName)) Then
acDocMgr.Open(strFileName, False)
Else
acDocMgr.MdiActiveDocument.Editor.WriteMessage("File " & strFileName & _
" does not exist.")
End If
End Sub
保存和关闭图形
使用 Database 对象的SaveAs 方法保存 Database 对象的内容。在使用 SaveAs 方法时,用户可以指定 Database 是否应该重命名,如果 bBakAndRename 参数指定为 True,在磁盘上的图形的备份将要重命名。通过检查 DWGTITLED 系统变量的值,用户可以确定 Database 是否使用类似 Drawing1,Drawing2 之类的默认名字。如果 DWGTITLED 为0,图形将不用重命名。
有时候用户希望检查活动图形中是否存在未保存的更改。在退出 AutoCAD 任务或创建新图形之前,应当进行这样的检查。若要检查图形文件是否已经被修改,用户需要检查 DBMOD 系统变量的值。
Document 对象的 CloseAndDiscard 或 CloseAndSave 方法用于关闭打开的图形并放弃或保存任何未保存的修改。也可以使用 DocumentCollection 的 CloseAll 方法关闭 AutoCAD 中所有打开的图形。
本例中,如果活动图形未保存就保存到"c:\MyDrawing.dwg"否则使用它的当前名字保存。
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Runtime
<CommandMethod("SaveActiveDrawing")> _
Public Sub SaveActiveDrawing()
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim strDWGName As String = acDoc.Name
Dim obj As Object = Application.GetSystemVariable("DWGTITLED")
'' 检查图形是否有名字
If System.Convert.ToInt16(obj) = 0 Then
'' 如果图形使用默认名字(Drawing1,Drawing2等等),那么指定一个新的名字
'' then provide a new name
strDWGName = "c:\MyDrawing.dwg"
End If
'' 保存活动图形
acDoc.Database.SaveAs(strDWGName, True, DwgVersion.Current, _
acDoc.Database.SecurityParameters)
End Sub
本例检查是否存在未保存的更改,并验证用户是否选择“确定”以保存图形(如果没有选择“确定”,跳至结尾处)。如果用户选择“确定”,将使用 Saveas 方法保存当前图形,如下所示:
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
<CommandMethod("DrawingSaved")> _
Public Sub DrawingSaved()
Dim obj As Object = Application.GetSystemVariable("DBMOD")
'' 检查 DBMOD 的值,如果为0那么图形就没有修改
If Not (System.Convert.ToInt16(obj) = 0) Then
If MsgBox("Do you wish to save this drawing?", _
MsgBoxStyle.YesNo, _
"Save Drawing") = MsgBoxResult.Yes Then
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
acDoc.Database.SaveAs(acDoc.Name, True, DwgVersion.Current, _
acDoc.Database.SecurityParameters)
End If
End If
End Sub
在没有文档打开时使用
AutoCAD 通常在启动时会打开一个新的或现有文档。但也可以关闭当前任务中的所有文档。
如果关闭 AutoCAD 用户界面中的所有文档,应用程序窗口将发生一些改变。快速访问工具栏和应用程序菜单将只出现可用的选项。并且这些可用选项只与创建和打开图形、显示图纸集管理和恢复图形有关。如果显示了菜单栏,也只简单的显示“文件”、“视图”、“窗口”和“帮助”菜单。此外还会注意到没有显示命令行。
在零文档状态中工作,只允许执行以下操作:
当进入零文档状态时若要与 AutoCAD 起反应,应该使用 DocumentDestroyed 事件。DocumentDestroyed 事件在一个打开的文档关闭时触发。文档数在最后一个文档被关闭时为1。当 DocumentDestroyed 事件触发时使用 DocumentManager 的 Count 属性可以确定打开文档的数量。
本例代码使用 DocumentDestroyed 事件监视什么时候最后文档关闭和什么时候进入零文档状态。一旦进入零文档状态,应用程序菜单的 Opening 事件将被注册。当应用程序菜单被点击时,Opening 事件将被触发。在 Opening 事件中,一个新的菜单项将添加到应用程序菜单中。新菜单项将显示一个消息框。
注意为了使用下面的示例代码用户必须引用 AdWindows.dll 到工程。 AdWindows.dll 包含用于定义应用程序菜单的命名空间,它可以在 AutoCAD 的安装文件夹或 ObjectARX SDK 部件中找到。同样也需要引用 WindowsBase,它可以在添加引用对话框的 .NET 标签中找到。
Imports System.Windows.Input
Imports Autodesk.Windows
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
'' 创建用于自定义应用程序菜单项的命令处理程序
Public Class MyCommandHandler
Implements ICommand
Event CanExecuteChanged(ByVal sender As Object, ByVal e As EventArgs) _
Implements ICommand.CanExecuteChanged
Function CanExecute(ByVal parameter As Object) As Boolean _
Implements ICommand.CanExecute
Return True
End Function
Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
Application.ShowAlertDialog("MyMenuItem has been clicked")
End Sub
End Class
Public Class Chapter4
''用于 ZeroDocState 的全局变量
Dim acApMenuItem As ApplicationMenuItem = Nothing
<CommandMethod("AddZeroDocEvent")> _
Public Sub AddZeroDocEvent()
'' 获得 DocumentCollection 并注册 DocumentDestroyed 事件
Dim acDocMgr As DocumentCollection = Application.DocumentManager
AddHandler acDocMgr.DocumentDestroyed, AddressOf docDestroyed
End Sub
Public Sub docDestroyed(ByVal obj As Object, _
ByVal acDocDesEvtArgs As DocumentDestroyedEventArgs)
'' 判断菜单项是否已经存在和打开文档的数量
If Application.DocumentManager.Count = 1 And IsNothing(acApMenuItem) Then
'' Add the event handler to watch for when the application menu is opened
'' AdWindows.dll 必须引用到工程中 AdWindows.dll must be referenced to the project
AddHandler ComponentManager.ApplicationMenu.Opening, _
AddressOf ApplicationMenu_Opening
End If
End Sub
Public Sub ApplicationMenu_Opening(ByVal sender As Object, _
ByVal e As EventArgs)
'' 检查以确定自定义菜单项前面是否已经添加
If IsNothing(acApMenuItem) Then
'' 获得应用程序菜单组件
Dim acApMenu As ApplicationMenu = ComponentManager.ApplicationMenu
'' 创建新的应用程序菜单项
acApMenuItem = New ApplicationMenuItem()
acApMenuItem.Text = "MyMenuItem"
acApMenuItem.CommandHandler = New MyCommandHandler()
'' 追加新的菜单项
acApMenu.MenuContent.Items.Add(acApMenuItem)
'' 移除应用程序菜单的 Opening 事件处理程序
RemoveHandler ComponentManager.ApplicationMenu.Opening, _
AddressOf ApplicationMenu_Opening
End If
End Sub
End Class
锁定和解锁文档
请求修改对象或访问 AutoCAD 可能发生在任何情况下,并有可能来自许多应用程序。若要避免和其它请求的冲突,应该在修改操作前锁定文档。在某些情况下锁定文档失败将引起数据库在修改期间的锁定侵犯。在如下情况下你将需要锁定文档:
例如,当要在除当前文档外的其它文档的模型空间或图纸空间中添加图元时,需要先锁定其文档。用户可用要锁定的Document 对象的LockDocument方法进行锁定。在调用LockDocument方法后,将返回一个DocumentLock对象。
一旦完成锁定数据库的修改,就需要解锁数据库。若要解锁数据库,可以调用 DocumentLock 对象的 Dispose 方法。也可以将 Using 语句用于 DocumentLock 对象,一旦 Using 语句结束,数据库也将被解锁。
当运行没有使用 Seesion 命令标记的命令的情况下,当前文档在修改前不需要锁定数据库。
本例创建一个新的文档然后在里面画一个圆。文档创建后,新文档的数据库会被锁定,然后一个圆会被添加到里面。圆添加后,数据库会被解锁,并且与其关联的文档窗口会被设置成当前文档。
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("LockDoc", CommandFlags.Session)> _
Public Sub LockDoc()
'' 创建新图形
Dim acDocMgr As DocumentCollection = Application.DocumentManager
Dim acNewDoc As Document = acDocMgr.Add("acad.dwt")
Dim acDbNewDoc As Database = acNewDoc.Database
'' 锁定新文档
Using acLckDoc As DocumentLock = acNewDoc.LockDocument()
'' 在新数据库中启动事务
Using acTrans As Transaction = acDbNewDoc.TransactionManager.StartTransaction()
'' 以只读方式打开块表
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acDbNewDoc.BlockTableId, _
OpenMode.ForRead)
'' 以写方式打开模型空间块表记录
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
'' 创建一个半径为3圆心在5,5的圆
Dim acCirc As Circle = New Circle()
acCirc.SetDatabaseDefaults()
acCirc.Center = New Point3d(5, 5, 0)
acCirc.Radius = 3
'' 添加新对象到模型空间和事务中
acBlkTblRec.AppendEntity(acCirc)
acTrans.AddNewlyCreatedDBObject(acCirc, True)
'' 保存新对象到数据库中
acTrans.Commit()
End Using
'' 解锁文档
End Using
'' 设置新文档为当前文档
acDocMgr.MdiActiveDocument = acNewDoc
End Sub