项目实战:数字孪生可视化大屏幕,实现生产过程实时监控

项目介绍

智慧工厂数据可视化系统,融合工业大数据、物联网、人工智能等各类信息技术,整合厂区现有信息系统的数据资源,实现数字孪生工厂、设备运维监测、智能管网监测、综合安防监测、便捷通行监测、能效管理监测、生产管理监测、仓储物流监测等多种功能,有效提高厂区综合监管能力、降低企业厂区运营成本,实现管理精细化、决策科学化和服务高效化。

项目展示

我们使用canvas,echarts,three.js开发绘制数字孪生工厂、设备运维监测、能效管理监测等页面,下面是项目中的一些案例

1.数字孪生工厂案例

2.设备运维监测案例

3.能效管理监测

项目开发

下面我们将通过项目实战教会大家如何利用canvas绘制一个智慧工厂数据可视化场景页面。

本文章以设备运维监测页面为案例讲解

1.场景画布绘制

针对智慧工厂数据可视化系统各种场景的绘制,首先我们使用canvas绘制一个画布,然后定义全局的canvas和ctx对象。

<canvas id="canvas" width="1880" height="900"></canvas>let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
2.场景元素绘制

首先我们把模型的图片准备好,然后我们写一个函数createPic可以传入模型的坐标位置,模型的大小和模型的路径。

2.1 绘制模型

createPic前2个参数是坐标xy轴的位置,我们这边坐标点是10,10 就会在画布的左上角绘制模型。createPic第3个第四个参数是模型的大小,我们这边定义模型的大小是222,232 。createPic最后一个参数数模型图片的位置。

createPic(10,10,222,232,'../scanboard4/model/水池.png');//调节池
2.2 createPic函数实现

创建一个Image对象,把图片的路径src赋值给Image对象,在Image的onload方法中拿到Image图片并通过ctx对象(canvas上下文对象)的drawImage的方法把模型加载到画布上

//绘制模型
function createPic(x, y,width,height,path){var img = new Image();img.src = path;img.onload = function(){ctx.beginPath();ctx.drawImage(img, x, y, width, height);      ctx.closePath();      ctx.restore();};return { x, y, width, height };
}
2.3 绘制标签

给模型添加名称,实际设备参数

createPic(50,50,222,232,'../scanboard4/model/水池.png');//调节池
drawLabel(125,40,'pH:3.21');
drawTitle(125,159,'调节池');

2.4 drawTitle和drawLabel函数实现

我们使用canvasAPI中的fillText绘制文字,设备参数是动态参数经常会变,我们需要每次绘制的时候把上一次的文字抹除掉,这边我们通过clearRect方法把上一次的文字抹除,因为文字大小和长度不一样的,每次抹除的范围不一样,我们通过canvasAPI中的measureText(text)可以得到文字的长度和高度去抹除

//绘制标题
function drawTitle(x,y,title,color,font){ctx.beginPath();if(!font){ctx.font="18px Arial";}else{ctx.font = font; }if(!color){ctx.fillStyle = "#F6DC2C"; }else{ctx.fillStyle = color; }ctx.textAlign="left";ctx.fillText(title,x,y); ctx.closePath();  ctx.restore();    
}//绘制指标
function drawLabel(x,y,text,color,font){ctx.beginPath();if(!font){ctx.font="14px Arial";}else{ctx.font = font; }if(!color){ctx.fillStyle = "#fff"; }else{ctx.fillStyle = color; }var textWidth = ctx.measureText(text).width +50;var hangingBaseline = ctx.measureText(text).hangingBaseline;ctx.clearRect(x-3,y-(hangingBaseline+3),textWidth,(hangingBaseline+8));ctx.textAlign="left";ctx.fillText(text,x,y);ctx.closePath();      
}
2.5绘制管道

设备与设备之间会有管道转接,我们这边有金属风格、蓝色风格、绿色风格的管子,我们这边通过

drawTunnelLine和drawTunnelInterface 2个函数分别绘制管道和管道转接。

createPic(50,50,222,232,'../scanboard4/model/水池.png');//调节池
drawLabel(125,40,'pH:3.21');
drawTitle(125,159,'调节池');
//金属风格管道
drawTunnelLine(271, 87,387,87);
drawTunnelInterface(386,86,3);
drawTunnelLine(387,86,387,56);
//蓝色风格管道
drawTunnelLine1(271, 165,387,165);
//绿色风格管道
drawTunnelLine2(271, 256,387,256);
drawTunnelInterface2(387,267,2);
drawTunnelLine2(398,267,398,356);

2.6 drawTunnelLine和drawTunnelInterface函数实现

drawTunnelLine函数传入4个函数,分别是起点坐标和终点坐标。我们通过canvasAPI中fillRect绘制管道,通过createLinearGradient设置渐变色实现金属风格的渐变效果。

drawTunnelInterface函数传入3个函数,转接管的坐标点以及转接管的朝向。我通过canvasAPI中arc绘制圆弧,然后通过createRadialGradient设置渐变色实现金属风格的渐变效果。

