28、AutoCAD图层与块操作全解析

AutoCAD图层与块操作全解析

1. 线宽设置与图层属性管理

在较早版本的AutoCAD中,会出现线宽对话框。若使用AutoCAD 2000i则可跳过此步,在“线宽”列表中选择线宽后点击“确定”,所选线宽会显示在“图层特性管理器”的“线宽”框中。

2. 图层的开启、冻结与锁定选项
  • 锁定图层 :在VBA代码中,将图层的“Lock”属性设置为“True”即可锁定图层。锁定的图层可让你在其上方创建新图层,而不必担心误更新锁定图层的元素。虽然能看到锁定图层中的所有实体,但它不能成为当前活动图层,无法被选择或编辑,不过仍可添加新对象,且对象捕捉功能仍可使用。若尝试调整锁定图层中的实体,会弹出消息框提示操作失败。
  • 冻结与解冻图层 :通过将图层的“Freeze”属性设置为“True”或“False”来实现图层的冻结和解冻。图层冻结时,与之关联的所有内容都将不可见,重绘操作仅对未冻结的图层生效。解冻冻结图层时,AutoCAD会自动重绘整个图形。由于重绘耗时,通常在一段时间内不需要某个图层时才设置冻结属性。若需频繁更改图层可见性,设置“LayerOn”属性更为高效。
冻结当前活动图层宏示例
Public Sub FreezeActiveLayer()
    Dim LayerObject As AcadLayer, NewActiveLayerObject As AcadLayer
    Set LayerObject = ThisDrawing.ActiveLayer
    If ThisDrawing.Layers.Count = 1 Then
        MsgBox “You cannot freeze the active layer!”, vbOKOnly + vbCritical, “Freezing Layers”
    Else
        If LayerObject.Name = “0” Then
            Set NewActiveLayerObject = ThisDrawing.Layers.Item(1)
        Else
            Set NewActiveLayerObject = ThisDrawing.Layers.Item(0)
        End If
        ThisDrawing.ActiveLayer = NewActiveLayerObject
        LayerObject.Freeze = True
    End If
End Sub

运行此宏的步骤如下:
1. 继续“Floor Plan”项目,将“FreezeActiveLayer”宏输入到“ThisDrawing”模块的代码窗口。
2. 从“图层”框中选择一个图层。
3. 从“宏”对话框中运行“FreezeActiveLayer”宏,执行完毕后,“图层”框中的“冻结”图标会更新。

  • 图层的开启与关闭 :通过将“LayerOn”属性分别设置为“True”或“False”来开启或关闭图层。图层关闭时虽不可见,但仍会随图形其他部分一起重绘,再次开启时可立即显示。若一段时间内不需要某个图层,应选择冻结而非仅隐藏。
使所有图层可见宏示例
Public Sub MakeAllLayersVisible()
    Dim LayerObject As AcadLayer
    For Each LayerObject In ThisDrawing.Layers
        LayerObject.LayerOn = True
    Next
End Sub

运行此宏的步骤如下:
1. 继续“Floor Plan”项目,将“MakeAllLayersVisible”宏输入到“ThisDrawing”的代码窗口。
2. 点击AutoCAD窗口顶部“图层”下拉列表中图层的灯泡图标,关闭几个图层,图标变灰表示图层已关闭。
3. 从“宏”对话框中运行“MakeAllLayersVisible”宏,“图层”列表中的灯泡图标再次变黄,表明所有图层已被宏开启。

3. 对象分组为块

块可作为容器,可容纳任意数量的AutoCAD对象,创建后可作为单个实体重复使用,提高绘图效率。块不限于模型空间和图纸空间对象,还可嵌套形成层次结构。AutoCAD提供三种类型的块:
- 简单块 :是一组对象的集合,可作为单个实体引用。可通过“InsertBlock”方法将其添加到图形中并进行平移和旋转变换,使用“BlockReference”对象引用添加的块,块对象添加到“Blocks”集合中。添加到块中的图形可来自当前图形或其他AutoCAD图形,更新原始图形不会影响块。
- 外部参照块(Xref块) :是指向其他绘图文件中绘图对象的外部链接。若引用的对象在其他绘图中发生更改,Xref块也会相应更改,使用“ExternalReference”对象引用这些块。
- 布局块 :用于绘图输出,相关内容将在其他资料中详细讨论。

