基于 HTML5 Canvas 繪制的電信網絡拓撲圖

電信網結構(telecommunication network structure)是指電信網各種網路單元按技術要求和經濟原則進行組合配置的組合邏輯和配置形式。組合邏輯描述網路功能的體系結構,配置形式描述網路單元的鄰接關系,即以交換中心(或節點)和傳輸鏈路所組成的拓撲結構。常見的網絡拓撲結構有星型結構、總線結構、環形結構、樹形結構、網狀結構、混合型拓撲以及蜂窩拓撲結構等,本文的例子主要描繪的是總線型拓撲,在顯示上相對其他的結構類型來說更清晰明了,繪制起來也非常容易。

雖然題目起的名字是電信網絡拓撲圖,幾乎所有的拓撲圖都能涵蓋,例如基本網絡圖,網絡拓撲圖,機架圖,網絡通信圖,3D網絡圖等等。

效果圖如下:

這個圖看起來挺簡單的,代碼也少,但是內容不少。

首先,機柜01、機柜02、機柜03 都是 ht.Group?“組”類型,ht.Group 類型用于作為父容器包含孩子圖元,在 GraphView 拓撲圖(http://www.hightopo.com)上可通過雙擊進行展開合并,合并時會自定隱藏子孫圖元節點, 如果有子節點有連線連接到外部時,合并的 Group 將代理進行連接。Group 的移動會帶動孩子節點跟隨, 孩子的位置和大小變化也會影響 Group 的展開圖形和 position 位置。

這邊提到一個代理連線的問題,“代理”兩個字可以很好地表明代理連線意義。實際上就是如果組內部的節點與組外部的節點有連線,那么在組合并的時候,會在這個組會“代理”與外部節點之間的連線,這個就是代理連線。我們拿機柜02來說吧,機柜02內部有一個“電腦”與“內部網絡交換機”之間有兩條連線,那么當我們雙擊機柜02合并時,實際上就相當于機柜02與“內部網絡交換機”之間有兩條連線了。

那么,我們來看看如何繪制這個組以及組內部的節點吧,先創建“機柜02”的 Group 節點,因為整個例子我創建了三個 Group 節點,而且創建的方式都類似,因此把創建組的代碼封裝起來復用:

function createGroup(name, x, y) {var group = new ht.Group();//組類型 實際上也是一個節點group.setExpanded(true);//設置展開組group.setName(name);//設置組的名字group.s({//設置組的樣式style'group.title.background': 'rgba(14,36,117,0.80)',//組展開后的title背景顏色,僅對group.type為空的類型起作用'group.background': 'rgba(14,36,117,0.40)',//組展開后的背景顏色'group.title.align': 'center'//組展開后的title文字水平對齊方式,默認值為'left',可設置為center和right
    });group.setPosition(x, y);//設置組的位置group.setImage('images/服務器.json');//設置拓撲上展現的圖片信息,在GraphView拓撲圖中圖片一般以position為中心繪制dataModel.add(group);//將創建的組節點添加進數據容器中return group;
}

組是可以通過雙擊展開合并的,展開的時候顯示的是一個有標題欄的框(當然這些都是可以自定義的),合并的時候就顯示上面代碼中設置的 group.setImage 中的圖片。

所有機柜內部的節點都是 ht.Node 類型的節點,所以我也封裝了一下:

function createNode(image, parent, x, y) {var node = new ht.Node();//創建一個 Node 節點if (image) node.setImage(image);//設置節點的顯示圖片if (parent) node.setParent(parent);//設置節點的父親if (x && y) node.setPosition(x, y);//設置節點的位置dataModel.add(node);//將節點添加進數據容器中return node;
}

生成機柜02:

cabinet = createGroup('機柜02', 146, 445);//創建機柜02
createNode('images/正常.json', cabinet, 78, 440).s('label', '數據監控分析系統');//創建帶有“正常”圖片的節點,并設置這個節點的文字為“數據監控分析系統”

因為連線需要的是“源節點”以及“終節點”,這邊源節點是中間的“內部網絡交換機”,我們再創建這個節點:

