乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 57|回复: 9

[编程交流] 更改块属性默认值

[复制链接]

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:34:12 | 显示全部楼层 |阅读模式
尊敬的Autocad朋友们:,
 
我在区块中的属性有问题。我已经创建了许多具有不同属性的块,其中有默认值/初始化值。现在我想用tht中的值更改这些默认值。TextString,而不是每次在blockeditor中输入。我试图用VBA更改它们,但找不到默认值的成员。我也不是舒尔,它工作如此。。。。
 
代码:
 
  1. Public Sub changedefault()
  2. Count = ThisDrawing.ActiveLayout.Block.Count
  3. For Index = 0 To Count - 1
  4. Blockstring = ThisDrawing.ActiveLayout.Block(Index).ObjectName
  5. If Blockstring = "AcDbBlockReference" Then
  6. BAttributes = ThisDrawing.ActiveLayout.Block(Index).GetAttributes
  7. For Each attrib In BAttributes
  8. attrib.???? = attrib.TextString
  9. Next attrib
  10. End If
  11. Next Index
  12. End Sub

我很乐意接受所有提示和提示
 
非常感谢
托马斯
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 22:44:25 | 显示全部楼层
只是一个提示
默认属性值存储在AcadBlock对象中(查看其中的AcadAttribute对象)
但是您试图在AcadBlockReference中更改它们,其中
您正在循环访问AcadAttributeReference对象
HTH公司
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 22:49:03 | 显示全部楼层
在工作图纸副本上尝试以下代码:
  1. Option Explicit
  2. Function IsBlockExist(bName As String) As Boolean
  3. ' credits to Frank Oquendo
  4. Dim oBlock As AcadBlock
  5. IsBlockExist = False
  6. On Error Resume Next
  7. For Each oBlock In ThisDrawing.Blocks
  8. If StrComp(oBlock.Name, bName, vbTextCompare) = 0 Then
  9. IsBlockExist = True
  10. End If
  11. Next
  12. End Function
  13. Sub TryIt()
  14. Dim blkName As String
  15. blkName = InputBox(vbCrLf & "Enter block name:", "Default Attribute Values Example")
  16. If Not IsBlockExist(blkName) Then
  17. MsgBox "Block " & Chr(34) & blkName & Chr(34) & " dos not exists"
  18. Exit Sub
  19. End If
  20. On Error GoTo Err_Control
  21. '----------------------------------------------'
  22. ' selection test:
  23. Dim ftype(0 To 2) As Integer
  24. Dim fdata(0 To 2) As Variant
  25. Dim dxfCode, dxfValue
  26. ftype(0) = 0: fdata(0) = "INSERT"
  27. ftype(1) = 66: fdata(1) = 1
  28. ftype(2) = 2: fdata(2) = "`U*," & blkName '<-- filter to select anonimous block as well
  29. dxfCode = ftype: dxfValue = fdata
  30. Dim oSset As AcadSelectionSet
  31. With ThisDrawing.SelectionSets
  32. While .Count > 0
  33. .item(0).Delete
  34. Wend
  35. Set oSset = .Add("MySset")
  36. End With
  37. Application.Eval ("msgbox(" & Chr(34) & "Select block instances" & Chr(34) & ")")
  38. oSset.SelectOnScreen dxfCode, dxfValue
  39. If oSset.Count = 0 Then
  40. MsgBox "Nothing selected"
  41. Exit Sub
  42. End If
  43. Dim aTag As String
  44. aTag = InputBox(vbCrLf & "Enter Attribute Tag:", "Default Attribute Values Example", "ID")
  45. Dim defaultVal As String
  46. Dim oEnt As AcadEntity
  47. Dim oBlkRef As AcadBlockReference
  48. Dim oBlock As AcadBlock
  49. Dim bName As String
  50. For Each oEnt In oSset
  51. Set oBlkRef = oEnt
  52. If oBlkRef.IsDynamicBlock Then
  53. bName = oBlkRef.EffectiveName
  54. Else
  55. bName = oBlkRef.Name
  56. End If
  57. If StrComp(blkName, bName, vbTextCompare) = 0 Then
  58. Set oBlock = ThisDrawing.Blocks.item(blkName)
  59. Dim oObj As AcadObject
  60. Dim oAttrib As AcadAttribute
  61. For Each oObj In oBlock
  62. If TypeOf oObj Is AcadAttribute Then
  63. Set oAttrib = oObj
  64. If StrComp(oAttrib.TagString, aTag, vbTextCompare) = 0 Then
  65. defaultVal = oAttrib.TextString
  66. Exit For
  67. End If
  68. End If
  69. Next oObj
  70. Dim i As Integer
  71. Dim attArr As Variant
  72. Dim oAttRef As AcadAttributeReference
  73. attArr = oBlkRef.GetAttributes
  74. For i = LBound(attArr) To UBound(attArr)
  75. Set oAttRef = attArr(i)
  76. If StrComp(oAttRef.TagString, aTag, vbTextCompare) = 0 Then
  77. oAttRef.TextString = defaultVal
  78. Exit For
  79. End If
  80. Next i
  81. End If
  82. Next oEnt
  83. ThisDrawing.Regen acActiveViewport
  84. Err_Control:
  85. End Sub

 
