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

模型空间、图纸空间、布局(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.kler.cn/a/594614.html

相关文章:

  • Node.js中SerialPort(串口)模块使用详解
  • debian11安装MongoDB
  • 美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!
  • NLua 文档
  • 《模型思维》第二十三章 “与集体行动有关的问题” 总结
  • 华为NAS真实测评!
  • 基于Spring Boot的售楼管理系统的设计与实现(LW+源码+讲解)
  • Python(正则表达式)
  • JAVA多线程中的单例模式
  • DeepSeek Chat 自动化交互技术分析
  • Hugging Face 模型格式全解析:从 PyTorch 到 GGUF
  • springboot Actuator 指标分析
  • 服务安全认证概述与基础认证方式
  • Buuctf [极客大挑战 2019]FinalSQL
  • 计算机图形学学习日志4
  • CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~
  • mysql之DATE_FORMAT迁移到gbase8s
  • MVC_Publish-Subscriber 模式中的事件处理程序
  • 【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法
  • 微服务即时通信系统---(九)消息转发子服务