节点可拖动
前后点击两个节点,可以对节点进行连接
点击连线,可以删除连线
动态添加、删除节点
配置项如下
//
// 节点可拖动
// 前后点击两个节点,可以对节点进行连接
// 点击连线,可以删除连线
// 动态添加、删除节点 ,还未完成
//关系坐标
var xydata = [
[0, 1],
[1, 2],
[2, 3]
];
//节点坐标
var dataArr = [{
name: 'A',
value: [15, 50]
},
{
name: 'B',
value: [-50, 10]
},
{
name: 'C',
value: [-55, -70]
},
{
name: 'D',
value: [40, -40]
},
]
//设置点的大小
var symbolSize = 70;
//当0时候表示输入起点坐标,其他值输入终点坐标
var position = 0;
//起点
var positionSource;
//钟点
var positionTarget;
//设置判断点击线还是点击点
var ok = 1;
//删除数组的索引位置
var del;
var links = xydata.map(function(item, i) {
return {
source: xydata[i][0],
target: xydata[i][1]
};
});
var option = {
title: {
text: '可拖动流程图'
},
grid: {
},
//定义X轴
xAxis: {
min: -100,
max: 100,
type: 'value',
axisLine: {
onZero: false
},
show: false
},
yAxis: {
min: -100,
max: 100,
type: 'value',
axisLine: {
onZero: false
},
show: false
},
series: [{
//设置id很重要
id: 'a',
//设置为甘特图
type: 'graph',
layout: 'none',
coordinateSystem: 'cartesian2d',
//设置球的大小
symbolSize: symbolSize,
label: {
show: true,
formatter: function(d, i) {
return dataArr[d.dataIndex].name;
}
},
itemStyle: {
borderColor: '#22faf7',
borderWidth: 3,
color: '#123456',
},
//设置连线形式为箭头
edgeSymbol: ['circle', 'arrow'],
edgeSymbolSize: [4, 10],
//指定数据数组
data: echarts.util.map(dataArr, function(item, di) {
return item.value;
}),
//指定连线方式
edges: links,
//指定连线颜色
lineStyle: {
normal: {
color: '#22faf7'
}
},
}],
};
//在demo里,必须要加setTimeout ,否则执行 myChart.convertToPixel 会报错
setTimeout(function() {
initGraphic();
//窗口大小改事件
window.addEventListener('resize', updatePosition);
}, 0);
//重新定位图形元素
function updatePosition() {
myChart.setOption({
graphic: echarts.util.map(dataArr, function(item, dataIndex) {
return {
position: myChart.convertToPixel('grid', item.value),
};
})
});
}
//绘制图形元素
function initGraphic() {
myChart.setOption({
graphic: echarts.util.map(dataArr, function(item, dataIndex) {
return {
//圆形
type: 'circle',
//将坐标转化为像素
position: myChart.convertToPixel('grid', item.value),
shape: {
// 拖动点的大小
r: symbolSize / 2 - 2
},
style: {
fill: '#3FA7DC50',
borderColor: '#22faf7',
borderWidth: 1,
},
//指定虚拟圈是否可见 false 可见
invisible: false,
//指定圈被拖拽(可以与不可以)
draggable: true,
//ondrag: echarts.util.curry(onPointDragging, dataIndex),
onclick: echarts.util.curry(initLinks, dataIndex),
onmouseup: echarts.util.curry(onPointDragging, dataIndex),
//层级
z: 100
};
})
});
}
//图形元素拖动后, 修改节点位置
function onPointDragging(dataIndex, dx, dy) {
dataArr[dataIndex].value = myChart.convertFromPixel('grid', this.position);
// Update data
myChart.setOption({
series: [{
id: 'a',
data: dataArr
}]
});
}
//绘制添加的连线
function initLinks(dataIndex){
for (var i = 0; i < dataArr.length; i++) {
if (i == dataIndex) {
ok = 0;
if (position == 0) {
positionSource = i;
position = 1;
} else {
positionTarget = i;
position = 0;
xydata.push([positionSource, positionTarget])
//当xydata值改变时linkss方法需要重新跑一变
var linkss = xydata.map(function (item, i) {
return {
source: xydata[i][0],
target: xydata[i][1]
};
});
//重新载入的东西都写在这里
myChart.setOption({
series: [{
edges: linkss,
//指定连线颜色
lineStyle: {
normal: {
color: '#22faf7'
}
}
}]
});
return true;
}
break;
}
}
}
//点击事件 , 删除连线
myChart.on('click', function (params) {
if (params.componentType != 'series' || params.dataType != "edge") {
return;
}
var a = [params.data.source, params.data.target]
for (var i = 0; i < xydata.length; i++) {
if (params.data.source == xydata[i][0] && params.data.target == xydata[i][1]) {
del = i;
xydata.splice(del, 1);
//当xydata值改变时linkss方法需要重新跑一变
var linkss = xydata.map(function (item, i) {
return {
source: xydata[i][0],
target: xydata[i][1]
};
});
//重新载入的东西都写在这里
myChart.setOption({
series: [{
edges: linkss,
}]
});
return true;
}
}
});