明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: willj

已解决,在excel中通过VBA修改CAD中的动态块的自定义属性值

[复制链接]
 楼主| 发表于 2023-9-12 10:16:50 | 显示全部楼层
本帖最后由 willj 于 2023-9-12 10:20 编辑
chixun99 发表于 2023-9-11 12:33
dim vAtt as variant
vAtt = AttBlR.GetAttributes
            If IsArray(vAtt) Then

  1. Sub SetAttributeValue()
  2.     Dim objAcadApp As Object
  3.     Dim objAcadDoc As Object
  4.     Dim objBlockRef As Object
  5.     Dim objBlockRefs As Object
  6.     Dim strBlockName As String
  7.     Dim strAttributeName As String
  8.     Dim strAttributeValue As String
  9.     Dim blnBlockRefFound As Boolean

  10.     '连接到AutoCAD应用程序
  11.     On Error Resume Next
  12.     Set objAcadApp = GetObject(, "AutoCAD.Application")
  13.     If objAcadApp Is Nothing Then
  14.         Set objAcadApp = CreateObject("AutoCAD.Application")
  15.     End If
  16.     On Error GoTo 0

  17.     '检查是否连接到AutoCAD
  18.     If objAcadApp Is Nothing Then
  19.         MsgBox "无法连接到AutoCAD"
  20.         Exit Sub
  21.     End If

  22.     '获取当前打开的图档
  23.     Set objAcadDoc = objAcadApp.ActiveDocument

  24.     '检查是否打开了图档
  25.     If objAcadDoc Is Nothing Then
  26.         MsgBox "未打开图档"
  27.         Exit Sub
  28.     End If

  29.     '获取指定块参照对象的块名称、属性名称和属性值
  30.     strBlockName = "测试模块"
  31.     strAttributeName = "宽度"
  32.     strAttributeValue = "1400"


  33.     '遍历所有块参照对象并查找指定块参照对象
  34.     For Each objBlockRef In objBlockRefs
  35.         If objBlockRef.Name = strBlockName Then
  36.             blnBlockRefFound = True
  37.             '获取块参照对象的所有属性
  38.             Dim vAtt As Variant
  39.             vAtt = objBlockRef.GetAttributes
  40.             If IsArray(vAtt) Then
  41.                 '遍历属性集合并查找标签(TagString)等于指定块名称(BlName)的属性
  42.                 Dim i As Integer
  43.                 For i = LBound(vAtt) To UBound(vAtt)
  44.                     If vAtt(i).TagString = strAttributeName Then
  45.                         '设置属性值(TextString)为指定的值(ValueStr)
  46.                         vAtt(i).TextString = strAttributeValue
  47.                         Exit For
  48.                     End If
  49.                 Next i
  50.             End If
  51.             Exit For
  52.         End If
  53.     Next objBlockRef

  54.     '提示块参照对象是否存在
  55.     If blnBlockRefFound Then
  56.         MsgBox "块参照对象存在"
  57.     Else
  58.         MsgBox "块参照对象不存在"
  59.     End If
  60. End Sub


思路感觉是这样了。就是还有个报错不知道什么情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-9-12 14:11:53 | 显示全部楼层
本帖最后由 chixun99 于 2023-9-12 14:12 编辑

For Each objBlockRef In objBlockRefs 中的 objBlockRefs 改为选择集,把图纸中的所有图块选到选择集中。
代码中的objBlockRefs这个变量未赋值。
 楼主| 发表于 2023-9-12 19:07:37 | 显示全部楼层
