基于 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.mzph.cn/news/284198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】021:利用控制点校正栅格图像

本文讲解GlobalMapper中利用控制点校正栅格图像的方法,数据为配套实验数据包中的data021.rar。 文章目录 一、结果预览二、校正过程【推荐阅读】:ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤 一、结果预览 二、校正过程 (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,分析和经验分享也就懈怠了,今天就给大…

采用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批量高效实现多种数据格式互转的方法。 文章目录一、批量格式转换二、格式转换形式举例一、批量格式转换 选择原文件类型: 选择文件类型: 在源文件列表中添加需要转换的文件或者文件夹,指定目标文件目录,文件名称和投…

基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换

基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换Intro前段时间有位小伙伴在 Github 上提了一个 “不能识别纯汉字的日期格式” issue二〇二二年一月一日 格式的日期单元格识别不出来会变成,0001/1/1 0:00:00 如何让它能够识别出来呢,基于 InputForm…

十个模型,总结产品经理沟通方法论

编辑导语:毫不夸张地说沟通占据了产品经理日常工作内容的40%,高效沟通往往能让事情事半功倍。本文作者结合沟通方法与具体沟通情景讲解了如何高效沟通,一起来看看吧! 目录 一、为什么要学会沟通 二、沟通模型 1. PREP原则&…

【Globalmapper中文入门到精通系列实验图文教程】(附配套实验数据持续更新)

【Globalmapper中文版入门到精通系列实验图文教程】(附配套实验数据持续更新) 文章目录一、专栏简介二、文章目录三、数据目录四、传送门一、专栏简介 本专栏为GlobalMapper中文入门实战精品教程,内容主要涉及:Globalmapper23软件…