插入具有预定义属性的现有块
本文关键字:预定义 插入 属性 | 更新日期: 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