news 2026/9/3 17:45:33

.NET 8 + WPF 打造的数控机床仿真平台

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET 8 + WPF 打造的数控机床仿真平台

项目概述

一个基于.NET 8.0开发的数控机床仿真平台,作为早期项目 MachineSimulation.DX 的演进版本,专注于机床结构、工装(fixture)和刀具(tool)的编辑、加载与三维可视化。

项目采用WPF + MVVM 架构,3D 渲染基于HelixToolkit.Wpf.SharpDX,支持高保真材料移除仿真,并通过客户端-服务器架构实现数据的集中管理与多端同步,为数控系统开发、学习演示和虚拟调试提供完整解决方案。

核心升级与技术演进

1、从 .NET Framework 迁移至.NET Core 8.0,提升性能与现代化兼容性

2、支持从REST 服务器动态加载机器数据,替代本地硬编码配置

3、MVVM 框架由MVVMLightLib升级为CommunityToolkit.Mvvm,代码更简洁、维护性更强

4、3D 引擎从 HelixToolkit.Wpf 切换至HelixToolkit.Wpf.SharpDX,利用 DirectX 实现更高帧率渲染

5、视图模型(ViewModel)设计更轻量,减少冗余逻辑

6、重构材料移除算法库,显著提升计算效率

7、支持在材料移除仿真中管理多种类型刀具(如铣刀、钻头等)

8、模块间依赖大幅降低,实现高内聚、低耦合的架构

客户端应用模块

Client

加载机器元素的 STL 模型文件,并发布到数据服务器。

Client.Machine

加载由 MachineEditor 生成的机器结构文件(*.xml),可发布至服务器或导出为 JSON 格式。

Client.Tooling

加载 ToolingEditor 创建的工装文件(*.tooling),支持发布或保存为 jTooling(JSON)格式。

Client.Tools

加载 ToolEditor 生成的刀具文件(*.tools),可发布或导出为 JTools(JSON)格式。

示例资源(位于Examples文件夹)

  • Simple3AxesCnc.json:基础三轴机床结构定义

  • Models/:包含所有 STL 格式的机器部件模型

  • SimpleToolSet.jTools:示例刀具数据库

  • SimpleTooling.jTooling:标准工装配置

  • SimpleTooling2.jTooling:用于运行test news.msteps的专用工装

  • Simple3AxesCnc.jenv:完整工作环境(含结构、模型、刀具、工装)

  • Simple3AxesCnc(news).jenv:适配新测试用例的工作环境
    antina.msteps:经典加工路径示例

  • test news.msteps:新功能验证用加工指令文件

核心类库模块说明

1、数据层

Machine.Data:主数据模型库

Machine.Data.Base / Enums / Interfaces / Factories:支撑数据模型的基础组件

Machine.Data.Converters:JSON/XML 序列化转换器
Machine.Data.Extensions.ViewModels:数据模型与 ViewModel 的桥接扩展

Mesh.Data:机器元素网格(STL)的数据结构定义

2、数据源适配

Machine.DataSource.File.Json / Xml:本地 JSON/XML 文件读写

Machine.DataSource.Client.Rest:通过 REST API 与服务器交互

3、编辑与步骤解析

Machine.Editor:机床结构编辑器

Tools.Editor:刀具集编辑器

Tooling.Editor:工装配置编辑器

Machine.StepsSource.File.Iso / Msteps:解析 ISO G代码 或 自定义 .msteps 加工指令

4、视图与 ViewModel

Machine.Views / Converters:WPF 视图及绑定转换器

Machine.ViewModels及其子模块(Base、Interfaces、Messaging、UI 等):完整 MVVM 实现体系

Machine.ViewModels.Ioc:轻量级控制反转容器

5、3D 与几何

Machine.3D.Views:3D 场景渲染视图(基于 HelixToolkit)

Machine.3D.Geometry.Provider:解耦的模型加载服务

6、材料移除仿真

MaterialRemove.Interfaces / Geometry:核心算法与接口(基于 geometry3Sharp 优化)

MaterialRemove.ViewModels / ViewModels.3D:仿真逻辑与 3D 可视化分离

MaterialRemove.Machine.Bridge:连接材料移除模块与主系统 ViewModel

MaterialRemove.Test:专用测试与调试工具

7、服务端

