基于 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这个方法就重新写了一遍,其中也遇到了一些问题,尤其突出的问题就是小车过弯 ...
随机推荐
- 用手机「3D探店」是种什么体验?
简介: 未来场景尽在眼前!阿里云3D全景网站通过云端算法技术自动建模,将线下场景1:1真实还原到线上,让用户足不出户就可以感受到真实的3D空间漫游效果. 在手机里用3D探店打卡是种什么样的体验? 走进 ...
- 大模型必备 - 中文最佳向量模型 acge_text_embedding
近期,上海合合信息科技股份有限公司发布的文本向量化模型 acge_text_embedding 在中文文本向量化领域取得了重大突破,荣获 Massive Text Embedding Benchmar ...
- SQL 多表关联更新语句
A表WHERE条件来自B表查询结果集 UPDATE a SET a.is_sync = 0 FROM A表 a LEFT JOIN B表 b ON a.order_id = b.order_id AN ...
- CF522D Closest Equals 离线扫描 + 线段树
CF522D Closest Equals 题意:m 个询问,求 [l,r] 内相同元素的最小距离. 离线询问,按右端点排序. 对于每一个 a[i],如果 last[a[i]] 存在,将线段树 las ...
- 普冉PY32系列(十五) PY32F0系列的低功耗模式
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 五:瑞芯微RV1109
瑞芯微RV1109是一款用于工控机或人工智能视觉应用的高性能机器视觉处理器SoC. 参考资料 http://www.neardi.com/news_22/434.html https://www.ro ...
- blazor中的PageTitle输出keywords和description,自定义组件
在blazor的PageTitle中不具备输出keywords和description的功能,而如果直接使用<mate>标签,输出中文时会变成乱码,所以我给大家推介下面的代码解君愁: 1 ...
- k8s-nginx实战部署1
目录 yaml 资源清单 run_deploy.sh .gitlab-ci.yml yaml 资源清单 deploy.yaml apiVersion: v1 kind: ConfigMap metad ...
- vben集成keycloak
前言 公司的项目是vben admin框架需要集成keycloak,那keycloak大家应该都不陌生了,就是统一认证的一个系统简称IDS.之前用过cas,并重构过cas的前端界面,所以对此也是比较熟 ...
- Unity Linear Gamma色彩空间矫正测试
Gamma和Linear修正的问题相信网上已经有很多文章了.简单来说显示器的颜色输出不是线性的,根据硬件参数和输出颜色 信息拟合曲线是x^2.2,因此会使用一个x^0.45曲线将其拟合回线性. 因为0 ...