var line = createNode();//創建一個節點
line.setSize(725, 20);//設置節點大小
line.setPosition(310, 325);//設置節點位置
line.s({//設置節點的style屬性'shape': 'roundRect',//決定shape的形狀,默認值為空,代表用image繪制。roundRect四周圓角矩形'shape.background': 'rgba(14,36,117,0.80)',//背景填充顏色,為null代表不填充背景'shape.border.color': '#979797',//邊框顏色'shape.corner.radius': 10,//該參數指定roundRect類型的圓角半徑,默認為空系統自動調節,可設置正數值'label': '內部網絡交換機', //文字內容,默認為空'label.position': 45,//文字內容,默認為空'label.offset.x': 50,//文字水平偏移,對于Edge意味著沿著連線方向水平偏移'label2': '內部網絡交換機',//HT默認除了label.*的屬性外,還提供了label2.*的屬性,用于滿足一個圖元需要顯示雙文字的情況'label2.position': 48,'label2.offset.x': 50,'label2.offset.y': 2,
});

不知道你們有沒有注意到,有一個 label2 的樣式屬性,這個是 HT 為了能在一個節點上添加兩個 label 文本而增加的功能,label 屬性和 label2 的屬性是完全相同的,只要在設置屬性的時候用 label 和 label2 區分開來就可以。

源節點和終節點都具備了,可以制作連線了:

createEdge(line, createNode('images/電腦.json', cabinet, 185, 450), 'rgb(30,232,178)', -100, true);
//參數1 源節點,參數2 終節點,參數3 連線顏色,參數4 連線起始點的水平偏移,參數5 是否創建兩條連線

還有一點有趣的,“交換機”的部分,最左側藍色方形的節點和中間長條的節點并不是一體的,而是分離的,但是我通過 setHost 進行節點與節點間的吸附,然后反吸附回來,這樣操作上就相當于這兩個節點是一體的:

var exchange = createNode('images/交換機.json', null, -53, 313);
exchange.setHost(line);//設置吸附
line.setHost(exchange);//反吸附 又設置line的吸附為exchange

因為 HT 會按照節點添加進數據容器中的順序來進行層次的排列,我的交換機是在 line 的添加之后的,所以默認交換機的節點會顯示在 line 之下,我們將默認的層級顯示關閉,并設置交換機 exchange 顯示在數據容器的頂部:

dataModel.setAutoAdjustIndex(false);//將自動調整data在容器中索引順序的開關關閉
dataModel.sendToTop(exchange);//將data在拓撲上置頂

?代碼就是這些,還有不懂的可以留言或者私信我也可以,大家一起探討。

轉載于:https://www.cnblogs.com/xhload3d/p/8377854.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284198.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡相關配置,SSH服務,bash, 元字符

