要创建一个块引用,首先必须创建一个块定义(块),且要使用“Add”方式。创建块之后,可以使用“InsertBlock”方式在图中插入块的一个样本。在这个例子中,我们在模型空间中创建一个块,它由一个圆和一条线段组成。
在cmdCreateBlock按钮的单击事件程序中加入下列代码。
blkInsPnt(0) = 0#: blkInsPnt(1) = 0#: blkInsPnt(2) = 0#'将块添加到块集合中Set BlkObj = blkColl.Add(blkInsPnt, "NewBlock")
将图元添加到块中 本节提供将图元添加到块中的代码范例。
添加圆
center(0) = 0#: center(1) = 0#: center(2) = 0#radius = 1'将圆添加到块中Set circleObj = BlkObj.AddCircle(center, radius)
添加线段 startPnt(0) = 1#: startPnt(1) = 1#: startPnt(2) = 0#endPnt(0) = 5#: endPnt(1) = 5#: endPnt(2) = 0#'将线段添加到块中Set lineObj = BlkObj.AddLine(startPnt, endPnt)
在模型空间中插入块 下列代码示例如何在模型空间中插入块。
Set BlkRefrence = mspace.InsertBlock(blkInsPnt, "NewBlock", 1#, 1#, 1#, 0)'放大块ZoomExtents
访问块和块引用对象 VBA通过ThisDrawing对象提供了到当前AutoCAD进程中激活图形的链接。通过使用ThisDrawing可以立即访问当前文档及其所有的方法、属性以及文档中其他所有对象。
要访问块,查找ThisDrawing对象;要访问块引用,查找模型空间集合或图纸空间集合。
访问块对象
现在需要扫描块集合,返回块名并将它们放入lstBlockObject列表框中。这里有两种扫描块集合的方法。
可以使用索引来扫描块集合。一旦知道了块集合中包含了多少项,就可以使用For.Next条件循环。要实现上述功能,在cmdLister命令按钮的单击事件程序中添加下述代码。
'返回在块集合中块的数量count = blkColl.count'清空列表框lstBlockObject.Clear'创建块列表For I = 0 To count - 1 lstBlockObject.AddItem blkColl.Item(I).NameNextlstBlockObject.ListIndex = 0
注意:一个有N个项的集合,索引从0到N-1。
然而,一个更好的方法是使用For Each.In.Next条件循环。例如,下列语句对集合中的每一个对象或阵列中的每一个元素重复执行一个语句块。每次循环执行时VBA自动设置一个变量。因此可以用下面的例子重写上面的代码。 '清空列表框lstBlockObject.Clear'创建块列表For Each elem in ThisDrawing.Blocks lstBlockObject.AddItem elem.NameNextlstBlockObject.ListIndex = 0
通过使用这种代码,可以 - 减少操作步骤。
- 增强代码的可读性。
- 减少自定义变量。
- 减少错误检查的工作量(例如,条件语句的范围控制)。
- 使编程风格更简洁。
访问块引用 要返回相似的图元,就要完成相似的操作;但不是搜索块集合,而是搜索AutoCAD激活文档的模型空间或图纸空间集合。要实现上述功能,在cmdLister的单击事件程序中添加下列代码。
'清空列表框lstBlockReference.Clear'创建块列表'扫描模型空间集合For Each elem In mspace '筛选出块引用 If elem.EntityName = "AcDbBlockReference" Then lstBlockReference.AddItem elem.Name End IfNextlstBlockReference.ListIndex = 0
这时,每次单击Create block按钮,在lstBlockObject列表框中只有一个名为NEWBLOCK的块。而一个名为NEWBLOCK的块引用被添加到lstBlockReference列表框中。因为创建一个新的块引用,所以增加了一个新的块引用。
注意:即使块引用与现有的块引用同名,但句柄不同。对于AutoCAD来说,它们是不同的对象。
修改块中的对象 不用分解块也可以在块中修改对象。要实现此功能,必须进入块对象,返回要修改的对象并改变它的属性。下列代码示例将线段的颜色属性改为绿色。
在cmdChangeColor按钮的单击事件程序中添加下列代码:
扫描块集合For Each elem In blkColl'搜寻要修改的块 If elem.Name = "NewBlock" Then '扫描块图元 For Each subelem In elem '寻找线段 If subelem.EntityName = "AcDbLine" Then '分配一个新的颜色r subelem.Color = acRed End If Next End IfNext'刷新图形ThisDrawing.Regen True<?PRE
这些代码改变了名称为NEWBLOCK的所有块引用中的线段的颜色属性。发生的真实情况是,这些代码改变了块对象中线段的颜色属性,同时也更新了块引用,因为它们引用的是块对象。