界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
效率与协作 · SKILL.md

libredwg

libredwg

【效率与协作】Use when reading or writing AutoCAD DWG files programmatically in C — DWG version conversion, entity extraction, DWG to DXF. LibreDWG: free C library for reading/writing AutoCAD DWG format.

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

技能说明

GitHub

name: libredwg description: "Use when reading or writing AutoCAD DWG files programmatically in C — DWG version conversion, entity extraction, DWG to DXF. LibreDWG: free C library for reading/writing AutoCAD DWG format." tags:

  • dwg
  • dxf
  • cad
  • c
  • python
  • conversion

项目地址: https://github.com/LibreDWG/libredwg

官网: https://www.gnu.org/software/libredwg/

手册: https://www.gnu.org/software/libredwg/

许可证: GPL-3.0+

概述

LibreDWG 解决 DWG 二进制格式的开源读写:

  • 读取版本:DWG R1.4 – R2018+(R13、R14、R2000、R2004、R2007、R2010、R2013、R2018)
  • 写入版本:稳定支持 R1.4 – R2004(R2007+ 写入仍试验性)
  • 读写:DWG ↔ DXF(ASCII/Binary),并能转 JSON/XML/SVG
  • 命令行工具:dwgread、dwgwrite、dwg2dxf、dxf2dwg、dwg2SVG、dwgrewrite
  • 绑定:C API、Python(LibreDWG 模块,SWIG 生成)、Common Lisp、Perl

与 ODA / Teigha 的差异:LibreDWG 完全开源(GPL),但版本兼容范围比商业库窄、高版本写入支持仍在完善。截至2026年6月最新稳定版为 0.14,详见 GitHub Releases。


安装

# Debian/Ubuntu
sudo apt install libredwg-dev libredwg0      # 库 + 头文件
sudo apt install libredwg-tools              # CLI

# Fedora
sudo dnf install libredwg-tools libredwg-devel

# macOS
brew install libredwg

# 源码
git clone https://github.com/LibreDWG/libredwg
./autogen.sh && ./configure --enable-write && make && sudo make install

命令行工具

# DWG → DXF(ASCII)
dwg2dxf -y input.dwg                       # → input.dxf
dwg2dxf -y -m -b input.dwg                 # binary DXF

# DXF → DWG
dxf2dwg -y input.dxf

# DWG → JSON / SVG / GeoJSON / YAML
dwgread -O JSON  -o out.json input.dwg
dwgread -O GeoJSON -o out.geojson input.dwg
dwg2SVG          input.dwg > out.svg

# 列出实体统计
dwgread input.dwg | head -50

# 重写(修复/版本转换,--as rNNNN 指定目标版本)
dwgrewrite --as r2018 input.dwg out.dwg    # 转换为 R2018

常用 -y 强制覆盖,-O 选输出格式,-v 为 verbose 级别(版本转换用 --as rNNNN)。


C API 入门

#include <dwg.h>
#include <dwg_api.h>

int main(void) {
    Dwg_Data dwg = { 0 };
    if (dwg_read_file("input.dwg", &dwg) != 0) return 1;

    // 遍历模型空间实体
    BITCODE_BL n; Dwg_Object_Ref **mspace_refs = NULL;
    Dwg_Object *mspace = dwg_get_first_object(&dwg, DWG_TYPE_BLOCK_HEADER);
    Dwg_Object_BLOCK_HEADER *blk = mspace ? mspace->tio.object->tio.BLOCK_HEADER : NULL;

    if (blk) {
        Dwg_Object_Ref **ents = dwg_block_header_get_entities(blk, &error, &n);
        for (BITCODE_BL i = 0; i < n; ++i) {
            Dwg_Object *o = dwg_ref_object(&dwg, ents[i]);
            if (!o) continue;
            switch (o->fixedtype) {
              case DWG_TYPE_LINE: {
                Dwg_Entity_LINE *l = o->tio.entity->tio.LINE;
                printf("LINE (%g,%g)-(%g,%g)\n",
                       l->start.x, l->start.y, l->end.x, l->end.y);
                break;
              }
              case DWG_TYPE_CIRCLE: {
                Dwg_Entity_CIRCLE *c = o->tio.entity->tio.CIRCLE;
                printf("CIRCLE (%g,%g) r=%g\n", c->center.x, c->center.y, c->radius);
                break;
              }
            }
        }
    }
    dwg_free(&dwg);
}

编译:

gcc demo.c -o demo $(pkg-config --cflags --libs libredwg)

写入新 DWG

Dwg_Data dwg = { 0 };
dwg.header.version = R_2018;
dwg.opts = DWG_OPTS_LOGLEVEL_INFO;

