第04章 - 核心架构与数据结构

第04章 - 核心架构与数据结构

4.1 LibreDWG架构概述

4.1.1 整体架构设计

LibreDWG采用分层架构设计,各层职责分明:

┌─────────────────────────────────────────────────────────┐
│                     应用层 (Applications)                │
│   dwg2dxf, dwgread, dwgwrite, dwglayers, dwggrep...    │
├─────────────────────────────────────────────────────────┤
│                     绑定层 (Bindings)                   │
│                   Python, Perl SWIG绑定                 │
├─────────────────────────────────────────────────────────┤
│                     API层 (API)                         │
│            dwg_api.h - 简化的高级API接口                │
├─────────────────────────────────────────────────────────┤
│                    核心层 (Core)                        │
│     dwg.h - 核心数据结构和底层函数                      │
├─────────────────────────────────────────────────────────┤
│               编解码层 (Encode/Decode)                  │
│      decode.c / encode.c - 二进制读写实现              │
├─────────────────────────────────────────────────────────┤
│                 格式转换层 (Converters)                 │
│    in_dxf.c, out_dxf.c, in_json.c, out_json.c...      │
└─────────────────────────────────────────────────────────┘

4.1.2 源码目录结构

libredwg/
├── include/              # 公开头文件
│   ├── dwg.h            # 核心数据结构定义
│   └── dwg_api.h        # 高级API声明
├── src/                  # 核心源码
│   ├── dwg.c            # DWG核心功能
│   ├── dwg_api.c        # API实现
│   ├── decode.c         # DWG解码(读取)
│   ├── encode.c         # DWG编码(写入)
│   ├── decode_r2007.c   # R2007+解码
│   ├── encode_r2007.c   # R2007+编码
│   ├── in_dxf.c         # DXF读取
│   ├── out_dxf.c        # DXF写入
│   ├── in_json.c        # JSON读取
│   ├── out_json.c       # JSON写入
│   ├── out_geojson.c    # GeoJSON输出
│   ├── bits.c           # 位操作工具
│   ├── common.c         # 公共工具函数
│   ├── classes.c        # 类处理
│   ├── classes.inc      # 类定义数据
│   ├── objects.inc      # 对象规格定义
│   ├── header_variables.spec  # 头变量规格
│   └── ...
├── programs/             # 命令行工具
│   ├── dwg2dxf.c
│   ├── dwgread.c
│   ├── dwgwrite.c
│   ├── dwglayers.c
│   ├── dwggrep.c
│   └── ...
├── examples/             # 示例程序
│   ├── load_dwg.c
│   ├── dwgadd.c
│   └── ...
├── bindings/             # 语言绑定
│   ├── python/
│   └── perl/
├── test/                 # 测试文件
├── doc/                  # 文档
│   ├── LibreDWG.texi    # Texinfo文档
│   └── dynapi.texi      # 动态API文档
└── examples/             # 示例DWG文件

4.1.3 核心模块职责

模块 主要文件 职责
数据结构 dwg.h 定义Dwg_Data及所有实体/对象结构
API dwg_api.h/c 提供简化的编程接口
解码 decode.c 将DWG二进制解析为内存结构
编码 encode.c 将内存结构写入DWG二进制
位操作 bits.c 位级别的读写操作
DXF in_dxf.c, out_dxf.c DXF格式转换
JSON in_json.c, out_json.c JSON格式转换
GeoJSON out_geojson.c GeoJSON输出

4.2 核心数据结构

4.2.1 Dwg_Data - 顶层容器

Dwg_Data是LibreDWG的核心数据结构,表示整个DWG文件:

