乐筑天下

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

全局属性编辑器

[复制链接]

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

铜币
731
发表于 2008-4-3 05:36:28 | 显示全部楼层 |阅读模式
我已经有一段时间没有在这里发布任何实质性内容了,所以我想分享一下。我昨天很无聊,把它放在一起,它是一个“全局”属性编辑器,列出了当前图形中的所有块(包含属性)
当您从列表中选择一个块时,(它还显示布局),它显示与该块相关的属性,您可以从那里修改属性值
您可以要么
a)仅修改选定块的属性,或b)修改所有布局中该块属性的所有实例。您还可以选择在选择时自动切换到所选块布局,并可以选择缩放到所选的特定块。您还可应用过滤器,仅列出以“abc”等开头的块。您将需要一个用户表单和以下控件:列表框&nbsp 名称:LBblocks&nbsp 名称:LBATT文本框&nbsp 名称:TBfilter&nbsp 名称:TBattvalue复选框&nbsp 姓名:CBXgoto&nbsp 标题:“选择布局”&nbsp 名称:CBXzoom&nbsp 标题:“选择时缩放到块”&nbsp 启用:FALSE&nbsp 名称:CBXallLayouts&nbsp 标题:“适用于所有布局上的此块”&nbsp 名称:Cbfilter&nbsp 标题:“应用过滤器”&nbsp 名称:CBclear&nbsp 标题:“清除过滤器”&nbsp 名称:CBupdate&nbsp 标题:“更新块”&nbsp 名称:CBexit&nbsp&nbsp&nbsp&nbsp 标题:“退出”标签&nbsp 标题:“属性值”&nbsp 标题:“属性列表”&nbsp 标题:“块..(一些空格)…布局”&nbsp 标题:“如果您想对控件进行分组,则只显示以开头的块和几个帧。我有2个用于“块过滤器”和一个用于“区块详细信息”的代码
  1. Option Explicit
  2.     Dim Block1Atts As Variant
  3.     Dim Block1 As AcadBlockReference
  4. Private Sub CBclear_Click()
  5.    
  6. ' clear the filter and display all blocks with attributes
  7.     LBblocks.Clear
  8.     TBfilter.Text = ""
  9.    
  10.     Dim LO As AcadLayout
  11.     Dim Ent As AcadEntity
  12.     Dim Blk As AcadBlock
  13.    
  14.         For Each LO In ThisDrawing.Layouts
  15.             For Each Ent In LO.Block
  16.                 If TypeOf Ent Is AcadBlockReference Then
  17.                     Set Blk = ThisDrawing.ObjectIdToObject(Ent.OwnerID)
  18.                     If Ent.HasAttributes = True Then
  19.                         LBblocks.AddItem UCase(Ent.Name & vbTab & Blk.Layout.Name)
  20.                     End If
  21.                 End If
  22.             Next
  23.         Next
  24. ' sort the listbox
  25.     LBsort LBblocks
  26.    
  27. End Sub
  28. Private Sub CBexit_Click()
  29.     Unload Me
  30. End Sub
  31. Private Sub CBfilter_Click()
  32.     LBblocks.Clear
  33.    
  34.     Dim LO As AcadLayout
  35.     Dim Ent As AcadEntity
  36.     Dim Blk As AcadBlock
  37. ' if the block name matches the filter text(with wildcard)
  38.         For Each LO In ThisDrawing.Layouts
  39.             For Each Ent In LO.Block
  40.                 If TypeOf Ent Is AcadBlockReference Then
  41.                     Set Blk = ThisDrawing.ObjectIdToObject(Ent.OwnerID)
  42.                     If Ent.Name Like UCase(TBfilter.Text) & "*" Then
  43.                         If Ent.HasAttributes = True Then
  44.                             LBblocks.AddItem UCase(Ent.Name & vbTab & Blk.Layout.Name)
  45.                         End If
  46.                     End If
  47.                 End If
  48.             Next
  49.         Next
  50.    
  51.     LBsort LBblocks
  52.    
  53. End Sub
  54. Private Sub CBupdate_Click()
  55.    
  56.     Dim BLKcoll As AcadSelectionSets
  57.     Dim SSetBlks As AcadSelectionSet
  58.     Dim NxtBlk As AcadBlockReference
  59.     Dim BlkAtts As Variant
  60.    
  61.         Dim X As Integer
  62. ' if we are only updating the selected block then....
  63.         If CBXallLayouts.Value = False Then
  64.             For X = 0 To UBound(Block1Atts)
  65.                 If LBatts.Value = Block1Atts(X).TagString Then
  66.                      Block1Atts(X).TextString = TBattValue.Text
  67.                 End If
  68.             Next X
  69.             Block1.Update
  70.             Exit Sub
  71.         Else
  72. ' or if we are updating this block across ALL layouts then...
  73. ' first check if any ss exist and if they do, delete them
  74.             Set BLKcoll = ThisDrawing.SelectionSets
  75.                 For Each SSetBlks In BLKcoll
  76.                     If SSetBlks.Name = "SSbks" Then
  77.                         ThisDrawing.SelectionSets.Item("SSbks").Delete
  78.                         Exit For
  79.                     End If
  80.                 Next
  81. ' then get an SS of the blocks
  82.             Set SSetBlks = ThisDrawing.SelectionSets.Add("SSbks")
  83.                 Dim FilterType(0 To 1) As Integer
  84.                 Dim FilterData(0 To 1) As Variant
  85.                 FilterType(0) = 0: FilterData(0) = "INSERT"
  86.                 FilterType(1) = 2: FilterData(1) = Block1.Name
  87.             SSetBlks.Select acSelectionSetAll, , , FilterType, FilterData
  88. ' loop through the Sset, get attributes and apply the updated value to the attribute
  89.             For Each NxtBlk In SSetBlks
  90.                 BlkAtts = NxtBlk.GetAttributes
  91.                 For X = 0 To UBound(BlkAtts)
  92.                     If BlkAtts(X).TagString = LBatts.Value Then
  93.                         BlkAtts(X).TextString = TBattValue.Text
  94.                         NxtBlk.Update
  95.                     End If
  96.                 Next X
  97.             Next NxtBlk
  98.             ThisDrawing.SelectionSets.Item("SSbks").Delete
  99.         End If
  100. ' and clear the global checkbox
  101.             CBXallLayouts.Value = False
  102.             
  103. End Sub
  104. Private Sub CBXgoto_Click()
  105.     If CBXgoto.Value = True Then
  106.         CBXzoom.Enabled = True
  107.     ElseIf CBXgoto.Value = False Then
  108.         CBXzoom.Enabled = False
  109.     End If
  110. End Sub
  111. Private Sub LBatts_Click()
  112. ' dispay the attribute value when clicked
  113.     Dim X As Integer
  114.         For X = 0 To UBound(Block1Atts)
  115.             If LBatts.Value = Block1Atts(X).TagString Then
  116.                 TBattValue.Text = Block1Atts(X).TextString
  117.             End If
  118.         Next X
  119.             
  120. End Sub
  121. Private Sub LBblocks_Click()
  122. TBattValue.Text = ""
  123.     Dim BlockName As String
  124.     Dim LayoutName As String
  125.     Dim BlValue As Variant
  126. ' split the text into block name and layout name
  127.         BlValue = LBblocks.Value
  128.         BlValue = Split(BlValue, vbTab, , vbTextCompare)
  129.         BlockName = BlValue(0)
  130.         LayoutName = BlValue(1)
  131.         
  132.     Dim BLKcoll As AcadSelectionSets
  133.     Dim SSetBlks As AcadSelectionSet
  134. ' first check if any ss exist and if they do, delete them
  135.     Set BLKcoll = ThisDrawing.SelectionSets
  136.          For Each SSetBlks In BLKcoll
  137.              If SSetBlks.Name = "SSbks" Then
  138.              ThisDrawing.SelectionSets.Item("SSbks").Delete
  139.          Exit For
  140.          End If
  141.      Next
  142. ' then get an SS of the blocks
  143.     Set SSetBlks = ThisDrawing.SelectionSets.Add("SSbks")
  144.         Dim FilterType(0 To 1) As Integer
  145.         Dim FilterData(0 To 1) As Variant
  146.         FilterType(0) = 0: FilterData(0) = "INSERT"
  147.         FilterType(1) = 2: FilterData(1) = BlockName
  148.     SSetBlks.Select acSelectionSetAll, , , FilterType, FilterData
  149. ' filter for the block on the current layout
  150.     FilterLayout SSetBlks, LayoutName
  151. ' display the block tag string
  152.     Dim i As Integer
  153.         Set Block1 = SSetBlks.Item(0)
  154.             'If Block1.HasAttributes = True Then
  155.                 LBatts.Clear
  156.                 Block1Atts = Block1.GetAttributes
  157.                     For i = 0 To UBound(Block1Atts)
  158.                         LBatts.AddItem Block1Atts(i).TagString
  159.                     Next i
  160.             'End If
  161.         ThisDrawing.SelectionSets.Item("SSbks").Delete
  162.         
  163. ' if "Go to layout on selection" is checked then
  164.         If CBXgoto.Value = True Then
  165.             ThisDrawing.ActiveLayout = ThisDrawing.Layouts(LayoutName)
  166. ' if "Zoom to block on selection" is checked then get the bounding box of the block
  167.                 If CBXzoom.Value = True Then
  168.                     Dim BboxSP As Variant
  169.                     Dim BboxEP As Variant
  170.                         Block1.GetBoundingBox BboxSP, BboxEP
  171. ' and use the bounding box for a zoom window
  172.                     Dim BboxP1(0 To 2) As Double
  173.                     Dim BboxP2(0 To 2) As Double
  174.                         BboxP1(0) = BboxSP(0): BboxP1(1) = BboxSP(1): BboxP1(2) = BboxSP(2)
  175.                         BboxP2(0) = BboxEP(0): BboxP2(1) = BboxEP(1): BboxP2(2) = BboxEP(2)
  176.                         ZoomWindow BboxP1, BboxP2
  177.                 End If
  178.         End If
  179. End Sub
  180. Private Sub UserForm_Initialize()
  181. ' find all blocks in drawing and if they have attributes
  182. ' then add them to the listbox
  183.     Dim LO As AcadLayout
  184.     Dim Ent As AcadEntity
  185.     Dim Blk As AcadBlock
  186.    
  187.         For Each LO In ThisDrawing.Layouts
  188.             For Each Ent In LO.Block
  189.                 If TypeOf Ent Is AcadBlockReference Then
  190.                     Set Blk = ThisDrawing.ObjectIdToObject(Ent.OwnerID)
  191.                     If Ent.HasAttributes = True Then
  192.                         LBblocks.AddItem UCase(Ent.Name & vbTab & Blk.Layout.Name)
  193.                     End If
  194.                 End If
  195.             Next
  196.         Next
  197. ' and sort the listbox
  198.     LBsort LBblocks
  199.    
  200. End Sub
  201. Private Function LBsort(LB As ListBox)
  202. ' Sort the listbox
  203.     Dim LBvar As Variant
  204.     Dim i As Integer
  205.    
  206.     For i = 0 To LB.ListCount - 2
  207.         If LB.List(i) > LB.List(i + 1) Then
  208.             LBvar = LB.List(i)
  209.             LB.List(i) = LB.List(i + 1)
  210.             LB.List(i + 1) = LBvar
  211.             i = -1
  212.         End If
  213.     Next i
  214. End Function
  215. Private Sub FilterLayout(SS As AcadSelectionSet, LOname As String)
  216. ' from code on Autodesk.com by Frank Oquendo
  217.     Dim X As Integer
  218.     Dim ObjArray() As AcadEntity
  219.     Dim Max As Long
  220.         Max = -1
  221.     For X = 0 To SS.Count - 1
  222.         If LCase(ThisDrawing.ObjectIdToObject(SS.Item(X).OwnerID).Layout.Name)  LCase(LOname) Then
  223.             Max = Max + 1
  224.             ReDim Preserve ObjArray(0 To Max)
  225.             Set ObjArray(Max) = SS.Item(X)
  226.         End If
  227.     Next X
  228.     SS.RemoveItems ObjArray
  229. End Sub