Server:基于 REST 的数据服务器,使用 SQLite 存储机床结构、工装、刀具及模型元数据

项目代码

public static Geometry3D Convert(AxisAlignedBox3d bb) { var builder = new MeshBuilder(); builder.AddBox(new SharpDX.Vector3((float)bb.Min.x, (float)bb.Min.y, (float)bb.Min.z), (float)(bb.Max.x - bb.Min.x), (float)(bb.Max.y - bb.Min.y), (float)(bb.Max.z - bb.Min.z)); return builder.ToMesh(); } public static Geometry3D Convert(DMesh3 mesh) { var builder = new MeshBuilder(); // 将 DMesh3 的顶点转换为 Vector3Collection var vertices = new Vector3Collection(); foreach (var v in mesh.Vertices()) { vertices.Add(new Vector3((float)v.x, (float)v.y, (float)v.z)); } // 将 DMesh3 的三角形转换为 IntCollection var triangles = new IntCollection(); foreach (var t in mesh.Triangles()) { triangles.Add(t.a); triangles.Add(t.b); triangles.Add(t.c); } builder.Append(vertices, triangles); return builder.ToMesh(); } public static Geometry3D Convert(MaterialRemove.Interfaces.Geometry g) { var builder = new MeshBuilder(); var vc = new Vector3Collection(g.Vertexes.Select(v => new Vector3((float)v.x, (float)v.y, (float)v.z))); var tc = new IntCollection((IEnumerable<int>)g.Triangles); builder.Append(vc, tc); return builder.ToMesh(); }

项目效果

工具编辑器界面

工装编辑器界面

加工仿真运行效果

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

HTTP性能测试工具-wrk

1、前言 性能测试对软件测试的重要性在于它可以评估软件在特定负载条件下的性能表现&#xff0c;包括响应时间、吞吐量、并发用户数、资源利用率等。通过性能测试&#xff0c;可以识别并解决可能存在的性能问题&#xff0c;提高软件的可靠性、稳定性和可伸缩性。性能测试还可以…

作者头像 李华
网站建设 2026/9/3 6:36:16

TensorLPP:张量局部保持投影算法详解与实现

在机器学习和计算机视觉领域,降维技术是处理高维数据的重要手段之一。传统的降维方法如PCA(主成分分析)关注全局方差最大化,而LPP(Locality Preserving Projections,局部保持投影)则更注重保留数据的局部邻域结构,这使得它在流形学习任务中表现出色。 然而,当数据本身…

作者头像 李华
网站建设 2026/9/3 4:00:32

MATLAB多列图例函数columnlegend详解与实现

引言 在MATLAB绘图中,当曲线或图例项数量较多时,默认的legend函数只会生成单列图例,导致图例框过长,甚至遮挡图形内容或超出图形区域。这时,我们希望能将图例排列成多列形式,既美观又节省空间。然而,MATLAB原生legend并不直接支持多列布局。 columnlegend 就是一个非常…

作者头像 李华
网站建设 2026/9/3 6:36:04

Keil uVision5嵌入式C开发:新手教程(从零配置环境)

从零开始搭建 Keil uVision5 嵌入式开发环境&#xff1a;新手也能看懂的实战指南 你是不是也曾经面对一块 STM32 开发板&#xff0c;手握资料却无从下手&#xff1f;打开 Keil 看着一堆弹窗和选项&#xff0c;心里直打鼓&#xff1a;“这玩意儿到底怎么用&#xff1f;”别急—…

作者头像 李华
网站建设 2026/9/3 6:36:04

javascript数据类型转换-转换为数字型

第一种转换方式&#xff0c;使用Number语法是Number(数据或者存储数据的变量)let a 12 console.log(Number(a),typeof Number(a))如果是不能转换的类型&#xff0c;返回值是NaN如果内容是空&#xff0c;返回值是0如果转换的是布尔值&#xff0c;true返回1&#xff0c;false返回…

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

ST7789V硬件时序详解:系统学习初始化流程

深入ST7789V&#xff1a;从硬件时序到初始化流程的系统性解析在嵌入式显示开发中&#xff0c;点亮一块屏幕看似简单——接上电源、写几条命令、刷点颜色。但当你真正动手时&#xff0c;却常常遇到花屏、黑屏、白屏、颜色错乱等问题。这些问题的背后&#xff0c;往往不是代码写错…

作者头像 李华