鄙人正在编写一个更改块名及插入基准点的程序,大致已编写完成的,只是在测试的时候发现一个问题,请教各位同好 因为我不想编一个只能修改全局块名及插入基准点的程序,事实上这样的程序明经里原来就有这样的程序,所谓全局块名事实上很简单,只是利用当前所选块参照对象(AcadBlockReference)的EffectiveName属性得到块名,再利用这个块名使用ThisDrawing.Blocks.Item(块名)的方法得到一个块对象(AcadBlock),再把这个块的Name改为所需改的块名就可以了,比如说图形中有一个块名为"XXX",在图中使用了10次,用上述的方法就可以将块名改为"YYY"等等其它块名 但是在实际的使用中我们要使用到一些内容相差不多的块,比如建筑中用到的同样款式但长宽不一样的门各窗,再比如电气图中用到的断路器,负荷开关,刀熔开关等,当然我们可以事先将常用的全部作成块,也可以作成动态块,但是如果是需要一些不太常用的,或只是这个工程才会用的某些块呢 现行的方法有两种 1)复制一个相差不多的块,炸散,修改内容再组成新块 2)如果是2006以上的版本,可以使用BEDIT命令进入"块编辑器",修改其内容后再用BSAVEAS命令另存为一个新块,再在图形中插入这个新的块 我编写的程序就是基于第一种方法,过程是 1)选中块参照,得出比例,角度,插入点及块名等基本信息后将这个块参照删除 2)使用ThisDrawing.Blocks.Add方法新建一个新块,块名自已给定,这个时候块里面是空的,没有任何内容 3)在这个块里使用InsertBlock方法将原来的块插入进去 4)使用Explode方法得出刚插入的块炸散后的对象 5)将刚插入的块用Delete方法删除(有这一步是因为上一步的Explode与CAD中Explode命令不同,CAD中的命令执行后原块就不存在了,只留下炸散后的对象,而VBA中Explode方法,原块不会消失) 6)在ModelSpace中用第一步得到的信息插入新块 到这里就相当于将所选的块改了名字,例如本来图中有10个名为"XXX"的块,经过上述过程后所选的块的名字就变成了"YYY",而其它9个块名仍为"XXX",实际上是绕了一大圈,不过绕圈是计算机的事,又不要我们绕,所以也就无所谓了 不过测试的时候却出了问题,什么问题呢?问题在动态块上,因为动态块一旦打散后所有的动态定义就自动消失了,不论是可见性,还是拉伸旋转缩放,统统没有,就算再组成块也不可能恢复,所以程序失败 但是如果使用第二种方法编程,在另存块的时候会弹出对话框,这又该如何处理呢? |