基于 WEB 的 WMS 3D 可视化管理系统
1 const g2d = new ht.graph.GraphView()
2 g2d.setPannable(false)
3 g2d.setRectSelectable(false)
4 g2d.handleScroll = function () {}
5 g2d.setScrollBarVisible(false)
6
7 ht.Default.xhrLoad('displays/状态面板.json', function (json) {
8 g2d.dm().deserialize(json)
9 })
1 const g2d = new ht.graph.GraphView()
2
3 g2d.setPannable(false)
4 g2d.setRectSelectable(false)
5 g2d.handleScroll = function () {}
6 g2d.setScrollBarVisible(false)
7 ht.Default.xhrLoad('displays/任务列表.json', function (json) {
8 g2d.dm().deserialize(json)
9 })
1 const g2d = new ht.graph.GraphView()
2 g2d.setPannable(false)
3 g2d.setRectSelectable(false)
4 g2d.handleScroll = function () {}
5 g2d.setScrollBarVisible(false)
6
7 ht.Default.xhrLoad('displays/故障信息.json', function (json) {
8 g2d.dm().deserialize(json);
9 });
1 // 货物入库
2 function goodsIn(code) {
3 var good = dataModel.getDataByTag(code)
4 if (!good) {
5 console.warn('货物编号不存在:', code)
6 return
7 }
8 ////////// 入库口移动至输入机 //////////////
9
10 var row = good.a('row')
11 var col = good.a('col')
12 var floor = good.a('floor')
13
14 if (col <= colSize / 2) { // 左侧
15 let goodP3 = dataModel.getDataByTag('入口1').p3()
16 goodP3[1] = floorBaseElevation
17 good.p3(goodP3)
18 } else { // 右侧
19 let goodP3 = dataModel.getDataByTag('入口2').p3()
20 goodP3[1] = floorBaseElevation
21 good.p3(goodP3)
22 }
23 good.s('3d.visible', true)
24 good.setHost(null)
25
26 if (col <= colSize / 2) { // 左侧
27 let refer = dataModel.getDataByTag('LeftFront')
28 moveZTo(good, refer.getY(), null, () => {
29 moveXTo(good, refer.getX(), null, () => { // 左移
30 // 后移至货架水平位置
31 let targetY = null
32 if (Math.floor(row % 2) === 0) { // 偶数列
33 targetY = good.a('p3')[2] + 300
34 } else {
35 targetY = good.a('p3')[2]
36 }
37 moveZTo(good, targetY, null, () => {
38 // 右移至货架边缘
39 moveXTo(good, dataModel.getDataByTag('升降机L' + row + ':底座').getX(), null, () => {
40 // 离开输送机移动至货架
41 goodToShelve(good)
42 })
43 })
44 })
45 })
46
47 } else { // 右侧
48 let refer = dataModel.getDataByTag('RightFront')
49 moveZTo(good, refer.getY(), null, () => {
50 moveXTo(good, refer.getX(), null, () => { // 右移
51 // 后移至货架水平位置
52 let targetY = null
53 if (Math.floor(row % 2) === 0) { // 偶数列
54 targetY = good.a('p3')[2] + 300
55 } else {
56 targetY = good.a('p3')[2]
57 }
58 moveZTo(good, targetY, null, () => {
59 // 左移至货架边缘
60 moveXTo(good, dataModel.getDataByTag('升降机R' + row + ':底座').getX(), null, () => {
61 // 离开输送机移动至货架
62 goodToShelve(good)
63 })
64 })
65 })
66 })
67 }
68 }
货物出库核心代码:
1 // 货物出库
2 function goodsOut(code) {
3 var good = dataModel.getDataByTag(code)
4 if (!good) {
5 console.warn('货物编号不存在:', code)
6 return
7 }
8
9 var row = good.a('row')
10 var col = good.a('col')
11 var floor = good.a('floor')
12
13 let elevatorRow = parseInt((row + 1) / 2)
14 let isLeft = col <= (colSize / 2)
15 let elevator = isLeft ? dataModel.getDataByTag("升降机L" + elevatorRow) : dataModel.getDataByTag("升降机R" + elevatorRow)
16
17 let elevatorX = elevator.getX()
18 let x = (good.getX() - elevatorX)
19 // 水平移动
20 ht.Default.startAnim({
21 duration: Math.abs(col - elevator.a('col')) * animationUnit, // 动画周期毫秒数,默认采用`ht.Default.animDuration`
22 action: function (v, t) {
23 elevator.setX(elevatorX + x * v)
24 },
25 finishFunc: function () {
26 elevator.a('col', col)
27
28 // 底座垂直移动
29 let base = dataModel.getDataByTag(elevator.getTag() + ":底座")
30 if (floor > 1) {
31 baseUp(base, good, floor, true, false)
32 } else {
33 // 取货,出货
34 startHandAnimation(base, good, floor, true, false)
35 }
36 }
37 });
38 }
堆垛机上升动画实现:
1 function elevatorIn(elevator, good) {
2 console.log('elevatorIn')
3 var row = good.a('row')
4 var col = good.a('col')
5 var floor = good.a('floor')
6
7 let elevatorX = elevator.getX()
8 let goodP3 = good.a('p3')
9 let x = (goodP3[0] - elevatorX)
10 // 水平移动
11 ht.Default.startAnim({
12 duration: Math.abs(col - elevator.a('col')) * animationUnit, // 动画周期毫秒数,默认采用`ht.Default.animDuration`
13 action: function (v, t) {
14 elevator.setX(elevatorX + x * v)
15 },
16 finishFunc: function () {
17 elevator.a('col', col)
18
19 // 底座垂直移动
20 let base = dataModel.getDataByTag(elevator.getTag() + ":底座")
21 if (floor > 1) {
22 baseUp(base, good, floor, false, true)
23 } else {
24 // 送货
25 startHandAnimation(base, good, floor, false, true)
26 }
27 }
28 });
29 }
堆垛机动画:
1 // 堆垛机出货
2 function elevatorOut(elevator, good, goodIn) {
3 console.log('elevatorOut')
4 let elevatorX = elevator.getX()
5 let isLeft = elevator.getTag().startsWith('升降机L')
6 let start = isLeft ? LeftElevatorX : RightElevatorX
7 let xOffset = (start - elevatorX)
8
9 let t = isLeft ? Math.abs(elevator.a('col')) : Math.abs(colSize - elevator.a('col') + 1)
10 // 水平移动
11 ht.Default.startAnim({
12 duration: t * animationUnit, // 动画周期毫秒数,默认采用`ht.Default.animDuration`
13 action: function (v, t) {
14 elevator.setX(elevatorX + xOffset * v)
15 },
16 finishFunc: function () {
17 elevator.a('col', isLeft ? 0 : (colSize + 1))
18 if (!goodIn) {
19 startHandAnimation(dataModel.getDataByTag(elevator.getTag() + ":底座"), good, 1, false, goodIn)
20 }
21 }
22 })
23 }
24
25 // 堆垛机取货
26 function elevatorIn(elevator, good) {
27 console.log('elevatorIn')
28 var row = good.a('row')
29 var col = good.a('col')
30 var floor = good.a('floor')
31
32 let elevatorX = elevator.getX()
33 let goodP3 = good.a('p3')
34 let x = (goodP3[0] - elevatorX)
35 // 水平移动
36 ht.Default.startAnim({
37 duration: Math.abs(col - elevator.a('col')) * animationUnit, // 动画周期毫秒数,默认采用`ht.Default.animDuration`
38 action: function (v, t) {
39 elevator.setX(elevatorX + x * v)
40 },
41 finishFunc: function () {
42 elevator.a('col', col)
43
44 // 底座垂直移动
45 let base = dataModel.getDataByTag(elevator.getTag() + ":底座")
46 if (floor > 1) {
47 baseUp(base, good, floor, false, true)
48 } else {
49 // 送货
50 startHandAnimation(base, good, floor, false, true)
51 }
52 }
53 });
54 }
堆垛机底座和抓手动画:
1 // 抓手动画
2 function startHandAnimation(baseNode, goodNode, floor, pick, goodIn) {
3 console.log('startHandAnimation:', floor, pick, goodIn)
4 let elevator = baseNode.getParent()
5 // 抓手移动的方向
6 let isBack = goodNode.a('row') === elevator.a('row') * 2
7 baseNode.eachChild(hand => {
8 var z = hand.getY()
9 // 抓手动画
10 ht.Default.startAnim({
11 duration: 4000, // 动画周期毫秒数,默认采用`ht.Default.animDuration`
12 easing: function (t) {
13 if (t < 0.5) {
14 return t * 2
15 } else {
16 return (1 - t) * 2
17 }
18 },
19 action: function (v, t) {
20 if (t >= 0.5) {
21 if (pick) {
22 goodNode.setHost(hand)
23 } else {
24 goodNode.setHost(null)
25 }
26 }
27 if (goodIn) {
28 if (pick) { // 取货
29 hand.setY(z + 150 * v)
30 } else { // 放货
31 if (isBack) {
32 hand.setY(z - 150 * v)
33 } else {
34 hand.setY(z + 150 * v)
35 }
36 }
37 } else {
38 if (pick) { // 取货
39 if (isBack) {
40 hand.setY(z - 150 * v)
41 } else {
42 hand.setY(z + 150 * v)
43 }
44 } else { // 放货
45 hand.setY(z - 150 * v)
46 }
47 }
48 },
49 finishFunc: function () {
50 if (baseNode.a('floor') > 1) {
51 baseDown(baseNode, goodNode, floor, pick, goodIn)
52 } else {
53 if (elevator.a('col') === 0 || elevator.a('col') === colSize + 1) {
54 if (goodIn) { // 入库: 已完成取货动作, 升降机进入货架
55 elevatorIn(elevator, goodNode)
56 } else { // 出库:已将货物放置到输送机
57 // 移动到小车位置
58 startGoodOutAnimation(goodNode)
59 }
60 } else { // 将升降机移到货架外
61 elevatorOut(elevator, goodNode, goodIn)
62 }
63 }
64 }
65 });
66 })
67 }
68
69 // 底座上升
70 function baseUp(baseNode, goodNode, floor, pick, goodIn) {
71 console.log('底座上升:', baseNode.getTag())
72
73 var baseElevation = baseNode.getElevation()
74
75 let goodP3 = goodNode.a('p3')
76 var elevationOffset = (goodP3[1] - baseElevation)
77 // 上升
78 ht.Default.startAnim({
79 duration: (floor - 1) * animationUnit,
80 action: function (v, t) {
81 baseNode.setElevation(baseElevation + elevationOffset * v)
82 },
83 finishFunc: function () {
84 baseNode.a('floor', floor)
85 startHandAnimation(baseNode, goodNode, floor, pick, goodIn)
86 }
87 });
88 }
1 const g2d = new ht.graph.GraphView()
2 g2d.setPannable(false)
3 g2d.setRectSelectable(false)
4 g2d.handleScroll = function () {}
5
6 ht.Default.xhrLoad('displays/视角切换.json', function (json) {
7 g2d.dm().deserialize(json);
8 });
9
10 g2d.lookAtFront = function () {
11 eventbus.trigger('g3d.lookAtFront')
12 }
13 g2d.lookAtLean = function () {
14 eventbus.trigger('g3d.lookAtLean')
15 }
16 g2d.lookAtLeft = function () {
17 eventbus.trigger('g3d.lookAtLeft')
18 }
19 g2d.lookAtTop = function () {
20 eventbus.trigger('g3d.lookAtTop')
21 }
在线演示地址:http://www.hightopo.com/demo/wms/index.html
基于 WEB 的 WMS 3D 可视化管理系统的更多相关文章
- 《基于 Web Service 的学分制教务管理系统的研究与实现》论文笔记(十一)
标题:基于 Web Service 的学分制教务管理系统的研究与实现 一.基本内容 时间:2014 来源:苏州大学 关键词:: 教务管理系统 学分制 Web Service 二.研究内容 1.教务管理 ...
- 基于 HTML5 + WebGL 的 3D 可视化挖掘机
前言 在工业互联网以及物联网的影响下,人们对于机械的管理,机械的可视化,机械的操作可视化提出了更高的要求.如何在一个系统中完整的显示机械的运行情况,机械的运行轨迹,或者机械的机械动作显得尤为的重要,因 ...
- 基于 HTML5 + WebGL 实现 3D 可视化地铁系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- 基于 H5 + WebGL 实现 3D 可视化地铁系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- 基于WebGL架构的3D可视化平台ThingJS-搭建设备管理系统
国内高层建筑不断兴建,它的特点是高度高.层数多.体量大.面积可达几万平方米到几十万平方米.这些建筑都是一个个庞然大物,高高的耸立在地面上,这是它的外观,而随之带来的内部的建筑设备也是大量的.为了提高设 ...
- 基于 HTML5 WebGL 的 3D 仓储管理系统
仓储管理系统(WMS)是一个实时的计算机软件系统,它能够按照运作的业务规则和运算法则,对信息.资源.行为.存货和分销运作进行更完美地管理,使其最大化满足有效产出和精确性的要求.从财务软件.进销存软件C ...
- 基于WebGL架构的3D可视化平台—设备管理
---恢复内容开始--- 国内高层建筑不断兴建,它的特点是高度高.层数多.体量大.面积可达几万平方米到几十万平方米.这些建筑都是一个个庞然大物,高高的耸立在地面上,这是它的外观,而随之带来的内部的建筑 ...
- 基于Web的文件上传管理系统
一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...
- 基于WebGL架构的3D可视化平台—新风系统演示
新风系统是根据在密闭的室内一侧用专用设备向室内送新风,再从另一侧由专用设备向室外排出,在室内会形成“新风流动场”,从而满足室内新风换气的需要.实施方案是:采用高风压.大流量风机.依靠机械强力由一侧向室 ...
- 基于WebGL架构的3D可视化平台—实现小车行走路线演示
小车行走路线演示New VS Old 刚接触ThingJS的时候,写的一个小车开进小区的演示,今天又看了教程中有movePath这个方法就重新写了一遍,其中也遇到了一些问题,尤其突出的问题就是小车过弯 ...
随机推荐
- 先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了
简介: 函数计算 FC 首创 GPU 实例.业内首发实例级别可观测和调试.率先提供端云联调和多环境部署能力.GB 级别镜像启动时间优化至秒级.VPC 网络建连优化至200ms,Serverless ...
- IIncrementalGenerator 获取项目默认命名空间
本文将告诉大家如何在分析器里面获取到项目的默认命名空间 在 Roslyn 分析器里面读取项目的默认命名空间,可以通过读取项目的属性配置实现.通过 IIncrementalGenerator 增量 So ...
- 2018-12-26-WPF-开启-ScrollViewer-的触摸滚动
title author date CreateTime categories WPF 开启 ScrollViewer 的触摸滚动 lindexi 2018-12-26 14:24:26 +0800 ...
- keil 中未编译的代码灰色显示
一.转载文章 转载:KEIL,#ifdef宏定义下失效代码差异性显示 注意keil的版本,太低的版本不具备灰色显示,据我所知在KEIL uVersion V5.31版本以上均可以. 二.使能灰色显示 ...
- 实验2 C语言分支与循环基础应用编程 王刚202383310053
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define N 5 5 int ma ...
- 为什么我反对过度使用TypeScript?
前言 在2024年, TypeScript肯定算不上什么新鲜的技术. 但是经过长时间的使用, 我认为可以使用, 但是要适度. 类型跟不上业务的变化 我们知道TypeScript的类型定义是业务的体现. ...
- ansible(3)--ansible的相关命令行工具
目录 1 ansible命令详解 2 ansible-doc显示模块帮助信息 3 ansible-playbook 4 ansible-galaxy 5 ansible-console 1 ansib ...
- neo4j配置文件neo4j.conf详解
一.dbms配置 dbms.default_database=neo4j 目录路径 dbms.directories.data=datadbms.directories.plugins=plugins ...
- C 语言编程 — 数据类型转换
目录 文章目录 目录 前文列表 数据类型转换 隐式(自动)类型转换 常用的算术转换 显式(强制)类型转换 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法& ...
- 智能勘探 | AIRIOT智慧油田管理解决方案
石油勘探和开采地处偏远地区,涉及面广且生产规模大.特殊的作业环境下,使得工作人员作业条件艰苦,仅靠人工值守难度很大,不可避免的遇到一系列硬核挑战: 1.设备维护难度较高: 2.采油厂分布地域广.分 ...