未经充分测试,因此请使用yada yada Yadaa,风险自负,欢迎发表评论和建议,如果您'你懒惰,在这里'是文件

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

16

主题

75

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2008-4-3 08:06:40 | 显示全部楼层
太棒了!谢谢,gatte命令是我最喜欢的express工具之一。很高兴有一个大大改进的gui版本!
回复

使用道具 举报

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

铜币
731
发表于 2008-4-3 08:23:37 | 显示全部楼层
看起来很酷 给自己弄了一份
我喜欢列表框排序功能 本人'亨迪,我有一些有用的计划。嘿嘿嘿…有用,亨迪
回复

使用道具 举报

16

主题

75

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2009-8-10 09:01:23 | 显示全部楼层
我想下载代码来测试它,但它's不工作
谁能把zip文件发给我吗
提前谢谢你
回复

使用道具 举报

16

主题

75

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2009-8-14 20:14:33 | 显示全部楼层

I'我很懒,但我'我以前从未真正使用过VB。请问你如何运行这个文件?谢谢
ArgV
回复

使用道具 举报

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

铜币
731
发表于 2010-1-11 05:09:22 | 显示全部楼层
如何运行此VBA
回复

使用道具 举报

16

主题

75

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2010-1-12 00:19:49 | 显示全部楼层
解压项目,打开AutoCAD,在命令行中键入VBAMAN,然后出现对话框窗口,选择并加载该项目;J#039~
回复

使用道具 举报

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

铜币
731
发表于 2010-1-12 09:58:44 | 显示全部楼层
很好的亨迪…现在不是比赛的时间,但希望很快。
回复

使用道具 举报

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

铜币
731
发表于 2010-1-26 03:21:01 | 显示全部楼层
解压项目,打开AutoCAD,在命令行中键入VBAMAN,然后出现对话框窗口,选择并加载该项目;J#039~
我在VBARUN对话框窗口中做了什么,但什么也没有做。搜索后,他没有添加这行用户表单。我说得对吗
秒,这个VBA不处理动态块,即使它有一个属性
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-1 19:20 , Processed in 0.282501 second(s), 76 queries .

© 2020-2025 乐筑天下

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