C# DXF文件解析与交互式显示含缩放/拖拽

news/2025/11/11 16:44:51/文章来源:https://www.cnblogs.com/eic85764/p/19210941

一、核心功能实现原理

graph TDA[DXF文件] --> B[netDxf库解析]B --> C[实体数据提取]C --> D[自定义绘图引擎]D --> E[交互式操作]E --> F[缩放/平移/选择]

二、完整代码实现(含详细注释)

1. 环境配置

// 安装依赖库
Install-Package netDxf
Install-Package System.Numerics.Vectors

2. 主窗体设计(WinForm)

using System;
using System.Drawing;
using System.Numerics;
using System.Windows.Forms;
using netDxf;
using netDxf.Entities;namespace DXFViewer
{public partial class MainForm : Form{private DxfDocument dxf;private Vector2 offset = Vector2.Zero;  // 平移偏移量private float zoom = 1.0f;              // 缩放系数private Point lastMousePos;public MainForm(){InitializeComponent();this.DoubleBuffered = true;          // 防闪烁hScroll.Maximum = 10000;vScroll.Maximum = 10000;}}
}

3. DXF加载与解析

// 加载DXF文件
private void LoadDxf(string path)
{try{dxf = DxfDocument.Load(path);UpdateView();}catch (Exception ex){MessageBox.Show($"加载失败: {ex.Message}");}
}// 解析实体数据
private void ParseEntities()
{entities.Clear();foreach (Entity entity in dxf.Entities){if (entity.Type == EntityType.Line){var line = (Line)entity;entities.Add(new DxfEntity{Type = EntityType.Line,Points = new[] { line.StartPoint, line.EndPoint }});}else if (entity.Type == EntityType.Circle){var circle = (Circle)entity;entities.Add(new DxfEntity{Type = EntityType.Circle,Center = circle.Center,Radius = circle.Radius});}// 其他实体类型处理...}
}

4. 自定义绘图引擎

// 绘制所有实体
private void DrawEntities(Graphics g)
{foreach (var entity in entities){Matrix3x2 transform = GetTransformMatrix();switch (entity.Type){case EntityType.Line:DrawLine(g, (LineEntity)entity, transform);break;case EntityType.Circle:DrawCircle(g, (CircleEntity)entity, transform);break;}}
}// 坐标变换矩阵
private Matrix3x2 GetTransformMatrix()
{return Matrix3x2.CreateTranslation(-offset.X, -offset.Y) *Matrix3x2.CreateScale(zoom, zoom) *Matrix3x2.CreateTranslation(ClientSize.Width / 2, ClientSize.Height / 2);
}

5. 交互事件处理

// 鼠标滚轮缩放
private void MainForm_MouseWheel(object sender, MouseEventArgs e)
{float delta = e.Delta > 0 ? 1.1f : 0.9f;zoom *= delta;UpdateScrollBars();Invalidate();
}// 鼠标拖拽平移
private void MainForm_MouseDown(object sender, MouseEventArgs e)
{lastMousePos = e.Location;
}private void MainForm_MouseMove(object sender, MouseEventArgs e)
{if (e.Button == MouseButtons.Left){Vector2 delta = new Vector2(e.X - lastMousePos.X, e.Y - lastMousePos.Y);offset += delta;lastMousePos = e.Location;UpdateScrollBars();Invalidate();}
}// 更新滚动条
private void UpdateScrollBars()
{hScroll.Maximum = (int)(dxf?.BoundingRectangle.Width * zoom ?? 10000);vScroll.Maximum = (int)(dxf?.BoundingRectangle.Height * zoom ?? 10000);hScroll.Value = (int)offset.X;vScroll.Value = (int)offset.Y;
}

三、高级功能扩展

1. 多图层支持

// 图层过滤显示
private void UpdateLayerVisibility()
{var activeLayers = dxf.Layers.Where(l => l.IsVisible).Select(l => l.Name).ToList();entities = entities.Where(e => activeLayers.Contains(e.Layer)).ToList();
}

2. 选择高亮

// 鼠标点击检测
private void CheckSelection(Point clientPos)
{Vector2 pos = Vector2.Transform(new Vector2(clientPos.X, clientPos.Y),Matrix3x2.Invert(GetTransformMatrix()));foreach (var entity in entities){if (entity.Type == EntityType.Line){var line = (LineEntity)entity;if (IsPointNearLine(pos, line.StartPoint, line.EndPoint)){selectedEntity = entity;Invalidate();break;}}}
}

3. 性能优化方案

// 分块加载实现
private void LoadLargeDxf(string path)
{using (var stream = new FileStream(path, FileMode.Open)){var reader = new DxfReader(stream);while (reader.ReadNextSection()){if (reader.SectionName == "ENTITIES"){while (!reader.EndOfSection){var entity = reader.ReadEntity();if (entity != null){entities.Add(ParseEntity(entity));if (entities.Count % 100 == 0) // 每100个刷新界面{this.Invoke((MethodInvoker)delegate { Invalidate(); });}}}}}}
}

四、界面设计示例

+---------------------------------+
| 文件操作栏 [打开] [保存] [退出]   |
+---------------------------------+
| 图层控制面板                    |
| [可见图层列表]                  |
+---------------------------------+
| 图形显示区 (PictureBox)         |
| 缩放: 100% 平移: (0,0)          |
+---------------------------------+
| 状态栏                        |
| 坐标: (X:0,Y:0) 选中实体: 无    |
+---------------------------------+

五、完整项目结构

DXFViewer/
├── Controls/
│   ├── LayerControl.cs      # 图层管理控件
│   └── EntitySelector.cs    # 实体选择器
├── Forms/
│   ├── MainForm.cs          # 主界面
│   └── AboutForm.cs         # 关于窗口
├── Models/
│   ├── DxfEntity.cs         # 实体基类
│   └── LayerInfo.cs         # 图层信息
└── Resources/├── icons/└── styles/

六、调试与测试

1. 坐标调试工具

// 实时坐标显示
private void UpdateStatusBar(Point clientPos)
{Vector2 worldPos = Vector2.Transform(new Vector2(clientPos.X, clientPos.Y),Matrix3x2.Invert(GetTransformMatrix()));statusBar.Text = $"世界坐标: ({worldPos.X:F3}, {worldPos.Y:F3})";
}

2. 内存泄漏检测

// 使用WeakReference管理实体
private List<WeakReference<DxfEntity>> weakEntities = new();// 添加实体时
weakEntities.Add(new WeakReference<DxfEntity>(entity));

七、扩展学习资源

  1. 官方网页
    • netDxf GitHub仓库 github.com/haplokuon/netDxf
    • DXF文件格式规范 www.autodesk.com/education/free-software/autocad
    • 源码 C#读取并显示DXF文件(含缩放、拖放)示例源码 www.youwenfan.com/contentcnl/93690.html
  2. 进阶功能参考
    • 三维实体解析(netDxf.Entities.Solid
    • 块参照处理(netDxf.Entities.BlockReference
    • 自定义着色器(使用OpenTK实现OpenGL渲染)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorRT - 命令行程序 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Hostinger+Wordpress虚拟主机踩坑:零代码建站体验+绝对不要用支付宝付款!!

作为一名码农,今天心血来潮想来试试WordPress的零代码建站和部署前端页面,但经过我的几小时摸索终于放弃了,原因如下:零代码在主观上(无论是视频宣传还是观感上)貌似很轻松,可实际操作中还是相当繁重;特别是当…

2025年PVC酸洗槽实力厂家权威推荐榜单:四氟电加热器/PDF酸洗槽/储罐式换热器源头厂家精选

在电镀、化工、电子及金属表面处理等行业中,PVC酸洗槽作为承载各类酸碱性化学液体的关键设备,其耐腐蚀性、结构强度及使用寿命直接关系到生产安全与成本控制。为帮助您精准筛选优质供应商,本文基于企业生产实力、技…

2025年11月连锁酒店推荐:主流品牌对比高性价比选择指南

一、引言 在商务出行与休闲差旅并重的当下,连锁酒店已成为消费者与投资人共同关注的核心场景。对于频繁出差的中小企业管理者、注重效率的个体创业者,以及希望获得稳定现金流回报的酒店物业持有人而言,如何在“住宿…

20251111Tuesday 代码修改备忘(为视频坐席 转坐席 以及 坐席发起呼叫 是否包含视频 而做的修改)

1 在外线呼入的时候,区分本呼叫是否带视频,决定在转坐席的时候,呼叫坐席软电话是否带视频 2 坐席发起呼叫的时候,指定本次呼叫是否带视频 1 修改 cardfs-video (1)在呼入和呼出接通时,根据通道变量,判断本次呼叫…

绩效管理过程中常见的陷阱

来源:tita.com 糟糕的指标 公司选择的指标必须实际促进其想要的绩效。通常,它只能通过将其中的几个合并到平衡计分卡中来实现这一点。当这种情况不发生时,问题就会出现。例如,一些制造工厂仍然单独为每个班次设定总…

2025年11月连锁酒店排行榜推荐:主流品牌对比与高性价比选择指南

一、引言 在差旅与休闲需求同步复苏的2025年四季度,中端及中高端连锁酒店成为企业差旅采购、家庭出行及中小投资人共同关注的高频赛道。消费者普遍希望在不牺牲睡眠、早餐、网络等核心体验的前提下,把每晚房费控制在…

全网最容易被忽视但超能打的 6 款工具,不收藏会后悔!

老实说,我用过不少所谓“效率工具”“生产力软件”,但常常一个被忽视的小工具,反而改变最大。 你可能会觉得:“我已经用好几个了,还能再找?” 答案是:能。关键是找那种“你还没装,但一装就立刻看见区别”的。 …

2025年11月沈阳酒店推荐:口碑评价列表实用避坑指南

一、引言 在商旅与休闲需求同步回升的2025年四季度,沈阳作为东北交通枢纽与文旅目的地,酒店入住率持续走高。对出差会议、家庭出游、中转过夜三类核心客群而言,"住得安心、行得方便、钱花得值"是共同诉求…

P4784 [BalticOI 2016] 城市 (Day2) 小结

这个题目如果不是模板题的话有点好,可是他是模板。 这个题其实是我随机跳题跳到的。 我看到他的 k<=5 我觉得很奇怪,然后画了一下 k=3,4,5 的所有情况。 然后我就发现这个复杂度是 \(O(n^{\max(1,k-2)})\) 的。很…

合并

public class Part05Merge {//========================================================================================// TODO Merge flux1 and flux2 values with interleavepublic Flux<User> mergeFlux…

Spring-ai 框架源码分析

官网地址https://docs.spring.io/spring-ai/reference/index.html版本<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>…

2025年11月沈阳酒店推荐:口碑评价列表与实用避坑指南

一、引言 在东北亚经济圈与东北全面振兴战略叠加的2025年四季度,沈阳作为区域枢纽城市,商务、会展、文旅流量同步抬升,酒店需求呈现“高频、短时、多元”特征。对差旅预算有限又希望兼顾位置、品质与个性化服务的消…

2025年11月geo服务商推荐:知名机构排行榜口碑评价对比指南

一、引言 生成式引擎优化(GEO)已成为企业在AI搜索时代获取精准流量与品牌增信的核心入口。面对DeepSeek、豆包、通义千问、元宝、Kimi等多平台算法并行、更新节奏不一的复杂环境,市场总监、品牌负责人及增长团队最紧…

2025年11月geo优化服务商推荐:知名机构排行榜与口碑评价对比指南

一、引言 生成式引擎优化(GEO)已不再是“锦上添花”的营销选项,而是企业在AI搜索生态里能否被看见、被信任、被转化的生死线。面对DeepSeek、豆包、通义千问、元宝、Kimi等平台算法高频迭代,市场部门与品牌主的核心…

2025年11月GEO优化推荐:知名机构排行榜口碑评价对比指南

一、引言 生成式引擎优化(GEO)正在重塑企业获取流量的路径。对品牌方、市场负责人及成长型公司而言,如何在DeepSeek、豆包、通义千问、元宝、Kimi等主流AI平台同步提升可见度,已成为成本控制与增长确定性的交汇点。…

微信小程序中下载文件(非图片)方式总结

前言 总是有需求想在微信小程序里面做下载文件并保存的功能,所以自己整理了一下小程序涉及到下载api,大致理了下在小程序里面下载的流程和解决方案。一、涉及api 1.wx.saveFile() ​ 文档链接:https://developers.w…

2025年11月豆包关键词排名优化推荐:主流机构排行榜高性价比选择指南

一、引言 生成式引擎优化(GEO)正在重塑企业获客逻辑,豆包作为月活破亿的国民级AI入口,其关键词排名直接影响品牌曝光质量。对于市场、运营及增长负责人而言,如何在多平台算法频繁迭代的2025年第四季度,用可控成本…

2025年11月北京GEO优化公司推荐:知名机构排行榜口碑评价对比指南

一、引言 生成式引擎优化(GEO)已取代传统搜索优化,成为企业在DeepSeek、豆包、通义千问、元宝、Kimi等AI入口获得精准流量的刚需。北京作为全国AI研发密度最高的城市,GEO服务商在2025年第三季度新增备案企业同比激…

2025年11月geo供应商推荐:知名机构排行榜口碑评价对比指南

一、引言 生成式引擎优化(GEO)已成为企业在AI搜索生态中争夺可见度的主战场。对于市场、公关及采购负责人而言,如何在DeepSeek、豆包、通义千问、元宝、Kimi等多平台同步获得稳定曝光,同时控制外包风险与预算,是当…