作業一:臨時配置網絡(ip,網關,dns)永久配置 設置IP和掩碼ifconfig eth0 192.168.2.2 netmask 255.255.255.0設置網關route add default gw 192.168.2.10[rootbogon ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0…

【GlobalMapper精品教程】021:利用控制點校正柵格圖像

本文講解GlobalMapper中利用控制點校正柵格圖像的方法,數據為配套實驗數據包中的data021.rar。 文章目錄 一、結果預覽二、校正過程【推薦閱讀】:ArcGIS實驗教程——實驗二:ArcGIS地理配準完整操作步驟 一、結果預覽 二、校正過程 (1)打開圖像。選擇實驗包中的待校正的柵…

[筆記]提升R的性能和突破內存限制的技巧

本文為雪晴數據網《R語言大規模數據分析實戰》 http://www.xueqing.tv/course/56 的課程學習筆記。 該課程目前更新到“第2章 Microsoft R Server簡介”的微軟數據科學家介紹MRS,后續教學主要是關于MRS的內容,再另外學習,所以本文只學習“第1…

WTM:ASP.NET Core快速開發利器!

不少程序員朋友應該都有這個想法,接接私活,賺賺外快,但是從零開發一套系統并不容易,今天給大家推薦一款開箱即用的通用后臺管理系統。一個能夠讓程序猿快速開發的炒雞腳手架,采用.NET Core開源框架!github地…

【CloudCompare教程】002:點云繪制模式詳解

文章目錄 1. 按高程著色2. 按索引著色3. 按漸變著色1. 按高程著色 在內容列表中選中點云圖層,點擊【編輯】→【標量領域】→【將坐標導出到SF】。 勾選Z,點擊OK。 高程著色效果: 2. 按索引著色 點擊【編輯】→【標量領域】→【添加點指數為SF】。 索引著色效果:

《首席產品官》成海清 著 圖書目錄 思維導圖

原文檔地址:《首席產品官》成海清

「每天一道面試題」如何理解方法的重載與覆蓋?

方法重載在同一個Java 類中(包含父類),如果出現了方法名稱相同,而參數列表不同的情況就叫做重載。方法的重載的規則:(1):方法名稱必須相同(2):參數…

day63-webservice 01.cxf介紹

CXF功能就比較強了。CXF支持soap1.2。CXF和Spring整合的非常密切。它的配置文件基本就是Spring的配置文件了。CXF是要部署在服務器才能用的。CXF得放到Web容器里面去發布。CXF就可以整合咱們的Web容器。 cxf-2.4.0解壓出來之后 apache-cxf-2.4.2是核心包,apache-cxf-2.4.4-src是…

Java中的static關鍵字解析

static關鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關鍵字,也是各大公司的面試官喜歡在面試時問到的知識點之一。下面就先講述一下static關鍵字的用法和平常容易誤解的地方,最后列舉了一些面試筆試中常見的關于static的考題。以下是…

微信公眾號授權登錄后報redirect_uri參數錯誤的問題

在進行微信公眾號二次開發的時候,需要通過授權碼模式來進行微信授權。比如,在進行登錄的時候,用戶點擊了登錄按鈕,然后彈出一個授權框,用戶點擊同意后,就可以獲取用戶的OpenId等信息了。這篇文章主要分享下…

【GlobalMapper精品教程】022:根據一個字段屬性值批量計算另一個字段屬性值(地類名稱求地類編碼)

項目中通常需要根據一個字段屬性值的不同,批量計算另一個字段屬性值(如根據地類名稱求地類編碼),根據權屬地物名稱給權屬地物編碼批量賦值等,本文講解在屬性表中根據代碼批量實現方法。 參考閱讀: 【ArcGIS風暴】ArcGIS 10.2字段計算器(Field Calculator)批量條件賦值用…

[轉]【讀書筆記】《俞軍產品方法論》——產品經理的枕邊書

作者簡介 俞軍,1997年畢業于同濟大學化學系。曾任百度產品副總裁、首席產品架構師,網名“搜索引擎9238”,有“百度貼吧之父”之稱。滴滴前高級產品副總裁。 內容簡介 摘抄語錄 我的產品潛力和優勢大約只來自三方面:第一&#xff0…

linux批量分發必會面試題,通過郵件反饋結果。

請準備三臺linux機器為別為A,B,C,要求實現以下內容1、用自己的名字用戶完成一把鑰匙開多把鎖(A,鑰匙,B,C鎖)的免密碼登錄部署場景該題在生產環境中的用途為;批量分發數據,批量發布程序代碼,批量…

【GlobalMapper精品教程】023:Excel數據通過相同字段連接到屬性表中(氣溫降水連接到氣象臺站)

globalmapper中也可以將Excel數據通過相同字段連接到屬性表中。本文講解將氣溫降水連接到氣象臺站點圖層中。 文章目錄 一、加載氣象臺站數據二、掛接氣溫降水數據一、加載氣象臺站數據 globalmapper中根據坐標生成點的方法,前面的文章有所說明: 【GlobalMapper精品教程】0…

記一次 .NET 某智慧物流WCS系統CPU爆高分析

一:背景 1. 講故事哈哈,再次見到物流類軟件,上個月有位朋友找到我,說他的程序出現了 CPU 爆高,讓我幫忙看下什么原因,由于那段時間在苦心研究 C,分析和經驗分享也就懈怠了,今天就給大…

c#調用存儲過程查詢表并返回影響的行數

// 在此處放置用戶代碼以初始化頁面 String DBConnStr; DataSet MyDataSet new DataSet(); SqlDataAdapter DataAdapter new SqlDataAdapter(); DBConnStr "server192.168.2.120,2433;databaseDB_test;uidsa;pwd43g"; Sq…

采用Atlas+Keepalived實現MySQL讀寫分離、讀負載均衡【轉載】

文章 原始出處 :http://sofar.blog.51cto.com/353572/1601552 一、基礎介紹 1、背景描述 目前我們的高可用DB的代理層采用的是360開源的Atlas,從上線以來,已穩定運行2個多月。無論是從性能上,還是穩定性上,相比其他開…

vscode搭建go開發環境

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、安裝goLang二.配置環境變量三、vscode安裝插件四.安裝golang依賴五.新建go文件前言 能用golang就用golang..這配置很麻煩 提示:以下是本篇文章正…

【GlobalMapper精品教程】024:批量高效實現多種數據格式互轉的方法

globalmapper批量高效實現多種數據格式互轉的方法。 文章目錄一、批量格式轉換二、格式轉換形式舉例一、批量格式轉換 選擇原文件類型: 選擇文件類型: 在源文件列表中添加需要轉換的文件或者文件夾,指定目標文件目錄,文件名稱和投…