我们开源了 go-cad,一个纯 Go 实现的 DWG/DXF 解析、渲染与写出库。
GitHub:github.com/unitedrhino…
它能把 CAD 图纸转成 PNG/SVG,识别图框并逐幅拆图,提取中文说明、标题栏和设备标注,也能将文档模型写回 DWG。零 cgo,无需安装 AutoCAD,可直接嵌入 Go 服务。
联犀 CLI 和联犀的文档解析库 docling 也已经接入:在 WorkBuddy 中,可以通过一句指令让 AI 调用 CLI 分析图纸;做知识库,可以用 docling 把 CAD 与 PDF、Word 放进同一条解析流程。
| 能力 | 当前支持 |
|---|---|
| DWG 读取 | R9/R10/R11、R13~R2018 容器 |
| DWG 写出 | R2000~R2018 六代容器 |
| 格式转换 | DXF 读写、LibreDWG 风格 JSON 导入 |
| 图纸预览 | PNG、SVG,中文与尺寸标注 |
| 自动拆图 | 图框识别、图号图名提取、逐幅出图 |
| 文本提取 | 文字、坐标、图层、图框归属 |
| 集成方式 | Go 模块 / 联犀 CLI / docling |
中文工程图,直接出图
这张 V 型滤池工艺图来自公开语料。平面、剖面、彩色工艺管线和右侧材料设备表,都是 go-cad 的渲染输出。
V 型滤池工艺图:平面、剖面与材料设备表。
材料设备表局部:名称、规格与数量。
消毒接触池图也能保留平面、两处剖面和材料一览表。图中的管径标注与右侧材料表可以对照。
消毒接触池:平面、剖面与材料一览表。
机械图对细节更敏感。下面这张内侧行走轮轴图,可以看到尺寸线、箭头、公差、直径符号,以及下方的技术要求。
内侧行走轮轴:尺寸标注、粗糙度符号和技术要求。
技术要求可以单独放大查看,中文说明与数值一起保留。
技术要求局部:45#钢、55HRC、公差标准与每套用量。
中文出图需要把解码和渲染都做好。go-cad 处理 GBK/UTF-16 码页、字符转义与 CAD 特殊文本码,%%C、%%d、%%p 分别显示为 φ、°、±;渲染端处理文字的旋转、镜像、对齐与宽度因子。
PNG 可指定输出宽度,SVG 适合放大查看。分幅 PNG 会检查文字的像素字高,必要时提高分辨率重渲;中文渲染需要运行环境提供中文字体,也可通过 FontPath 指定。
一张 DWG,拆成多张图
施工图常把多个楼层、专业或单体平铺在同一个模型空间。go-cad 会识别图框,从标题栏提取图号、图名,再逐幅出图。
下面用四图幅 DXF 演示。全览保留图纸排列,单幅图便于查看内容。
输入:四张图幅在模型空间中的排列。
输出之一:单幅给水系统图,保留图框、图形和标题栏。
四图幅 DXF 合成示例,展示全览与单幅出图。
有真实图框时,批量出图首项为整图全览,后续为各张图幅;无图框时有整图兜底,设计说明、图例表等内容区也有相应切分路径。
// doc 为已解析的图纸文档。
images, err := cad.RenderAllSheets(
doc, cad.RenderOptions{}, "png")
if err != nil { panic(err) }
texts := cad.SheetTexts(doc)
SheetTexts 把文字与图框放在一起,保留文本、坐标、字高、图层和归属编号,并展开块引用中的文字。这样,“某层弱电平面图”对应的图片和说明就可以一起保存、一起检索。
项目公开记录中,消防与弱电施工图分别识别出 9 张图框,标题栏中的图号、图名可自动提取。
WorkBuddy:一句话分析 CAD
联犀 CLI 从 v0.8.5 起支持 CAD 文档解析,联犀 Skills 可安装到 WorkBuddy / CodeBuddy。
首次安装(Linux / macOS),一行命令即可:
curl -fsSL https://doc.unitedrhino.com/cli/install.sh | bash
已有 CLI 的用户先执行 ur upgrade。随后将 Skills 安装到 WorkBuddy / CodeBuddy:
ur skills install --dir ~/.codebuddy/skills
ur skills status
默认目录下安装完成后,重启 WorkBuddy 会话,让它加载联犀 Skills。自定义配置目录使用对应的 Skills 路径。
把图纸放进 WorkBuddy 可访问的工作目录,指定文件后,就可以让 AI 调用联犀 CLI 读取并分析。例如:
用联犀 CLI 分析工作目录里的“施工图.dwg”。按图幅整理图号、图名和设计说明;提取设备材料、型号与数量,并注明来自哪张图。图纸里没有写明的信息单独列出。
上面是一条可复制的请求示例。
这条路径由 CLI 负责把 DWG/DXF 解析成 AI 能读取的内容,WorkBuddy 中的 AI 负责按要求整理、分析。材料表、施工说明和设备型号可以作为任务输入,无需先手工截图、复制文字。
开发人员也可以直接运行命令,先查看图纸结构,再输出正文:
ur doc parse 施工图.dwg --format outline
ur doc parse 施工图.dwg --format md --out 施工图.md
还支持 content-list 和 json 输出,适合进一步筛选文本、保留文档结构。
docling:把 CAD 放进知识库
联犀的纯 Go 文档解析库 unitedrhino/docling 从 v1.4.0 起集成 go-cad,支持 .dwg、.dxf、.dxfb 输入。
GitHub:github.com/unitedrhino…
在 Go 服务中,按文件扩展名调用统一入口:
// data 为已读入的图纸字节。
doc, err := docling.ParseByExt("施工图.dwg", data)
if err != nil { panic(err) }
md := doc.ToMarkdown()
文档按图纸组织:每个识别到的图框对应一页,包含图名标题、渲染图片和框内文本。图框外的文字保留在文档前部;整图全览不会重复占一页。
CAD 图纸可以与 PDF、Word 使用统一的 Markdown、JSON、content-list 输出,进入后续分块、索引和检索流程。 保存图名与来源后,检索到一段说明,可以回到对应图幅核对。
需要独立的机器清单,go-cad 还提供 caddocling:
# 在 go-cad 仓库中运行。
go run ./cmd/caddocling drawing.dwg -o out
它输出 manifest.json 与分幅图片,清单包含图框、文本和图片信息,方便接入自己的文档处理程序。
能读,也能写
cad.Parse 读取 DWG,cad.ParseDXF 读取 DXF,cad.ParseJSON 导入 LibreDWG 风格 JSON。
解析结果可提取文本、渲染图片,也可通过 cad.WriteDwg 写出 DWG。写出按文档版本分派到 R2000~R2018 六代容器,项目使用回读与 dwgread 交叉验证。DXF 和 JSON 导入构建的文档,也有结构化 DWG 写出路径。
对 Go 后端,go-cad 可以作为普通模块直接使用。解析、渲染和写出都在同一进程内完成,减少外部转换程序与 C 动态库的部署工作。项目采用 Apache-2.0 许可证,集成时保留相应许可与通知。
验证与性能
DWG 解码有些错误不容易从图片看出来。坐标或对象字段解错,程序仍可能正常出图。因此,go-cad 使用 LibreDWG 的 dwgread -O JSON 输出作参考,比较对象与实体的字段值。
项目公开测试记录如下:
| 验证项目 | 记录 |
|---|---|
| 值级对照 | 37 张语料,严格对照项 100% 对齐 |
| DWG 写出 | 六代容器回读与 dwgread 交叉验证 |
| DXF 转换 | dxf2dwg 参考验证 59/59 |
| 消费链路 | 147 张语料:解析、渲染、写出、再解析 |
| 健壮性 | 1000+ 变异输入测试,未出现 panic |
对照结果限定于所列语料和已纳入比较的字段;外部参考数据测试需要配置相应资源。
一份 4.3MB、108,850 个对象的图纸,项目记录的处理耗时为:
| 操作 | 耗时 |
|---|---|
| 解析 | 691ms |
| PNG 渲染,宽 2048 | 4.1s |
| DWG 回写 | 785ms |
这些是项目基准数据,实际耗时随硬件、图纸内容和输出分辨率变化。
Go 最小示例
安装模块:
go get github.com/unitedrhino/go-cad
下面是完整的 main.go,读取图纸、输出 PNG/SVG、统计文本,再写回 DWG:
// 演示 DWG 解析、图片渲染与 DWG 写出。
package main
import (
"bytes"
"fmt"
"os"
cad "github.com/unitedrhino/go-cad"
)
// check 遇到错误时终止示例,避免继续输出无效文件。
func check(err error) {
if err != nil { panic(err) }
}
// main 从 drawing.dwg 读取图纸,在当前目录输出文件。
func main() {
// data 为原始图纸字节,doc 为解析后的文档。
data, err := os.ReadFile("drawing.dwg")
check(err)
doc, err := cad.Parse(data)
check(err)
// opts 控制输出宽度,png 和 svg 为图片内容。
opts := cad.RenderOptions{Width: 2048}
png, err := cad.RenderPNG(doc, opts)
check(err)
check(os.WriteFile("drawing.png", png, 0644))
svg, err := cad.RenderSVG(doc, opts)
check(err)
check(os.WriteFile("drawing.svg", svg, 0644))
// buf 接收回写后的 DWG 字节。
var buf bytes.Buffer
check(cad.WriteDwg(doc, &buf))
check(os.WriteFile("roundtrip.dwg", buf.Bytes(), 0644))
fmt.Println("文本条数:", len(doc.Texts()))
}
把一份支持写出的 DWG 命名为 drawing.dwg,放在同目录运行即可。仓库也提供 example/,可直接演示解析、渲染、回写和再解析。
当前边界
- ACIS 三维实体的 SAT/SAB 几何重建不在当前范围内。
- 不支持 pre-R13 写出、R2.x~R8 早期格式。
- 部分长尾对象字段仍在完善;没有真实样本的分支使用合成数据验证。
- 文字提取针对 CAD 文本实体,画成线条或嵌入图片的文字需要另行处理。
- 高分辨率出图需要相应内存;docling 的文本包围框用于近似定位。
做图纸预览,可以直接用 go-cad;需要在 WorkBuddy 中分析图纸,用联犀 CLI;已有知识库解析流程,用 docling 接入。欢迎做工程资料、CAD 开发和知识库的同事拿自己的图纸试用,交流解析与出图问题。
欢迎关注我们的开源项目
联犀 things · Go 物联网开源模块
从设备接入、物模型到设备数据与 OTA,为你的智能应用打好基础。
觉得有用,欢迎点亮 Star!
也欢迎关注联犀,持续分享 AI+物联网的开发进展、开源实践与应用案例。