菜鸟求助:关于两个文档之间BlockReference复制的问题!
各位好:向各位求助,我在两个文档之间进行BlockReference复制,其主要目的是把作为图形库的文档中保存的块(可以认为是图形库)放到当前的工作文档中待用。在当前文档中可以通过菜单上的“插入块”来使用。
我目前是这样做的,首先打开图形库对应的文档,遍历其中的块并获取;然后在每获取到一个块之后,再在当前工作文档中进行增加newBlockDef.AppendEntity(ent),这个时候程序会报错,说是已经存在 eAlreadylnDb。
请各位该看看,初学乍练的、,谢谢各位啊!
另外还请各位看看,像我这种思路还有什么好的办法。主要是想模拟autocad自带的工具选项板功能!
谢谢! 思路没有问题,eAlreadylnDb说明你可能重复添加了,注意检查图块是否已经存在 我的代码如下:
Public Sub Read_Dwg()
Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
Dim ed As Editor = doc.Editor
Dim ObjId As ObjectId
Using acLckDoc As DocumentLock = doc.LockDocument()
Dim trx As Transaction = db.TransactionManager.StartTransaction
Dim bt As BlockTable = db.BlockTableId.GetObject(OpenMode.ForRead)
Dim btrMs As BlockTableRecord = bt(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)
Dim dbInsert As Database = New Database(False, True)
Dim dwgName As String = "C:\Program Files\AutoCAD 2010\Sample\Dynamic Blocks\Mechanical - Metric.dwg"
dbInsert.ReadDwgFile(dwgName, FileOpenMode.OpenForReadAndAllShare, True, String.Empty)
ObjId = db.Insert(Path.GetFileNameWithoutExtension(dwgName), dbInsert, True)
Dim trx1 As Transaction = dbInsert.TransactionManager.StartTransaction
Dim bt1 As BlockTable = dbInsert.BlockTableId.GetObject(OpenMode.ForRead)
Dim btrMs1 As BlockTableRecord = bt1(BlockTableRecord.ModelSpace).GetObject(OpenMode.ForWrite)
For Each ID As ObjectId In btrMs1
Dim ent As Entity = trx1.GetObject(ID, OpenMode.ForRead)
If ((ent.GetType() Is GetType(BlockReference))) Then
'MessageBox.Show(ent.GetType.ToString + "--" + ent.BlockName)
Dim bref As BlockReference = ent
bref.ResetBlock()
btrMs.AppendEntity(bref.Clone)
trx.AddNewlyCreatedDBObject(bref, True)
trx.Commit()
End If
Next
End Using
End Sub
代码执行后,总是报错。提示:eAlreadyInDb.
请大家帮看看,怎么处理啊!
谢谢! btrMs.AppendEntity(bref.Clone)
trx.AddNewlyCreatedDBObject(bref, True)
--------------------------------------
Entity tEnt = (Entity)bref.Clone();
btrMs.AppendEntity(tEnt );
trx.AddNewlyCreatedDBObject(tEnt , True); 上面我写的是C#代码
trx.AddNewlyCreatedDBObject(bref, True)//这句里面的bref已存在,不能再添加
sieben 发表于 2014-6-17 10:20 static/image/common/back.gif
btrMs.AppendEntity(bref.Clone)
trx.AddNewlyCreatedDBObject(bref, True)
--------------------------- ...
感谢sieben的回复。我尝试了你的代码,还是有错误。
Dim tEnt As Entity = bref.Clone
btrMs.AppendEntity(tEnt) ‘这一行报错,eWrongDatabase
trx.AddNewlyCreatedDBObject(tEnt, True)
还请帮助看一下。谢谢!
把 trx.Commit()
放在Next后面 bref.ResetBlock()
这一句我不熟悉,建议不用试试看 sieben 发表于 2014-6-17 14:32 static/image/common/back.gif
bref.ResetBlock()
这一句我不熟悉,建议不用试试看
这一句只是为了获取到块的显示名字! sieben 发表于 2014-6-17 14:31 static/image/common/back.gif
把 trx.Commit()
放在Next后面
放在之后让然报错,错误信息相同,eWrongDatabase。
另外把resetblock也注释掉了
页:
[1]
2