当前位置: 首页 > news >正文

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

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

---

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);}}


http://www.mrgr.cn/news/95264.html

相关文章:

  • Java+Html实现前后端客服聊天
  • K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群
  • [AI速读]如何构建高效的AMBA协议检查器(Checker IP)
  • 基于carla的模仿学习(附数据集CORL2017)更新中........
  • PWM控制电机转速的原理及相关寄存器值计算
  • 失败的面试经历(ʘ̥∧ʘ̥)
  • 英伟达黄仁勋2025GTC演讲深度解析:液冷GPU、AI工厂、机器人AI…...
  • electron桌面应用多种快速创建方法
  • Windows 系统安装 Python3.7 、3.8、3.9、3.10、 3.11 、3.12、3.13最新版,附带相应程序。
  • 尝试在软考65天前开始成为软件设计师-计算机网络
  • VulnHub-Web-Machine-N7通关攻略
  • mysql之DATE_FORMAT迁移到gbase8s
  • 拓展 Coco AI 功能 - 智能检索 Hexo 博客
  • 论文分享:PL-ALF框架实现无人机低纹理环境自主飞行
  • T-CSVT投稿记录
  • Android自动化测试终极指南:从单元到性能全覆盖!
  • MCU-芯片时钟与总线和定时器关系,举例QSPI
  • 松下Panasonic PLC FP0R C32CT控制张大头闭环步进电机
  • 操作系统基础:从开机流程洞悉其运作原理
  • sql-DDL