本帖最后由 willj 于 2023-9-12 19:11 编辑
chixun99 发表于 2023-9-12 14:11
For Each objBlockRef In objBlockRefs 中的 objBlockRefs 改为选择集,把图纸中的所有图块选到选择集中。
...
找了其他资料用这种方式实现了。好像通过它块参照的名称来指定的话会报错,只有通过指定Set MyObj = acadModelSpace.Item(7)这样去指定这个块参照就可以。你说的这种选择集的方法还未研究出
  1. Sub SetAttributeValue()
  2.     Dim acadApp As Object
  3.     Dim acadDoc As Object
  4.     Dim acadModelSpace As Object
  5.     Dim MyObj As Object
  6.     Dim val As Double
  7.     Dim val2 As Double
  8.     Dim val3 As String
  9.    
  10.     '连接到AutoCAD
  11.     On Error Resume Next
  12.     Set acadApp = GetObject(, "AutoCAD.Application")
  13.     If Err.Number <> 0 Then
  14.         Set acadApp = CreateObject("AutoCAD.Application")
  15.     End If
  16.     On Error GoTo 0
  17.    
  18.     '获取当前文档和模型空间
  19.     Set acadDoc = acadApp.ActiveDocument
  20.     Set acadModelSpace = acadDoc.ModelSpace
  21.    
  22.     '获取指定块参照对象
  23.     Set MyObj = acadModelSpace.Item(7)
  24.     If MyObj.EntityName <> "AcDbBlockReference" Then
  25.         MsgBox "未找到块参照对象!"
  26.         Exit Sub
  27.     End If
  28.    
  29.     '修改属性值
  30.     val = 1200   '宽度  7
  31.     val2 = 2100  '深度  15
  32.     val3 = "圆风扇"  '平板灯  6
  33.    
  34.     Dim varAttributes As Variant
  35.     varAttributes = MyObj.GetDynamicBlockProperties
  36.    
  37.     varAttributes(7).value = val
  38.     varAttributes(15).value = val2
  39.     varAttributes(6).value = val3
  40.    
  41.     '刷新
  42.     MyObj.Update
  43.    
  44.     '保存并关闭文档
  45.     acadDoc.Save
  46.     acadDoc.Close
  47.    
  48.     '释放对象
  49.     Set MyObj = Nothing
  50.     Set acadModelSpace = Nothing
  51.     Set acadDoc = Nothing
  52.     Set acadApp = Nothing
  53. End Sub
发表于 2023-9-13 09:47:16 | 显示全部楼层
Set MyObj = acadModelSpace.Item(7)这个是整个模型空间(modelspace)中序号7的图元,刚好能蒙到也行吧。其实所有图元就是一个集合(对象),加个循环遍历所有图元,判断是块参照类型、块名(动态块需要用EffectiveName属性来对比)一致就可以了。
cad vba简单,多用就熟悉了。
发表于 2023-9-13 11:33:47 | 显示全部楼层
电梯老表,同行呀
 楼主| 发表于 2023-9-13 15:36:45 | 显示全部楼层
本帖最后由 willj 于 2023-9-13 15:38 编辑
chixun99 发表于 2023-9-13 09:47
Set MyObj = acadModelSpace.Item(7)这个是整个模型空间(modelspace)中序号7的图元,刚好能蒙到也行吧。 ...
完美解决了,多谢指点
  1.     '循环遍历所有块参照对象
  2.     For Each MyObj In acadModelSpace
  3.         '判断是否是块参照对象
  4.         If MyObj.EntityName = "AcDbBlockReference" Then
  5.             '获取块的名称
  6.             blkName = MyObj.EffectiveName
  7.             '判断是否是要获取动态块属性的块参照对象
  8.             If blkName = "测试模块" Then
  9.                 '获取动态块属性
  10.                 Dim props As Variant
  11.                 props = MyObj.GetDynamicBlockProperties
  12.                
  13.                 val = Range("B1")   '宽度
  14.                 val2 = Range("B2")  '深度
  15.                 val3 = Range("B3")  '平板灯
  16.                 '循环遍历动态块属性
  17.                 Dim prop As Variant
  18.                 For Each prop In props
  19.                     '获取属性名称和值
  20.                     On Error Resume Next
  21.                     Select Case prop.PropertyName
  22.                         Case "宽度"
  23.                             prop.value = val
  24.                         Case "深度"
  25.                             prop.value = val2
  26.                         Case "顶开孔"
  27.                             prop.value = val3
  28.                     End Select
  29.                     
  30.                 '刷新
  31.                 MyObj.Update
  32.                 Next prop

回复 支持 2 反对 0

使用道具 举报

发表于 2023-9-14 11:55:00 | 显示全部楼层
willj 发表于 2023-9-13 15:36
完美解决了,多谢指点

恭喜又多一个入坑的。
发表于 2023-9-14 16:24:06 | 显示全部楼层
willj 发表于 2023-9-13 15:36
完美解决了,多谢指点

请教下,感觉代码不齐全?
 楼主| 发表于 2023-9-15 08:25:53 | 显示全部楼层
sunny_8848 发表于 2023-9-14 16:24
请教下,感觉代码不齐全?

结合上文就齐了
发表于 2023-12-1 20:59:55 来自手机 | 显示全部楼层
我也研究一下动态块
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:42 , Processed in 0.528814 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表