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


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. 根据二进制和十进制转换规则转换成游戏[xyytit]

    摘要: 二進位是由十進位轉換而成,它的數字都由1.0組成的.我們研究發現由十進位轉換而成的二進位的數字可以不只局限在於1~127,它的數可以更加深加廣,並且可以利用二進位的規則轉換成遊戲.我們利用2n ...

  2. 图像获取与采集及图像格式与Region介绍——第2讲

    一.图像获取与采集 1.本地图片读取 ① 单张读取 直接传入图片路径即可,可以用绝对路径,也可以用相对路径: read_image (Image, 'C:/Users/Administrator/De ...

  3. linq to sql之like

    contains——like '%提交%' StartsWith—— like '条件%' EndWith——like '%条件'

  4. 一个方便的java分页算法

    一个好用的java分页算法,代码如下,只需要分页参数继承Pageable类就可以很方便分页了 package cn.com.base.common.pagination; /** * 分页基类 * * ...

  5. 20172325 2017-2018-2 《Java程序设计》第十周学习总结

    20172325 2017-2018-2 <Java程序设计>第十周学习总结 教材学习内容总结 1.集合与数据结构 集合是一种对象 集合按照保存类型来看可以分为两种: (1)同构集合:只能 ...

  6. 深入浅出 JMS(三) - ActiveMQ 安全机制

    深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...

  7. OSGi 系列(十八)之 基于注解的 Blueprint

    OSGi 系列(十八)之 基于注解的 Blueprint 1. 注解实现 blueprint 第一步:bundle 添加 Bundle-Blueprint-Annotation <plugin& ...

  8. bat 调用exe

    @set errorlevel=>nul :reInput @echo 请输入批次号: @set/p 批次号= >nul @set 批次号|findstr "\\<%sea ...

  9. Dice 5 ==> dice 7

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  10. 《Delphi XE6 android 编程入门教程》推荐

    近5.6年已经没有看见关于delphi的新技术的书出来了(看来在国内delphi的使用量确实很低了), 高勇同学最近出了一本<Delphi XE6 android 编程入门教程>,上周刚拿 ...