乐筑天下

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

全局属性编辑器

[复制链接]

18

主题

222

帖子

51

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
260
发表于 2008-4-3 05:36:28 | 显示全部楼层 |阅读模式
我有一段时间没有在这里发布任何实质性的东西,所以我认为Id分享这个。我昨天感到无聊,把它放在
一起 它是一个全局属性编辑器,它列出了当前图形中的所有块(包含属性)。
当您从列表中选择一个块时(它还显示布局),它显示与该块关联的属性,从那里您可以修改属性值。
您可以
a)仅修改所选块的属性,或
b)在所有布局中修改该块属性的所有实例
您还可以选择在选择时自动切换到所选块布局,并可以选择缩放到所选的特定块
您还可以将过滤器应用于仅列出以abc等
开头的块您将需要一个用户窗体和以下控件:
列表框
名称: LB块
名称: LBatts
文本框
名称: TBfilter
名称: TBattvalue
复选框
名称: CBXgoto 标题: 转到布局 在选择
名称: CBXzoom 标题: 缩放以阻止 启用选择: FALSE
名称: CBXall布局 标题: 应用于此块 在所有布局
上 命令按钮
     名称:Cbfilter 标题:应用筛选器
名称:CBclear 标题:清除筛选器
名称:CB更新标题:更新块
名称:CBexit 标题:退出
标签
标题:属性值
标题:属性列表
标题:块 ..(某些空格)布局
标题:如果要对控件进行分组,请仅显示以 开头
的块和几个帧。我有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 yada
评论,欢迎提出建议
哦,如果你懒惰,这里是文件......

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

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

使用道具 举报

6

主题

22

帖子

3

银币

初来乍到

Rank: 1

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

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
6
发表于 2008-4-3 08:23:37 | 显示全部楼层
看起来很酷。我给自己弄了一本
我喜欢列表框排序功能。我有一些计划会派上用场亨迪*
回复

使用道具 举报

8

主题

31

帖子

22

银币

初来乍到

Rank: 1

铜币
43
发表于 2009-8-10 09:01:23 | 显示全部楼层
我想下载代码来测试它,但它不起作用...
有人可以给我发送zip文件吗?
提前感谢您
回复

使用道具 举报

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

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

我很懒,但我以前从未真正使用过VB。请问您如何运行此文件?谢谢!
-ArgV
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

16

主题

75

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
139
发表于 2010-1-12 00:19:49 | 显示全部楼层
解压缩项目
在命令行中打开AutoCAD
键入VBAMAN然后会出现对话框窗口
选择并加载此项目
键入VBARUN
选择您需要运行
~'J'~
回复

使用道具 举报

98

主题

339

帖子

7

银币

中流砥柱

Rank: 25

铜币
731
发表于 2010-1-12 09:58:44 | 显示全部楼层
不错的亨德....现在不是玩的时候,但希望很快。
回复

使用道具 举报

8

主题

31

帖子

22

银币

初来乍到

Rank: 1

铜币
43
发表于 2010-1-26 03:21:01 | 显示全部楼层
解压项目
打开AutoCAD
在命令行中键入VBAMAN,然后会出现对话框窗口
选择并加载此项目
键入VBARUN
选择您需要运行
~'J'~

我做了,但在VBARUN对话框窗口中没有东西
搜索后,他没有添加此行
Userform.Show
我说得对吗?
第二
这个VBA不处理动态块,即使它有一个属性。
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-1 19:06 , Processed in 1.331199 second(s), 75 queries .

© 2020-2025 乐筑天下

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