本帖最后由 transteel 于 2024-8-8 09:29 编辑

<2024-08-08更新>


我用另一个思路解决了这个难题:


不再使用块属性关联【距离】对象,而是采用变通的方法,也即用一个除了尺寸外关闭其他所有内容的【标注】来代替块【属性】。很巧妙的方法,完全能满足我的要求,并且还收获了意外的优点(显示的悬臂长度是实时刷新的,而不必入之前需要用re命令手动刷新图纸才更新)。


============================

<原问题>

有一个带属性的块,其属性的默认值关联的是某个对象的值,使用下面代码插入时,属性会被改为文本类型,失去和对象的关联。

如下图,第一次插入的块是采用代码插入,关联对象的属性被破坏了;第二次是使用CAD内置命令插入的块,还保留着关联的属性。

不知是否有哪位知道如何解决这个问题。

  1. ' 添加块参照到模型空间或块表记录空间
  2.                         Dim ms As BlockTableRecord = CType(trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite), BlockTableRecord)
  3.                         ms.AppendEntity(blkRef)
  4.                         trans.AddNewlyCreatedDBObject(blkRef, True)
  5. ' 处理块中的属性
  6.                         Dim btr As BlockTableRecord = CType(trans.GetObject(btrId, OpenMode.ForRead), BlockTableRecord)
  7.                         For Each objId As ObjectId In btr
  8.                             Dim obj As DBObject = trans.GetObject(objId, OpenMode.ForRead)
  9.                             If TypeOf obj Is AttributeDefinition Then
  10.                                 Dim attDef As AttributeDefinition = CType(obj, AttributeDefinition)
  11.                                 If Not attDef.Constant Then
  12.                                     ' 创建属性并设置值
  13.                                     Dim attRef As New AttributeReference()
  14.                                     attRef.SetAttributeFromBlock(attDef, blkRef.BlockTransform)
  15.                                     ' 添加属性到块参照
  16.                                     blkRef.AttributeCollection.AppendAttribute(attRef)
  17.                                     trans.AddNewlyCreatedDBObject(attRef, True)
  18.                                 End If
  19.                             End If
  20.                         Next




网友答: 使用ACAD官方给的.net代码也不能实现。(VBA是可以实现的。)

下面是官方代码:ttps://help.autodesk.com/view/OARX/2023/CHS/?guid=GUID-2107599E-9405-4D8B-A6DD-83D603B41568

  1. For Each objID As ObjectId In acBlkTblRec
  2.     ' 遍历块表记录中的每一个对象ID
  3.     Dim dbObj As DBObject = acTrans.GetObject(objID, OpenMode.ForRead)
  4.     ' 通过事务获取数据库对象(DBObject),以供读取
  5.     If TypeOf dbObj Is AttributeDefinition Then
  6.         ' 如果数据库对象是属性定义(AttributeDefinition)类型
  7.         Dim acAtt As AttributeDefinition = dbObj
  8.         ' 将数据库对象转换为属性定义对象(AttributeDefinition)
  9.         If Not acAtt.Constant Then
  10.             ' 如果属性定义对象不是常量属性
  11.             Using acAttRef As New AttributeReference
  12.                 ' 使用属性引用对象(AttributeReference)
  13.                 acAttRef.SetAttributeFromBlock(acAtt, acBlkRef.BlockTransform)
  14.                 ' 从块中的属性定义设置属性引用对象的属性
  15.                 acAttRef.Position = acAtt.Position.TransformBy(acBlkRef.BlockTransform)
  16.                 ' 根据块的变换设置属性引用对象的位置
  17.                 acAttRef.TextString = acAtt.TextString
  18.                 ' 设置属性引用对象的文本字符串与属性定义相同
  19.                 acBlkRef.AttributeCollection.AppendAttribute(acAttRef)
  20.                 ' 将属性引用对象添加到块引用的属性集合中
  21.                 acTrans.AddNewlyCreatedDBObject(acAttRef, True)
  22.                 ' 将新创建的属性引用对象添加到事务中
  23.             End Using
  24.         End If
  25.     End If
  26. 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
把标注做到动态块挺异端的

原来您是博客园的【惊惊】博主啊,《日志篇 惊惊博客轨迹》我偶尔会打开看看(很久不更新了),没想到在这里遇到了。幸会。

网友答: 不错,功能大为扩展

网友答: 啥意思,没明白,咋解决的
  • 上一篇:cad.net 自然语言查找相似图元
  • 下一篇:没有了