找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3892|回复: 28

[讨论]:如何用VBA创建匿名块?

[复制链接]

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-17 13:11:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
在AutoCAD中,确实可以用VBA创建匿名块,那么如何创建呢,请大家共同来探讨这一话题,发表一下自己的心得。

下图中,首先生成U开头的三个匿名块,再分别生成A、U开头的各一个,接下来生成A开头的两个,最后生成C开头的一个。检查块集合中的块名称如下:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-17 14:02:59 | 显示全部楼层
那么怎么生成匿名块呢,其实制作匿名块的方法和制作普通块的方法是一样的。
如:

  1.   [FONT=courier new]
  2.     Dim iPt(0 To 2) As Double
  3.     iPt(0) = 0: iPt(1) = 0: iPt(2) = 0
  4.     Dim BlockObj As AcadBlock
  5.     Set BlockObj = ThisDrawing.Blocks.Add(iPt, "*U")
  6.     Set BlockObj = Nothing
  7.   [/FONT]

上面的代码中在块集合生成了一个U开头的匿名块,你可以试试用下面的代码测试一下。

  1.   [FONT=courier new]
  2.     Dim BlockObj As AcadBlock
  3.     For Each BlockObj In ThisDrawing.Blocks
  4.         Debug.Print BlockObj.Name
  5.     Next
  6.     Set BlockObj = Nothing
  7.   [/FONT]

看了上面的代码,是不是制作匿名块其实很简单。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-17 15:44:00 | 显示全部楼层
但是如何获取刚创建的块的名称呢?
下面的代码用于枚举匿块的数量

  1.   [FONT=courier new]
  2.     Dim BlockObj As AcadBlock
  3.     Dim n As Integer
  4.     For Each BlockObj In ThisDrawing.Blocks
  5.         If Left(BlockObj.Name, 1) = "*" Then
  6.             If BlockObj.Name <> "*Model_Space" And Left(BlockObj.Name, 12) <> "*Paper_Space" Then '原来有错,应该是并的关系,表示即不是模型空间,也不是国纸空间。
  7.                 n = n + 1
  8.             End If
  9.         End If
  10.     Next
  11.     Debug.Print n '匿名块的数量
  12.     Set BlockObj = Nothing
  13.   [/FONT]

知道了吧,其中为数值为n的块名就是匿名块的名称了,比如上次刚创建了一个“*U”的匿名块,如果得出的数量为1,那么块的名称就是“*U1”。

  1.   [FONT=courier new]
  2.     Dim iPt(0 To 2) As Double
  3.     iPt(0) = 0: iPt(1) = 0: iPt(2) = 0
  4.     Dim BlockRefObj As AcadBlockReference
  5.     Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(iPt, "*U1", 1, 1, 1, 0)
  6.     Debug.Print BlockRefObj.Name
  7.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-17 16:01:21 | 显示全部楼层
上面仅仅提供了一种创建匿名块的思路,大家在实际使用中可以自己加以完善。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 70个

财富等级: 招财进宝

发表于 2002-11-17 21:24:48 | 显示全部楼层
谢谢斑竹!:4 :4
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-21 15:19:25 | 显示全部楼层
有什么疑问吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-21 15:27:46 | 显示全部楼层
问斑竹,创建匿名块的用处,可以讲一下吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-21 15:30:16 | 显示全部楼层
在CAD中,标注用的就是匿名块。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-21 15:32:53 | 显示全部楼层
哈哈
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-21 15:46:55 | 显示全部楼层
匿名块的用处就是把几个实体做成一个整体,以方便统一调用。还有一个就是CAD系统会自动管理匿名块,如果没有使用的匿名块,会自动清除,而不会留在块集体中。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-11-21 16:03:25 | 显示全部楼层
噢,原来如此,不过实际应用中好像作用不大
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-21 16:07:00 | 显示全部楼层
当然,有什么用处是要靠你自己去想象和挖掘了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-12-4 22:06:30 | 显示全部楼层
在VBA中,可以用于创建匿名块的字母共有二十四个,除了字母M和P之外,其它的都可以用于创建匿名块。因此,如果对于图中块的种类不多的话,可以为每一类型的块分别以不同的字母来创建,便于分类管理。
如下是我做的一个测试,列出了可以创建匿名块的字母:

  1.   [FONT=courier new]
  2. *A49
  3. *B50
  4. *C51
  5. *D52
  6. *E53
  7. *F54
  8. *G55
  9. *H56
  10. *I57
  11. *J58
  12. *K59
  13. *L60
  14. *N61
  15. *O62
  16. *Q63
  17. *R64
  18. *S65
  19. *T66
  20. *U67
  21. *V68
  22. *W69
  23. *X70
  24. *Y71
  25. *Z72
  26.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-12-23 10:44:43 | 显示全部楼层
关于匿名块的用处只有自己遇到问题时才会发现它的用处!
  还想请教efan几个问题:
  1。我将你这个程序执行
Dim BlockObj As AcadBlock
    Dim n As Integer
    For Each BlockObj In ThisDrawing.Blocks
        If Left(BlockObj.Name, 1) = "*" Then
            If BlockObj.Name <> "*Model_Space" Or Left(BlockObj.Name, 12) <> "*Paper_Space" Then
                n = n + 1
            End If
        End If
    Next
    Debug.Print n '匿名块的数量
   
  该程序执行结果n :好象是包括"*Model_Space ,*Paper_Space三个图块,那它们也属于匿名图块吗?如果不是的话,那么该枚取匿名图块数量的程序该怎样修改?

  2.使用匿名块不会出现块重复画线的问题。可是efan能告诉我未使用匿名块时块重复现象的问题症结所在?以及块重复的规律,因为有的图像是重复两次,而有的是三次,这两次和三次是怎么回事?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-12-23 14:29:49 | 显示全部楼层
If BlockObj.Name <> "*Model_Space" Or Left(BlockObj.Name, 12) <> "*Paper_Space" Then
这一句有错,中间是AND,表示块的名称既不是模型空间也不是图纸空间,这是块的名称前带*号的就是所要的匿名块了。其实在CAD中,模型空间和图纸空间都是块集合中的成员,也都是匿名块,但它们的命名方式和其它的匿名块不一样。

对于你上次的例子中,引用的块是同一个名称。有没有注意到每次运行程序时,都是用Add方法,表示往这个块中添加成员,但原来的块中已经有实体存在。因而重复的次数就是运行程序的次数了。但用了匿名块后,其实它是分别往不同的块中添加实体,因而也就不会重复了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 05:05 , Processed in 0.484603 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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