计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
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 快照 · 自动分类 · 以原作者文档为准
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:
项目地址: https://github.com/LibreDWG/libredwg
官网: https://www.gnu.org/software/libredwg/
手册: https://www.gnu.org/software/libredwg/
许可证: GPL-3.0+
LibreDWG 解决 DWG 二进制格式的开源读写:
dwgread、dwgwrite、dwg2dxf、dxf2dwg、dwg2SVG、dwgrewriteLibreDWG 模块,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)。
#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_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。
# 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)
dwgread -O GeoJSON input.dwg -o out.geojson
适合将 DWG 中的多段线/多边形转入 PostGIS / QGIS。
--no-check、-O DXFB(二进制 DXF)减小体积dwg_get_BLOCKS_HEADER 等高层 API,避免遍历所有 objectsdwg.header.versiondwg_errstrings 与 dwg_set_loglevel 排查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 引用 |
dwg2dxf/dwgread),数据提取用 JSON/GeoJSON 输出,复杂处理用 C API 或 Python 绑定。写入功能仍在完善,写 DWG 前考虑先写 DXF 再转换。$DWGCODEPAGE 决定(简体中文常见 ANSI/CP936),输出 JSON 为 UTF-8;③ 写入需编译时启用 --enable-write;④ 大文件用 --no-check 加速读取。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)。dwg2dxf -y input.dwg 将 DWG 转为 DXF ASCII 格式dwgread -O JSON input.dwg -o out.json 提取结构化数据dwgread -O GeoJSON input.dwg -o out.geojson 直接生成 GeoJSON<dwg.h> 和 <dwg_api.h>,链接 libredwgdwg_read_file("input.dwg", &dwg) 读取文件dwg_get_first_object(&dwg, DWG_TYPE_BLOCK_HEADER) 获取模型空间dwg_block_header_get_entities() 获取实体引用列表fixedtype 分派处理(DWG_TYPE_LINE / CIRCLE / TEXT 等)dwg_free(&dwg) 释放内存