<2024-08-08更新>
我用另一个思路解决了这个难题:
不再使用块属性关联【距离】对象,而是采用变通的方法,也即用一个除了尺寸外关闭其他所有内容的【标注】来代替块【属性】。很巧妙的方法,完全能满足我的要求,并且还收获了意外的优点(显示的悬臂长度是实时刷新的,而不必入之前需要用re命令手动刷新图纸才更新)。
============================
<原问题>
有一个带属性的块,其属性的默认值关联的是某个对象的值,使用下面代码插入时,属性会被改为文本类型,失去和对象的关联。
如下图,第一次插入的块是采用代码插入,关联对象的属性被破坏了;第二次是使用CAD内置命令插入的块,还保留着关联的属性。
不知是否有哪位知道如何解决这个问题。

网友答: 使用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
那个拖动时显示的长度数字并不是刻意“隐藏”的,应该是动态块的“距离”参数,是自动显示的。
尝试了一下,距离参数没有显示。启发了另一种想法,应该是本来标注的文字字高改小隐藏的,显示出来的是动态输入的文字。尝试成功!
网友答:
本帖最后由 你有种再说一遍 于 2024-10-12 22:52 编辑 看起来就是字段类型的反应器没有附着到块参照上面?
找到了一种方式:通过"块特性表"
https://jingyan.baidu.com/article/d45ad1488521dc28552b80ed.html
二级菜单版本:
https://www.cadzxw.com/44132.html
网友答:
tranque 发表于 2024-8-8 10:31
U1S1拉伸标注确实好用,不是道是不是楼主的那个意思
把标注做到动态块挺异端的网友答:
你有种再说一遍 发表于 2024-8-8 10:57
把标注做到动态块挺异端的
【能用】万岁吧。哈哈哈!网友答:
你有种再说一遍 发表于 2024-8-8 10:57
把标注做到动态块挺异端的
原来您是博客园的【惊惊】博主啊,《日志篇 惊惊博客轨迹》我偶尔会打开看看(很久不更新了),没想到在这里遇到了。幸会。网友答: 不错,功能大为扩展网友答: 啥意思,没明白,咋解决的