插入具有预定义属性的现有块

本文关键字:预定义 插入 属性 | 更新日期: 2023-09-27 18:26:23

我正在开发一个c#程序,该程序旨在将autocad图形中已经存在的块插入到用户单击的任何位置,并自动向第一个自定义属性添加字符串值。我已经完成了其中的一部分,通过使用新的单击点位置和现有的块名称创建一个新的块参照。

只是由于某些原因,现有块上的两个自定义属性在新块上不存在,它只显示没有文本的块的行。请参阅下面程序的一小部分。有人知道为什么现有的块属性没有添加到新的块中吗?如果有,我该怎么做?我已经浏览了很多关于这个问题的论坛,它们都展示了如何创建全新的属性,而不是从现有的块中获得预定义的属性并将其添加到新的块中。

Scale3d blkScale = new Scale3d(drgScalemm, drgScalemm, drgScalemm);
ObjectId bdId = bt[blkName];
Point3d pt = ptInsert.Value;
BlockReference insblkref = new BlockReference(pt, bdId);
insblkref.ScaleFactors = blkScale;
insblkref.Rotation = 0;
btr.AppendEntity(insblkref);
tr.AddNewlyCreatedDBObject(insblkref, true);

插入具有预定义属性的现有块

你做了一个错误的假设。从"代码"插入块时,不会自动从块定义中插入属性。因此,您需要"手动"添加属性。

在VB:中截取的代码

 Sub AttributenToevoegen(ByVal BlokRefId As ObjectId)
        Dim doc = Application.DocumentManager.MdiActiveDocument
        Dim dwg = doc.Database
        Using doc.LockDocument
            Using transactie = doc.TransactionManager.StartTransaction()
                Try
                    Dim Ref As BlockReference
                    Ref = transactie.GetObject(BlokRefId, OpenMode.ForWrite)
                    Dim a = Ref.Name
                    Dim BlokDefinities As BlockTable
                    BlokDefinities = transactie.GetObject(dwg.BlockTableId, OpenMode.ForRead)
                    Dim Blokdefid = BlokDefinities(Ref.Name)
                    Dim BlokDefinitie As BlockTableRecord
                    BlokDefinitie = transactie.GetObject(Blokdefid, OpenMode.ForRead)
                    Dim AttRefIdColl = Ref.AttributeCollection
                    For Each elementId In BlokDefinitie
                        Dim Element As Entity
                        Element = transactie.GetObject(elementId, OpenMode.ForRead)
                        If TypeOf Element Is AttributeDefinition Then
                            Dim attribuutdefinitie = CType(Element, AttributeDefinition)
                            Dim attribuutreferentie As New AttributeReference
                            attribuutreferentie.SetAttributeFromBlock(attribuutdefinitie, Ref.BlockTransform)
                            AttRefIdColl.AppendAttribute(attribuutreferentie)
                            transactie.AddNewlyCreatedDBObject(attribuutreferentie, True)
                        End If
                    Next
                    transactie.Commit()
                Catch ex As Exception
                    MsgBox("Er ging iets fout: " & vbCrLf & ex.Message)
                End Try
            End Using
        End Using