第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的核心架构和数据结构:
- 整体架构:分层设计,从底层编解码到高级API
- 源码结构:各目录和模块的职责
- 核心数据结构:Dwg_Data、Dwg_Object、实体和对象结构
- 实体结构:LINE、CIRCLE、TEXT等常用实体的字段
- 非图形对象:LAYER、BLOCK_HEADER、DICTIONARY等
- 内存管理:分配、释放和引用计数
- 句柄系统:句柄类型和操作函数
- 错误处理:错误码和处理函数
- 类型枚举:对象类型和版本枚举
掌握这些数据结构是使用LibreDWG进行开发的基础。
下一章预告:第05章 - 命令行工具详解 - 详细介绍LibreDWG提供的各种命令行工具及其使用方法。

浙公网安备 33010602011771号