模型空间、图纸空间、布局(Layout)之间联系——CAD c#二次开发

在 AutoCAD 的二次开发中,**模型空间(Model Space)**、**图纸空间(Paper Space)** 和 **布局(Layout)** 是三个核心概念,它们的关系及开发中的操作逻辑如下:

---

在AutoCAD的 BlockTableRecord 类中, .IsLayout 是一个属性,用于判断该块表记录是否代表一个布局(包括图纸空间布局和模型空间布局)。
 
当 .IsLayout 属性值为 true 时,表示该块表记录是一个布局;如果为 false ,则表示它不是布局,可能是其他类型的块定义。结合代码中的 !btRecord.IsModelSpace 条件,就可以准确筛选出图纸空间布局,因为模型空间也是一种布局,但代码中需要区分开模型空间和图纸空间,只对图纸空间进行绘制圆的操作。

当 BlockTableRecord 的 .IsLayout 属性为 false 时,意味着该块表记录不代表任何类型的布局,它通常是普通的块定义。
 
例如,在AutoCAD中创建的用于重复使用的图块,如家具、电气符号等,这些块的 BlockTableRecord.IsLayout 属性就是 false 。它们是为了在图形中被多次插入而定义的,与模型空间或图纸空间的布局概念不同。

 

using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;

[assembly: CommandClass(typeof(BlockTableTraversal.Commands))]

namespace BlockTableTraversal
{
    public class Commands
    {
        [CommandMethod("TraverseBlockTable")]
        public void TraverseBlockTable()
        {
            // 获取当前文档和数据库
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            try
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    // 获取块表
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                    
                    ed.WriteMessage("\n开始遍历块表中的所有项目:\n");
                    
                    // 遍历块表中的每个记录
                    foreach (ObjectId btRecordId in bt)
                    {
                        // 获取块表记录对象
                        BlockTableRecord btRecord = (BlockTableRecord)tr.GetObject(btRecordId, OpenMode.ForRead);
                        
                        // 判断块表记录类型并输出信息
                        string typeInfo = GetBlockTableRecordType(btRecord);
                        ed.WriteMessage($"\n名称:{btRecord.Name}");
                        ed.WriteMessage($"\n类型:{typeInfo}");
                    }
                    
                    tr.Commit();
                }
            }
            catch (Exception ex)
            {
                ed.WriteMessage($"\n操作出错: {ex.Message}");
            }
        }

        // 判断块表记录类型的辅助方法
        private string GetBlockTableRecordType(BlockTableRecord btRecord)
        {
            if (btRecord.IsModelSpace)
            {
                return "模型空间";
            }
            else if (btRecord.IsLayout && !btRecord.IsModelSpace)
            {
                return "图纸空间";
            }
            else
            {
                return "块定义";
            }
        }
    }
}
 

 

1. 模型空间(Model Space)

  - 是 AutoCAD 的默认设计环境,用于创建和编辑三维模型或二维几何体。
 - **唯一性**:每个图形文件只有一个模型空间。

  - 所有几何实体(如直线、圆、块等)默认保存在模型空间的块表记录 `BlockTableRecord.ModelSpace` 中。
  - 通过 `BlockTableRecord.ModelSpace` 直接访问,无需依赖布局。

  using (Transaction tr = db.TransactionManager.StartTransaction()) {
      BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
      BlockTableRecord modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
      
      // 添加实体到模型空间
      Line line = new Line(new Point3d(0,0,0), new Point3d(100,100,0));
      modelSpace.AppendEntity(line);
      tr.AddNewlyCreatedDBObject(line, true);
      tr.Commit();
  }

2. 图纸空间(Paper Space)

  - 用于排版和打印,包含标题栏、注释、视口等非几何元素。
  - **多实例性**:一个图形文件可以有多个图纸空间(通过布局实现)。
- **开发特点**:
  - 每个图纸空间对应一个布局(如 `Layout1`, `Layout2`)。
  - 通过 `BlockTableRecord.PaperSpace` 访问当前激活的图纸空间块表记录。
  - **必须通过布局(Layout)操作**,直接操作 `PaperSpace` 可能无法关联到特定布局。

3. 布局(Layout)
- **定位**:
  - 是图纸空间的具体表现形式,每个布局代表一个独立的打印页面。
  - 用户通过切换布局来管理不同的图纸空间排版。
- **开发特点**:
  - 布局通过 `LayoutManager` 类管理,每个布局包含以下关键属性:
    - 页面设置(纸张尺寸、打印机配置等)。
    - 视口(Viewport)集合,用于显示模型空间的内容。
    - 标题栏、注释文本等二维元素。
  - **每个布局有自己的图纸空间块表记录**,例如 `Layout1` 的图纸空间与 `Layout2` 的图纸空间是独立的。
 

