绘制拓扑图有很多开源的工具,知乎上也有人回答了这个问题:


https://www.zhihu.com/question/41026400/answer/118726253

ujtopo是基于jTopo作了一些封装,适用一些基本的场景

jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。官网地址:http://www.jtopo.cn

1、首先定义画布、舞台、场景并对舞台和场景做一些设置等

//节点
var nodeList = [];
//连接关系
var linkList = [];
//状态
var nodeStatus = []; var canvasId = 'canvas';
var canvas = null;
var stage = null;
var scene = null;
var lineType = "1";
var lineColor = '';
getCanvas = function () { canvas = document.getElementById(canvasId); }, getStage = function () { stage = new JTopo.Stage(canvas); }, getScene = function () {
scene = new JTopo.Scene(stage);
scene.background = imglist.background;
},

2、设计视图和显示视图

设计视图可以增加节点,拖动节点、节点之间的连线,选择各种线形、选择线的颜色,可以生成节点和连线数据以供显示视图可以解析显示;实际中节点可能有不同的类型,不同类型的节点我们可能需要做不同的处理,每个节点要有唯一的标识、要有和数据源关联的某些标识等等;显示视图要能根据设计视图最终输出的节点数据和连线数据还原出设计视图所绘制的图形拓扑。

  • addNode是添加节点,入参是args和func。args封装了节点的一些特征数据,格式为:{ x: 50, y: 60, id: 1, type: 1, img: 'Images/ujtopo/net-yuan.png', title: 'net-yuan' },也可以根据实际需要做调整;x和y是坐标;id是跟数据源相关的标识,type是节点类型,img:节点的图片;title:节点的名称;func是节点的事件处理,目前没有处理,可以根据实际情况,加一些处理,比如增加节点的mouseup事件等等,具体的事件请参考jTopo的事件
//添加节点
addNode = function (args, func) {
var n = new JTopo.Node(args.title);
//n.setSize(50,50); // 尺寸
n.fontColor = "black";
n.setImage(args.img, true);
n.setLocation(args.x, args.y);
n.dragable = this.designer;
//if (clicked != undefined) {
// n.addEventListener("mouseup", clicked);
//}
nodeList.push({ args: dealArgs(args), node: n });
scene.add(n);
return n;
},
  • dealArgs是处理参数的,根据id和type生成唯一标识uid
  • setLineType和setLineColor分别是设置线形和线颜色
  • onLineEdit是设计视图所用,拖动节点、节点之间的连线、删除节点或者连线等
  • drawLine、drawFoldLine、drawReverseFoldLine分别是画直线、折线和反折线
drawLine = function (nodeA, nodeZ) {
var link = new JTopo.Link(nodeA, nodeZ);
link.lineWidth = 3; // 线宽
//link.dashedPattern = 10; // 虚线
link.arrowsRadius = 10; //箭头大小
//link.bundleOffset = 60; // 折线拐角处的长度
//link.bundleGap = 20; // 线条之间的间隔
//link.textOffsetY = 3; // 文本偏移量(向下3个像素)
link.strokeColor = lineColor;
scene.add(link);
return link;
},
  • getLine是根据所选线形画相应的连线
  • findNode是根据uid查找节点信息的
  • findArgsByNode是根据节点查找节点参数的
  • nodeList和linkList分别是存储节点的连线的数组。nodeList格式是{ args: dealArgs(args), node: n },args是处理之后有uid的节点参数;node是jtopo节点;linkList格式是{ lineType: lineType, lineColor: lineColor, xArgs: xArgs, yArgs: yArgs };lineType是线形;lineColor是线的颜色;xArgs是起始节点的参数;yArgs是末尾节点的参数;

保存数据
节点数据保存:用jtopo节点的坐标替换节点参数的坐标;去掉jtopo节点
连线数据保存:linkList

3、演示程序的说明

  1. 设计视图模拟了10个节点、颜色选择colorpicker组件、线形选择使用了icheck组件。点击结果输出,会显示出节点数据和连线数据并且保存至localStorage;实际中节点数据可以从数据源获取,节点数据和连线数据可以保存至数据库或者其它地方
  2. 显示视图从localStorage获取节点数据和连线数据解析节点数据的连线数据。