// 通过 dwg_add_* 系列工厂函数
Dwg_Object_BLOCK_HEADER *mspace = dwg_add_*();
dwg_add_LINE(mspace, &(Dwg_Object_3DPOINT){0}, &(Dwg_Object_3DPOINT){10,0,0});
dwg_add_CIRCLE(mspace, &(Dwg_Object_3DPOINT){5,0,0}, 2.0);

dwg_write_file("out.dwg", &dwg);
dwg_free(&dwg);

写入 API 仍在演化,建议参考 programs/ 下示例与最新 API。


Python 绑定

# Debian/Ubuntu(官方打包的 SWIG 绑定;PyPI 上没有 LibreDWG-python 包)
sudo apt install python3-libredwg

# 源码构建:configure 默认探测 SWIG,可用 --enable-python / --disable-python 控制
./autogen.sh && ./configure --enable-python && make
import LibreDWG as dwg
data = dwg.dwg_read_file("input.dwg")
for e in data.modelspace.entities:
    print(type(e).__name__, getattr(e, 'layer', ''))

或使用 subprocess 调用 CLI 进行批处理:

import subprocess, json
out = subprocess.check_output(["dwgread", "-O", "JSON", "input.dwg"])
data = json.loads(out)

转换为 GeoJSON(GIS 用途)

dwgread -O GeoJSON input.dwg -o out.geojson

适合将 DWG 中的多段线/多边形转入 PostGIS / QGIS。


性能与精度

  1. 大文件用 --no-check、-O DXFB(二进制 DXF)减小体积
  2. 读取后通过 dwg_get_BLOCKS_HEADER 等高层 API,避免遍历所有 objects
  3. 写入时显式设置 dwg.header.version
  4. 检查 dwg_errstrings 与 dwg_set_loglevel 排查
  5. 浮点比较使用 Dwg_Bitcode_2RD 字段直接对比

常见问题

问题解决
高版本 DWG 无法读等待 LibreDWG 支持,或先用 ODA File Converter 转为 R2010
写入失真启用 --enable-write 编译;优先使用 DXF 出口
中文文字乱码编码由 DWG 头 $DWGCODEPAGE 决定(简体中文常见 ANSI_936);优先用 dwgread -O JSON 输出 UTF-8,或对 DXF 输出用 iconv 转码
引用块缺失解析 INSERT 时跟随 BLOCK_HEADER 引用

AI 使用建议

  • 推荐工作流模式:AI 助手应根据场景选择 LibreDWG 的使用层级——简单转换用 CLI(dwg2dxf/dwgread),数据提取用 JSON/GeoJSON 输出,复杂处理用 C API 或 Python 绑定。写入功能仍在完善,写 DWG 前考虑先写 DXF 再转换。
  • 关键注意事项:① 高版本 DWG(R2021+)不被支持,先用 ODA File Converter 转为 R2010/R2018;② 中文文字编码由 DWG 头 $DWGCODEPAGE 决定(简体中文常见 ANSI/CP936),输出 JSON 为 UTF-8;③ 写入需编译时启用 --enable-write;④ 大文件用 --no-check 加速读取。
  • 常用代码模式:CLI 转换:dwg2dxf -y input.dwg / dwgread -O JSON input.dwg -o out.json / dwg2SVG input.dwg > out.svg。C API:dwg_read_file("input.dwg", &dwg) → dwg_get_first_object(&dwg, DWG_TYPE_BLOCK_HEADER) → 遍历实体 → dwg_free(&dwg)。

典型工作流

工作流一:DWG 数据提取与格式转换

  1. dwg2dxf -y input.dwg 将 DWG 转为 DXF ASCII 格式
  2. dwgread -O JSON input.dwg -o out.json 提取结构化数据
  3. 解析 JSON,遍历模型空间实体(LINE/CIRCLE/INSERT/TEXT 等)
  4. 将提取的几何数据转入下游系统(GIS/数据库/可视化)
  5. 对于 GIS 用途:dwgread -O GeoJSON input.dwg -o out.geojson 直接生成 GeoJSON

工作流二:以 C 程序读写 DWG 文件

  1. 引入 <dwg.h> 和 <dwg_api.h>,链接 libredwg
  2. dwg_read_file("input.dwg", &dwg) 读取文件
  3. 通过 dwg_get_first_object(&dwg, DWG_TYPE_BLOCK_HEADER) 获取模型空间
  4. 使用 dwg_block_header_get_entities() 获取实体引用列表
  5. 遍历实体,按 fixedtype 分派处理(DWG_TYPE_LINE / CIRCLE / TEXT 等)
  6. dwg_free(&dwg) 释放内存

相关技能


参考资源

我的收藏