整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          科技:基于 HTML5 WebGL 的水泥工廠數據可視化系統

          如今的制造行業,基于數據進行生產策略制定與管理已經成為一種趨勢,特別是 工業4.0 的浪潮下,數據戰略已經成為很多制造企業的優先戰略,而數據可視化以更直觀的方式,幫助指導決策,成為數據分析傳遞信息的重要工具。通過數據可視化系統助力實現數據驅動的工業世界,為 工業4.0 提供更加靈活、敏捷、高效、個性化的數據支撐。

          今天就給大家帶來一個采用 Hightopo 的 HT for Web 產品實現了一個水泥工廠可視化系統。

          系統預覽

          <script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>

          系統實現

          本案例共有七個系統:

          • 數據概況 -- 展示全廠年月時間單位的各項數據概況
          • 窯系統運行 -- 用窯工藝流程動畫展示窯系統實時運行狀態
          • 系統運行情況 -- 用動畫流程圖展示整個系統運行情況
          • 生料質量控制 -- 用圖表和流程圖展示各種生料的配比情況
          • 材料質量控制 -- 用動畫流程圖展示各種材料的配比情況
          • 煤粉質量控制 -- 用圖表和流程圖對煤粉質量進行監控
          • 智能物流 -- 通過 3D 場景實時監控進出廠車輛,和各項原料運輸情

          子系統頁面切換

          切換不同的系統時,左側菜單和頂部標題是不需要切換的,所以我們把需要切換的內容部分別放在不同的 Block 中,Block 類型,本身不繪制任何內容,用于作為其它節點的父節點,可以與子節點同步大小,當它隱藏或顯示時,所有的節點都會跟著隱藏或顯示。所以當我們切換子系統時只需要控制對應的 Block 顯示隱藏,而不需要去加載切換多張圖紙。


          流向地圖

          在數據概況頁面中,流向地圖展示年度水泥向各地區的銷售情況,這里我們用 Shape 類型繪制線段來連接源地和匯地,用流動效果表示銷售關系。流動效果只需引入 HT 的 ht-flow.js 插件,即可通過簡單的屬性設置實現,代碼如下:

          // 獲取線段的父節點
          this.flowParent = dm.getDataByTag('saleFlowParent');
          // 遍歷得到所有線段
          this.flowParent.eachChild(child => {
              // 開啟流動,設置流動樣式
              child.s({
                  // 開啟流動
                  'flow': true,
                  // 設置流動組中最大元素的尺寸
                  'flow.element.max': 4,
                  // 設置流動組中的元素的漸變陰影中心顏色
                  'flow.element.shadow.begincolor': '#49e5fe',
                  // 設置流動組中的最大元素的漸變陰影尺寸
                  'flow.element.shadow.max': 16,
                  // 設置流動組中的元素的漸變陰影邊緣顏色
                  'flow.element.shadow.endcolor': 'rgba(73, 229, 254, 0)',
              });
          });


          窯內系統動畫

          在窯系統運行頁面中,窯工藝流程動畫很直觀的展示了窯系統實時運行狀態。畫面中火焰、水和材料在傳送帶上運輸的動畫效果,為了在性能較差的設備上也能流暢運行,我通過切換不同矢量圖形的方式實現。這里用到了 HT 矢量中狀態機制,先繪制多個不同的矢量組件,每個組件都可以定義狀態來決定自己在哪個狀態下顯示,只要通過 data.s('state') 修改節點狀態就可以實現如下效果:

          使用一個定時器,不斷地改變節點的狀態值,相關代碼如下:

          this._stateTimer = setInterval(() => {
              stateNodes.forEach(node => {
                  this.stateAnimation(node);
              });
          }, 180);
          //切換狀態
          stateAnimation(node) {
              let stateIndex = (node.a('stateIndex') || 0) % stateEnum.length,
                  state = stateEnum[stateIndex].value;
              node.s('state', state);
              node.a('stateIndex', ++stateIndex);
          }


          流程圖動畫

          流程圖中流動線同樣是使用 ht-flow.js 插件實現。由于圖紙上的線段比較多,我把不同的線段分組放在不同的 Block 下,遍歷其子節點設置樣式,代碼如下:

          //設置節點透明度setNodeOpacity (data, value = 0.5) {    if (data instanceof ht.Block) {        data.eachChild(child => {            this.setNodeOpacity(child, value);        });    }    else {        data.s('opacity', value);    }}

          為了使動畫看起來更順暢,我給一些節點加上透明度動畫,設置節點透明度的代碼如下:

          //設置節點透明度
          setNodeOpacity (data, value = 0.5) {
              if (data instanceof ht.Block) {
                  data.eachChild(child => {
                      this.setNodeOpacity(child, value);
                  });
              }
              else {
                  data.s('opacity', value);
              }
          }

          接下來只需要按次序執行動畫:

          //開始流程圖動畫
          start() {
              let {eo, eoInput, eoLine1, eoKind, eoCalu} = this;
              //工況輸入透明度動畫
              this.gv.enableFlow(30);
              this.setNodeOpacity(eo);
              this.setNodeFlow(eo, false);
              (new Promise((resolve, reject) => {
                  this.animtion = startAnim({
                      frames: 16,
                      interval: 5,
                      finishFunc: () => {resolve()},
                      action: (v, t) => {
                          this.setNodeOpacity(eoInput, 0.5 + 0.5 * v);
                      }
                  });
              })).then(() => {
                  //連線連線透明動畫,流動
                  return new Promise((resolve, reject) => {
                      this.animtion = startAnim({
                          frames: 12,
                          interval: 10,
                          finishFunc: () => {
                              this.setNodeFlow(eoLine1, true);
                              this.timer = setTimeout(() => {resolve()}, 1500);
                          },
                          action: (v, t) => {
                              this.setNodeOpacity(eoLine1, 0.5 + 0.5 * v);
                          }
                      });
                  })
              }).then(() => {
                  //軟計算透明動畫
                  return new Promise(resolve => {
                      this.animtion = startAnim({
                          frames: 16,
                          interval: 5,
                          finishFunc: () => {resolve()},
                          action: (v, t) => {
                              this.setNodeOpacity(eoKind, 0.5 + 0.5 * v);
                              this.setNodeOpacity(eoCalu, 0.5 + 0.5 * v);
                          }
                      });
                  });
              }).then(() => {
                  //軟計算透明虛線流動
                  return new Promise(resolve => {
                      this.setNodeDashFlow(eoKind, true);
                      this.setNodeDashFlow(eoCalu, true);
                      this.timer = setTimeout(() => {
                          this.setNodeDashFlow(eoKind, false);
                          this.setNodeDashFlow(eoCalu, false);
                          resolve();
                      }, 3000);
                  });
              }).then(() => {
                  ......
              })
          }


          智能物流

          前面六個子系統均為 2D 界面,而智能物流頁面則是嵌入了一個 3D 場景。實現方式是通過定義 HT 矢量 JSON 的 renderHTML 函數屬性,可實現在 GraphView 拓撲圖上,嵌入任意第三方 HTML DOM 元素。不過這里也要注意一點,HT 的圖紙是 Canvas 實現的,renderHTML 的 DOM 元素一定在 Canvas 之上,使用 renderHTML 的 DOM 與常規 Canvas 上繪制的圖元不可能有層級控制可能性。下面展示一下 renderHTML 函數屬性里的代碼:

          renderHTML : function (data, gv, cache) {
              // 避免重復創建g3d
              if (!cache.g3d) {
                  // 創建 3D 視圖組件
                  var g3d = cache.g3d = new ht.graph3d.Graph3dView();
                  // 布局函數,根據圖元的位置信息擺放HTML元素
                  g3d.layoutHTML = function () {
                      gv.layoutHTML(data, g3d, true);
                  };
                  // 阻止事件冒泡
                  g3d.getView().addEventListener('mousedown', function (event) {
                      event.stopPropagation();
                  });
                  g3d.getView().addEventListener('touchstart', function (event) {
                      event.stopPropagation();
                  });
              }
              // 獲取圖元自定義屬性sceneURL的值
              var sceneURL = data.a('sceneURL');
              // 獲取圖元自定義屬性onPostDeserialize的值
              var onPostDeserialize = data.a('onPostDeserialize');
              // 當圖元自定義屬性sceneURL改變時,清除舊dataModel,反序列化新的sceneURL
              if (cache.g3d.sceneURL !== sceneURL) {
                  cache.g3d.dm().clear();
                  cache.g3d.sceneURL = sceneURL;
                  if (sceneURL) {
                      cache.g3d.deserialize(sceneURL, function (json, dm, g3d, datas) {
                          // 在反序列化后的回調函數中,執行onPostDeserialize函數
                          onPostDeserialize && onPostDeserialize(json, dm, g3d, datas);
                      });
                  }
              }
              return cache.g3d;
          }

          3D場景嵌入后,接下來實現水泥廠內的車輛動畫。根據后臺傳來車輛進入工廠的數據,我們創建運載不同原料的車輛模型,讓它們沿著不同的路徑抵達對應的廠房。同樣是用 Shape 類型事先繪制好路徑,根據 Shape 的 Points 和 Segments 信息,實現車輛沿著路徑行駛動畫。相關代碼如下:

          carAnimation(car, path, duration) {
              // 車輛行駛動畫
              ht.Default.startAnim({
                  duration: duration,
                  easing: Easing.easeNone,
                  action: function (v, t) {
                      // 設置偏移量
                      let offset = Math.floor(v * 100);
                      // 根據偏移量得到在路徑上的點坐標
                      let position = ht.Default.getPercentPositionOnPoints(path.getPoints(), path.getSegments(), offset);
                      // 根據偏移量得到在路徑上的點于路徑切線角度
                      let angle = ht.Default.getPercentAngle(path.getPoints(), path.getSegments(), offset);
                      // 設置車輛位置坐標及旋轉角度
                      car.setX(position.x);
                      car.setY(position.y);
                      car.setRotationY(Math.PI / 2 - angle);
                  },
              });
          }


          總結

          工業互聯網是工業發展的必經之路,我們國家是一個工業大國,正處在工業轉型升級的關鍵時刻,面臨著人工成本上升、原材料價格波動、貿易競爭日益加劇等問題,迫切需要提高效率、降低生產成本。只有堅定不移地推動工業互聯網落地,加快更多企業的數字化轉型和智能化改造,才有能讓在全球化競爭中立于不敗之地。可視化作為智能化數字化的最后一環,讓復雜抽象的數據變得真正可知可感,幫助決策者發現規律,洞悉未來,為企業提速增效。

          2019 我們也更新了數百個工業互聯網 2D/3D 可視化案例集,在這里你能發現許多新奇的實例,也能發掘出不一樣的工業互聯網:《分享數百個 HT 工業互聯網 2D 3D 可視化應用案例 》,更多行業應用實例可以點擊“了解更多” 。

          者:劉萍萍(國家高級營養師,高級健康管理師)

          在有些人看來,水不能反復燒,也不能殘留一部分水再燒,因為會導致亞硝酸鹽、鈣、鎂等物質不斷積累,人喝了這樣的水會中毒,甚至致癌。其實,水反復燒還能喝嗎?水壺里殘留一部分水再燒是不是不健康?隔夜的水能喝嗎?

          水反復燒還能喝嗎?

          有些人認為,水反復燒會導致水中亞硝酸鹽增多,人喝了這樣的水會引發中毒甚至致癌。

          飲用水里含有的亞硝酸鹽,一般是由水中原有的硝酸鹽轉化而來的。在飲用水反復燒開后,由于高溫缺氧,部分硝酸鹽轉化為亞硝酸鹽。另外,由于水的蒸發,也會導致亞硝酸鹽濃度增加[1]。

          攝入含有低水平亞硝酸鹽的食物可補充人體內的亞硝酸鹽。但如果一次性攝入過多的亞硝酸鹽,則容易引起急性中毒,使血液中具有正常攜氧能力的低鐵血紅蛋白氧化成高鐵血紅蛋白,失去攜氧能力,造成組織缺氧,稱為高鐵血紅蛋白血癥。

          當亞硝酸鹽攝入量達到0.2-0.5克的時候,可導致中毒,超過3克的時候,可致人死亡[2]。

          聯合國糧農組織和世界衛生組織聯合食品添加劑專家委員會(JECFA)規定亞硝酸鹽的每日允許攝入量為每公斤體重0-0.2毫克[2]。對于一個體重60公斤的成年人來說,相當于每天亞硝酸鹽的允許攝入量為0-12毫克。

          那么,反復燒開的水里有多少亞硝酸鹽呢?

          2007年,上海市崇明縣疾病預防控制中心的一篇研究顯示,對于新鮮桶裝礦泉水,隨著反復加熱次數的增多,熱水中的亞硝酸鹽含量逐漸升高,在加熱到52次后,亞硝酸鹽的含量為2.3微克/升[3]。

          2010年,衡陽師范學院的一項研究,則把桶裝純凈水反復加熱181次,結果水中亞硝酸鹽的含量在3-4微克/升之間[4]。

          不管是加熱52次,還是181次,結果都小于我國包裝飲用水(礦泉水除外)、礦泉水中亞硝酸鹽的最高限量值5微克/升、100微克/升[5]。

          更為關鍵的是,如果想要達到0.2克亞硝酸鹽這個急性中毒的劑量,可不是隨便喝幾杯水就能做到的,需要一次性喝好幾萬升水。很顯然,這是不可能的。

          如果是自來水加熱呢?

          2011年,哈爾濱工業大學則對符合國家標準的自來水進行反復燒開5次的研究,結果并沒有檢測到亞硝酸鹽的存在。即便人為加入一定量的亞硝酸鹽,隨著煮沸次數的增加,亞硝酸鹽的質量也沒有提高[1]。

          在我們日常生活中,把飲用水反復加熱幾十上百次的現象并不多見,只要本身是合格的飲用水,大可不必擔心亞硝酸鹽含量超標導致中毒的問題。

          記住那句簡單粗暴的話——脫離劑量談毒性都是耍流氓。

          至于致癌也是不用擔心的。因為亞硝酸鹽并不是致癌物,在特定條件下生成的“亞硝胺”才是致癌物[6]。

          因此,我們一般無需擔心喝幾杯反復燒開的水,會發生亞硝酸鹽中毒,或是致癌的問題。

          水壺里殘留一部分水再燒是不是不健康?

          有些人疑惑,如果水壺里殘留一部分水再燒是不是不健康?如果是指亞硝酸鹽超標的問題,那是不需要擔心的,因為道理與飲水機里的水反復加熱是一樣的。

          如果是說水質變硬,有害物質增加的問題,同樣也不用太擔心。

          先說水質變硬的問題。水的硬度主要是水中鈣、鎂等礦物質的作用,如果水中礦物質多,水質就偏硬,反之則偏軟。

          如果本身是比較硬的水,含有較多的鈣、鎂,在加熱煮沸后,會生成碳酸鈣等不溶性物質,俗稱水垢,沉淀下來,結果反而是降低水的硬度。

          如果本身就是基本不含雜質的純凈水,水壺里殘留一部分水再燒,雖然一定程度上會使里面的鈣、鎂礦物質累積,但最終同樣可以生成水垢沉淀下來。

          關鍵是,鈣、鎂這類礦物質本身就不是什么對人體有害的物質,喝較硬的水一定程度上還可以幫助我們補充鎂、鈣等礦物質。有一些研究顯示,硬度較高的水可能對多種心血管疾病具有有益作用[7]。

          再說有害物質增加的問題,如果本身就是合格的飲用水,只要不被有害物質污染,那么,有害物質不會無中生有,就算因為是上一次殘留的部分水重新加熱,導致有害物質累積,也不會太多,一方面,是因為一般帶蓋子燒水,蒸發掉的水不多,另一方面,是因為會加新的水進去一起燒。

          另外,這個有害的前提是,有害物質總是在一次次加熱中沉淀下來的,那萬一有害物質可以揮發掉呢?反復加熱豈不是在降低有害物質含量?

          所以,水壺里殘留一部分水再燒是否不健康這個問題,是不需要太擔心的。

          隔夜的水能喝嗎?

          隔夜水也是很多人擔心的,擔心細菌污染,擔心亞硝酸鹽增多。

          其實,對于燒開的白開水來說,因為經過高溫煮沸,水中大部分細菌已經被殺死了。如果能夠合理存放,不需要擔心細菌滋生的問題。當然,如果沒有密封保存、溫度過高等,則存在這方面的風險。

          至于亞硝酸鹽的問題,有研究發現煮沸后放置的隔夜水中亞硝酸鹽含量為1090微克/升[8],已經超過了我國現行《GB 5749-2006 生活飲用水衛生標準》中規定的亞硝酸鹽限量值1000微克/升[9]。

          不過,如前面所說,亞硝酸鹽攝入量至少達到0.2克時才可引起急性中毒,因此,喝一兩杯隔夜水不會那么容易就亞硝酸鹽中毒。

          如果是包裝飲用水呢?有研究測定發現5種品牌飲用水,在打開隔夜后都開始檢出亞硝酸鹽,分別為1.5微克/升、1.3微克/升、5.0微克/升、2.1微克/升、1.9微克/升,但結果也都沒有超出我國包裝飲用水(礦泉水除外)、礦泉水中亞硝酸鹽的最高限量值5微克/升、100微克/升[8]。

          因此,對于隔夜水,只要能合理存放,如密封保存[10]、保持溫度不過高等,一般來說,是可以放心喝的。當然,煮沸后的水還是不要放太久,盡量不要放置過夜,特別是天氣比較熱的情況下。

          參考資料:

          [1] 沈倩青,張光明.飲用水反復燒開對水質的影響.環境科學與技術, 2011, 34(5):128-130

          [2] 國家食品藥品監督管理總局(CFDA).關于亞硝酸鹽的科學解讀.2016年08月18日 發布.http://www.sda.gov.cn/WS01/CL1679/163400.html

          [3] 梁成可,陳華.飲水機反復加熱對桶裝礦泉水中亞硝酸鹽含量的影響.上海預防醫學, 2007, 19(7):343-3446.

          [4] 鄒伶俐,張雪姣.桶裝純凈水在使用過程中亞硝酸鹽污染的初步研究

          [5] 《食品中污染物限量》(GB 27620 2017)

          [6] 香港食物安全中心.食物中的硝酸鹽.http://www.cfs.gov.hk/sc_chi/multimedia/multimedia_pub/multimedia_pub_fsf_25_01.html5.

          [7] 馬冠生 主譯.世界衛生組織(WHO)飲用水中的營養素.人民衛生出版社.http://apps.who.int/iris/bitstream/handle/10665/43403/9787117242295-chi.pdf?sequence=7&ua=1

          [8] 鮑若晗.飲用水中亞硝酸鹽的測定與分析.糧食流通技術.2016

          [9] 《生活飲用水衛生標準》(GB 5749-2006)

          [10] 王凡 , 韓曦 , 王重芳.某校茶爐飲用水高亞硝酸鹽狀況及產生機理研究.現代預防醫學.2007

          圖片來源:圖蟲創意

          版權聲明:本文為春雨醫生原創稿件,版權歸屬春雨醫生所有,未經授權禁止轉載。

          (來源:春雨醫生)

          教程的效果基本上都是用圖層樣式來完成。大致過程:先設定好文字,文字選擇類似液體的字體,然后給文字添加樣式做出水滴質感,再在文字周圍加上一些小水滴即可

          完成效果

          一,選取“文件/創建”菜單,打開“創建”或Ctrl+N對話框 名稱為:液體字體做,寬度:為800像素, 高度:為600像素, “分辨率”為72 , “模式”為RGB色彩的文檔,見下圖1

          二,在圖層控制面版擊創建圖層按鈕,創建一圖層一,選取工具箱漸變工具(快捷鍵G),在工具選項欄中設定為線性漸變,之后點按可編輯漸變,彈出漸變編輯器。雙擊見下圖2中的A處,設定顏色RGB分別為25二,25二,232。再雙擊P2中的B處,設定顏色RGB分別為2二十五,2十九,184。繼續按鍵盤Shift不放結合鼠標從上到下拖下,給漸變效果,按鍵盤快捷鍵Ctrl+D取消選區,見下圖2。完成圖見下圖3

          三,在工具箱中選取橫排文字工具 ,在畫面中用鼠標點擊后,出現一鍵入文字光標,在光標后鍵入“pop”,在工具選項欄中設定字體為“CroissantD”,設定字體大小為“238.46點”,設定消除鋸齒為“銳利”,設定字體色彩為白色,單擊新建文字變形,彈出變形文字對話框,設定樣式為:扇形,勾選水平,彎曲為:-10%,水平扭曲為:0%,垂直扭曲為:0%,見下圖4

          四,雙點擊pop圖層進入到圖層樣式,分別勾選投影、內陰影、外發光、內發光、斜面與浮雕、色彩疊加、光澤、描邊選項

          參數設定及此時效果圖如下

          五,在圖層樣板中,選取POP圖層,拷貝一pop圖層拷貝,雙點擊pop圖層進入到圖層樣式,分別勾選投影、內陰影、斜面與浮雕選項。見下圖16

          詳細參數設定及此時效果圖如下

          六,新建新圖層按鈕,在工具箱中選取橢圓選項框工具,繼續在工作區拉出一橢圓選項框工具外形,設定前景為白色,繼續按鍵盤快捷鍵Alt+Delete填充,并按鍵盤Ctrl+D取消,并雙點擊圖層進入到圖層樣式,分別勾選投影、內陰影、內發光、斜面與浮雕、光澤選項,見下圖21

          詳細參數設定見下圖

          斷重復拷貝并調節大小和地方,處理完成效果圖

          ==============================

          公眾號:春樹鎮

          研究討論:互聯網技術,php開發,網站建議,app開發,html5開發,設計,小說,電影。


          主站蜘蛛池模板: 精品无码人妻一区二区三区| 亚洲一区二区三区在线观看精品中文| 亚洲av色香蕉一区二区三区蜜桃| 无码人妻久久一区二区三区免费| 亚洲一区综合在线播放| 一区二区三区日韩精品| 久久青青草原一区二区| 视频一区在线播放| 亚洲无人区一区二区三区| 国产精品香蕉在线一区| 无码少妇一区二区三区芒果| 久久精品人妻一区二区三区 | 国产一区二区三区播放| 精品久久久久中文字幕一区| 人妻AV一区二区三区精品 | 亚洲国产精品一区二区第一页免| 国产精品自在拍一区二区不卡| 久久一区二区精品综合| 日韩美女视频一区| 久久精品国产一区二区三| 成人毛片无码一区二区| 中文字幕一区二区日产乱码| 无码人妻一区二区三区一| 免费一区二区无码视频在线播放| 亚洲bt加勒比一区二区| 精品视频一区在线观看| 亚洲一区二区久久| 久夜色精品国产一区二区三区| 亚洲一区二区三区高清不卡| 精品国产一区二区三区在线观看| 亚洲一区二区三区在线网站| 亚洲国产成人久久一区WWW| 日韩精品无码一区二区三区不卡 | 人妻无码久久一区二区三区免费| 在线观看国产一区亚洲bd| 无码精品人妻一区二区三区免费看| 波多野结衣一区在线| 精品一区二区三区在线播放视频| 国产精品免费大片一区二区| 国产一区二区在线观看| 精品三级AV无码一区|