模型空间、图纸空间、布局(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);
}
}