首页/新闻资讯/正文详情

Teigha4 .NET读写DWG:不装AutoCAD也能解析图纸

发布时间:2026/9/25 23:06:34 来源:云帆数科 栏目:资讯中心
Teigha4 .NET读写DWG:不装AutoCAD也能解析图纸
简介Teigha原名OpenDwg/DWGdirect是脱离AutoCAD环境读写DWG文件的经典开发库本资源面向.NET平台二次开发人员以VB.net和C#双语言源码演示了不启动AutoCAD即可提取图形数据的实现思路。压缩包共165个文件、约61.5MB涵盖62个dll运行库、6个vb与6个cs工程源码、6个exe示例程序以及config、xml配置与帮助文档结构上兼顾直接运行和二次改造需求。由于Teigha相关中文资料稀缺作者整理的这套附件对初学者和需要快速上手的工程师都很有参考价值。目前已有3822人浏览学习适合具备一定.NET基础、希望绕过AutoCAD界面进行批量图形解析的开发人员下载研究。1. Teigha4 才是读写 DWG 的正道不装 AutoCAD 也能解析图纸做 CAD 二次开发的同行应该都有过这种憋屈时刻项目现场没装 AutoCAD或者装着天正、LibreCAD 顶一顶结果程序一调 COM 接口直接罢工图纸解析只能干瞪眼。这套 Teigha4 读写 Dwg 方案含 DWGdirect_NET_3_02、Teigha_Net_40010 及帮助文档附 vb.net 和 C# 原码解决的正是这个核心诉求——在不依赖 AutoCAD 进程的前提下用纯 .NET 托管代码直接读写 DWG 二进制文件。对需要做图纸批量解析、属性提取、格式转换的 C# 或 vb.net 工程师来说它相当于把 DWG 文件从黑匣子变成可编程的对象模型。下面把原理讲透、步骤铺开、坑也一并摆出来。2. 认识 Teigha4 体系DWGdirect 与 Teigha_Net 的分工2.1 DWG 二进制格式与 Teigha 的定位DWG 是 Autodesk 的私有二进制格式官方只开放了基于 COM 的 ActiveX 接口这套接口要求在运行环境里安装 AutoCAD 或至少注册其类型库。Teigha 的定位完全不同——它是 Open Design AllianceODA维护的一套跨平台开发库直接读取 DWG 的内核数据结构把文件里的实体、图层、块表、标注样式、扩展数据等都映射成一套与 AutoCAD 对象模型高度相近的类。从使用层面理解Teigha_Net_40010 是 Teigha 4.0.10 对应的 .NET 托管封装DWGdirect_NET_3_02 则是早期 DWGdirect 体系的 .NET 组件版本。两者在功能上重叠度高但版本年代不同带来的 API 命名空间和调用方式也有细微差别。资源包把这两个版本都放进去还配了帮助文档和双语言示例目的就是让人在迁移老项目时能对得上旧代码新项目则可以直接用新封装。2.2 版本对应逻辑先搞清楚你拿的是哪套 API安装或引用之前先厘清一个容易翻车的点Teigha_Net_40010 和 DWGdirect_NET_3_02 不是随便二选一就能编译过的等价物。Teigha 4.0.10 的托管程序集通常以TD_Mgd.dll为核心命名空间以Teigha开头DWGdirect_NET_3_02 的年代更早命名空间多带ODA或DWGdirect前缀两者在Database、HostAppServices这些核心类上存在差异。实际使用中我一般建议以 Teigha_Net_40010 为主理由有三第一是它对较新的 DWG 版本如 2010、2013、2018 格式支持更完整第二是它的帮助文档结构更清晰搜一个类名能直接跳到属性说明第三是它的托管层对非托管资源的封装更规范Dispose 模型比老版本严谨。DWGdirect_NET_3_02 则适合手上已有老代码、只需要在原基础上打补丁的场景。2.3 为什么不用 AutoCAD COM 而选 Teigha这里要用一个具体的生产场景来说明选型理由。假设你要给公司做一个批量图纸属性提取工具每天要扫几百个 DWG把图框里的项目名称、图号、版本日期导成清单。用 AutoCAD COM 做每处理一张图就要启动一个 acad 进程内存轻松飙到 1.5GB 以上还得处理许可证并发限制运维同事看到就头大。Teigha 是纯文件级读写不拉起任何 GUI 进程内存占用通常只有 AutoCAD 方案的五分之一左右。更关键的是COM 方案在服务器环境Windows Server 无桌面会话下经常弹交互框或注册失败Teigha 只要把原生依赖放对目录静默跑批完全没问题。从这个角度看它不只是一个 SDK更是一条能让 CAD 周边工具跑进自动化流水线的路子。3. 从引用到跑通vb.net 与 C# 双语言示例3.1 环境准备与程序集引用先把工程建起来。无论用 C# 还是 vb.net都需要在项目中添加对 Teigha 核心托管 DLL 的引用。以 Teigha_Net_40010 为例引用清单如下用表格说明比较直观程序集用途是否必须TD_Mgd.dll核心托管封装定义了 Database、Transaction、Entity 等类型是TD_Mgd.DatabaseServices.dll数据库与文件读写服务是TD_Mgd.Geometry.dll几何计算点、向量、矩阵等通常需要TD_Mgd.HostAppServices.dll主机应用入口初始化必须是引用添加后还要把 Teigha 原生非托管 DLL即TD_All.x.dll这类动态库复制到编译输出目录。很多人的程序一运行就报BadImageFormatException或DllNotFoundException八成是这一步没做干净。原生 DLL 必须和 exe 在同一目录且位数要和编译目标一致。3.2 C# 读取 DWG遍历实体并提取坐标信息下面这段 C# 示例演示了最基础也最有用的操作——打开 DWG、开启事务、遍历模型空间里的直线实体并输出坐标。注意代码里每一步的注释using Teigha.DatabaseServices; using Teigha.Runtime; using Teigha.Geometry; class DwgReader { public static void ReadDwg(string filePath) { // 初始化 host 服务Teigha 要求在任何操作前先完成这一步 using (HostAppServices host new HostAppServices()) { using (Database db new Database(false, true)) { // 第二个参数 true 表示以只读方式打开文件 db.ReadDwgFile(filePath, System.IO.FileShare.ReadWrite, true, ); using (Transaction tr db.TransactionManager.StartTransaction()) { // 获取模型空间块表记录 BlockTable bt (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead); int lineCount 0; foreach (ObjectId id in btr) { DBObject obj tr.GetObject(id, OpenMode.ForRead); if (obj is Line line) { lineCount; // 输出直线起点和终点的三维坐标 Console.WriteLine($Line {lineCount}: Start({line.StartPoint.X:F3}, {line.StartPoint.Y:F3}, {line.StartPoint.Z:F3}) $End({line.EndPoint.X:F3}, {line.EndPoint.Y:F3}, {line.EndPoint.Z:F3})); } } tr.Commit(); } } } } }这段代码的逻辑分四层先创建HostAppServices实例完成 Teigha 运行环境初始化再以只读方式加载 DWG 为内存中的Database对象随后开事务锁定模型空间块表记录最后在事务里遍历所有实体并按类型过滤出直线对象。参数说明上ReadDwgFile的第三个参数留空字符串表示不传密码第二个参数FileShare.ReadWrite很关键它允许 DWG 被其他进程同时打开这在图纸被设计人员占用时能避免文件锁冲突。Line.StartPoint返回的是Point3d结构F3格式化是为了控制输出精度实际项目中建议保留三位小数即可满足绝大多数坐标比对场景。3.3 vb.net 写入 DWG新建文件并保存为 DXF很多项目只需要读但总有几个场景需要写——比如把处理结果另存为新图纸或者生成简化版 DXF 交付下游系统。这段 vb.net 代码演示了从零建库、创建圆实体、落盘的全流程Imports Teigha.DatabaseServices Imports Teigha.Runtime Imports Teigha.Geometry Public Sub CreateCircleDwg(savePath As String) Using host As New HostAppServices() Using db As New Database(True, True) Using tr As Transaction db.TransactionManager.StartTransaction() Dim bt As BlockTable DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForWrite), BlockTable) Dim btr As BlockTableRecord DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord) 创建一个圆心在原点、半径为 50 的圆 Using circ As New Circle() circ.Center New Point3d(0, 0, 0) circ.Radius 50 btr.AppendEntity(circ) tr.AddNewlyCreatedDBObject(circ, True) End Using tr.Commit() End Using 写入文件true 表示保存为 DXF 格式 db.SaveAs(savePath, DwgVersion.Current, True) End Using End Using End Sub与 C# 版本不同的关键点在New Database(True, True)的第一个参数——它表示创建全新数据库而不是打开已有文件。btr.AppendEntity之后必须调用tr.AddNewlyCreatedDBObject这是 Teigha 事务模型的硬性要求漏掉这一句会导致实体只在内存中、不落盘。SaveAs的最后一个参数True对应 DXF 输出传False则是二进制 DWG按业务需求切换即可。两段示例跑通后你基本就掌握了 Teigha 的两条主干流程打开已有文件做读取分析创建新文件做写入输出。4. Teigha4 常见问题排查五个必踩的坑4.1 初始化失败Runtime 目录与原生依赖现象程序一启动就抛异常提示找不到TD_All系列原生库或者报HostAppServices初始化失败。原因绝大多数情况下是原生非托管 DLL 没有复制到 exe 输出目录。Teigha 的托管层只是壳所有真实读写动作都靠原生库完成。另一个常见原因是编译目标平台不对——工程是 AnyCPU但原生库只有 x64 版本运行时会莫名崩溃。解决把资源包里的原生 DLL 直接复制到bin\Debug或bin\Release目录工程属性里把平台目标固定为 x64现代环境基本都是 64 位。如果条件允许用Debug.WriteLine打印Environment.CurrentDirectory确认运行时目录能少走很多弯路。4.2 版本不匹配DWG 版本与 Teigha 支持范围现象打开某些 DWG 时抛出eNotImplementedYet或直接不识别文件头。原因不同年代的 AutoCAD 保存的 DWG 格式版本不同比如 AC1027 对应 2013 格式Teigha 4.0.10 对 2018 之后的格式支持不完整老版本 SDK 打开新文件必然翻车。解决先用资源包里的文档查清 Teigha_Net_40010 支持的 DWG 版本上限对高版本文件先让用户在 AutoCAD 里另存为兼容格式。如果是批处理工具写一个前置格式嗅探逻辑读取文件头判断版本见下文第 5 章的验证部分。4.3 中文路径与文件锁现象文件路径含中文或空格时读取抛eInvalidFileName文件被 AutoCAD 打开时报文件占用错误。原因Teigha 底层对路径的编码处理在不同版本上有差异文件锁则是 Windows 文件共享机制的锅。解决路径统一用Path.GetFullPath规范后再传入ReadDwgFile的FileShare参数务必传ReadWrite并在异常捕获里把IOException单独处理提示用户关闭图纸再试。4.4 Dispose 泄漏与内存上涨现象批处理几百个文件后内存占用稳步上涨GC 无法回收。原因事务对象、实体对象、Database对象之间引用关系复杂只靠Dispose而不按顺序释放会产生循环引用非托管句柄得不到及时清理。解决每个文件处理完严格执行tr.Commit()后立即tr.Dispose()Database对象用using包裹处理的文件多时主动调用GC.Collect()并WaitForPendingFinalizers()。血泪经验是Teigha 不像 .NET 自带类型那么省心对象生命周期必须当成非托管资源来管。4.5 64 位 / 32 位混用崩溃现象在 64 位系统上用 32 位模式编译读大文件时AccessViolationException。原因Teigha 原生库内部指针按 8 字节宽度编译强制用 32 位模式加载会踩内存边界。解决整个解决方案统一使用 x64 平台包括所有依赖项目。检查每个被引用的类库项目不要只改启动项目。5. 验证与进阶把读取的实体数据做成导出工具掌握了读和写下一步是把这个能力变成可交付的工具。最常见的需求是按住址提取图纸内所有线段端点坐标导出成 CSV 给其他系统用。这里给一个进阶版思路不直接输出到控制台而是组装成结构化数据流。核心技巧是把Line.StartPoint这类几何数据转成字符串行时先统一格式化再写入StringBuilder最后一次性落盘。为什么强调一次性因为逐行File.AppendAllText在几百个文件时会因为频繁打开关闭文件句柄而慢得离谱。批量处理的框架也很固定遍历目录拿文件列表逐个调用ReadDwg并返回对象集合再统一写 CSV。验证写得好不好有一个简单的判断方法用资源包里的 DWG 文件跑一遍导出工具把 CSV 数据导入 Excel 或 GIS 工具用画线功能重建图形与原图叠对比对。如果端点坐标完全重合说明读取精度没问题偏差超过 0.001 就检查是不是单位设置问题——有些图纸是以毫米为单位有些以英寸为单位Teigha 返回的向量值不换算就直接用会有系统性偏差。另外补充一个自查技巧写一个一次性脚本对同一个文件连续读取两次比对结果是否一致再拿不同版本的 DWG 各跑一遍观察是否有异常实体类型抛出。Teigha 对某些代理实体如天正自定义对象默认情况下只返回外壳或跳过这类情况要在代码里单独记录并跳过避免整个流程中断。从那以后我每次用 Teigha 做批量工具都会强制走一遍「文件头版本嗅探 → 试读 → 实体分类统计 → 异常隔离」这四步验证流程大部分线上问题都能在开发期就暴出来。希望这篇笔记能帮你在 T eig ha4 的读写路上少踩几个坑。本文还有配套的精品资源点击获取

