明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2086|回复: 26

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

[复制链接]
发表于 2023-9-11 10:32 | 显示全部楼层 |阅读模式
本帖最后由 willj 于 2023-9-13 12:45 编辑



如图想在excel中使用VBA修改红色箭头的值,更新保存到CAD中去。





本帖子中包含更多资源

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

x
 楼主| 发表于 2023-9-13 15:36 | 显示全部楼层
本帖最后由 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-12-5 12:39 | 显示全部楼层
willj 发表于 2023-9-13 15:36
完美解决了,多谢指点

为什么我运行prop.value = val的时候会报错,从官网文档上看prop.value 是不能修改的
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-9-12 10:16 | 显示全部楼层
本帖最后由 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-11 10:45 | 显示全部楼层
在 excel  编程不就行了
 楼主| 发表于 2023-9-11 11:00 | 显示全部楼层
liuhe 发表于 2023-9-11 10:45
在 excel  编程不就行了

可以出个示例学习下吗
发表于 2023-9-11 11:32 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mo ... =%CA%F4%D0%D4%BF%E9去这个连接找找我回复的代码参考。
 楼主| 发表于 2023-9-11 11:56 | 显示全部楼层
chixun99 发表于 2023-9-11 11:32
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=186844&highlight=%CA%F4%D0%D4%BF%E9去这个连接找找我 ...

老师好,如果有时间是否可以帮我搞个示例。我查了下好像是需要用到GetDynamicBlockProperties方法去获取动态块的自定义属性,具体实现修改还未摸索出来。
发表于 2023-9-11 12:33 | 显示全部楼层
dim vAtt as variant
vAtt = AttBlR.GetAttributes
            If IsArray(vAtt) Then
                For i = 0 To UBound(vAtt)
                    If vAtt(i).TagString = BlName Then vAtt(i).TextString = ValueStr
                Next
            End If
就这段可以实现属性值的修改了?关键是要遍历所有你的图块图形,BlName 改为对应你的A列的名称,ValueStr改为对应你的B列的值
 楼主| 发表于 2023-9-11 13:06 | 显示全部楼层
chixun99 发表于 2023-9-11 12:33
dim vAtt as variant
vAtt = AttBlR.GetAttributes
            If IsArray(vAtt) Then

暂时无从下手
发表于 2023-9-11 13:33 | 显示全部楼层

你会VBA吗?看你的帖子和帐号,很多年的账号了,但是没有一个代码
 楼主| 发表于 2023-9-11 13:45 | 显示全部楼层
liuhe 发表于 2023-9-11 13:33
你会VBA吗?看你的帖子和帐号,很多年的账号了,但是没有一个代码

第一次连CAD进行操作
发表于 2023-9-11 17:13 | 显示全部楼层
willj 发表于 2023-9-11 13:45
第一次连CAD进行操作

你要是真会vba  直接查书就能解决的事情
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 10:51 , Processed in 0.322877 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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