前言目前的棉花加工行业还停留在传统的被动维护模式。当棉花加工厂的设备突然出现故障时,需要更换控制程序。在这种情况下,客户首先需要要求设备制造商派技术人员进行维护,然后制造商可以根据情况派员到现场进行处理。由于棉花加工设备分布在中国各地,甚至出口到世界各地,从客户响应问题到厂家派员到现场的时间会很长,短则一天,长则到一些偏远的地方.为企业生产活动的继续。传统的被动式维护存在以下缺点:售后服务响应速度慢;维护成本高;生产效率低;停机率高;管理成本高;无法应对合格工程师的短缺。远程监控系统主要是通过分布在棉花加工生产线各设备中的传感器、开关量信号、视频监控设备、PLC控制器等装置,通过智能联网设备接入互联网和局域网,从而实现远程监控。随时掌握生产经营状况,建立全网监控数据和在线知识资源库,根据现场采集的设备运行数据进行远程诊断和在线维护。http://www.hightopo.com/demo/...创建场景的代码实现首先是创建一个3D场景(https://hightopo.com/guide/gu...),通过添加元素在场景中将数据保存在数据容器中(https://hightopo.com/guide/gu...):vardm=newht.DataModel();//datacontainervarg3d=newht.graph3d.Graph3dView(dm);//3D组件g3d.addToDOM();//添加3D组件到body上面代码中的addToDOM方法是通过getView方法将调用该方法的组件获取到该组件的底层div中,然后将此div添加到正文中。HT组件一般嵌入在BorderPane、SplitView、TabView等容器中,而最外层的HT组件需要用户手动将getView()返回的底层div元素添加到页面的DOM元素中。这里需要注意的是,当父容器的尺寸变化时,如果父容器是BorderPane、SplitView等HT预定义的容器组件,HT容器会自动递归调用子组件的invalidate函数通知更新.但是如果父容器是原生的html元素,HT组件无法知道它需要更新,所以最外层的HT组件一般需要监听window的窗口大小变化事件,调用最外层组件的invalidate函数更新。为了方便加载最外层组件填满窗口,HT的所有组件都有addToDOM函数,实现逻辑如下,其中iv是invalidate的简写:addToDOM=function(){varself=this,view=self.getView(),//获取组件底层divstyle=view.style;document.body.appendChild(view);//将组件底层div添加到body中style.left='0';//ht默认所有组件的位置都设置为absolute绝对定位style.right='0';style.top='0';style.bottom='0';window.addEventListener('resize',function(){self.iv();},false);//窗口大小变化事件,调用刷新函数}整个环境搭建完成后,我们需要添加3D模型到场景并安排位置。这里我们将整个场景的模型和模型的放置位置放在一个JSON格式的文件中,然后通过将JSON文件反序列化到数据容器DataModel中,将JSON文件中的场景内容和模型的放置位置可以呈现:ht.Default.xhrLoad('scenes/cotongrabingmachine.json',function(text){//加载JSON文件dm.deserialize(text);//将JSON反序列化到数据容器中});上面出现的ht.Default.xhrLoad方法是一个用于异步加载文件的封装函数。您可以使用此方法加载JSON文件。因为该方法是异步加载的,如果要操作该函数反序列化后的数据容器中的元素,后续操作需要使用该函数。场景动画因为整个场景中的元素都是从这个JSON文件中反序列化出来的,所以这个JSON文件中只保存了场景的内容,不包括动画和交互。元素不同部分的动画也不同。我们需要将这些元素分别取出来,这里通过dm.getDataByTag(tag)方法(https://hightopo.com/guide/gu...,该方法通过tag的唯一标识获取节点的信息:varequipment=dm.getDataByTag('equipment');//获取轧棉机节点varhand=dm.getDataByTag('hand');//获取轧棉机“hand”节点varlight=dm.getDataByTag('light');//获取轧棉机顶部指示灯的节点获取到需要动画的节点后,这里我使用动画插件setAnimation(https://hightopo.com/guide/gu...,动画插件更进一步对动画进行了封装,用户只需要用一个描述性的描述HT就可以自动实现动画过程。动画插件可以平滑的缓和一个或多个属性值(例如宽度,高度,不透明度等)图元从一个值到另一个值,同时提供丰富的缓动方法来实现各种效果。但是在使用这个插件之前,必须先引入ht-animation.js文件:<脚本src="ht.js">一共有三部分带动画,采用的方法大致相同,这里只针对全身轧棉机左右运动的动画。equipment.setAnimation({//动画调用方法moveDown:{//定义了一个叫moveDown的动画过程,将图元的x轴坐标从623变为-256from:623,//开头的属性值theanimationto:-256,//动画间隔结束时的属性值:equipInterval,//动画间隔,单位msnext:["moveUp"],//字符串类型,指定当前动画完成后,对于下一个要执行的动画,可以组合多个动画onUpdate:function(value){//回调函数,每一帧动画都会回调这个函数this.setX(value);//设置x轴node的值为当前动画的值fromtototoformPane.getItemById('xValue').element=value.toFixed(2);//获取form表单上的xValue元素,同时改变这个值timeformPane.iv();//Form内容改变后,要通知窗体刷新改变}},moveUp:{//定义一个动画过程,名字为moveUp,改变图元的x轴坐标从-256到623从:-256,到:623,间隔:equipInterval,下一个:[“moveDown”],onUpdate:function(value){this.setX(value);formPane.getItemById('xValue').element=value.toFixed(2);表单面板.iv();}},start:['moveDown']//start是一个数组,用于指定一个或多个动画开始});注意,要使用动画,首先首先,您需要调用ht.DataModel#enableAnimation(interval)来启动全局动画计时器。默认间隔为16毫秒。如果不设置此参数值,DataModel定时器将每隔16ms左右遍历一次其所有Data。根据动画DataConfigure执行动画dm.enableAnimation();form的创建前面代码中出现的form表单(https://hightopo.com/guide/gu...,是通过createForm方法创建的,定义如下(PS:由于表单表单列表有点长,这里用一些有代表性的表单元素来说明一下)://创建表单formfunctioncreateForm(){varfp=newht.widget.FormPane();//创建表单组件实例fp.setWidth(200);//设置表单组件的宽度fp.setHeight(250);//设置表单组件的高度fp.getView().style.top='8%';//设置表单组件的样式fp.getView().style.right=0;fp.getView().style.background='rgba(255,255,255,0.3)';document.body.appendChild(fp.getView());//添加表单组件在body中添加底层divvarequipment=dm.getDataByTag('equipment');//通过tag的唯一标识获取元素varhand=dm.getDataByTag('hand');fp.setLabelAlign('right');//设置表单的文本对齐方式fp.addRow([//向表单添加一行该方法的第一个参数是一个元素数组,一行中可以添加多个元素{//元素一显示文本内容为“机器号”element:'Machinenumber',color:'#fff'},{//元素二显示文本为“Machine”element:'Machine',color:'#fff'}],[0.1,0.1]);//第二个参数是每个元素的宽度信息数组。width值大于1表示固定的绝对值,较小的值等于1代表一个相对值,也可以是80+0.3的组合{//元素1显示文字内容为“机器编号”element:'抓棉机动画',color:'#fff'},{//第二个元素的文字内容为按钮元素button:{label:'Start',onClicked:function(){//点击按钮触发事件启动轧棉机左右动画dm.enableAnimation();//启动全局动画定时器varlight=dm.getDataByTag('light');if(!light)return;lightColor(light);colorTimer=setInterval(function(){lightColor(light);},1000);}}},{button:{label:'Stop',onClicked:function(){//按钮点击触发事件,关闭gin左右动画dm.disableAnimation();//停止全局动画定时器clearInterval(colorTimer);varlight=dm.getDataByTag('light');if(light)light.s('all.color','rgba(0,0,255,0.51)');}}}],[0.2,0.1,0.1]);//将所有三个元素组合成一行分配显示宽度fp.addRow([//向表单添加一行该方法的参数是一个数组,并且可以连续添加多个元素{//元素1将文本内容显示为“汽车行走速度”element:'carWalkingspeed',color:'#fff'},{//元素2将文本内容显示为滑块id:'slide',slider:{//slidervalue:equipInterval,//slider当前值min:0,//slider最小值max:300,//slider最大值step:20,//每个slider的值movesteponValueChanged:function(){//滑块值变化触发事件varanim=dm.getDataAnimation(equipment);//获取参数数据的动画配置anim.moveDown.interval=this.getValue();//设置moveDown动画的区间内容anim.moveUp.interval=this.getValue();//设置moveUp动画的区间内容}}}],[0.1,0.1]);fp.addRow([//在表格中添加一行该方法的参数是一个数组,可以在一行中添加多个元素{element:'X-axis',color:'#fff'},{id:'xValue',element:equipment.getX().toFixed(2),//获取轧棉机当前x轴值颜色:'#fff'}],[0.1,0.1]);returnfp;}这就是有趣的部分。如果大家有什么建议和意见,欢迎留言或者私信哦~或者去官网(https://hightopo.com/)查看相关信息总结一下,以前很少用动画动画,而这次是专门用来仔细研究动画的机制的。animation设置的动画可以“和平”的改变值,动画看起来也更有效。更有条理;当然也有可以设置下一个动画的操作。这种设计也非常人性化;同时可以通过getDataAnimation获取对象的动画配置,通过该方法可以重新配置对象的动画。这些优势都值得与你分享