相关推荐

统信UOS内网离线安装Flash插件全流程与避坑指南
统信UOS内网离线安装Flash插件全流程与避坑指南

简介:针对统信UOS内置浏览器无法加载Flash插件、且内网环境阻碍在线安装的问题,这份资源打包了一套离线安装与排错方案,主要面向政企运维人员、UOS普通用户及系统管理员,帮助恢复旧式Flash网页内容的正常显示。资源包共6个文件&am… · 2026/9/25 23:06:34

阳光板厂推荐 银川君瑞祥新材料科技质量参考评选
阳光板厂推荐 银川君瑞祥新材料科技质量参考评选

在工业厂房搭建、农业温室建设、体育场馆改造以及化工车间升级的各类工程项目中,采光板材的选择,从来都是影响项目整体质量、后期运维成本与使用安全的核心环节。面对西北区域强紫外线、大温差、多风沙的特殊气候,不少项目都曾踩过通用款采光… · 2026/9/25 23:06:27

基于PHP的H5转APP在线封装打包平台实现与避坑指南
基于PHP的H5转APP在线封装打包平台实现与避坑指南

简介:面向需要把H5手机网站快速封装成安卓和苹果安装包的开发者,这套PHP源码以在线打包方式提供免签绿色封装方案,支持Android与iOS平台。可自行上传安卓证书和启动图,并针对iOS 14全屏兼容问题做了专门修复;同时去除多… · 2026/9/25 23:06:21