typedef struct _dwg_struct {
    // 版本信息
    Dwg_Version_Type header_version;
    Dwg_Version_Type version;
    
    // 头信息
    Dwg_Header header;
    Dwg_Header_Variables header_vars;
    
    // 类定义
    BITCODE_BL num_classes;
    Dwg_Class *dwg_class;
    
    // 对象数组
    BITCODE_BL num_objects;
    Dwg_Object *object;
    
    // 对象映射
    BITCODE_BL num_object_refs;
    Dwg_Object_Ref **object_ref;
    
    // 符号表控制句柄
    struct {
        BITCODE_H BLOCK_CONTROL_OBJECT;
        BITCODE_H LAYER_CONTROL_OBJECT;
        BITCODE_H STYLE_CONTROL_OBJECT;
        BITCODE_H LTYPE_CONTROL_OBJECT;
        BITCODE_H VIEW_CONTROL_OBJECT;
        BITCODE_H UCS_CONTROL_OBJECT;
        BITCODE_H VPORT_CONTROL_OBJECT;
        BITCODE_H APPID_CONTROL_OBJECT;
        BITCODE_H DIMSTYLE_CONTROL_OBJECT;
        BITCODE_H VX_CONTROL_OBJECT;
        BITCODE_H DICTIONARY_ACAD_GROUP;
        BITCODE_H DICTIONARY_ACAD_MLINESTYLE;
        BITCODE_H DICTIONARY_NAMED_OBJECTS;
        // ...更多句柄
    };
    
    // 缩略图
    Dwg_Chain thumbnail;
    
    // SummaryInfo
    struct Dwg_SummaryInfo {
        BITCODE_TU TITLE;
        BITCODE_TU SUBJECT;
        BITCODE_TU AUTHOR;
        BITCODE_TU KEYWORDS;
        BITCODE_TU COMMENTS;
        BITCODE_TU LASTSAVEDBY;
        // ...
    } summaryinfo;
    
    // R2004+段信息
    Dwg_Section *section;
    BITCODE_RL num_sections;
    
    // 内部状态
    int opts;
    unsigned int dirty_refs;
    struct _inthash *object_map;
    
} Dwg_Data;

4.2.2 Dwg_Object - 通用对象容器

Dwg_Object是所有DWG对象(实体和非图形对象)的通用容器:

typedef struct _dwg_object {
    // 对象基本信息
    BITCODE_RL size;           // 对象数据大小
    BITCODE_BS type;           // 对象类型
    BITCODE_RL index;          // 在对象数组中的索引
    
    // 固定类型标识
    Dwg_Object_Type fixedtype; // 标准化的类型枚举
    char *name;                // 类型名称字符串
    char *dxfname;             // DXF类型名
    
    // 句柄信息
    BITCODE_BL handle;         // 对象句柄值
    
    // 父级引用
    struct _dwg_struct *parent; // 指向Dwg_Data
    
    // 实体/对象数据联合体
    Dwg_Object_Supertype supertype; // ENTITY或OBJECT
    
    union {
        Dwg_Object_Entity *entity;   // 图形实体数据
        Dwg_Object_Object *object;   // 非图形对象数据
    } tio;
    
    // 原始数据(用于调试)
    unsigned long bitsize;
    BITCODE_RC *hdlptr;        // 句柄流指针
    
} Dwg_Object;

4.2.3 Dwg_Object_Entity - 图形实体

typedef struct _dwg_object_entity {
    // 公共实体字段
    BITCODE_H ownerhandle;     // 所属块记录句柄
    BITCODE_BL num_reactors;   // 反应器数量
    BITCODE_H *reactors;       // 反应器句柄数组
    BITCODE_H xdicobjhandle;   // 扩展字典句柄
    BITCODE_B is_xdic_missing; // 无扩展字典
    
    // 图形属性
    BITCODE_BB entmode;        // 实体模式
    BITCODE_BL num_eed;        // EED数量
    Dwg_Eed *eed;              // 扩展实体数据
    
    BITCODE_B preview_exists;  // 预览存在
    BITCODE_BL preview_size;   // 预览大小
    BITCODE_TF preview;        // 预览数据
    
    // 实体属性
    BITCODE_CMC color;         // 颜色
    BITCODE_BD ltype_scale;    // 线型比例
    BITCODE_BB ltype_flags;    // 线型标志
    BITCODE_BB plotstyle_flags;// 打印样式标志
    BITCODE_BB material_flags; // 材质标志
    BITCODE_RC shadow_flags;   // 阴影标志
    BITCODE_B has_full_visualstyle;
    BITCODE_B has_face_visualstyle;
    BITCODE_B has_edge_visualstyle;
    BITCODE_BS invisible;      // 不可见标志
    BITCODE_RC lineweight;     // 线宽
    
    // 实体类型特定数据(联合体)
    union {
        Dwg_Entity_LINE *LINE;
        Dwg_Entity_CIRCLE *CIRCLE;
        Dwg_Entity_ARC *ARC;
        Dwg_Entity_POINT *POINT;
        Dwg_Entity_TEXT *TEXT;
        Dwg_Entity_MTEXT *MTEXT;
        Dwg_Entity_INSERT *INSERT;
        Dwg_Entity_DIMENSION_LINEAR *DIMENSION_LINEAR;
        Dwg_Entity_LWPOLYLINE *LWPOLYLINE;
        Dwg_Entity_HATCH *HATCH;
        Dwg_Entity_SPLINE *SPLINE;
        // ... 所有实体类型
    } tio;
    
    // 句柄引用
    BITCODE_H layer;           // 图层句柄
    BITCODE_H ltype;           // 线型句柄
    BITCODE_H plotstyle;       // 打印样式句柄
    BITCODE_H material;        // 材质句柄
    BITCODE_H visualstyle;     // 视觉样式句柄
    
} Dwg_Object_Entity;

