记录使用echarts的graph类型绘制流程图全过程(二)- 多层关系和圆形图片的设置
本文主要记录在使用echarts的graph类型绘制流程图时候遇到的2个问题:对于圆形图片的剪切和多层关系的设置
图片的设置

如果用echarts默认的symbol参数来显示图片,会显示图片的原始状态,即圆形就显示圆形的,矩形就显示矩形的,而案例中的图片是矩形的(如上图所示)。但是尼,我们在流程图的绘制过程中,一般用到的又是圆形,所以这时候就需要我们自己进行剪切了。主要运用cavans的clip功能,以下是具体的代码实现:
let picList = [];
let tempNodes = [];
for (let i in this.nodesObj) {
let item = this.nodesObj[i];
// 设置已知的信息
let obj = {
x: item.x,
y: item.y,
name: item.name,
id: item.id,
symbolSize: this.size,
category:
item.id === this.startNode || item.id === this.endNode ? 0 : 1
};
// 如果有图标信息,进行图片处理,没有的直接放到节点信息中
if (item.icon) {
let p = this.getImgData(item.icon);
picList.push(p);
tempNodes.push(obj);
} else {
this.nodes.push(obj);
}
}
// 将图片处理放在promise中,然后使用promise.all,当所有的图片都剪切完毕后,赋值
if (picList.length > 0) {
let that = this;
Promise.all(picList).then(images => {
for (let i = 0, len = tempNodes.length; i < len; i++) {
tempNodes[i].symbol = 'image://' + images[i];
that.nodes.push(tempNodes[i]);
}
// console.log(this.nodes);
// 再设置节点
that.setLinks();
// 把数据设置到Echart中data
if (this.graphChart) {
var option = this.graphChart.getOption();
option.series[0].nodes = this.nodes;
option.series[0].links = this.links;
this.graphChart.setOption(option);
}
});
} else {
// 设置节点
this.setLinks();
}
// 获取icon的图片信息
getImgData (imgSrc) {
var fun = function (resolve) {
const canvas = document.createElement('canvas');
const contex = canvas.getContext('2d');
const img = new Image();
img.crossOrigin = '';
img.onload = function () {
// 设置图形宽高比例
let center = {
x: img.width / 2,
y: img.height / 2
};
let diameter = img.width;
let radius = diameter / 2; // 半径
canvas.width = diameter;
canvas.height = diameter;
contex.clearRect(0, 0, diameter, diameter);
contex.save();
contex.beginPath();
contex.arc(radius, radius, radius, 0, 2 * Math.PI); // 画出圆
contex.clip();
contex.drawImage(
img,
center.x - radius,
center.y - radius,
diameter,
diameter,
0,
0,
diameter,
diameter
); // 在刚刚裁剪的园上画图
contex.restore(); // 还原状态
resolve(canvas.toDataURL('image/png', 1));
};
img.src = imgSrc;
};
var promise = new Promise(fun);
return promise;
}
实现效果:

多关系合并
echarts的关系最多支持2条显示,所以当2个节点之间存在多个关系的时候,可以把同一个指向的关系合并到一起如下图,周杰伦与刘德华的关系是偶像和同窗,刘德华和周杰伦的关系是好友

