本篇文章已有1人收藏 | Loading收藏

1789354762 cad2image banner

各位旅行者好呀,我是屋主 GrayZ。今天要安利的,是我最近搓出来的一个 CAD 图纸渲染工具——cad2image

先老实交代一句:这玩意儿跟之前那几个难兄难弟一样,Star 数嘛……咳,懂得都懂(>人<;)。但它解决的痛点,是真真切切机械、建筑、电子这帮画图党每天都在受的折磨——用 Acme CAD Converter 把 DWG 转成 PNG 的时候,圆弧边缘总是拖着一圈细小的毛须、杂线,放大看简直逼死强迫症。

所以我就想:能不能把「图纸渲染」这条管线重做一遍,让圆弧就是圆弧、直线就是直线,干干净净?于是就有了 cad2image。

cad2image 是什么

一句话:cad2image 是一个把 DWG / DXF 图纸渲染成 PNG / SVG 的命令行工具,同时也是一个可以直接 import 的 Python 库

高保真 DWG/DXF → PNG/SVG 渲染管线:ODA File Converter + ezdxf,无 GDI 残余杂线,可替换 Acme CAD Converter
Python
0

它做的事,核心就一件:把 CAD 图纸变成能直接发微信、贴文档、塞进网页的图片或矢量图。围绕这件小事,它顺手解决了一堆 CAD 出图的顽疾:

能力 说明
高保真渲染 DWG/DXF → PNG(任意 DPI)或 SVG(矢量)
告别残余杂线 圆弧走真圆弧,无多边形折痕、无毛须
中文开箱即用 内置开源中文字体,自动替换 SimSun / 宋体等专有字体
完整打印样式 CTB 打印样式表、线宽控制、颜色 / 灰度 / 单色输出
批量处理 目录递归处理,逐条报告成功 / 失败,不因单个失败中断整批
双形态 命令行工具 + Python 库,两条路都能走

为什么要重造轮子:Acme 的「杂线」到底哪来的

这里想多唠两句技术,因为这是 cad2image 存在的理由。

很多画图党出图都用 Acme CAD Converter,方便是方便,但它渲出来的 PNG 有一个老毛病——圆弧的边缘经常拖着一圈细小的毛须、杂线,放大看特别脏。

我扒了扒它的底层:Acme 走的是 ODA Teigha 内核,DWG 被解析成「边矢量模型」后,会分别喂给三套后端。其中 SVG / PDF 这两套是走真圆弧的,输出是干净的;唯独 GDI 图元栅格化这套,会把曲线离散成一小段一小段的折线,于是圆弧就变成了多边形,边缘自然全是折痕和毛须。

换句话说,bug 不在图纸,也不在 CAD 软件,而在 GDI 栅格化那一步。找到了根子,解法就清晰了——把栅格化后端整个换掉。

于是 cad2image 用了一条更干净的管线:ODA File Converter(负责 DWG→DXF 这个「啃二进制」的脏活)+ ezdxf(纯 Python 读 DXF)+ PyMuPDF 后端渲染。圆弧走真圆弧,栅格化不再经过 GDI,杂线自然就没了。

安装

要求 Python 3.8+。安装就一句话:

# 从 PyPI 安装(推荐)
pip install cad2image
要把 DWG 转成 DXF,还需要另外装一个免费的 ODA File Converter官网下载)。如果你只渲染现成的 DXF,那就不用装。

ODA 装好后,工具会按这个优先级去找它:先看环境变量 ODA_FILE_CONVERTER_PATH,找不到就用默认路径 D:\ODA\ODAFileConverter_title 21.5.0\ODAFileConverter.exe;你也可以用 --oda-path 直接指定。

快速上手

装完就能用控制台命令 cad2image(也可以 python -m cad2image)。常用玩法都在下面:

CLI 命令速查(点开看) 展开 / 收起

参数挺多,但都直白。完整的参数表放下面,需要时对着查就行:

命令行参数完整表(点开看) 展开 / 收起

从 Acme CAD Converter 迁移

如果你之前一直用 Acme 的命令行出图,cad2image 已经把参数语义对齐好了,照着下面这张表改就行:

Acme 参数 cad2image 映射
/res N --dpi N
/w /h(mm) --width / --height
/e /ad(缩放扩展) --fit(包围盒自适应)
/b 背景色 --background
/lw 0/1/2 --lineweight + --lineweight-scaling
/p 1/2/3(1bit/灰度/256色) --color(灰度暂以 monochrome 近似)
/pw myset plotstyle.load_ctb(尚未实现,见已知限制)
/a 0/-1/-2(布局选择) --layout
/l 报告 批处理汇总 + 退出码

给开发者的 Python API

除了命令行,cad2image 也能当库用,提供三层能力:渲染(DXF→PNG/SVG)、转换(DWG→DXF)、批处理。只有 DWG→DXF 转换需要 ODA,纯 DXF 渲染不需要。

Python API 速查(点开看) 展开 / 收起

错误统一抛 FileNotFoundError / ValueError / RuntimeError,可以放心捕获。

必须清楚的边界

cad2image 不是 Acme 的「像素级克隆」,它是用一条更干净的管线重做的。下面这几条限制,动手前先看清楚,免得踩坑。
  • 灰度输出(Acme /p 2):暂以 monochrome 近似,真正的 256 级灰度要等像素级后处理。
  • 3D 消隐(Acme /hide):未实现,工具默认输入是 2D 工程图。
  • Xref 外部引用:转换前要把 xref 文件与主图放同一目录(与 Acme 行为一致)。
  • 页面单位:模型空间包围盒自适应时,默认绘图单位是 mm($INSUNITS 没做换算)。
  • SHX 中文大字体(bigfont):ezdxf 1.1.x 不支持,引用这类字体的图纸会被自动重写为 Noto Sans SC。

结语

写到这里,cad2image 的「干净出图」这一件事就讲完了。它不是什么黑科技,只是把 CAD 出图这条老管线里最脏的那一步(GDI 栅格化)换成了真圆弧的矢量路径,再把中文、打印样式、批量这些画图党天天要的东西顺手补齐。

工具是 MIT 开源的,代码全在 GitHub 上,PyPI 也能直接 pip install。如果你也喜欢这种「把命令行工具搓成顺手小玩意」的调调,我之前还写过 阿里云盘 WebDAV 管理器。欢迎各位旅行者去围观、提 issue,甚至……顺手点个 Star?(就是那个小星星,懂的都懂)ヾ(◍°∇°◍)ノ゙

P.S. 如果手头有「圆弧边缘带杂线」的坏图纸,可以拿它跑一遍试试,对比一下 Acme 和 cad2image 的输出差异,效果会更直观。愿大家的图纸都干干净净、没有毛须。