传统机器学习图像分类实战:小样本、低算力、高可解释性方案
传统机器学习图像分类实战:小样本、低算力、高可解释性方案

简介:本资源是一套面向机器学习初学者与图像处理开发者的实践型工具包,聚焦SVM与贝叶斯算法在图像分类任务中的工程实现,解决传统方法中特征提取、模型训练与效果对比等关键环节的落地难题。压缩包共216个文件,含102幅BMP格式样本… · 2026/9/25 23:37:45

从0到1掌握DeerFlow:字节跳动开源AI Agent框架,用TaoToken统一Key打通企业级智能体平台!
从0到1掌握DeerFlow:字节跳动开源AI Agent框架,用TaoToken统一Key打通企业级智能体平台!

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 23:37:26

Cygwin下编译运行Varnish Cache实战指南
Cygwin下编译运行Varnish Cache实战指南

简介:本资源是专为Windows开发者与系统管理员定制的Cygwin平台Varnish Cache适配方案,解决Varnish在原生Windows环境无法直接运行的核心兼容性问题。项目通过针对性修补源码(含文件路径、网络I/O、线程及信号处理等关键模块)&… · 2026/9/25 23:37:19

MinIO Java分片上传实战:断点续传与高并发优化
MinIO Java分片上传实战:断点续传与高并发优化