4.2.4 Dwg_Object_Object - 非图形对象

typedef struct _dwg_object_object {
    // 公共对象字段
    BITCODE_H ownerhandle;     // 拥有者句柄
    BITCODE_BL num_reactors;   // 反应器数量
    BITCODE_H *reactors;       // 反应器句柄数组
    BITCODE_H xdicobjhandle;   // 扩展字典句柄
    BITCODE_B is_xdic_missing; // 无扩展字典
    
    BITCODE_BL num_eed;        // EED数量
    Dwg_Eed *eed;              // 扩展实体数据
    
    // 对象类型特定数据(联合体)
    union {
        Dwg_Object_BLOCK_CONTROL *BLOCK_CONTROL;
        Dwg_Object_BLOCK_HEADER *BLOCK_HEADER;
        Dwg_Object_LAYER_CONTROL *LAYER_CONTROL;
        Dwg_Object_LAYER *LAYER;
        Dwg_Object_STYLE_CONTROL *STYLE_CONTROL;
        Dwg_Object_STYLE *STYLE;
        Dwg_Object_LTYPE_CONTROL *LTYPE_CONTROL;
        Dwg_Object_LTYPE *LTYPE;
        Dwg_Object_DICTIONARY *DICTIONARY;
        Dwg_Object_LAYOUT *LAYOUT;
        Dwg_Object_DIMSTYLE *DIMSTYLE;
        // ... 所有对象类型
    } tio;
    
} Dwg_Object_Object;

4.2.5 Dwg_Object_Ref - 句柄引用

typedef struct _dwg_object_ref {
    Dwg_Object *obj;           // 指向的对象
    BITCODE_H handleref;       // 句柄引用数据
    BITCODE_BL absolute_ref;   // 绝对引用值
} Dwg_Object_Ref;

// 句柄结构
typedef struct _dwg_handle {
    BITCODE_RC code;           // 句柄类型代码
    BITCODE_RC size;           // 大小
    BITCODE_BL value;          // 句柄值
} Dwg_Handle;

4.3 实体结构详解

4.3.1 常用实体结构

直线实体 (LINE):

typedef struct _dwg_entity_LINE {
    struct _dwg_object_entity *parent;
    
    BITCODE_B z_is_zero;       // Z坐标为零标志
    BITCODE_3BD start;         // 起点坐标
    BITCODE_3BD end;           // 终点坐标
    BITCODE_BD thickness;      // 厚度
    BITCODE_BE extrusion;      // 挤出方向向量
    
} Dwg_Entity_LINE;

圆实体 (CIRCLE):

typedef struct _dwg_entity_CIRCLE {
    struct _dwg_object_entity *parent;
    
    BITCODE_3BD center;        // 圆心坐标
    BITCODE_BD radius;         // 半径
    BITCODE_BD thickness;      // 厚度
    BITCODE_BE extrusion;      // 挤出方向向量
    
} Dwg_Entity_CIRCLE;

圆弧实体 (ARC):

typedef struct _dwg_entity_ARC {
    struct _dwg_object_entity *parent;
    
    BITCODE_3BD center;        // 圆心坐标
    BITCODE_BD radius;         // 半径
    BITCODE_BD thickness;      // 厚度
    BITCODE_BE extrusion;      // 挤出方向向量
    BITCODE_BD start_angle;    // 起始角度(弧度)
    BITCODE_BD end_angle;      // 终止角度(弧度)
    
} Dwg_Entity_ARC;

块引用实体 (INSERT):

typedef struct _dwg_entity_INSERT {
    struct _dwg_object_entity *parent;
    
    BITCODE_3BD ins_pt;        // 插入点
    BITCODE_BB scale_flag;     // 比例标志
    BITCODE_3BD scale;         // 缩放比例
    BITCODE_BD rotation;       // 旋转角度
    BITCODE_3BD extrusion;     // 挤出方向
    BITCODE_B has_attribs;     // 有属性标志
    BITCODE_BL num_owned;      // 拥有的属性数量
    
    BITCODE_H block_header;    // 块定义句柄
    BITCODE_H first_attrib;    // 第一个属性句柄
    BITCODE_H last_attrib;     // 最后一个属性句柄
    BITCODE_H *attribs;        // 属性句柄数组
    BITCODE_H seqend;          // SEQEND句柄
    
} Dwg_Entity_INSERT;

