C# 操作CAD文件 C#如何读取DWG或DXF文件的基本信息

来源:这里教程网 时间:2026-02-21 17:42:49 作者:

netDxf
读取 DXF 文件元信息最轻量

DXF 是文本可读格式,

netDxf
开源库能直接解析图层、实体数、单位、创建时间等基本信息,不依赖 AutoCAD 安装。它适合做批量检查、预处理或轻量 CAD 数据提取。

常见错误现象:

NullReferenceException
在调用
DxfDocument.Load
后立刻访问
document.Header
—— 实际上部分头变量(如
$INSUNITS
)可能未定义,需先判断
document.Header.ContainsKey("$INSUNITS")

使用场景:自动化校验设计院交付的 DXF 是否含标准图层、是否设置毫米单位
DxfDocument.Load
默认启用严格模式,遇到非标准扩展实体会抛
DxfException
;加
new DxfReaderOptions { IgnoreUnknownRecords = true }
更鲁棒
性能影响:小文件(DxfDocument.LoadAsync 避免 UI 线程阻塞

读 DWG 必须走 Autodesk RealDWG 或 Teigha(无免费纯托管方案)

C# 原生无法解析 DWG,因为它是二进制加密格式,Autodesk 不开放规范。所谓“免费读 DWG”方案基本是包装了 RealDWG 的 COM 组件(需安装 AutoCAD 或单独部署 RealDWG 运行时),或调用 Open Design Alliance 的 Teigha SDK(商业授权)。

容易踩的坑:

AcDbDatabase.ReadDwgFile
eNotImplemented
错误——不是代码写错,而是当前 RealDWG 版本不支持该 DWG 的保存版本(比如用 2024 RealDWG 读 2025 新增功能保存的 DWG)。

必须匹配 DWG 版本:RealDWG 2023 支持最高到 ACAD2023(即
AC1032
),不支持
AC1033
部署时缺
acdb19.dll
accoreconsole.exe
会导致
DllNotFoundException
,不能只拷 bin 目录,要按官方文档部署整个运行时目录
Linux/macOS 下完全不可行;.NET Core/.NET 6+ 项目需用 x64 构建并禁用“首选 32 位”

Document.Database.Header
里哪些字段真正可靠

不是所有头变量都默认存在,尤其从第三方软件导出的 DXF/DWG。硬取

$LUNITS
$MEASUREMENT
很容易崩,得按实际有无来适配。

实操建议:优先查这四个字段,它们在绝大多数人工绘制文件中稳定存在:

$ACADVER
:DWG/DXF 版本标识(如
AC1027
对应 AutoCAD 2013)
$INSUNITS
:插入单位(值为 4=mm,6=m,10=inch),但需 fallback 到
$MEASUREMENT
(0=英制,1=公制)
$EXTMIN
$EXTMAX
:模型空间范围,类型是
Point3d
,可算图纸大致尺寸
$DWGCODEPAGE
:编码页,决定中文图层名/文字能否正确解码(
ANSI_1252
ANSI_932

中文路径或图层名乱码的根源和临时解法

根本原因是 DXF 默认用系统本地编码(如 Windows-1252),而 .NET

StreamReader
默认用 UTF-8。RealDWG 自动处理,但
netDxf
需手动指定编码。

错误现象:

document.Layers.FirstOrDefault(l => l.Name == "标注")
返回 null,但打印所有图层名看到的是 “标注”。

DXF 加载时传入
Encoding.GetEncoding(936)
(GBK)或
Encoding.GetEncoding(932)
(Shift-JIS)
RealDWG 中文图层名一般没问题,但若
AcDbLayerTableRecord.Name
显示方块,检查
AcDbDatabase.Textstyle
是否缺失仿宋字体定义
不推荐全局改系统区域设置,临时解法是在启动 RealDWG 前调用
SetThreadUILanguage(0x0804)
(中文简体)

DWG 的版本兼容性和部署约束比想象中更硬,很多“读取成功”的假象来自测试文件恰好匹配了 SDK 版本。真正上线前,务必用客户实际交付的最小/最大/最旧版本 DWG 各跑一遍。

相关推荐