也就是获取两个节点之间同方向的线条的关系,然后进行合并,再显示在一条关系线上即可。
// 设置线条
setLinks () {
this.links = [];
this.relationList.forEach(item => {
let obj = {
source: item.source,
target: item.target,
value: item.relName,
label: {
show: true,
formatter: '{c}'
}
};
if (item.sameTotal >= 2) {
let hasLink = this.links.find(link => {
if (link.source === item.source && link.target === item.target) {
return true;
}
});
if (!hasLink) {
let res = this.findSameLinkRelation(
item.source,
item.target,
item.sameTotal
);
obj.value = res.value;
if (res.setLineStyle) {
obj.lineStyle = {
normal: {
curveness: 0.2
}
};
}
this.links.push(obj);
}
} else {
this.links.push(obj);
}
});
}
findSameLinkRelation (sid, tid, total) {
let value = [];
let setLineStyle = true;
this.relationList.forEach(item => {
if (item.source === sid && item.target === tid) {
value.push(item.relName);
}
});
if (total === value.length) {
setLineStyle = false;
}
value = value.join('、');
return {
value,
setLineStyle
};
}
记录使用echarts的graph类型绘制流程图全过程(二)- 多层关系和圆形图片的设置的更多相关文章
- 记录使用echarts的graph类型绘制流程图全过程(一)-x,y位置的计算
先说下本次案例业务需求,输入2个节点,获取数据后绘制出2个节点间的路径,之前使用的是网状图,但是网状图的效果不佳,需要转换成流程图的模式: 那么如何在不修改数据的情况下,实现类似效果尼? 看了下ech ...
- Echarts中graph类型的运用求教
以下是百度Echarts官网上关系图的源码,但是这个关系图的node节点和edge都是静态文件里规定好的,我现在想动态实现,点击其中一个节点A然后新产生一个新节点B,并且有A和B之间的edge,就类似 ...
- 玩转控件:GDI+动态绘制流程图
前言 今天,要跟大家一起分享是"GDI+动态生成流程图"的功能.别看名字高大上(也就那样儿--!),其实就是动态生成控件,然后GDI+绘制直线连接控件罢了.实际项目效果图如下 ...
- 源码分析篇 - Android绘制流程(二)measure、layout、draw流程
performTraversals方法会经过measure.layout和draw三个流程才能将一帧View需要显示的内容绘制到屏幕上,用最简化的方式看ViewRootImpl.performTrav ...
- android绘制圆形图片的两种方式
看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...
- Apache日志不记录图片文件设置方法和来源日志的配置
Apache日志不记录图片文件设置方法 <FilesMatch "\.(ico|gif|jpg|swf)">SetEnv IMAG 1</FilesMatch&g ...
- echarts常用方法,item小坑(二)
在echarts折线图使用过程中,我们会遇到折线拐点symbol的问题.这个问题是在版本3.8.5引用时发现的.折线图在支持legend显示的情况下需要考虑. 问题描述如下:如果采用echarts提供 ...
- spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二)
spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二) >>>>>>>>>>>>>>&g ...
- Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现
Android View加载圆形图片且同时绘制圆形图片的外部边缘边线及边框:LayerDrawable实现 LayerDrawable实现的结果和附录文章1,2,3中的layer-list一致. ...
随机推荐
- 损失函数———有关L1和L2正则项的理解
一.损失函: 模型的结构风险函数包括了 经验风险项 和 正则项,如下所示: 二.损失函数中的正则项 1.正则化的概念: 机器学习中都会看到损失函数之后会添加一个额外项,常用的额外项一般有2种, ...
- windows命令行pip报错解决的方法
今天在新电脑安装python,发现pip无效了,于是乎百度了很多方法,发现原因是pip升级导致的 解决办法,卸载pip重新安装 可以首先执行 python -m ensurepip 然后执行 py ...
- ETCD:基于角色的访问控制
原文地址:Role-based access control 总览 身份验证已添加到etcd 2.1中. etcd v3 API略微修改了身份验证功能的API和用户界面,以更好地适应新的数据模型.本指 ...
- koa2 从入门到进阶之路 (七)
之前的文章我们介绍了一下 koa koa-static静态资源中间件,本篇文章我们来看一下 koa 中 cookie 和 session 的使用. cookie 是存储于访问者的计算机中的变量.可以让 ...
- ABP之Logging
服务器端 ABP使用Castle Windsor的日志设施.它可以使用不同的日志库:Log4Net.NLog.Serilog等等.Castle为所有日志程序库提供了一个公共接口,这样,我们可以独立的使 ...
- C# HttpClient设置cookies的两种办法
前言:最近公司使用HttpClient对象在发送请求,抛弃了之前的HttpWebRequest,使用httpClient有个好处:就是可以只使用一个HttpClient的实例,去完成发送所有的请求数据 ...
- error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
这个报错一般是因为你图像的路径写错了,找不到图像而导致的. 解决问题的朋友麻烦点个推荐呗!嘿嘿
- Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法
在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1. ...
- ABP入门教程1 - 开篇
点这里进入ABP入门教程目录 基于DDD的现代ASP.NET开发框架 - ABP ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET ...
- Python 定义常量
常量在编写程序的时候,一旦设定就不能再进行变动,常量一种约定俗成的方式,所有字母大写并用下划线分隔单词的方式(如MAX_VALUE, OUT_TIME等),但是python没有提供设置常量用法,需要自 ...