.NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人
基于前文介绍的Ribbon界面、插件化、MVVM模式等内容,我们搭建了一个软件雏形。本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块。
1 目标
基于MVVM模式在RapidCAX中增加以下的机器人交互界面:
- 加载机器人模型后,在左侧的目录树里面显示机器人模型的名称
- 在目录树中选中机器人节点后,在右侧的属性面板中显示机器人的配置参数
- 修改机器人的关节参数,更新机器人模型,实现正向模拟
2 整体设计
总体上采用插件机制,即机器人模块Rapid.Robot.Plugin依赖主程序Rapid.CAX.exe,主程序动态加载机器人模块。
模块内采用MVVM架构,以分离界面和逻辑实现。
命名约定:
- ProjectBrowser:项目目录树
- PropertyView: 属性面板
交互过程
- 点击加载机器人命令由RobotViewModel处理,加载模型并显示
- RobotViewModel监听ProjectBrowerViewModel的选择修改,并创建PropertyView和PropertyViewModel
- 修改属性后,RobotPropertyView通知RobotModel更改机器人关节参数,并更新视图
3 具体实现
Rapid.Robot.Plugin项目创建,Ribbon界面创建过程这里不再赘述,可以参考之前的内容创建。
3.1 机器人描述
单模型多机械臂的结构设计,详细参照 样例模型
3.2 模型加载
由MachineTemplate类实现,具体参考代码实现。
加载后创建RobotModel对象。
//RobotViewModel.cs
var template = AnyCAD.Robot.MachineTemplate.Load(dlg.FileName, (int progress) =>
{
//TODO:
});
if (template == null)
{
MessageBox.Show("打开配置文件失败");
return;
}
var robot = template.CreateInstance();
viewer3d.ShowSceneNode(robot);
mRobotControl = new RobotModel(robot);
viewer3d.ShowSceneNode(mRobotControl.TrackingPath);
var treeNode = new BrowserTreeNode { DisplayName = mRobotControl.Name, Tag = mRobotControl };
MainWindow.Instance()?.ProjectBrowser.TreeNodes.Add(treeNode);
3.3 动态创建属性
RobotViewModel收到选择了机器人后,动态创建RobotPropertyView并挂接到属性面板上。
//RobotViewModel.cs
void OnSelectionChagned(object? sender, PropertyChangedEventArgs e)
{
var pbCtrl = MainWindow.Instance()?.ProjectBrowserCtrl;
if (pbCtrl == null)
return;
var node = (BrowserTreeNode)pbCtrl.SelectedItem;
if(node == null)
return ;
if(node.Tag == mRobotControl && mRobotControl!=null)
{
var panel = MainWindow.Instance()?.PropertyPanel;
if(panel != null)
panel.Content = new RobotPropertyView(mRobotControl);
}
}
3.4 机器人关节修改
机器人控制和模拟在《一种机器人运动模拟装置》一文中做了比较详细的介绍,这里不再赘述。
以更改参数A属性为例,ViewModel部分代码如下:
//RobotPropertyViewModel.cs
private uint mBaseOffset = 1; //用来调整轴的起始位置偏移
public double A { get => mRobot.GetVariable(mArmIndex, 0+ mBaseOffset); set=> SetProperty(0 + mBaseOffset, value, nameof(A)); }
Vector3 mFinalPosition = new Vector3(0);
void SetProperty(uint idx, double val, string name)
{
var old = mRobot.GetVariable(mArmIndex, idx);
var delta = val - old;
if(SetProperty(ref old, val, name))
{
// 更新关节参数
mRobot.AddVariable(mArmIndex, idx, delta);
var viewer3D = MainWindow.Instance()?.Viewer3D;
viewer3D?.RequestDraw(EnumUpdateFlags.Scene);
// 计算末端点的位置
var trf = mRobot.GetFinalPosition(mArmIndex);
mFinalPosition.x = mFinalPosition.y = mFinalPosition.z = 0;
mFinalPosition.applyMatrix4(trf);
// 增加路径点
mRobot.AddTrackingPoint(mFinalPosition);
// 更新界面
OnPropertyChanged(nameof(FinalPositionX));
OnPropertyChanged(nameof(FinalPositionY));
OnPropertyChanged(nameof(FinalPositionZ));
}
}
4 总结
本文涉及的内容主要是前文几部分的综合应用,这里主要列举了关键的代码实现,详细的代码实现可以从gitee上Rapid.CAX项目上下载。
最终效果如下:
https://www.bilibili.com/video/BV1Pu411q7JK/
希望本文可以对大家开发机器人应用有所启发~
.NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人的更多相关文章
- .NET6: 开发基于WPF的摩登三维工业软件 (2)
在<.NET6: 开发基于WPF的摩登三维工业软件 (1)>我们创建了一个"毛坯"界面,距离摩登还差一段距离.本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI ...
- .NET6: 开发基于WPF的摩登三维工业软件 (7)
做为一个摩登的工业软件,提供可编程的脚本能力是必不可少的能力.脚本既可以方便用户进行二次开发,也对方便对程序进行自动化测试.本文将结合AnyCAD对Python脚本支持的能力和WPF快速开发带脚本编辑 ...
- .NET6: 开发基于WPF的摩登三维工业软件
MS Office和VisualStudio一直引领着桌面应用的时尚潮流,大型的工业软件一般都会紧跟潮流,搭配着Ribbon和DockPanel风格的界面.本文将介绍WPF下两个轻量级的Ribbon和 ...
- .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM
基于WPF开发界面的一个很大优势是可以方便地基于MVVM设计模式开发应用.本文从应用的角度基于MVVM实现参数化管材的创建界面. 1 MVVM MVVM是Model-View-ViewModel的简写 ...
- 封装:简要介绍自定义开发基于WPF的MVC框架
原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...
- (转)基于 WPF + Modern UI 的 公司OA小助手 开发总结
原文地址:http://www.cnblogs.com/rainlam163/p/3365181.html 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个 ...
- 基于 WPF + Modern UI 的 公司OA小助手 开发总结
前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- 快速开发基于 HTML5 网络拓扑图应用
采用 HT 开发网络拓扑图非常容易,例如<入门手册>的第一个小例子麻雀虽小五脏俱全:http://www.hightopo.com/guide/guide/core/beginners/e ...
随机推荐
- 使用python实现冒泡排序和快速排序
1 def bubble(arr): 2 """冒泡排序""" 3 loop = len(arr) - 1 4 if loop > 0 ...
- LNMP平台的redis对接安装
LNMP平台的redis对接安装 目录 LNMP平台的redis对接安装 一.安装LNMP的各个组件 二.安装redis服务 三.安装redis扩展 四.修改php配置文件 五.测试连接 一.安装LN ...
- Charles抓包工具介绍
1.Charles是什么? Charles是一款基于http协议的代理服务器,通过称为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的. 2.Charles有哪些用途? (1)能够分析前 ...
- 总结Tomcat优化方法
一.内存空间优化 配置文件目录:/usr/local/tomcat/bin/catalina.sh JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= ...
- 有手就行7——*项目构建细节2-钩子(webhook) 配置
有手就行7--*项目构建细节2-钩子(webhook) 配置 钩子服务 1)开启webhook功能 使用root账户登录到后台,点击Admin Area -> Settings -> N ...
- HGAME第一二周re
RE easyasm 有手就行 高低位互换再异或0x17 a = [0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21, 0x14, ...
- 《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)
1.简介 今天继续操作Excle,小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle,今天不介绍了,有两种就够用了,其实一种就够用了,今天主要是来介绍如何使用不同的数据类型读取Excel文件 ...
- Cesium 加载地形数据
1.注册Cesium Ion账号,注册地址:Sign In | Cesium ion 否则,加载数据会报错{code: "InvalidCredentials", message: ...
- [杂记]BrainFuck语言及编译器(c++实现)
BrainFuck语言 极简的一种图灵完备的语言,由Urban Müller在1993年创造,由八个指令组成(如下表).工作机制与图灵机非常相似,有一条足够长的纸带,初始时纸带上的每一格都是0,有一个 ...
- Windows三种文件系统:NTFS、FAT32、FAT16的区别
什么是文件系统? 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构:即在磁盘上组织文件的方法.也指用于存储文件的磁盘或分区,或文件系统种类. 举个通俗的比喻,一块硬盘就像一个块空地,文件就 ...