乐筑天下

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

BLockDef表和层

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-2-12 12:02:09 | 显示全部楼层 |阅读模式
您好
我想知道是否有人能在不分解块的情况下告诉我一个块由哪些层组成
我有一个带有多个块的图形,我需要知道创建块时使用了哪些层,“而不是”该块所在的层。
我相信这些信息必须来自块定义表;不确定
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-2-12 12:45:00 | 显示全部楼层

嘿,布莱
,这真是太好了!谢谢你
它工作得很好。
虽然我了解什么是集合,因为我们每天对对象集合进行编程;
我从未创建过集合;因此我不太确定它在代码中的意图。
虽然它工作正常;但我的好奇心需要知道。
那么Bry,收藏的原因是什么呢?
谢谢
马克
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-2-12 12:54:06 | 显示全部楼层
有关阵列的更多信息,请参阅2D阵列帮助文章
但是集合是一种缓慢、高开销且非常容易存储对象的方法
这里需要集合来存储层名称,当每个层出现时,您可以检查它是否已经存在,如果已经存在
集合不需要变暗为特定的大小,您只需边添加边删除即可
您还可以将数组添加到集合中
然而,你看不到优秀的程序员像使用数组一样使用它们,因为它们速度较慢。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-2-12 14:36:20 | 显示全部楼层
如果我们运气好,Mp会看到这一点,也许会对一个集合做一个简短的解释。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-2-12 14:54:01 | 显示全部楼层
我不是VBA'er,所以把这篇文章当作那个....
但是,如果您说数组更快,为什么不使用最大限制绘图中层数的数组呢? 然后,您可以有一个计数变量,以便您知道将其放在数组中的位置,并且还知道何时停止将数组值打印到命令行?
还是我离基地太远了?
回复

使用道具 举报

28

主题

249

帖子

7

银币

后起之秀

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

铜币
361
发表于 2008-2-12 14:56:06 | 显示全部楼层
是的,这是一个观众。我希望Ml能把它从这里拿走,然后这样做
他可能也想按字母顺序排列图层。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2008-2-12 15:45:34 | 显示全部楼层
好的,谢谢。我只是沿着编程的思路思考,并认为这可能适用于C#(.Net),这就是我提出这个问题的原因。   
回复

使用道具 举报

28

主题

249

帖子

7

银币

后起之秀

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

铜币
361
发表于 2008-2-12 16:04:29 | 显示全部楼层
对Bryco的数组代码做了一点修改代码1]
回复

使用道具 举报

9

主题

59

帖子

38

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
58
发表于 2008-2-12 18:51:54 | 显示全部楼层
Joro,这是一个很好的尝试,但您可能想看看您重新定位的方式
如果您对下面的代码感兴趣,请制作一个基准块,要插入绘图,然后运行tch,您可以检查每个方法的时间
我为您的方法获得0.2792969
0.1601563使用Blocklayerswith Col ent
  1. Sub tch()
  2.     Dim P
  3.     Dim ent As AcadEntity
  4.     ThisDrawing.Utility.GetEntity ent, P, "Pick a blockref"
  5.         If Not TypeOf ent Is AcadBlockReference Then Exit Sub
  6.         If ent Is Nothing Then Exit Sub
  7.    
  8.     Dim t As Single
  9.     t = Timer
  10.     Blocklayers ent
  11.     'BlocklayerswithCol ent
  12.     Debug.Print Timer - t
  13.    
  14. End Sub
  15. Sub Blocklayers(ent As AcadEntity)
  16.     Dim b As AcadBlock
  17.     Dim UsedLayers() As String
  18.     Dim N As Double
  19.     Dim P
  20.     Dim i As Double
  21.     Dim Found As Boolean
  22.     Dim msg As String
  23.    
  24.     Set b = ThisDrawing.Blocks(ent.Name)
  25.    
  26.     N = -1
  27.     For Each ent In b
  28.         If N = -1 Then
  29.             N = N + 1
  30.             ReDim UsedLayers(N)
  31.             UsedLayers(N) = ent.Layer
  32.             msg = msg & vbCr & ent.Layer
  33.         Else
  34.             Found = False
  35.             For i = 0 To UBound(UsedLayers)
  36.                 If UsedLayers(i) = ent.Layer Then
  37.                     Found = True
  38.                     Exit For
  39.                 End If
  40.             Next
  41.             If Found = False Then
  42.                 N = N + 1
  43.                 ReDim Preserve UsedLayers(N)
  44.                 UsedLayers(N) = ent.Layer
  45.                 msg = msg & vbCr & ent.Layer
  46.             End If
  47.         End If
  48.     Next
  49.     'MsgBox "Layers used in the block:" & vbCr & msg
  50.    
  51. End Sub
  52. Sub BlocklayerswithCol(ent As AcadEntity)
  53.     Dim b As AcadBlock
  54.     Dim LayerCol As New Collection
  55.     Dim slayer As String
  56.     Dim i As Integer
  57.     Dim msg As String
  58.    
  59.     Set b = ThisDrawing.Blocks(ent.Name)
  60.     For Each ent In b
  61.         slayer = ent.Layer
  62.         For i = 1 To LayerCol.count
  63.             If LayerCol(i) = slayer Then GoTo skip
  64.         Next
  65.         LayerCol.Add slayer
  66. skip:
  67.     Next
  68.     For i = 1 To LayerCol.count
  69.         msg = msg & vbCr & LayerCol(i)
  70.     Next
  71.     'MsgBox "Layers used in the block:" & vbCr & msg
  72. End Sub
  73. Sub addblockandlayers()
  74.     Dim b As AcadBlock
  75.     Dim l As AcadLayer
  76.     Dim ls As AcadLayers
  77.     Dim bs As AcadBlocks
  78.     Set ls = ThisDrawing.LAYERS
  79.     Set bs = ThisDrawing.Blocks
  80.     Set b = bs.Add(Zero, "b")
  81.     Dim c As AcadCircle
  82.     Dim i As Integer
  83.     Dim cen(2) As Double
  84.     For i = 1 To 250
  85.         Set l = ThisDrawing.LAYERS.Add(i)
  86.         l.Color = i
  87.         cen(0) = i
  88.         Set c = b.AddCircle(cen, 5)
  89.         c.Layer = i
  90.         Set c = b.AddCircle(cen, 3)
  91.         c.Layer = i
  92.     Next
  93. End Sub
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 09:40 , Processed in 0.885172 second(s), 71 queries .

© 2020-2025 乐筑天下

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