找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1187|回复: 11

[求助]:如何用VBA合并图块

[复制链接]
发表于 2003-2-27 21:40:04 | 显示全部楼层 |阅读模式

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

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

×
如何创建一条:“function combin2blockto1(blockID1 as string,blockid2 as string)as string”的命令,来实现将两个已知ID号的图块合为一个图块,并反回新的图块ID。
小弟刚接触VBA,对很多函数都不怎么了解,还请各位大虾指点帮助。谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-2-27 22:18:48 | 显示全部楼层
参考下面的代码,根据自己的需要增删。

  1.   [FONT=courier new]
  2. Sub Combine2Block(ByVal BlockID1 As String, ByVal BlockID2 As String, ByVal BlockID3 As String)
  3.     Dim BlockObj1 As AcadBlock
  4.     Dim Blockobj2 As AcadBlock
  5.     Dim iPt(0 To 2) As Double
  6.     Dim BlockObj3 As AcadBlock
  7.     Dim EntObj(0) As AcadEntity
  8.     Dim i As Integer

  9.     On Error Resume Next
  10.     Set BlockObj1 = ThisDrawing.Blocks(BlockID1)
  11.     If Err.Number <> 0 Then Exit Sub '检查名称为BlockID1的块是否存在
  12.     Set Blockobj2 = ThisDrawing.Blocks(BlockID2)
  13.     If Err.Number <> 0 Then Exit Sub '检查名称为BlockID2的块是否存在
  14.     iPt(0) = 0: iPt(1) = 0: iPt(2) = 0
  15.     Set BlockObj3 = ThisDrawing.Blocks.Add(iPt, BlockID3)
  16.     If Err.Number <> 0 Then Exit Sub '创建名称为BlockID3的块
  17.     On Error GoTo ErrTrap
  18.     For i = 0 To BlockObj1.Count - 1
  19.         Set EntObj(0) = BlockObj1(i)
  20.         ThisDrawing.CopyObjects EntObj, BlockObj3 '将第一个块中的实体依次拷贝到新块中
  21.     Next
  22.     For i = 0 To Blockobj2.Count - 1
  23.         Set EntObj(0) = Blockobj2(i)
  24.         ThisDrawing.CopyObjects EntObj, BlockObj3 '将第二个块中的实体依次拷贝到新块中
  25.     Next
  26.     ThisDrawing.ModelSpace.InsertBlock iPt, BlockObj3.Name, 1, 1, 1, 0 '在模型空间插入新块
  27.     Exit Sub
  28.    
  29. ErrTrap:
  30.     On Error GoTo 0
  31. End Sub
  32.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-2-28 10:08:31 | 显示全部楼层

那么

那两个块插入新块时他们所在位置和旋转角度该怎么确定?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-2-28 12:49:06 | 显示全部楼层
用CopyObjects方法并不会改变新生成实体的位置和旋转角度,它们在原来块中是什么位置,到了新块中还是什么位置,如果需要改变的话,在新块中直接操作实体就行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-2-28 13:26:11 | 显示全部楼层
如果是当前窗体上有两个独立的图块,需要根据他们当前所在的相对位置和旋转角度来创建一个新图块,用这行吗?
并且用什么函数能分别返回这两个选中图块的ID号
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-2-28 13:37:03 | 显示全部楼层
当前窗体上有两个独立的图块?指的是块引用吧,它的名称和块名称是一样的,可直接用Name属性来获取。至于怎么根据原来的块合并创建新块,要自己看看位置和旋转角度有没有变化,再来更改新块中实体的属性了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-2-28 13:51:24 | 显示全部楼层
那是不是说先得从这两个块上读出他们的ID号,NAME,基点,和旋转角度。再在新建块时输入这些讯息,才能创建出要求的新块。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-2-28 19:00:20 | 显示全部楼层
操作时直接用块对象的Name,而不用ID(ObjectID?对象ID号)或者Index(块集合中的索引),原因是ObjectID是变化的和数值型的,Index也是数值型的,通过Name就可以直接获取想要的块。
关于新块中实体的位置和旋转角度,还是自己实验一下,看看要不要做出改变。
新建块如果想做成匿名块则不需要另外指定名称,创建时用*U来代替名称即可。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-2-28 21:41:19 | 显示全部楼层
那做一个选择集,并分别读出他们的NAME,代码大致是怎么样的?
我刚开始接触VBA,对那些函数都不怎么了解。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-2-28 22:02:04 | 显示全部楼层
将块插入到图纸中的实体称为块引用。块引用的名称与块的名称是一样的。因而获取块的名称的方法一是对块集合进行枚举,依次查找每个块的名称,检查是否是自己所需要的。方法二是选择块引用,可以用GetEntity来得到一个实体,并用TypeOf 选择到的实体对象 Is AcadBlockReference来判断是不是块引用,还可以构造一选择集,用过滤机制。如:

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

使用道具 举报

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

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-3-1 21:20:12 | 显示全部楼层
这个可要看看帮助文件或者相关资料了,它的内容太丰富了。简单的说过滤机制中应包括组码及值,如组码为0,代表选择某一类的实体,值为INSERT,代表为块引用对象,组码为62,代表选择某一颜色的实体,值为acRed,代表为红色。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-7 00:37 , Processed in 0.390048 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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