轻量多段线实体 (LWPOLYLINE):

typedef struct _dwg_LWPOLYLINE_width {
    BITCODE_BD start;          // 起始宽度
    BITCODE_BD end;            // 终止宽度
} Dwg_LWPOLYLINE_width;

typedef struct _dwg_entity_LWPOLYLINE {
    struct _dwg_object_entity *parent;
    
    BITCODE_BS flag;           // 标志(1=闭合)
    BITCODE_BD const_width;    // 常量宽度
    BITCODE_BD elevation;      // 高程
    BITCODE_BD thickness;      // 厚度
    BITCODE_BE extrusion;      // 挤出方向
    
    BITCODE_BL num_points;     // 点数量
    BITCODE_2RD *points;       // 点数组
    
    BITCODE_BL num_bulges;     // 凸度数量
    BITCODE_BD *bulges;        // 凸度数组
    
    BITCODE_BL num_vertexids;  // 顶点ID数量
    BITCODE_BL *vertexids;     // 顶点ID数组
    
    BITCODE_BL num_widths;     // 宽度数量
    Dwg_LWPOLYLINE_width *widths; // 宽度数组
    
} Dwg_Entity_LWPOLYLINE;

4.3.2 文字实体结构

单行文字 (TEXT):

typedef struct _dwg_entity_TEXT {
    struct _dwg_object_entity *parent;
    
    BITCODE_RC dataflags;      // 数据标志
    BITCODE_BD elevation;      // 高程
    BITCODE_2RD ins_pt;        // 插入点
    BITCODE_2RD alignment_pt;  // 对齐点
    BITCODE_BE extrusion;      // 挤出方向
    BITCODE_BD thickness;      // 厚度
    BITCODE_BD oblique_ang;    // 倾斜角
    BITCODE_BD rotation;       // 旋转角度
    BITCODE_BD height;         // 文字高度
    BITCODE_BD width_factor;   // 宽度因子
    BITCODE_TV text_value;     // 文字内容
    BITCODE_BS generation;     // 生成标志
    BITCODE_BS horiz_alignment;// 水平对齐
    BITCODE_BS vert_alignment; // 垂直对齐
    
    BITCODE_H style;           // 文字样式句柄
    
} Dwg_Entity_TEXT;

多行文字 (MTEXT):

typedef struct _dwg_entity_MTEXT {
    struct _dwg_object_entity *parent;
    
    BITCODE_3BD ins_pt;        // 插入点
    BITCODE_BE extrusion;      // 挤出方向
    BITCODE_3BD x_axis_dir;    // X轴方向
    BITCODE_BD rect_width;     // 矩形宽度
    BITCODE_BD rect_height;    // 矩形高度
    BITCODE_BS attachment;     // 附着点
    BITCODE_BS flow_dir;       // 流向
    BITCODE_BD extents_width;  // 实际宽度
    BITCODE_BD extents_height; // 实际高度
    BITCODE_TV text;           // 文字内容(含格式码)
    
    BITCODE_H style;           // 文字样式句柄
    BITCODE_BS linespace_style;// 行距类型
    BITCODE_BD linespace_factor;// 行距因子
    BITCODE_B unknown_bit;
    BITCODE_BL bg_fill_flag;   // 背景填充标志
    BITCODE_BL bg_fill_scale;  // 背景填充比例
    BITCODE_CMC bg_fill_color; // 背景填充颜色
    BITCODE_BL bg_fill_trans;  // 背景填充透明度
    
} Dwg_Entity_MTEXT;

4.3.3 尺寸标注结构

// 尺寸标注公共数据
typedef struct _dwg_DIMENSION_common {
    BITCODE_RC class_version;
    BITCODE_3BD extrusion;
    BITCODE_2RD text_midpt;
    BITCODE_BD elevation;
    BITCODE_RC flags;
    BITCODE_TV user_text;
    BITCODE_BD text_rotation;
    BITCODE_BD horiz_dir;
    BITCODE_3BD ins_scale;
    BITCODE_BD ins_rotation;
    BITCODE_BS attachment;
    BITCODE_BS lspace_style;
    BITCODE_BD lspace_factor;
    BITCODE_BD act_measurement;
    BITCODE_B unknown;
    BITCODE_B flip_arrow1;
    BITCODE_B flip_arrow2;
    BITCODE_2RD clone_ins_pt;
    
    BITCODE_H dimstyle;
    BITCODE_H block;
} Dwg_DIMENSION_common;

