前言
系统概述




应用场合及优势
安全管理将监控系统、告警系统、管理系统、巡更系统、停车系统等有机结合起来,实现一体化集成管理和系统联动。

具体应用例举
实现思路
// 隐藏选中边框
gv.getSelectWidth = () => { return 0 }
// 禁止图元移动
gv.setMovableFunc(() => { return false }) // 禁止缩放// 禁止移动
gv.setZoomable(false)// 禁止框选
gv.setRectSelectable(false)
// 隐藏滚动条
gv.setScrollBarVisible(false)
// 全局设置右键菜单禁用
window.document.oncontextmenu = () => { return false }由于结构是长屏,所以为了让使用普通屏幕的用户更加舒适,亦或是调试起来更方便,我们要做一些特殊处理:
// 水平滚动
gv.adjustTranslateY = (ty) => 0
// 限制平移范围
gv.adjustTranslateX = (tx) => {
let viewRect = gv.getViewRect(),
scrollRect = gv.getScrollRect(),
minX = (viewRect.width - scrollRect.width) * gv.getZoom()
tx = Math.max(minX, tx)
tx = Math.min(tx, 0)
return tx
}
gv.getScrollRect = () => {
// 根节点
return gv.dm().getDataByTag('contentRectNode').getRect()
}
this.fitContent()
// 窗口变化时调用
window.addEventListener('resize', () => {
this.fitContent()
})
// 界面展开
fitContent() {
const winInfo = ht.Default.getWindowInfo(),
contentRectNode = this.gv.dm().getDataByTag('contentRectNode'),
height = contentRectNode.getHeight(),
zoom = winInfo.height / height
if (!height) {
ht.Default.callLater(() => {
this.fitContent()
})
return
}
this.gv.adjustZoom = () => zoom
this.gv.setZoom(zoom)
}中部场景是通过 renderHTML 将一张新的图纸渲染到 2D 页面上,HT 的图纸又是 Canvas 实现,renderHTML 的 DOM 一定在 Canvas 之上,所以我们将图纸的中心掏一个洞出来,然后修改两部分的层级位置来使得效果更佳:
// 对 2D 图纸的层级设置
gv.getCanvas().style.zIndex = 300
// 对 3D 场景的层级设置
g3d.getView().style.zIndex = 200首先来看一下半圆菜单栏部分,我们先给图标中元素绑定好属性,明确要驱动的部分,即小扇形的横纵缩放比、颜色透明度,提示框的裁切比等,然后通过改变状态来区分不同的选项:

还有个面板中是扇形图的轮播,也是通过提前绑定好属性,然后起个定时器来切换它的状态,风格一致,相同的动画效果我们一起来看一下:

下面介绍一下表格的动画效果实现:

表格控件基于 HT 矢量封装,为方便我们后期开发,内部暴露了多种属性可以调配以达到想要的效果。如此好看的 UI 也是一大亮点,我们可以提前设计好图标,然后配置列定义 columns 属性将它绘制成表格的行,其中滚动部分通过表格的行高来计算。然后再按时增加它的变化系数 num 的值就可以实现表格滚动的动画了。关于动画函数在我之前的文章中都有提到,这里就不再做过多赘述,有兴趣的朋友可以点查看进来学习。

得益于 HT 图标库的庞大和实用,多种类型的面板以及风格设计层出不穷:


这个轮播图的动效制作方式与表格相仿,首先还是传入我们绘制好的图标,在 drawItem 函数中,接着我们算好系数来写个动画做偏移。

关于这个萌萌的小机器人部分,我给大家拆分讲解一下。第一部分是机器人的整体,它的表情是可以切换的跟上述我们提到的菜单切换差不多,都是切换状态,我们通过不同的状态来切换不同的脸皮图标。再者其后面的动画也做得很细节,分别是一些光球的背景上升和本身的浮动以及底部光晕的缩放。将背景的光球抽离出来做成一个图标放在后面做成背板,注意要比原来长一些,我是将内部元素复制成双份,然后延长一倍尺寸。而后打开图标的裁剪属性使超出图标部分隐藏起来,说到这里大家可能已经想到了,然后再调整这个图标的纵偏移就可以了。

停车场的建筑群明暗度变化也是通过此方式实现。流动线条是对每个线条的裁切比例来操作,让它按照某个方向生长出来:

车辆的变化是通过一种随机的计算方式来修改它们的显隐,位置都是提前摆放好的,这样最便捷。
// 禁止拖动
gv.setMovableFunc(() => { return false })
// 隐藏选中边框
gv.getWireframe = (d) => { d.s('wf.visible', false) }
// 设置眼睛
gv.setEye([-38, 729, 1109])
// 设置中心点
gv.setCenter([-35, -4, 218])
// 设置远端位置
gv.setFar(500000)
// 设置近端位置
gv.setNear(50)
// 设置交互限制
gv.setInteractors([ new ht.graph3d.MapInteractor(gv)])
// 设置天空球
gv.setSkyBox(this.dm.getDataByTag('skyBox'))
gv.setHighlightMode('mouseover')
初始场景的模型升起我们通过修改特定坐标轴的模型缩放来实现。

其中还可以观察到一些光条的升起效果,这里我们将所有光条分成一组来驱动,使整个整体纵向偏移。为了让效果不突兀,我们再对其透明度进行修改,使其明暗也随之渐入渐出。

所有科技风的 3D 场景中都离不开 uv 偏移这一效果,设计师们可以大显身手,绘制丰富的贴图来给模型增添光彩,程序员通过代码来偏移 uv 贴图使得产生酷炫的效果:

值得一提的还有这个波纹扩散的动画,之前 2D 界面也有用到这个效果:


在三维场景中,这个元素的类型为 billboard,打开 3D 可交互即可开放我们对这些 billboard 做的动画,扩散其实是一个圆的横纵缩放的过程,同时透明度也逐渐变浅,从而产生水波的效果。还有个常用的动画其实在场景中应用很广泛:

其实就是旋转动画,根据模型的锚点位置,修改某个方向坐标轴的角度变化,飞鸟、小船和声浪图都应用了这种方式:


总结
通过 HT for Web 丰富完善的图标库资源的支持,使得组态设计变得更加的简单便捷。除了楼宇和园区还广泛应用于电信网络拓扑和设备管理,以及电力、燃气等工业自动化 (HMI/SCADA) 领域。同时 HT 的成功与完善更是离不开广大用户的支持。各行各业提供的专业需求,使得它越发的完善。欢迎更多大佬加入,这将使得数据可视化有无限的可能。
2019 我们也更新了数百个工业互联网 2D/3D 可视化案例集,在这里你能发现许多新奇的实例,也能发掘出不一样的工业互联网:《分享数百个 HT 工业互联网 2D 3D 可视化应用案例之 2019 篇》,更多行业应用实例可以参考官网案例链接: