明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5568|回复: 16

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

[复制链接]
发表于 2014-6-16 11:30:13 | 显示全部楼层 |阅读模式
各位好:

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

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

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

       谢谢!
发表于 2014-6-16 14:05:05 | 显示全部楼层
思路没有问题,eAlreadylnDb说明你可能重复添加了,注意检查图块是否已经存在
 楼主| 发表于 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.
请大家帮看看,怎么处理啊!
谢谢!
发表于 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);
发表于 2014-6-17 10:22:24 | 显示全部楼层
上面我写的是C#代码
trx.AddNewlyCreatedDBObject(bref, True)//这句里面的bref已存在,不能再添加
 楼主| 发表于 2014-6-17 13:47:03 | 显示全部楼层
sieben 发表于 2014-6-17 10:20
btrMs.AppendEntity(bref.Clone)
trx.AddNewlyCreatedDBObject(bref, True)
--------------------------- ...

感谢sieben的回复。我尝试了你的代码,还是有错误。

                Dim tEnt As Entity = bref.Clone
                btrMs.AppendEntity(tEnt) ‘这一行报错,eWrongDatabase
                trx.AddNewlyCreatedDBObject(tEnt, True)

还请帮助看一下。谢谢!
发表于 2014-6-17 14:31:56 | 显示全部楼层
把 trx.Commit()

放在Next后面
发表于 2014-6-17 14:32:36 | 显示全部楼层
bref.ResetBlock()
这一句我不熟悉,建议不用试试看
 楼主| 发表于 2014-6-17 15:30:18 | 显示全部楼层
sieben 发表于 2014-6-17 14:32
bref.ResetBlock()
这一句我不熟悉,建议不用试试看

这一句只是为了获取到块的显示名字!
 楼主| 发表于 2014-6-17 15:34:27 | 显示全部楼层
sieben 发表于 2014-6-17 14:31
把 trx.Commit()

放在Next后面

放在之后让然报错,错误信息相同,eWrongDatabase。
另外把resetblock也注释掉了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 12:21 , Processed in 0.166490 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表