// 线性尺寸
typedef struct _dwg_entity_DIMENSION_LINEAR {
    struct _dwg_object_entity *parent;
    Dwg_DIMENSION_common dim;
    
    BITCODE_3BD def_pt;        // 定义点
    BITCODE_3BD xline1_pt;     // 第一条延伸线点
    BITCODE_3BD xline2_pt;     // 第二条延伸线点
    BITCODE_BD oblique_angle;  // 倾斜角度
    BITCODE_BD dim_rotation;   // 尺寸线旋转
    
} Dwg_Entity_DIMENSION_LINEAR;

4.4 非图形对象结构

4.4.1 符号表对象

图层 (LAYER):

typedef struct _dwg_object_LAYER {
    struct _dwg_object_object *parent;
    
    BITCODE_BS flag;           // 标志(冻结、锁定等)
    BITCODE_TV name;           // 图层名
    BITCODE_B is_xref_ref;     // 外部引用
    BITCODE_BS xrefindex;      // 外部引用索引
    BITCODE_B is_xref_resolved;// 外部引用已解析
    
    BITCODE_B frozen;          // 冻结
    BITCODE_B on;              // 开启
    BITCODE_B frozen_in_new;   // 新视口中冻结
    BITCODE_B locked;          // 锁定
    BITCODE_B plotflag;        // 打印标志
    BITCODE_RC lineweight;     // 线宽
    BITCODE_CMC color;         // 颜色
    
    BITCODE_H ltype;           // 线型句柄
    BITCODE_H material;        // 材质句柄
    BITCODE_H plotstyle;       // 打印样式句柄
    BITCODE_H visualstyle;     // 视觉样式句柄
    
} Dwg_Object_LAYER;

块头 (BLOCK_HEADER):

typedef struct _dwg_object_BLOCK_HEADER {
    struct _dwg_object_object *parent;
    
    BITCODE_TV name;           // 块名
    BITCODE_B is_xref_ref;     // 外部引用
    BITCODE_BS xrefindex;      // 外部引用索引
    BITCODE_B is_xref_resolved;
    BITCODE_B is_xref_dep;     // 外部引用依赖
    
    BITCODE_B anonymous;       // 匿名块
    BITCODE_B hasattrs;        // 有属性
    BITCODE_B is_xref;         // 是外部引用
    BITCODE_B is_overlaidxref; // 覆盖外部引用
    BITCODE_B loaded_bit;      // 已加载
    BITCODE_BL num_owned;      // 拥有的实体数量
    BITCODE_3BD base_pt;       // 基点
    BITCODE_TV xref_pname;     // 外部引用路径
    
    BITCODE_BL num_inserts;    // 插入数量
    BITCODE_TV description;    // 描述
    BITCODE_BL preview_size;   // 预览大小
    BITCODE_TF preview;        // 预览数据
    
    BITCODE_BS insert_units;   // 插入单位
    BITCODE_B explodable;      // 可分解
    BITCODE_RC block_scaling;  // 块缩放
    
    BITCODE_H block_entity;    // BLOCK实体句柄
    BITCODE_H first_entity;    // 第一个实体句柄
    BITCODE_H last_entity;     // 最后一个实体句柄
    BITCODE_H *entities;       // 实体句柄数组
    BITCODE_H endblk_entity;   // ENDBLK实体句柄
    BITCODE_H *inserts;        // INSERT句柄数组
    BITCODE_H layout;          // 布局句柄
    
} Dwg_Object_BLOCK_HEADER;

4.4.2 样式对象

文字样式 (STYLE):

typedef struct _dwg_object_STYLE {
    struct _dwg_object_object *parent;
    
    BITCODE_BS flag;           // 标志
    BITCODE_TV name;           // 样式名
    BITCODE_B is_xref_ref;
    BITCODE_BS xrefindex;
    BITCODE_B is_xref_resolved;
    BITCODE_B is_xref_dep;
    
    BITCODE_B is_vertical;     // 垂直文字
    BITCODE_B is_shape_file;   // 形文件
    BITCODE_BD fixed_height;   // 固定高度
    BITCODE_BD width_factor;   // 宽度因子
    BITCODE_BD oblique_angle;  // 倾斜角
    BITCODE_RC text_generation;// 文字生成标志
    BITCODE_BD last_height;    // 最后使用高度
    BITCODE_TV font_file;      // 字体文件
    BITCODE_TV bigfont_file;   // 大字体文件
    
} Dwg_Object_STYLE;