~'J'~
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:55:37 | 显示全部楼层
非常感谢您的代码。我希望能够稍微修改一下,使attribute的actaul值成为默认值。您的代码将实际值替换为默认值。
 
抱歉重复发帖:尚未看到您的回复
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 23:05:19 | 显示全部楼层
没问题
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 23:11:12 | 显示全部楼层
Hy朋友们,
 
首先我必须原谅我的英语:对不起
第二,也很抱歉我的代码混乱。这可能是我在VBA中第一次尝试自己编写的代码
 
正如我所描述的,我正在搜索设置我的。textstring作为属性的默认值,但我无法编写它。
所以我试着写一个,在同一个插入点创建图形中每个块的副本,并在与旧块相同的点创建新属性。
出乎意料的是,它真的有效!!!
但是仍然有一个问题我无法解决:我想删除旧属性,这样只有具有新默认值的新属性
我在论坛和互联网上搜索了很多时间,但我没有找到我可以使用的东西。
如果有人能帮我,我真的会很高兴。
 
这是我的代码:
 
 
 
非常感谢
托马斯
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 23:16:35 | 显示全部楼层
托马斯,我完全糊涂了
请试试这个:
-创建样例图形并在其中插入2个块参照
-具有旧属性和值的第一个块参照
-以及具有新属性和新值的第二个块参考
没有别的了
-然后以格式上传此图纸
 
也许我更容易理解你需要什么
 
奥列格
 
~'J'~
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 23:21:24 | 显示全部楼层
Hy Oleg,
 
抱歉解释得不好。我真的希望这幅画能有所帮助。
该图中有3个块。我将用中的旧值更改的原始块。属性的文本字符串,并在块编辑器中设置为属性的默认值。中间的一个在中具有正确的(新)值。Textstring,但blockeditor中的假(旧)字符串作为默认值。3个块(由于属性默认值不同而命名为不同的块。应使用相同的名称)中的新值。Textstring和right也在blockeditor中设置为默认值)。
 
我几乎可以用上面的代码解决我的问题。我只是没有删除Blockeditor中的(false/old)属性,以便下次插入块时,它将只是具有用户在中插入的值的新属性。Textstring(块的用户界面/不在Blockeditorwindow中)作为默认值。
 
我希望我能够解释我,如果不只是发短信给我。非常感谢,对所有不方便的事情表示抱歉
 