简介:本资源是一套面向Java后端开发者与云存储集成工程师的MinIO高性能文件上传实战示例,聚焦分片上传与断点续传两大核心场景,解决大文件稳定上传、网络中断恢复及服务端资源优化等实际问题。压缩包共13个文件,含7个Java类&#… · 2026/9/25 23:37:19

Netdiscover实战:用ARP扫描快速摸清局域网设备
Netdiscover实战:用ARP扫描快速摸清局域网设备

简介:Netdiscover是一款开源的ARP网络扫描工具,主要面向网络管理员与安全测试人员,用于在无线网络或缺乏DHCP的环境中快速发现活跃设备、获取IP与MAC地址并推测网络拓扑。这份源码包为netdiscover-0.3-pre-beta7,共包含39个文件&a… · 2026/9/25 23:37:13

OpenCV实时人眼识别与眨眼检测实战:基于68点关键点的鲁棒方案
OpenCV实时人眼识别与眨眼检测实战:基于68点关键点的鲁棒方案

简介:本资源是一套基于Python与OpenCV实现的实时人眼识别、眨眼及闭眼检测的完整实践方案,面向计算机视觉初学者、AI课程设计者及嵌入式视觉应用开发者,解决人脸关键区域动态行为分析的实际需求。压缩包共61个文件,含37个核心Pyth… · 2026/9/25 23:37:06

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码