// 绘制金属管道
function drawTunnelLine(x1, y1, x2, y2) {lineWidth = 10;  // 设置线条宽度// 计算线条的矩形范围let dx = x2 - x1;let dy = y2 - y1;let length = Math.sqrt(dx*dx + dy*dy);  // 线段长度let angle = Math.atan2(dy, dx);  // 线段的角度// 绘制矩形ctx.save();  // 保存当前上下文状态ctx.translate(x1, y1);  // 平移到起始点ctx.rotate(angle);  // 旋转到线段的角度var g1 = ctx.createLinearGradient(0, 0, 0,  lineWidth);g1.addColorStop(0.2, '#7A8383'); g1.addColorStop(0.6, '#fff');g1.addColorStop(0.8, '#7A8383'); ctx.fillStyle = g1;ctx.fillRect(0, 0, length, lineWidth);  // 绘制矩形ctx.restore();  // 恢复上下文状态
}// 绘制金属管道转接口
function drawTunnelInterface(x,y,rotate){var RADIUS = 11;ctx.beginPath();ctx.lineWidth=0.01;ctx.moveTo(x, y);var rotate = (Math.PI/2) *rotate;ctx.arc(x, y, RADIUS, Math.PI / 2 + rotate, Math.PI + rotate); //sAngle 90 ,eAngle 180var g1 = ctx.createRadialGradient(x, // 内圆中心的 x 坐标y, // 内圆中心的 y 坐标0, // 内圆的半径x, // 外圆中心的 x 坐标y, // 外圆中心的 y 坐标RADIUS // 外圆的半径,这里设置为整个 Canvas 的一半);g1.addColorStop(0.2, '#7A8383'); g1.addColorStop(0.6, '#fff');g1.addColorStop(0.8, '#7A8383'); ctx.fillStyle = g1;ctx.fill();ctx.restore();ctx.stroke();
}

项目结束

以上我们一个简单的案例基础功能就完成了,通过此案例简单的介绍了一下canvas的一些功能,大家可以根据自己的需求场景绘制自己的可视化场景。

最后给大家看一下我在工作中绘制的一些别的场景

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

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

相关文章

SiC电机控制器(逆变器)发展概况及技术方向

SiC电机控制器&#xff08;逆变器&#xff09;发展概况及技术方向 1.概述2.电动汽车动力系统设计趋势3.栅极驱动器和驱动电源配置4.结论 tips&#xff1a;资料来自网上搜集&#xff0c;仅供学习使用。 1.概述 2022年到2023年&#xff0c;第三代半导体碳化硅被推上了新的热潮。…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

案例介绍|钡铼助力2023年全国职业院校技能大赛工业网络智能控制与维护赛项

如今&#xff0c;越来越多的企业开始意识到数字制造和工业物联网已经成为工业自动化中大规模生产的核心驱动力。这其中&#xff0c;工业网络作为基础设施&#xff0c;是实现工厂设备联网与数据采集&#xff0c;建设数字工厂的基础和前提&#xff0c;甚至成为关乎数字工厂能否真…

【AIGC工具】我找到了使用大模型问答的最短路径!

大家好&#xff0c;我是豆小匠~ 好久没介绍提高效率的工具啦&#xff0c;这次来介绍一个UTools的骚操作&#xff0c;可以极速打开LLM进行提问&#xff01; 完成后的效果是&#xff1a; 快捷键调出输入框&#xff1b;2. 输入问题&#xff1b;3. 选择模型&#xff1b;4. 回车提…

Embedded-Project项目介绍

Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址&#xff1a; https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…

C++ 类的内存分布

文章目录 1 . 前言2 . 无继承&#xff0c;无虚函数3 . 无继承&#xff0c;有虚函数4 . 单一继承&#xff0c;无虚函数5 . 单一继承&#xff0c;有虚函数&#xff0c;虚析构6 . 多重继承7 . 菱形继承8 . 虚拟继承9 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_…

【机器学习】循环神经网络(二)-LSTM示例(keras)国际航空乘客问题的回归问题...

使用 Keras 在 Python 中使用 LSTM 循环神经网络进行时间序列预测 国际航空乘客问题的回归问题 这个文件是一个CSV格式的数据集&#xff0c;它包含了从1949年1月到1960年12月的每个月的国际航空乘客的总数&#xff08;以千为单位&#xff09;。第一行是列名&#xff0c;分别是&…

案例099:基于微信小程序的外卖小程序的研究与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

期货日数据维护与使用_日数据维护_日数据更新

目录 写在前面&#xff1a; 下载日数据 下载“新增合约”日数据 下载“待更新合约”日数据 日数据文件 “选择日数据所在目录”按钮点击 “执行”按钮点击 sqlite3代码 按钮点击后执行的代码 子线程代码 写在前面&#xff1a; 本文默认已经创建了项目&#xff0c;如…

pytorch集智-2单车预测器

完整代码在个人主页简介链接pytorch路径下可找到 1 单车预测器1.0 1.1 人工神经元 对于sigmoid函数来说&#xff0c;w控制函数曲线的方向&#xff0c;b控制曲线水平方向位移&#xff0c;w控制曲线在y方向的幅度 1.2 多个人工神经元 模型如下 数学上可证&#xff0c;有限神经…

篇三:让OAuth2 server支持密码模式

由于Spring-Security-Oauth2停止维护&#xff0c;官方推荐采用 spring-security-oauth2-authorization-server&#xff0c;而后者默认不支持密码授权模式&#xff0c;本篇实战中采用的版本如下&#xff1a; <dependency><groupId>org.springframework.security<…

jsES6+新语法

目录 模板字符串标签模板字符串 函数增强默认值与解构剩余参数rest和arguments 箭头函数 展开语法SymbolSetSet方法weakSetweakSet常用方法 MapMap常用方法weakMapweakMap常用方法 PromiseProxy/Reflect迭代器与生成器ES6新增方法includes**Object.valuesObject.entriespadStar…