4. 三者的关系
(1) 模型空间 ⇄ 图纸空间(布局)
- **单向依赖**:
  - 模型空间是数据的唯一来源,图纸空间通过视口(Viewport)引用模型空间的视图。
  - 图纸空间中的视口是“窗口”,显示模型空间的特定区域,但无法直接修改模型空间数据。
- **多布局共享模型**:
  - 多个布局可以引用同一个模型空间的不同视图(例如:平面图、剖面图、三维视图)。

(2) 图纸空间 ⇄ 布局**
- **一一对应**:
  - 每个布局(如 `Layout1`)对应一个独立的图纸空间块表记录。
  - 切换布局时,实际切换的是当前激活的图纸空间环境。
- **开发关键点**:
  - 操作布局时需通过 `LayoutManager` 和 `Layout` 类,而非直接访问 `BlockTableRecord.PaperSpace`。

(3) 视口(Viewport)的角色**
- **连接模型与图纸**:
  - 视口是图纸空间中的对象,通过设置 `Viewport.ViewDirection`、`Viewport.CustomScale` 等属性,控制显示模型空间的哪部分内容。
  - 一个布局可以有多个视口,每个视口可独立配置显示范围和比例。

1. CAD中的视图与视口

视图(View) 定义:

用户对图形的观察方式,包括视角、投影方式(如正交或透视)、图层可见性等。 用途: 定义模型空间的显示方式(如俯视、侧视)。 控制打印布局中的图形比例和位置。 操作:通过VIEW命令或API调整视图的中心点、比例、旋转角度等。

视口(Viewport) 定义:

布局空间中的矩形区域,用于显示模型空间的内容。 用途: 将模型空间的不同视图(如平面图、立面图)排列在一张图纸上。 控制每个视图的显示比例和位置。 操作:通过VPORT命令或API调整视口的边界、比例、锁定状态等。 联系: 一个视口可以包含多个视图(通过视口分割)。 视口是视图的“容器”,决定视图在图纸上的位置和大小。

5. 开发中的关键区别
| **场景**               | **模型空间**                      | **图纸空间(布局)**                |
|-------------------------|-----------------------------------|-----------------------------------|
| **访问方式**           | `BlockTableRecord.ModelSpace`    | `LayoutManager` + `Layout`       |
| **实体类型**           | 三维几何体、块参照               | 视口、标题栏、注释文本            |
| **比例控制**           | 无固定比例                             | 通过视口的 `CustomScale` 控制      |
| **多实例支持**        | 唯一                                       | 多个布局(每个布局独立)          |
| **打印设置**           | 不可直接打印                        | 通过 `Layout.PlotSettings` 配置   |

总结

模型空间是数据的唯一来源,用于三维建模。 图纸空间是打印排版的环境,通过布局(Layout)管理。 布局是图纸空间的具体实例,每个布局独立配置页面和视口。 视口是连接二者的桥梁,控制模型空间的显示范围和比例。 在开发中,需通过 LayoutManager 管理布局,通过 BlockTableRecord.ModelSpace 和 BlockTableRecord.PaperSpace 分别操作模型和图纸空间的内容。

 

 public static void 模型空间_图纸空间_布局视图的关系()
 {
     // 获取当前文档和数据库
     Document doc = Application.DocumentManager.MdiActiveDocument;
     Database db = doc.Database;
     Editor ed = doc.Editor;

     try
     {
         // 提示用户选择一个实体
         PromptEntityOptions entityOptions = new PromptEntityOptions("\n请选择要检查的实体: ");
         entityOptions.SetRejectMessage("\n请选择有效的AutoCAD实体。");
         entityOptions.AddAllowedClass(typeof(Entity), false); // 允许选择任何实体类型

         PromptEntityResult entityResult = ed.GetEntity(entityOptions);

         // 检查用户是否取消选择
         if (entityResult.Status != PromptStatus.OK)
         {
             ed.WriteMessage("\n操作已取消。");
             return;
         }

         // 获取选中的实体对象
         using (Transaction tr = db.TransactionManager.StartTransaction())
         {
             Entity selectedEntity = tr.GetObject(entityResult.ObjectId, OpenMode.ForRead) as Entity;

             // 获取实体所在的块表记录(BlockTableRecord)
             BlockTableRecord btr = tr.GetObject(selectedEntity.BlockId, OpenMode.ForRead) as BlockTableRecord;
             // 获取布局名称
             string layoutName = "模型空间"; // 默认值为模型空间

             if (btr.LayoutId!= null)
             {   
                 Layout layout = tr.GetObject(btr.LayoutId, OpenMode.ForRead) as Layout;
                 layoutName = layout.LayoutName;
             }
             // 判断实体所在空间和视图
            ed.WriteMessage($"\n所选实体位于{btr.Name},layoutName:{layoutName}。\n");
             tr.Commit(); // 提交事务
         }
     }
     catch (System.Exception ex)
     {
         ed.WriteMessage("\n发生错误: " + ex.Message);
     }
 }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山水CAD插件定制

你的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值