news 2026/3/14 10:21:43

直接编译运行C#解析DXF源码:可读取圆、直线、弧、多段线,无封装缩放拖拽,支持多种CAD版本...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
直接编译运行C#解析DXF源码:可读取圆、直线、弧、多段线,无封装缩放拖拽,支持多种CAD版本...

可直接编译运行 c#解析dxf可读取圆直线弧多段线源码-无封装缩放拖拽 可读取坐标信息 支持多种版本的CAD 可导出G代码

最近在折腾CAD文件解析,发现DXF这东西虽然结构复杂但还挺有意思的。用C#撸了个解析器,能读取圆、直线、弧、多段线这些基础图形,顺手还做了G代码导出功能。咱们直接从代码层面聊聊实现思路。

先看这段读取直线的基础代码:

var lines = File.ReadAllLines("sample.dxf"); for (int i = 0; i < lines.Length; i++) { if (lines[i] == "LINE") { var line = new DxfLine(); while (lines[++i] != "0") { var code = lines[i]; var value = lines[++i]; switch(code) { case "10": line.StartX = double.Parse(value); break; case "20": line.StartY = double.Parse(value); break; case "11": line.EndX = double.Parse(value); break; case "21": line.EndY = double.Parse(value); break; } } Console.WriteLine($"直线坐标:({line.StartX},{line.StartY}) -> ({line.EndX},{line.EndY})"); } }

这代码看着糙但实用,遍历DXF文本按组码抓数据。注意LINE实体的组码10/20是起点,11/21是终点。DXF的坐标对总是成对出现,处理时要记得X在前Y在后。

遇到多段线就刺激了。旧版用POLYLINE,新版用LWPOLYLINE,这俩结构差异不小。看这段处理逻辑:

if (entityType == "LWPOLYLINE") { var poly = new Polyline(); while ((code = lines[++i]) != "0") { value = lines[++i]; if (code == "90") // 顶点数 { int vertexCount = int.Parse(value); poly.Vertices = new List<Point>(vertexCount); } else if (code == "10") // X坐标 { x = double.Parse(value); flag = true; } else if (code == "20" && flag) // Y坐标 { poly.Vertices.Add(new Point(x, double.Parse(value))); flag = false; } } }

这里用了个flag标记来捕获坐标对,因为DXF的顶点坐标是交替出现的。处理旧版POLYLINE更麻烦,得在顶点段(VERTEX)里逐个抓点,最后还要等SEQEND结束符,代码能多写二十行。

说到版本兼容,关键在HEADER段找$ACADVER字段。不同版本组码有变化,比如圆弧的起始/终止角度在R12用50/51,新版可能用其他组码。咱们用个字典来映射:

var versionMappings = new Dictionary<string, Func<string, string>>() { {"AC1018", code => code == "1001" ? "start_angle" : null}, // 2004版 {"AC1021", code => code == "72" ? "start_angle" : null} // 2007版 };

导出G代码这块更有意思。把几何数据转成机床指令,注意坐标系的Y轴要反转(CAD是Y向上,机床通常是Y向下)。看这个转换片段:

stringBuilder.AppendLine($"G01 X{point.X:F3} Y{-point.Y:F3} F500");

圆弧处理要算圆心和方向。用DXF的起始角/终止角转成G02/G03指令:

var arcCmd = IsClockwise ? "G02" : "G03"; var center = new Point( (start.X + end.X)/2 + radius * Math.Cos(midAngle), (start.Y + end.Y)/2 + radius * Math.Sin(midAngle) );

最后说下缩放拖拽的实现。别被唬住,本质就是矩阵变换。比如平移操作:

public void Pan(double offsetX, double offsetY) { foreach (var entity in entities) { if (entity is Line line) { line.StartX += offsetX; line.StartY += offsetY; line.EndX += offsetX; line.EndY += offsetY; } // 其他实体类型同理... } }

这代码直接粗暴但有效,真要优化可以用访客模式,不过咱说好了不封装嘛。

项目扔GitHub上后,有老哥反馈说处理复杂图纸会内存溢出。一查发现是暴力读整个文件导致的,后来改成流式读取,内存占用直接从500M降到50M。所以说,处理DXF还是得边读边解析,别头铁全加载到内存。

总之这项目验证了:用C#搞DXF解析完全可行,关键是多准备点测试图纸。下次考虑加点三维实体支持,不过那是另一个坑了...

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/8 9:10:22

浩辰CAD看图王免费版下载和安装保姆级教程(附安装包,超级详细)

在工程设计、建筑规划和制造业等相关领域&#xff0c;CAD图纸是传递信息的关键载体。然而&#xff0c;传统的专业 CAD 软件往往体积大、价格贵&#xff0c;且对电脑配置有要求&#xff0c;这给需要的工作人员带来了不便。浩辰 CAD 看图王正是为了解决这一痛点而诞生的一款软件。…

作者头像 李华
网站建设 2026/3/13 14:00:05

亚马逊新品智能增长:读懂算法、精准协同,快速破局出海

在亚马逊的生态中&#xff0c;新品成功并非偶然&#xff0c;而是一场与算法系统建立信任、用数据证明价值的精密对话&#xff0c;理解平台底层逻辑&#xff0c;并据此设计科学的运营路径&#xff0c;是穿越激烈竞争的关键。一、黄金窗口&#xff1a;建立初始信任的关键期亚马逊…

作者头像 李华
网站建设 2026/3/13 9:50:59

【EI检索+高录用+可线上参会】2026年第二届生成式人工智能与数字媒体国际学术会议(GADM 2026)

随着生成式人工智能技术的迅猛发展&#xff0c;其在艺术创作、内容生成、用户体验优化等领域展现出前所未有的潜力。在首届会议成功举办的基础上&#xff0c;第二届生成式人工智能与数字媒体国际学术会议 (GADM 2026) 将于2026年2月6日至8日在中国昆明隆重召开。 本次会议旨在…

作者头像 李华
网站建设 2026/3/6 6:08:12

insertOnDuplicateKey 和 upsert 区别

二者是一样的insertOnDuplicateKey 实际上是 ON DUPLICATE KEY UPDATE&#xff0c;是MySQL的特有写法类似的有 ON CONFICT() &#xff0c;这个是 pgsql 的类似写法在数据库操作中&#xff0c;INSERT ON DUPLICATE KEY UPDATE&#xff08;MySQL特有语法&#xff09;和UPSERT&…

作者头像 李华
网站建设 2026/3/13 14:58:39

IfcOpenShell如何解决传统BIM工作流中的五大痛点?

在传统BIM项目中&#xff0c;设计师常常面临数据孤岛、格式兼容性差、工具链断裂等挑战。IfcOpenShell作为开源IFC库和几何引擎&#xff0c;通过模块化架构重新定义了BIM数据处理方式。不同于传统的单一工具链&#xff0c;它提供了一套完整的解决方案&#xff0c;让BIM协作变得…

作者头像 李华
网站建设 2026/3/9 20:15:35

5步构建Android视频播放器跨设备适配框架

5步构建Android视频播放器跨设备适配框架 【免费下载链接】ExoPlayer 项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayer 在移动应用开发领域&#xff0c;视频播放功能的多设备兼容性始终是技术团队面临的重大挑战。随着Android设备生态的碎片化程度不断加深&…

作者头像 李华