最近我的项目中须要绘制拓扑图,于是钻研了下绘制拓扑图的组件,jtopo是一款比较简单易上手的开发工具包,分享给大家。
jtopo特点
1、齐全基于HTML5 Canvas开发,API平易近人、简直简略到了极致。
2、不依赖任何其余库、执行仅需一个Canvas。
3、体积小,压缩后仅几十KB。
5、收费!
下载jtopo
大家能够去官网自行下载 http://www.jtopo.com/download/jtopo-0.4.8-min.js,目前版本是0.4.8,官网有API文档和案例。
jtopo官网地址:http://www.jtopo.com/
jQuery
目前我是vue我的项目中引入的jtopo,jtopo只反对在jQuery语言编写,须要我的项目中引入jQuery,不是vue我的项目的能够自行去官网下载jQuery.js,vue引入jQuery可参考https://blog.csdn.net/JQdazhuang/article/details/107152192
举例代码
html代码:
<template> <div style="position: relative; width: 100%; height: 100%; margin: auto" id="topo_content" > <canvas id="topology-canvas" width="1000" height="600"></canvas> </div></template>
js代码:
var canvas = document.getElementById("topology-canvas"); var stage = new JTopo.Stage(canvas);//创立一个画布 var scene = new JTopo.Scene(stage);//创立一个背景 _this.scene = scene; var childs = topoData; for (let i in childs) { var a = childs[i]; if (a.elementType == "node") {//如果是拓扑节点 //节点 var node = new JTopo.Node(a.text); node.setLocation(a.x, a.y); node.setImage("/static/img/" + a.nodeImage, true); node.fontColor = "0,0,0"; node.nodeId = a.nodeId; node.nodeType = a.nodeType; node.nodeImage = a.nodeImage; node.scaleX = a.scaleX; node.scaleY = a.scaleY; node.devIp = a.devIp; node.textPosition = a.textPosition; if (node) { node.alarm = a.alarm; node.alarmColor = "255,0,0"; node.alarmAlpha = 0.5; } scene.add(node); } else if (a.elementType == "link") { //如果是连线 var link = null; if (link == null) { var nodes = stage.find("node"); var nodeA, nodeZ; if (a.nodeSrc && a.nodeDst) { nodes.forEach(function (nodeElement) { if (nodeElement.elementType == "node") { if (nodeElement.nodeId == a.nodeSrc) { nodeA = nodeElement; //终点 } if (nodeElement.nodeId == a.nodeDst) { nodeZ = nodeElement; //起点 } } }); } //绘制折线 var c = null; if (nodeA && nodeZ) { // 折线和直线绘制 if (a["lineType"] == "line") { c = new JTopo.Link(nodeA, nodeZ); c.lineType = "line"; } if (a["lineType"] == "foldLine") { c = new JTopo.FoldLink(nodeA, nodeZ); c.bundleOffset = 40; c.direction = a.direction; c.lineType = "foldLine"; } if (a["lineType"] == "flexLine") { c = new JTopo.FlexionalLink(nodeA, nodeZ); c.offsetGap = 40; c.direction = a.direction; c.lineType = "flexLine"; } if (a["lineType"] == "curveLine") { c = new JTopo.CurveLink(nodeA, nodeZ); c.lineType = "curveLine"; } c.alpha = 1; c.shadow = false; c.font = "12px Consolas"; c.arrowsRadius = 0; c.lineWidth = 1.5; c.bundleGap = 0; c.eagleEyeVsibleDefault = false; c.id = a.id; c.strokeColor = a.strokeColor; c.lineClass = a.lineClass; c.nodeSrc = nodeA.nodeId; c.nodeDst = nodeZ.nodeId; c.localDevId = a.localDevId; c.localDevIp = a.localDevIp; c.localDevIfindex = a.localDevIfindex; c.localDevIfname = a.localDevIfname; c.remoteDevId = a.remoteDevId; c.remoteDevIp = a.remoteDevIp; c.remoteDevIfindex = a.remoteDevIfindex; c.remoteDevIfname = a.remoteDevIfname; scene.add(c); } } else { link.strokeColor = a.strokeColor; } } }
代码运行效果图如下:
不懂可留言征询
具体残缺代码可看我的码云,自行下载运行即可 https://gitee.com/niexiaohua/JTopo