综合

img haydnliu

使用VBA访问块和块引用数据

发表于2004/10/10 12:14:00  2507人阅读

 
 
使用VBA访问块和块引用数据

摘要: 本文叙述如何使用VBA(Visual Basic for Applications)访问块和块引用数据。 
 

产品 版本 操作系统
AutoCAD (R) 2000 Windows 95, Windows 98, Windows NT 4.0
相关文档:
关键词: VBA BLOCK MODEL SPACE PAPER SPACE ACCESS REFERENCE DATA
文档编号: TD105102.DOC 
使用范围: API, Customization 
修订时间: September 30, 1999 

目录

绪论 

可以使用VBA来管理块和块引用。 

一个块是关联在一起的一个对象集,将其作为单独的对象定义的过程称为块定义。当在图中插入一个块,就产生了一个块引用。即块引用引用了块定义。了解块定义和块引用的区别是非常重要的,因为这将帮助你明白在VBA中如何操纵这些对象。 

我们通过注释一个演示该过程的小程序来解释如何区别和操纵块定义和块引用。以下章节使用被注释的代码实例来演示如何使用VBA访问块(块定义)和块引用数据。 

创建应用程序界面 

假设你已经使用下列控件定义了一个VBA的主窗口。 

  • 名为lstBlockObject的列表框
  • 名为lstBlockReference的列表框
  • 名为cmdCreateBlock的命令按钮
  • 名为cmdLister的命令按钮
  • 名为cmdChangeColor的命令按钮
创建一个模块并添加下列声明。 
    
    '块集合
    Public blkColl As AcadBlocks
    '块对象
    Public BlkObj As AcadBlock
    '块引用对象
    Public BlkRefrence As AcadBlockReference
    '模型空间集合
    Public mspace As AcadModelSpace
    '图纸空间集合
    Public pspace As AcadPaperSpace
    Public count As Integer
    Public I As Integer
    Public elem As Object
    Public subelem As Object
    '块插入点
    Public blkInsPnt (0 To 2) As Double
    Public circleObj As AcadCircle
    '圆心点
    Public center(0 To 2) As Double
    '圆半径
    Public radius As Double
    Public lineObj as AcadLine
    '线段起点
    Public startPnt (0 To 2) As Double
    '线段终点
    Public endPnt (0 To 2) As Double
在窗口的初始化事件中添加下列声明。 
    
    '返回模型空间集合
    Set mspace = ThisDrawing.ModelSpace
    '返回图纸空间集合
    Set pspace = ThisDrawing.PaperSpace
    '返回块集合
    Set blkColl = ThisDrawing.Blocks
创建一个块 

要创建一个块引用,首先必须创建一个块定义(块),且要使用“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).Name
    Next
    lstBlockObject.ListIndex = 0

注意:一个有N个项的集合,索引从0到N-1。 


然而,一个更好的方法是使用For Each.In.Next条件循环。例如,下列语句对集合中的每一个对象或阵列中的每一个元素重复执行一个语句块。每次循环执行时VBA自动设置一个变量。因此可以用下面的例子重写上面的代码。 
    
    '清空列表框
    lstBlockObject.Clear
    '创建块列表
    For Each elem in ThisDrawing.Blocks
            lstBlockObject.AddItem elem.Name
    Next
    lstBlockObject.ListIndex = 0
通过使用这种代码,可以 
  • 减少操作步骤。
  • 增强代码的可读性。
  • 减少自定义变量。
  • 减少错误检查的工作量(例如,条件语句的范围控制)。
  • 使编程风格更简洁。
访问块引用 

要返回相似的图元,就要完成相似的操作;但不是搜索块集合,而是搜索AutoCAD激活文档的模型空间或图纸空间集合。要实现上述功能,在cmdLister的单击事件程序中添加下列代码。 

    '清空列表框
    lstBlockReference.Clear
    '创建块列表
    '扫描模型空间集合
    For Each elem In mspace 
            '筛选出块引用
            If elem.EntityName = "AcDbBlockReference" Then 
                    lstBlockReference.AddItem elem.Name
            End If
    Next
    lstBlockReference.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 If
    Next
    '刷新图形
    ThisDrawing.Regen True<?PRE
这些代码改变了名称为NEWBLOCK的所有块引用中的线段的颜色属性。发生的真实情况是,这些代码改变了块对象中线段的颜色属性,同时也更新了块引用,因为它们引用的是块对象。 

 
   
  

C) 版权所有 2001 Autodesk, Inc. 保留所有权利  未经许可不得复制.
Autodesk 版权和注册商标信息 | 个人信息条例 | 联络 Autodesk

阅读全文
0 0

相关文章推荐

img
取 消
img