创建简单块宏示例
Public Sub CreateABlock()
    Dim BlockObject As AcadBlock
    Dim InputPoint As Variant, Radius As Double
    InputPoint = ThisDrawing.Utility.GetPoint(, “Insert position for block!”)
    Set BlockObject = ThisDrawing.Blocks.Add(InputPoint, “MyBlock”)
    InputPoint = ThisDrawing.Utility.GetPoint(, “Insert position for circle’s center!”)
    Radius = ThisDrawing.Utility.GetDistance(InputPoint, “Insert radius!”)
    BlockObject.AddCircle InputPoint, Radius
    BlockObject.AddBox InputPoint, Radius, Radius, Radius
End Sub

运行此宏的步骤如下:
1. 启动新项目,将上述代码输入到“ThisDrawing”的代码窗口。
2. 从AutoCAD窗口的“宏”对话框中运行该宏,命令行将提示输入创建圆所需的详细信息,但模型空间中不会显示任何内容。

将块添加到图形宏示例
Public Sub AddABlock()
    Dim BlockReference As AcadBlockReference
    Dim InputPoint As Variant
    InputPoint = ThisDrawing.Utility.GetPoint(, “Input the position for the block!”)
    Set BlockReference = ThisDrawing.ModelSpace.InsertBlock(InputPoint, “MyBlock”, 1#, 1#, 1#, 3.14 / 2#)
    BlockReference.Update
    ZoomAll
End Sub

运行此宏前需先运行“CreateABlock”宏以确保“MyBlock”已创建,否则宏将异常终止。

添加外部参照块宏示例
Public Sub AddAnXref()
    Dim XrefReference As AcadExternalReference
    Dim InsertPoint As Variant
    InsertPoint = ThisDrawing.Utility.GetPoint(, “Insert position for map!”)
    Set XrefReference = ThisDrawing.ModelSpace.AttachExternalReference(“c:\Program Files\AutoCAD 2000i\SAMPLE\City Map”, “XRef Map”, InsertPoint, 1#, 1#, 1#, 0#, False)
    XrefReference.Update
    ZoomAll
End Sub

将此宏输入到“ThisDrawing”的代码窗口,从“宏”对话框中运行,注意根据实际情况更新示例地图的路径。

4. 块的移动

简单块或Xref块中的所有绘图对象都可移动,通过选择它们显示单个定位手柄,拖动该手柄可将块移动到模型空间中的所需位置。

5. 使用选择集

选择集是绘图对象的临时集合,在进行移动、复制和删除等操作时可将其视为单个实体。每个AutoCAD图形都有一个“SelectionSets”集合,可添加任意数量的“SelectionSet”对象。创建的选择集仅在当前图形打开时存在,通常在需要进行操作时添加,操作完成后删除。关闭包含选择集的图形会清空“SelectionSets”集合。

选择集应用程序开发步骤
  1. 在新项目中插入一个用户窗体,添加一对标签和文本框控件、一个包含五个选项按钮的框架以及两个命令按钮。
  2. 按照以下表格更改用户窗体和控件的属性:
    | 旧名称 | 新名称 | 标题 |
    | — | — | — |
    | UserForm1 | frmSelectionSet | Selection Set |
    | Label1 | - | Name of Selection Set |
    | TextBox1 | txtSelectionSetName | - |
    | Frame1 | - | Selection Mode |
    | OptionButton1 | optWindow | Window |
    | OptionButton2 | optCrossing | Crossing |
    | OptionButton3 | optPrevious | Previous |
    | OptionButton4 | optLast | Last |
    | OptionButton5 | optAll | All |
    | CommandButton1 | cmdContinue | Continue |
    | CommandButton2 | cmdCancel | Cancel |
  3. 将“CommandButton1”的“Accelerator”属性更改为“o”,“CommandButton2”的“Accelerator”属性更改为“C”。
  4. 将“CommandButton2”的“Default”属性设置为“True”,取消按钮将显示深色边框。
  5. 将文本框的“TabIndex”属性更改为“0”,插入光标将出现在文本框中。
  6. 将以下代码输入到用户窗体的代码窗口:
Dim SelectionSetObject As AcadSelectionSet
Dim Point1 As Variant, Point2 As Variant
Dim SelectionMode As Integer

Private Sub cmdCancel_Click()
    End
End Sub

Private Sub cmdContinue_Click()
    frmSelectionSet.hide
    Set SelectionSetObject = ThisDrawing.SelectionSets.Add(frmSelectionSet.txtSelectionSetName)
    With ThisDrawing.Utility
        If SelectionMode = acSelectionSetWindow Or SelectionMode = acSelectionSetCrossing Then
            .InitializeUserInput 1
            Point1 = .GetPoint(, “Enter position of first corner”)
            Point2 = .GetCorner(Point1, “Enter position for opposite corner”)
            SelectionSetObject.Select SelectionMode, Point1, Point2
        Else
            SelectionSetObject.Select SelectionMode
        End If
        SelectionSetObject.Highlight True
        SelectionSetObject.Update
        .GetString False, “Hit Enter to finish!”
    End With
    SelectionSetObject.Highlight False
    SelectionSetObject.Update
End Sub

Private Sub optAll_Click()
    SelectionMode = acSelectionSetAll
End Sub

Private Sub optCrossing_Click()
    SelectionMode = acSelectionSetCrossing
End Sub

Private Sub optLast_Click()
    SelectionMode = acSelectionSetLast
End Sub

Private Sub optPrevious_Click()
    SelectionMode = acSelectionSetPrevious
End Sub

Private Sub optWindow_Click()
    SelectionMode = acSelectionSetWindow
End Sub

Private Sub UserForm_Initialize()
    optWindow.Value = True
End Sub
  1. 将以下宏输入到“ThisDrawing”的代码窗口,以便从AutoCAD窗口的“宏”对话框中运行选择集应用程序:
Public Sub AddASelectionSet()
    frmSelectionSet.Show
End Sub
  1. 创建一些可成为选择集一部分的绘图对象,多次运行该宏,每次选择不同的选择模式选项并按照命令行中的说明操作。
6. 选择模式

选择模式决定了选择一个或多个绘图对象的技术:
- 窗口(Window) :选择完全位于由两个对角点定义的矩形窗口内的所有绘图对象。
- 交叉(Crossing) :选择位于矩形窗口内或与窗口边界相交的绘图对象。
- 上一个(Previous) :选择上一个选择集。
- 最后一个(Last) :选择最后添加到绘图空间的可见绘图对象。
- 全部(All) :选择绘图空间中的所有绘图对象。

7. InitializeUserInput方法

该方法用于在命令行输入期间提供一些选项,以下是其位值和选项说明,这些值可相加以便在一次调用中启用多个选项:
| 位值 | 选项描述 |
| — | — |
| 具体位值1 | 选项1描述 |
| 具体位值2 | 选项2描述 |
| … | … |

AutoCAD图层与块操作全解析

8. 选择集代码分析

以下是选择集应用程序中相关代码的详细分析:

Dim SelectionSetObject As AcadSelectionSet
Dim Point1 As Variant, Point2 As Variant
Dim SelectionMode As Integer

Private Sub cmdCancel_Click()
    End
End Sub

Private Sub cmdContinue_Click()
    frmSelectionSet.hide
    Set SelectionSetObject = ThisDrawing.SelectionSets.Add(frmSelectionSet.txtSelectionSetName)
    With ThisDrawing.Utility
        If SelectionMode = acSelectionSetWindow Or SelectionMode = acSelectionSetCrossing Then
            .InitializeUserInput 1
            Point1 = .GetPoint(, “Enter position of first corner”)
            Point2 = .GetCorner(Point1, “Enter position for opposite corner”)
            SelectionSetObject.Select SelectionMode, Point1, Point2
        Else
            SelectionSetObject.Select SelectionMode
        End If
        SelectionSetObject.Highlight True
        SelectionSetObject.Update
        .GetString False, “Hit Enter to finish!”
    End With
    SelectionSetObject.Highlight False
    SelectionSetObject.Update
End Sub

Private Sub optAll_Click()
    SelectionMode = acSelectionSetAll
End Sub

Private Sub optCrossing_Click()
    SelectionMode = acSelectionSetCrossing
End Sub

Private Sub optLast_Click()
    SelectionMode = acSelectionSetLast
End Sub

Private Sub optPrevious_Click()
    SelectionMode = acSelectionSetPrevious
End Sub

Private Sub optWindow_Click()
    SelectionMode = acSelectionSetWindow
End Sub

Private Sub UserForm_Initialize()
    optWindow.Value = True
End Sub
  • 变量声明
  • SelectionSetObject :用于引用选择集对象。
  • Point1 Point2 :作为变体类型,方便一次性赋值表示点的三个坐标。
  • SelectionMode :用于存储代表选择模式的AutoCAD常量值。

  • cmdCancel_Click 事件 :当点击取消按钮时,程序结束。

  • cmdContinue_Click 事件
    1. 隐藏用户窗体,使AutoCAD窗口成为活动窗口。
    2. 根据用户在文本框中输入的名称创建一个新的选择集对象。
    3. 使用 With 语句简化对 ThisDrawing.Utility 方法的调用。
    4. 判断选择模式是否为窗口或交叉模式:

    • 如果是,使用 InitializeUserInput 强制用户在命令行输入内容,通过 GetPoint GetCorner 获取矩形窗口的两个对角点,然后使用 Select 方法根据指定的选择模式和点来选择对象。
    • 如果不是,直接使用 Select 方法根据选择模式选择对象。
      5. 调用 Highlight 方法将选择的对象以虚线显示,并使用 Update 方法更新显示。
      6. 提示用户按回车键结束操作。
      7. 再次调用 Highlight 方法将对象以实线显示,并更新显示。
  • 选项按钮点击事件 :当用户选择不同的选项按钮时,将 SelectionMode 设置为相应的选择模式常量。

  • UserForm_Initialize 事件 :在用户窗体加载时,将窗口选项按钮设置为默认选中状态。

9. 总结与应用建议
  • 图层管理 :合理使用图层的锁定、冻结和解冻功能,可以提高绘图效率和准确性。例如,对于一些暂时不需要编辑但又不想删除的图层,可以进行锁定或冻结操作。同时,利用宏代码可以快速实现图层的管理,减少手动操作的时间。

  • 块的使用 :块是AutoCAD中非常强大的功能,通过创建简单块、外部参照块等,可以实现对象的重复使用和层次结构的构建。在实际应用中,可以将常用的图形元素创建成块,方便在不同的绘图中使用。

  • 选择集 :选择集可以将多个对象作为一个整体进行操作,提高操作的效率。通过开发选择集应用程序,可以根据不同的选择模式快速选择所需的对象。

以下是一个简单的流程图,展示了选择集应用程序的主要流程:

graph TD;
    A[启动选择集应用程序] --> B[选择选择模式];
    B --> C{是否为窗口或交叉模式};
    C -- 是 --> D[输入矩形窗口对角点];
    C -- 否 --> E[直接选择对象];
    D --> F[选择对象];
    E --> F;
    F --> G[高亮显示选择集];
    G --> H[用户确认];
    H --> I[取消高亮显示];

通过以上对AutoCAD图层、块和选择集的详细介绍和分析,相信读者可以更好地掌握这些功能,并在实际绘图中灵活应用,提高绘图的效率和质量。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值