中望CAD二次开发(二)——图形创建详解

246 阅读5分钟

AutoCAD 对象的层次结构

在查看代码前,让我们先来了解CAD程序的层次结构 首先我们来看Application 对象 (.NET) 该对象是 AutoCAD .NET API 的根对象。从 Application 对象中,您可以访问主窗口以及任何打开的图形。获得图形后,就可以访问图形中的对象。

image.png

  • Document 对象可以使用和创建、打开和关闭图形文件。提供对包含所有图形和大多数非图形 AutoCAD 对象的对象的访问。
  • Database:存储数据的仓库,我们画的每一条线、圆弧、文本等组成图纸的各种元素,以及其他看不到的元素(例如图层)都存储在这里。
  • Editor:人机交互的场所,数据的输入、信息的输出都可以在这里进行。编辑器是文档的一个组成部分,而不是直接隶属于应用程序。现在您可以启动应用程序,打开一个文档,我们可以看到编辑器(命令行)。
  • Transaction Manager:事务管理员当然是来管理各项事务的。在编程(尤其是涉及数据操作的场景,如数据库、CAD 图形处理等)中,事务(Transaction)  是一个核心概念,用于保证一系列操作的完整性和一致性。简单来说,事务就像一个 “操作容器”,把多个相关的操作打包在一起,确保这些操作要么全部成功执行,要么全部失败回滚,不会出现 “部分成功、部分失败” 的中间状态。。 image.png

数据库对象 (.NET)

该对象包含所有图形和大多数非图形 AutoCAD 对象,包括符号表和命名字典。 image.png

符号表名称符号表功能
Block Table块表存储图形数据库中定义的块。此表中含有两个非常重要的记录:模型空间和图纸空间。
Dimension Style Table尺寸标注样式表存储尺寸标注样式
Layer Table层表存储图层
Linetype Table线型表存储线型
RegApp Table应用程序名注册表存储为图形数据库中对象的扩展实体数据而注册的应用程序名,扩展实体数据是附加在 CAD 实体上的 “自定义信息”(如材料属性、成本、供应商等),由第三方插件或用户自定义添加。
Text Style Table文字样式表存储文字样式
UCS Table用户坐标系表存储用户保存的用户坐标系
View Table视图表存储与命令view相关的视图 视图配置包括:视角(如正视图、俯视图、轴测图)、缩放比例、平移位置等,是对 “当前窗口显示状态” 的快照。
Viewport Table视口表存储当系统变量Tilemode值为1时的视口配置,该配置由命令vports创建。平铺视口是将模型空间窗口分割成多个子窗口(如上下两个、左右四个),每个子窗口可显示不同视角,方便同时观察模型的多个部分。

image.png

以上9个表不可增加不可删除

(DBDictionary)  是一种灵活的数据容器,用于存储和管理自定义对象、扩展数据或非图形化配置。它与符号表(如块表、层表)类似,但更通用且支持用户自定义扩展,是 CAD 图形数据库中实现高级功能的核心机制之一。

特性DBDictionary(命名字典)符号表(如BlockTableLayerTable
存储内容任意数据库对象(XRecord、自定义对象等)固定类型对象(如块表只存块定义)
创建灵活性可由用户 / 插件自由创建、删除系统预定义,不可删除或新增
结构支持嵌套层级结构平面结构(无嵌套)
用途扩展数据、自定义配置、插件数据管理 CAD 原生图形元素(块、图层、线型等)
// 定义ZWCAD命令特性,用户在命令行输入"AddCircle"即可执行该方法
[CommandMethod("AddCircle")]
// 公共方法AddCircle,用于在ZWCAD中添加一个圆
public void AddCircle()
{
    // 获取当前激活的ZWCAD文档对象(当前打开并操作的图纸)
    Document zcDoc = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
    
    // 从当前文档中获取数据库对象,ZWCAD中所有图形数据都存储在数据库中
    Database zcDB = zcDoc.Database;
    
    // 启动一个事务,所有对数据库的修改必须在事务中进行,确保数据一致性
    Transaction ZcTran = zcDoc.TransactionManager.StartTransaction();
    
    // 使用using语句包裹事务,确保事务在代码块结束后自动释放(无论是否发生异常)
    using (ZcTran)
    {
        // 以"只读"模式打开块表(BlockTable),块表存储了所有块定义的信息
        // GetObject方法通过对象ID获取数据库对象,OpenMode.ForRead表示只读
        BlockTable zcBLT = (BlockTable)ZcTran.GetObject(zcDB.BlockTableId, OpenMode.ForRead);
        
        // 从块表中获取模型空间(ModelSpace)的块表记录,并以"可写"模式打开
        // 模型空间是放置实际图形实体的默认空间,OpenMode.ForWrite表示可修改
        BlockTableRecord zcBLTR = (BlockTableRecord)ZcTran.GetObject(zcBLT[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
        
        // 创建一个圆(Circle)对象,这是ZWCAD中的图形实体
        Circle zcCircle = new Circle();
        
        // 设置圆的中心点坐标,Point3d表示三维坐标,此处Z轴为0(二维平面)
        zcCircle.Center = new Point3d(2, 3, 0);
        
        // 设置圆的半径为10(单位由当前图纸单位决定,如毫米、米等)
        zcCircle.Radius = 10;
        
        // 设置圆的颜色索引,1通常对应红色(ZWCAD的标准颜色索引)
        zcCircle.ColorIndex = 1;
        
        // 将创建的圆实体添加到模型空间中,此时圆被关联到模型空间但未写入数据库
        zcBLTR.AppendEntity(zcCircle);
        
        // 通知事务管理器:新创建的圆实体需要被事务管理,true表示事务提交时自动保存
        ZcTran.AddNewlyCreatedDBObject(zcCircle, true);
        
        // 提交事务,将所有操作(添加圆等)正式写入数据库,完成图形的持久化
        ZcTran.Commit();
    }
    
    // 向ZWCAD发送命令字符串,执行"范围缩放"(_ZOOM E)
    // 确保新添加的圆能在视图中完整显示,后面的false参数表示非模态执行
    zcDoc.SendStringToExecute("_ZOOM E ", false, false, false);
}