插入带特殊属性的块的问题
本帖最后由 transteel 于 2024-8-8 09:29 编辑<2024-08-08更新>
我用另一个思路解决了这个难题:
不再使用块属性关联【距离】对象,而是采用变通的方法,也即用一个除了尺寸外关闭其他所有内容的【标注】来代替块【属性】。很巧妙的方法,完全能满足我的要求,并且还收获了意外的优点(显示的悬臂长度是实时刷新的,而不必入之前需要用re命令手动刷新图纸才更新)。
============================<原问题>有一个带属性的块,其属性的默认值关联的是某个对象的值,使用下面代码插入时,属性会被改为文本类型,失去和对象的关联。如下图,第一次插入的块是采用代码插入,关联对象的属性被破坏了;第二次是使用CAD内置命令插入的块,还保留着关联的属性。不知是否有哪位知道如何解决这个问题。' 添加块参照到模型空间或块表记录空间
Dim ms As BlockTableRecord = CType(trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
ms.AppendEntity(blkRef)
trans.AddNewlyCreatedDBObject(blkRef, True)
' 处理块中的属性
Dim btr As BlockTableRecord = CType(trans.GetObject(btrId, OpenMode.ForRead), BlockTableRecord)
For Each objId As ObjectId In btr
Dim obj As DBObject = trans.GetObject(objId, OpenMode.ForRead)
If TypeOf obj Is AttributeDefinition Then
Dim attDef As AttributeDefinition = CType(obj, AttributeDefinition)
If Not attDef.Constant Then
' 创建属性并设置值
Dim attRef As New AttributeReference()
attRef.SetAttributeFromBlock(attDef, blkRef.BlockTransform)
' 添加属性到块参照
blkRef.AttributeCollection.AppendAttribute(attRef)
trans.AddNewlyCreatedDBObject(attRef, True)
End If
End If
Next
使用ACAD官方给的.net代码也不能实现。(VBA是可以实现的。)
下面是官方代码:ttps://help.autodesk.com/view/OARX/2023/CHS/?guid=GUID-2107599E-9405-4D8B-A6DD-83D603B41568
For Each objID As ObjectId In acBlkTblRec
' 遍历块表记录中的每一个对象ID
Dim dbObj As DBObject = acTrans.GetObject(objID, OpenMode.ForRead)
' 通过事务获取数据库对象(DBObject),以供读取
If TypeOf dbObj Is AttributeDefinition Then
' 如果数据库对象是属性定义(AttributeDefinition)类型
Dim acAtt As AttributeDefinition = dbObj
' 将数据库对象转换为属性定义对象(AttributeDefinition)
If Not acAtt.Constant Then
' 如果属性定义对象不是常量属性
Using acAttRef As New AttributeReference
' 使用属性引用对象(AttributeReference)
acAttRef.SetAttributeFromBlock(acAtt, acBlkRef.BlockTransform)
' 从块中的属性定义设置属性引用对象的属性
acAttRef.Position = acAtt.Position.TransformBy(acBlkRef.BlockTransform)
' 根据块的变换设置属性引用对象的位置
acAttRef.TextString = acAtt.TextString
' 设置属性引用对象的文本字符串与属性定义相同
acBlkRef.AttributeCollection.AppendAttribute(acAttRef)
' 将属性引用对象添加到块引用的属性集合中
acTrans.AddNewlyCreatedDBObject(acAttRef, True)
' 将新创建的属性引用对象添加到事务中
End Using
End If
End If
Next
transteel 发表于 2024-10-8 08:17
那个拖动时显示的长度数字并不是刻意“隐藏”的,应该是动态块的“距离”参数,是自动显示的。
尝试了一下,距离参数没有显示。启发了另一种想法,应该是本来标注的文字字高改小隐藏的,显示出来的是动态输入的文字。尝试成功!:handshake 本帖最后由 你有种再说一遍 于 2024-10-12 22:52 编辑
看起来就是字段类型的反应器没有附着到块参照上面?
找到了一种方式:通过"块特性表"
https://jingyan.baidu.com/article/d45ad1488521dc28552b80ed.html
二级菜单版本:
https://www.cadzxw.com/44132.html
U1S1拉伸标注确实好用,不是道是不是楼主的那个意思 tranque 发表于 2024-8-8 10:31
U1S1拉伸标注确实好用,不是道是不是楼主的那个意思
把标注做到动态块挺异端的 你有种再说一遍 发表于 2024-8-8 10:57
把标注做到动态块挺异端的
凑活用了,怎么省事怎么来,反正一个月没多少窝囊费,糊弄完就下班 你有种再说一遍 发表于 2024-8-8 10:57
把标注做到动态块挺异端的
【能用】万岁吧。哈哈哈! 你有种再说一遍 发表于 2024-8-8 10:57
把标注做到动态块挺异端的
原来您是博客园的【惊惊】博主啊,《日志篇 惊惊博客轨迹》我偶尔会打开看看(很久不更新了),没想到在这里遇到了。幸会。 不错,功能大为扩展 啥意思,没明白,咋解决的
页:
[1]
2