尺寸样式 (DIMSTYLE):

typedef struct _dwg_object_DIMSTYLE {
    struct _dwg_object_object *parent;
    
    BITCODE_BS flag;           // 标志
    BITCODE_TV name;           // 样式名
    
    // 尺寸变量(数十个)
    BITCODE_BD DIMSCALE;       // 全局比例因子
    BITCODE_BD DIMASZ;         // 箭头大小
    BITCODE_BD DIMEXO;         // 延伸线起点偏移
    BITCODE_BD DIMDLI;         // 尺寸线增量
    BITCODE_BD DIMEXE;         // 延伸线超出量
    BITCODE_BD DIMRND;         // 取整值
    BITCODE_BD DIMDLE;         // 尺寸线延伸
    BITCODE_BD DIMTP;          // 公差上限
    BITCODE_BD DIMTM;          // 公差下限
    BITCODE_BD DIMTXT;         // 文字高度
    BITCODE_BD DIMCEN;         // 中心标记大小
    BITCODE_BD DIMTSZ;         // 短划线大小
    BITCODE_BD DIMALTF;        // 换算单位比例
    BITCODE_BD DIMLFAC;        // 线性比例因子
    BITCODE_BD DIMTVP;         // 文字垂直位置
    BITCODE_BD DIMTFAC;        // 公差文字比例
    BITCODE_BD DIMGAP;         // 尺寸线间隙
    // ... 更多变量
    
    // 样式引用句柄
    BITCODE_H DIMTXSTY;        // 文字样式
    BITCODE_H DIMLDRBLK;       // 引线箭头
    BITCODE_H DIMBLK;          // 箭头块
    BITCODE_H DIMBLK1;         // 第一箭头
    BITCODE_H DIMBLK2;         // 第二箭头
    BITCODE_H DIMLTYPE;        // 尺寸线线型
    BITCODE_H DIMLTEX1;        // 第一延伸线线型
    BITCODE_H DIMLTEX2;        // 第二延伸线线型
    
} Dwg_Object_DIMSTYLE;

4.4.3 字典对象

typedef struct _dwg_object_DICTIONARY {
    struct _dwg_object_object *parent;
    
    BITCODE_BL numitems;       // 条目数量
    BITCODE_RC cloning;        // 克隆行为
    BITCODE_RC hard_owner;     // 硬拥有标志
    
    BITCODE_TV *texts;         // 键名数组
    BITCODE_H *itemhandles;    // 值句柄数组
    
} Dwg_Object_DICTIONARY;

// 扩展记录
typedef struct _dwg_object_XRECORD {
    struct _dwg_object_object *parent;
    
    BITCODE_BL num_databytes;  // 数据字节数
    BITCODE_RC cloning;        // 克隆行为
    
    // 以DXF组码格式存储的数据
    BITCODE_BL num_xdata;
    Dwg_Resbuf *xdata;         // 数据链表
    
    BITCODE_BL num_objid_handles;
    BITCODE_H *objid_handles;
    
} Dwg_Object_XRECORD;

4.5 内存管理

4.5.1 内存分配策略

LibreDWG使用标准C内存管理,但提供了统一的接口:

// 内存分配宏
#define CALLOC(ptr, num, type) \
    ptr = (type *)calloc(num, sizeof(type))

// 内存释放
void dwg_free(Dwg_Data *dwg);

// 对象释放
void dwg_free_object(Dwg_Object *obj);

// 实体数据释放
void dwg_free_LINE(Dwg_Entity_LINE *ent);
void dwg_free_CIRCLE(Dwg_Entity_CIRCLE *ent);
// ... 其他实体类型

4.5.2 引用计数

LibreDWG使用dirty_refs标志追踪对象引用状态:

// 标记引用需要更新
dwg->dirty_refs = 1;

// 解析所有引用
int dwg_resolve_objectrefs(Dwg_Data *dwg);

// 解析单个引用
Dwg_Object *dwg_resolve_handle(Dwg_Data *dwg, BITCODE_BL handle);

// 通过引用获取对象
Dwg_Object *dwg_ref_object(Dwg_Data *dwg, Dwg_Object_Ref *ref);

