fatkids 发表于 2014-6-16 11:30:13

菜鸟求助:关于两个文档之间BlockReference复制的问题!

各位好:

       向各位求助,我在两个文档之间进行BlockReference复制,其主要目的是把作为图形库的文档中保存的块(可以认为是图形库)放到当前的工作文档中待用。在当前文档中可以通过菜单上的“插入块”来使用。
   
       我目前是这样做的,首先打开图形库对应的文档,遍历其中的块并获取;然后在每获取到一个块之后,再在当前工作文档中进行增加newBlockDef.AppendEntity(ent),这个时候程序会报错,说是已经存在 eAlreadylnDb。

       请各位该看看,初学乍练的、,谢谢各位啊!

       另外还请各位看看,像我这种思路还有什么好的办法。主要是想模拟autocad自带的工具选项板功能!

       谢谢!

sieben 发表于 2014-6-16 14:05:05

思路没有问题,eAlreadylnDb说明你可能重复添加了,注意检查图块是否已经存在

fatkids 发表于 2014-6-17 09:04:17

我的代码如下:
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.
请大家帮看看,怎么处理啊!
谢谢!

sieben 发表于 2014-6-17 10:20:59

btrMs.AppendEntity(bref.Clone)
trx.AddNewlyCreatedDBObject(bref, True)
--------------------------------------
Entity tEnt = (Entity)bref.Clone();
btrMs.AppendEntity(tEnt );
trx.AddNewlyCreatedDBObject(tEnt , True);

sieben 发表于 2014-6-17 10:22:24

上面我写的是C#代码
trx.AddNewlyCreatedDBObject(bref, True)//这句里面的bref已存在,不能再添加

fatkids 发表于 2014-6-17 13:47:03

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)

还请帮助看一下。谢谢!

sieben 发表于 2014-6-17 14:31:56

把 trx.Commit()

放在Next后面

sieben 发表于 2014-6-17 14:32:36

bref.ResetBlock()
这一句我不熟悉,建议不用试试看

fatkids 发表于 2014-6-17 15:30:18

sieben 发表于 2014-6-17 14:32 static/image/common/back.gif
bref.ResetBlock()
这一句我不熟悉,建议不用试试看

这一句只是为了获取到块的显示名字!

fatkids 发表于 2014-6-17 15:34:27

sieben 发表于 2014-6-17 14:31 static/image/common/back.gif
把 trx.Commit()

放在Next后面

放在之后让然报错,错误信息相同,eWrongDatabase。
另外把resetblock也注释掉了
页: [1] 2
查看完整版本: 菜鸟求助:关于两个文档之间BlockReference复制的问题!