- 积分
- 1098
- 明经币
- 个
- 注册时间
- 2007-4-12
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2014-6-18 09:33:06
|
显示全部楼层
sieben 发表于 2014-6-17 17:28
///
/// 使用一个新建的database从另外一个不打开的文件引入块记录
/// ImportBlock_DB里的 ...
多谢sieben!
我读了你的代码,觉得现在的方法关键应该在下面这里:
acCurDb.WblockCloneObjects(acObjIdColl, acBlkTblRecNewDoc.ObjectId, acIdMap, _
DuplicateRecordCloning.Ignore, False)
我该写了你的代码,改成VB.net的,代码如下:
Public Sub ImportBlock_DB()
Dim sourceDb As Database = New Database(False, True)
Try
' //se.WriteMessage("\nadb.ImportBlock_DB");
' //下面的ReadDwgFile方法在编译调试环境下会出错,错误为:尝试读取或写入受保护的内存
'//但在正常AutoCAD启动装载程序情况下可用.
Dim fileName As String = "C:\Program Files\AutoCAD 2010\Sample\Dynamic Blocks\Mechanical - Metric.dwg"
sourceDb.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndReadShare, False, "")
Dim destDb As Database = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database
Dim blockIds As ObjectIdCollection = New ObjectIdCollection()
' Dim reValue As StringCollection = New StringCollection()
Dim ctrans As Transaction = sourceDb.TransactionManager.StartTransaction()
Dim cbt As BlockTable = ctrans.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, False)
For Each btrId As ObjectId In cbt
Dim cbtr As BlockTableRecord = ctrans.GetObject(btrId, OpenMode.ForRead, False)
'If cbtr.IsAnonymous <> True And cbtr.IsLayout <> True Then
blockIds.Add(btrId)
cbtr.Dispose()
Next
cbt.Dispose()
Dim mapping As IdMapping = New IdMapping()
sourceDb.WblockCloneObjects(blockIds, destDb.BlockTableId, New IdMapping(), DuplicateRecordCloning.Replace, False)
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
sourceDb.Dispose()
End Try
End Sub
代码执行完毕后,能够把需要的信息复制过来。但是AutoCAD会报错、死掉、退出,弹出发邮件到AutoDesk公司的窗口。
我想是因为这一句没写好:sourceDb.ReadDwgFile(fileName, System.IO.FileShare.Read, False, "")
我用的是AutoCAD2010 x64, ReadDwgFile的mode参数和你的不太一样。不知道我想的对不对!
为了不让AutoCAD死掉,我后面索性把需要的文档open,open后然后再把blocktable进行了复制,然后关掉文档。其方法就是你上面代码中提到的。
再次感谢Sieben。
|
|