4.5.3 深拷贝

// 复制整个DWG结构
Dwg_Data *dwg_copy(const Dwg_Data *dwg);

// 复制单个对象
Dwg_Object *dwg_copy_object(Dwg_Data *dwg, const Dwg_Object *obj);

4.6 句柄系统

4.6.1 句柄类型

// 句柄类型枚举
typedef enum DWG_HANDLE_CODE {
    DWG_HANDLE_NONE = 0,       // 无
    DWG_HANDLE_SOFTOWNER = 2,  // 软拥有
    DWG_HANDLE_HARDOWNER = 3,  // 硬拥有
    DWG_HANDLE_SOFTPOINTER = 4,// 软指针
    DWG_HANDLE_HARDPOINTER = 5,// 硬指针
} DWG_HANDLE_CODE;

// 相对句柄编码
// 0x06 = 当前句柄 + 1
// 0x08 = 当前句柄 - 1
// 0x0A = 当前句柄 + 偏移
// 0x0C = 当前句柄 - 偏移

4.6.2 句柄操作函数

// 通过句柄值获取对象
Dwg_Object *dwg_resolve_handle(Dwg_Data *dwg, BITCODE_BL handle);

// 通过句柄引用获取对象
Dwg_Object *dwg_ref_object(Dwg_Data *dwg, Dwg_Object_Ref *ref);

// 获取对象的绝对句柄
BITCODE_BL dwg_obj_handle(const Dwg_Object *obj);

// 添加句柄引用
int dwg_add_handle(Dwg_Handle *hdl, BITCODE_RC code, 
                   BITCODE_BL value, Dwg_Object *obj);

4.6.3 对象映射表

// 对象映射表操作
void dwg_add_object_to_map(Dwg_Data *dwg, Dwg_Object *obj);
Dwg_Object *dwg_get_object_from_map(Dwg_Data *dwg, BITCODE_BL handle);

// 重建对象映射
int dwg_resolve_objectrefs_silent(Dwg_Data *dwg);

4.7 错误处理

4.7.1 错误码定义

// 错误级别
typedef enum DWG_ERROR {
    DWG_NOERR = 0,             // 无错误
    DWG_ERR_WRONGCRC = 1,      // CRC校验错误
    DWG_ERR_NOTYETSUPPORTED = 2,// 尚不支持
    DWG_ERR_UNHANDLEDCLASS = 4, // 未处理的类
    DWG_ERR_INVALIDTYPE = 8,   // 无效类型
    DWG_ERR_INVALIDHANDLE = 16,// 无效句柄
    DWG_ERR_INVALIDEED = 32,   // 无效EED
    DWG_ERR_VALUEOUTOFBOUNDS = 64, // 值越界
    DWG_ERR_CLASSESNOTFOUND = 128, // 类未找到
    DWG_ERR_SECTIONNOTFOUND = 256, // 段未找到
    DWG_ERR_PAGENOTFOUND = 512,// 页未找到
    DWG_ERR_INTERNALERROR = 1024, // 内部错误
    DWG_ERR_OUTOFMEM = 2048,   // 内存不足
    DWG_ERR_INVALIDDWG = 4096, // 无效DWG文件
    DWG_ERR_IOERROR = 8192,    // IO错误
    DWG_ERR_CRITICAL = 0x2000, // 临界错误阈值
} DWG_ERROR;

// 错误级别判断
#define DWG_ERR_CRITICAL 0x2000
if (error >= DWG_ERR_CRITICAL) {
    // 严重错误,无法继续
}

4.7.2 错误处理函数

// 获取错误字符串
const char *dwg_errstrings(int error);

// 设置日志级别
void dwg_set_loglevel(int level);

// 跟踪输出
// 通过环境变量 LIBREDWG_TRACE 控制(0-9)

4.8 类型枚举

4.8.1 固定类型

