如今的制造行業,基于數據進行生產策略制定與管理已經成為一種趨勢,特別是 工業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>
本案例共有七個系統:
子系統頁面切換
切換不同的系統時,左側菜單和頂部標題是不需要切換的,所以我們把需要切換的內容部分別放在不同的 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開發,設計,小說,電影。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。