4、演示结果

演示地址:http://net-yuan.com/ujtopo

GitHub:https://github.com/net-yuan/ujtopo

文章已同步至:http://net-yuan.com/Article/Detail/9b8053cc-6f37-45d1-a638-e1d46885e412

基于jTopo的拓扑图设计工具库ujtopo的更多相关文章

  1. 使用wxpy这个基于python实现的微信工具库的一些常见问题

    使用如下的命令行安装: pip install wxpy Collecting wxpy Downloading https://files.pythonhosted.org/packages/6b/ ...

  2. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  3. 基于WebServices简易网络聊天工具的设计与实现

    基于WebServices简易网络聊天工具的设计与实现 Copyright 朱向洋 Sunsea ALL Right Reserved 一.项目内容 本次课程实现一个类似QQ的网络聊天软件的功能:服务 ...

  4. 一个PHP高性能、多并发、restful的工具库(基于multi_curl)

    This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...

  5. 【测试设计】基于正交法的测试用例设计工具--PICT

    前言 我们都知道成对组合覆盖是一种非常有效的测试用例设计方法,但是实际工作过程中当成对组合量太大,我们往往很难做到有效的用例覆盖. PICT是微软公司出品的一款成对组合命令行生成工具,它很好的解决了上 ...

  6. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

  7. FROONT – 超棒的可视化响应式网页设计工具

    FROONT 是一个基于 Web 的设计工具,在浏览器中运行,使得各类可视化设计的人员都能进行响应式的网页设计,即使是那些没有任何编码技能的设计师.FROONT 使得响应式网页设计能够可视化操作,能够 ...

  8. 15款优秀移动APP产品原型设计工具

    一新来小盆友问:“移动产品原型设计都用啥工具?” 答:“@#¥……&%*” 又问:“能详细说下各个工具吗?我比较一下” “……” 好吧,谁让我那么的爱分享而你又是小美女呢 ———————正文开 ...

  9. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...

随机推荐

  1. mybatis什么时候需要声明jdbcType?

    经常会见到以下两种写法:1. #{bookId}2. #{bookId,jdbcType=INTEGER}一般情况下,两种写法都可以.它们都可以获取Dao层传递过来的参数.但是,当传入的参数为null ...

  2. mongo远程登录

    1. 进入数据库: use admin db.addUser("foo","foo"); ps:高版本用db.createUser创建. 2. 改配置 如/et ...

  3. 全屏API

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2679 二.相关文章以 ...

  4. dataTables常用参数

    一.新版本和老版本的区别 新版本的改进:https://datatables.net/new/1.10 新老版本参数变化列表:http://datatables.club/upgrade/1.10-c ...

  5. geoserver 开发1

    打开项目,会看见下面这些包(其实还有很多插件之类的包,我都删除了) 5)可以从Eclipse启动GeoServer了. 如果你已经安装了GeoServer,现在也可以打开它的登陆页面进行操作. 三 结 ...

  6. Java 中>>和>>>的区别

    Java 中>>和>>>的区别 Java中的位运算符: >>表示右移,如果该数为正,则高位补0,若为负数,则高位补1: >>>表示无符号右移 ...

  7. db2 存储过程中的玩意

    aix的top是topas.vmstat也是一个玩意,但是不懂. AND C_DEP_CDE  like  substr(I_C_DPT_CDE,1,2)||'%';--db2中字符串的加法用||这个 ...

  8. eclipse 配置动态web项目在servers中运行

    第一步: window->preferences:Server->Runtime Environments窗口,add. 第二步: window->preferences:Proje ...

  9. 3层+SVN学习笔记(2)

    在对于餐桌付款程序设计时,需要先选中餐桌,然后点击付款.正常情况是这样的: 在程序设计时,没有考虑到用户未点击餐桌而直接进行付款的情况,程序出现以下错误: 在设计时,需要考虑用户未点击餐桌而直接进行付 ...

  10. nginx怎么与tomcat完美结合

    nginx怎么与tomcat完美结合 现在公司一个服务器上需要部署两个项目,其中一个项目已经正式上线,并且已经占用了80端口,另外一个项目 部署上去后,访问必须要加端口号,这样的用户体验非常不好,那么 ...