typedef enum DWG_OBJECT_TYPE {
    DWG_TYPE_UNUSED = 0,
    DWG_TYPE_TEXT = 1,
    DWG_TYPE_ATTRIB = 2,
    DWG_TYPE_ATTDEF = 3,
    DWG_TYPE_BLOCK = 4,
    DWG_TYPE_ENDBLK = 5,
    DWG_TYPE_SEQEND = 6,
    DWG_TYPE_INSERT = 7,
    DWG_TYPE_MINSERT = 8,
    // ... 省略部分
    DWG_TYPE_VERTEX_2D = 10,
    DWG_TYPE_VERTEX_3D = 11,
    DWG_TYPE_VERTEX_MESH = 12,
    DWG_TYPE_VERTEX_PFACE = 13,
    DWG_TYPE_VERTEX_PFACE_FACE = 14,
    DWG_TYPE_POLYLINE_2D = 15,
    DWG_TYPE_POLYLINE_3D = 16,
    DWG_TYPE_ARC = 17,
    DWG_TYPE_CIRCLE = 18,
    DWG_TYPE_LINE = 19,
    DWG_TYPE_DIMENSION_ORDINATE = 20,
    DWG_TYPE_DIMENSION_LINEAR = 21,
    DWG_TYPE_DIMENSION_ALIGNED = 22,
    DWG_TYPE_DIMENSION_ANG3PT = 23,
    DWG_TYPE_DIMENSION_ANG2LN = 24,
    DWG_TYPE_DIMENSION_RADIUS = 25,
    DWG_TYPE_DIMENSION_DIAMETER = 26,
    DWG_TYPE_POINT = 27,
    DWG_TYPE_3DFACE = 28,
    DWG_TYPE_POLYLINE_PFACE = 29,
    DWG_TYPE_POLYLINE_MESH = 30,
    DWG_TYPE_SOLID = 31,
    DWG_TYPE_TRACE = 32,
    DWG_TYPE_SHAPE = 33,
    DWG_TYPE_VIEWPORT = 34,
    DWG_TYPE_ELLIPSE = 35,
    DWG_TYPE_SPLINE = 36,
    DWG_TYPE_REGION = 37,
    DWG_TYPE_3DSOLID = 38,
    DWG_TYPE_BODY = 39,
    DWG_TYPE_RAY = 40,
    DWG_TYPE_XLINE = 41,
    DWG_TYPE_DICTIONARY = 42,
    DWG_TYPE_OLEFRAME = 43,
    DWG_TYPE_MTEXT = 44,
    DWG_TYPE_LEADER = 45,
    DWG_TYPE_TOLERANCE = 46,
    DWG_TYPE_MLINE = 47,
    
    // 符号表和控制对象
    DWG_TYPE_BLOCK_CONTROL = 48,
    DWG_TYPE_BLOCK_HEADER = 49,
    DWG_TYPE_LAYER_CONTROL = 50,
    DWG_TYPE_LAYER = 51,
    DWG_TYPE_STYLE_CONTROL = 52,
    DWG_TYPE_STYLE = 53,
    // ... 省略更多
    
    // 动态类型起始
    DWG_TYPE_FREED = 500,
    // >= 500 的类型从CLASSES段加载
    
} DWG_OBJECT_TYPE;

4.8.2 版本枚举

typedef enum DWG_VERSION_TYPE {
    R_INVALID,
    R_1_1,
    R_1_2,
    R_1_3,
    R_1_4,
    R_2_0b,
    R_2_0,
    R_2_10,
    R_2_21,
    R_2_22,
    R_2_4,
    R_2_5,
    R_2_6,
    R_9,
    R_9c1,
    R_10,
    R_11b1,
    R_11b2,
    R_11,
    R_12,
    R_13b1,
    R_13b2,
    R_13,
    R_13c3,
    R_14,
    R_2000b,
    R_2000,
    R_2000i,
    R_2002,
    R_2004a,
    R_2004b,
    R_2004c,
    R_2004,
    R_2007a,
    R_2007b,
    R_2007,
    R_2010b,
    R_2010,
    R_2013b,
    R_2013,
    R_2018b,
    R_2018,
    R_AFTER
} Dwg_Version_Type;

4.9 本章小结

本章详细介绍了LibreDWG的核心架构和数据结构:

  1. 整体架构:分层设计,从底层编解码到高级API
  2. 源码结构:各目录和模块的职责
  3. 核心数据结构:Dwg_Data、Dwg_Object、实体和对象结构
  4. 实体结构:LINE、CIRCLE、TEXT等常用实体的字段
  5. 非图形对象:LAYER、BLOCK_HEADER、DICTIONARY等
  6. 内存管理:分配、释放和引用计数
  7. 句柄系统:句柄类型和操作函数
  8. 错误处理:错误码和处理函数
  9. 类型枚举:对象类型和版本枚举

掌握这些数据结构是使用LibreDWG进行开发的基础。


下一章预告第05章 - 命令行工具详解 - 详细介绍LibreDWG提供的各种命令行工具及其使用方法。

posted @ 2026-01-11 00:40  我才是银古  阅读(3)  评论(0)    收藏  举报