johnpolob 发表于 2015-11-25 05:06:58

深层克隆VB网络

大家好,
我需要用数字扩展名重命名我绘图中的一些块。
这不是问题,因为我下面的代码做得很好。
但是当我清除我的绘图时,所有重命名的块都消失了。
我不知道我是否正确使用了“DeepClone”方法。
有人能帮我解决这个问题吗?
欢迎所有建议。
提前谢谢你。
我的代码:
      
      Public Sub test()
            Dim zDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim zDb As Database = zDoc.Database
            Dim zEd As Editor = zDoc.Editor
            Using mTrans As Transaction = zDb.TransactionManager.StartTransaction()
                Try
                  Dim mBlkTbl As BlockTable = mTrans.GetObject(zDb.BlockTableId, OpenMode.ForWrite)
                  Dim zBlkTblRec As BlockTableRecord = mTrans.GetObject(mBlkTbl("test"), OpenMode.ForWrite)
                  Dim i As Integer
                  For Each zBlkTableRecId As ObjectId In zBlkTblRec.GetBlockReferenceIds(True, False)
                        Dim BlkRef As BlockReference = mTrans.GetObject(zBlkTableRecId, OpenMode.ForWrite)
                        Dim zMap As New IdMapping
                        Dim newzBlkTblRec As BlockTableRecord = zBlkTblRec.DeepClone(mBlkTbl, zMap, True)
                        newzBlkTblRec.Name = zBlkTblRec.Name & i
                        BlkRef.BlockTableRecord = mBlkTbl.Add(newzBlkTblRec)
                        mTrans.AddNewlyCreatedDBObject(newzBlkTblRec, True)
                        i = i + 1
                  Next
                Catch ex As SystemException
                  MsgBox(ex.Message.ToString, MsgBoxStyle.Critical, "Rename block.")
                End Try
                mTrans.Commit()
            End Using
      End Sub

**** Hidden Message *****

CADbloke 发表于 2015-11-25 05:21:52

Purge将清除所有没有在绘图中插入至少一个块引用的块定义。您已将新定义添加到块表中,但尚未保存对
BlkRef
块引用的更改。
为了证明这一点,请检查属性面板中的块插入的块名称。
但是我不明白为什么您会想要有很多重复的块定义,您可以向块添加一个属性并使用它来按名称识别每个插入吗?

johnpolob 发表于 2015-11-25 06:16:20

嗨,卡德布罗克,
感谢您的快速回复。
如果块的名称是“TEST”,我需要像这样重命名每个块,所有同名的块将被重命名为“TEST0”,“TEST1”,“TEST2”等。我的代码做得很好。
我在“块插入”选项板中看到所有重命名的块。
当我尝试保存图形时,我在AutoCAD文本窗口中看到以下消息:“*警告*乘以拥有的对象,处理”193AE“”
您能告诉我如何保存对BlkRef块引用的更改吗?
可能是我的问题。
谢谢。

johnpolob 发表于 2015-11-25 06:44:34

有人能帮我吗?

MexicanCustard 发表于 2015-11-25 07:37:58

一个街区有两个部分。
1。BlockTableRecord,它是位于数据库的BlockTable中的定义。BlockReference是您在模型空间/图纸空间中看到的实体,它引用BlockTableRecord
如果没有block reference引用回您的BlockTableRecord,则当您清除时,您的所有BlockTableRecord都将被删除。您必须更改所有现有的块引用以指向新的块表记录。
我不会将DeepClone用于此应用程序。我会创建新的BlockTableRecords并修改现有的BlockReferences。

johnpolob 发表于 2015-11-25 07:58:58

嗨,墨西哥库斯塔德,
感谢您的回复。
请问您有例子吗?
谢谢。

johnpolob 发表于 2015-11-25 09:58:43

请需要你的帮助。
谢谢。

MexicanCustard 发表于 2015-11-25 10:12:03

对不起,我在想你可以爆炸并创建一个新的BlockTableRecord,但如果你保留原始块,那就行不通了。因此,深度克隆是一条出路。您只需要克隆BlockTableRecord,而不是BlockReferences
var db=Application.DocumentManager.MdiActiveDocument.Database
使用(var tr=db.TransactionManager.StartTransaction())
{
var bt=(BlockTable)tr.GetObject(db.BlockTableId,OpenMode.ForWrite)
var ms=(BlockTableRecord)tr.GetObject(bt,OpenMode.ForRead)
var testBlock=(BlockTableRecord)tr.GetObject(bt[“test”],OpenMode.ForRead)
var newBlock=(BlockTableRecord)测试块。DeepClone(bt,new IdMapping(),true)
tr.AddNewlyCreatedDBObject(newBlock,true)
var references=testBlock。GetBlockReferenceId(真、假)
foreach(references.Cast
()中的var引用)
{
var blockReference=(blockreforence)tr.GetObject(reference,OpenMode.ForWrite)
块引用。BlockTableRecord=newBlock.ObjectId
}
tr.Commit()
}

johnpolob 发表于 2015-11-25 10:25:52

谢谢墨西哥Custard,
我会改编它,让你知道是否好。
我认为足以开始工作。

johnpolob 发表于 2015-11-25 11:05:29

你好,MexicanCustard,
我在清除我的绘图时遇到了同样的问题->所有的块都消失了。
你能在你的机器上检查一下吗?
非常感谢。
页: [1] 2
查看完整版本: 深层克隆VB网络