托马斯
样品dxf
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 23:30:03 | 显示全部楼层
Thomas,试试这个单属性代码
然后让我知道这个代码是如何工作的
为你
  1. Option Explicit
  2. Function IsBlockExist(bName As String) As Boolean
  3. Dim oBlock As AcadBlock
  4. IsBlockExist = False
  5. On Error Resume Next
  6. For Each oBlock In ThisDrawing.Blocks
  7. If StrComp(oBlock.Name, bName, vbTextCompare) = 0 Then
  8. IsBlockExist = True
  9. End If
  10. Next
  11. End Function
  12. Sub TestForThomas()
  13. Dim blkName As String
  14. blkName = InputBox(vbCrLf & "Enter block name:", "Default Attribute Values Example", "block2circles")
  15. If Not IsBlockExist(blkName) Then
  16. MsgBox "Block " & Chr(34) & blkName & Chr(34) & " doesn't exists"
  17. Exit Sub
  18. End If
  19. On Error GoTo Err_Control
  20. '----------------------------------------------'
  21. ' selection test:
  22. Dim ftype(0 To 2) As Integer
  23. Dim fdata(0 To 2) As Variant
  24. Dim dxfCode, dxfValue
  25. ftype(0) = 0: fdata(0) = "INSERT"
  26. ftype(1) = 66: fdata(1) = 1
  27. ftype(2) = 2: fdata(2) = "`U*," & blkName '<-- filter to select anonimous block as well
  28. dxfCode = ftype: dxfValue = fdata
  29. Dim oSset As AcadSelectionSet
  30. With ThisDrawing.SelectionSets
  31. While .Count > 0
  32. .item(0).Delete
  33. Wend
  34. Set oSset = .Add("MySset")
  35. End With
  36. oSset.Select acSelectionSetAll, , , dxfCode, dxfValue
  37. If oSset.Count = 0 Then
  38. MsgBox "Nothing selected"
  39. Exit Sub
  40. End If
  41. Dim aTag As String
  42. aTag = InputBox(vbCrLf & "Enter Attribute Tag:", "Default Attribute Values Example", "ATTRIBUTE1")
  43. Dim defaultVal As String
  44. defaultVal = InputBox(vbCrLf & "Enter the Default Attribute Value:", "Default Attribute Values Example", "- Blah -")
  45. Dim oEnt As AcadEntity
  46. Dim oBlkRef As AcadBlockReference
  47. Dim oBlock As AcadBlock
  48. Dim bName As String
  49. For Each oEnt In oSset
  50. Set oBlkRef = oEnt
  51. '' get the block reference owner
  52. Dim ltObj As AcadObject
  53. Set ltObj = ThisDrawing.ObjectIdToObject(oBlkRef.OwnerID)
  54. '' check if this block reference is belongs to the current space
  55. If ltObj.Handle = ThisDrawing.ActiveLayout.Block.Handle Then
  56. If oBlkRef.IsDynamicBlock Then
  57. bName = oBlkRef.EffectiveName
  58. Else
  59. bName = oBlkRef.Name
  60. End If
  61. If StrComp(blkName, bName, vbTextCompare) = 0 Then
  62. Set oBlock = ThisDrawing.Blocks.item(blkName)
  63. Dim oObj As AcadObject
  64. Dim oAttrib As AcadAttribute
  65. '' iterate through block definition subobjects
  66. For Each oObj In oBlock
  67. '' check if object is type of Attribute object
  68. If TypeOf oObj Is AcadAttribute Then
  69. Set oAttrib = oObj
  70. '' check if attribute tags is ineteresting for us
  71. If StrComp(oAttrib.TagString, aTag, vbTextCompare) = 0 Then
  72. '' check if attribute value is not equal to the newly defined value
  73. If oAttrib.TextString <> defaultVal Then
  74. '' if not equal so change it on default
  75. oAttrib.TextString = defaultVal
  76. '' the desired attribute was changed, we can go out from iteration
  77. Exit For
  78. End If
  79. End If
  80. End If
  81. Next oObj
  82. '' then turn back to our block reference
  83. '' and change known attribute value on default value
  84. Dim oAttribs As Variant
  85. oAttribs = oBlkRef.GetAttributes
  86. Dim i
  87. For i = LBound(oAttribs) To UBound(oAttribs)
  88. Dim oAttRef As AcadAttributeReference
  89. Set oAttRef = oAttribs(i)
  90. If StrComp(oAttRef.TagString, aTag, vbTextCompare) = 0 Then
  91. oAttRef.TextString = defaultVal
  92. Exit For
  93. End If
  94. Next
  95. End If
  96. End If
  97. Next oEnt
  98. Err_Control:
  99. If Err.Number <> 0 Then
  100. MsgBox Err.Description
  101. End If
  102. End Sub

 
~'J'~
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 23:39:42 | 显示全部楼层
Hy Oleg,
 
非常感谢你的帮助和花费的时间。我真的很感激
 
昨天的代码几乎完成了。只有一些变化
 
1) defaultVal:应该将其设置为插入框。如果双击图形中的某个块,可以打开窗口/遮罩。在那里,您可以更改属性的值,但不会更改块编辑器中属性的默认值。这是。文本字符串。我希望设置这个。textstring作为默认值
 
2) 代码应该对块的所有属性都执行此操作(我能够在代码trought中编写此例程)
 
 
3) 代码应该为这个图形中的每个块都这样做(我也能够在代码中编写它)
 
今天我的学习时间有点不够,所以我无法尝试更改您的代码,但我非常确信,通过我们的CADE组合,我将能够编写正确的代码。 
谢谢Oleg并致以最良好的问候
托马斯
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 06:03 , Processed in 1.117110 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表