465 lines
15 KiB
JavaScript
465 lines
15 KiB
JavaScript
"use strict";
|
|||
|
|
|
||
|
|
var _tslib = require("tslib");
|
||
|
|
var _g6Core = require("@antv/g6-core");
|
||
|
|
var _util = require("@antv/util");
|
||
|
|
// 三角形
|
||
|
|
(0, _g6Core.registerNode)('triangle', {
|
||
|
|
// 自定义节点时的配置
|
||
|
|
options: {
|
||
|
|
size: 40,
|
||
|
|
direction: 'up',
|
||
|
|
style: {
|
||
|
|
stroke: _g6Core.BaseGlobal.defaultNode.style.stroke,
|
||
|
|
fill: _g6Core.BaseGlobal.defaultNode.style.fill,
|
||
|
|
lineWidth: _g6Core.BaseGlobal.defaultNode.style.lineWidth
|
||
|
|
},
|
||
|
|
labelCfg: {
|
||
|
|
style: {
|
||
|
|
fill: _g6Core.BaseGlobal.nodeLabel.style.fill,
|
||
|
|
fontSize: _g6Core.BaseGlobal.nodeLabel.style.fontSize
|
||
|
|
},
|
||
|
|
offset: 15
|
||
|
|
},
|
||
|
|
// 节点上左右上下四个方向上的链接circle配置
|
||
|
|
linkPoints: {
|
||
|
|
top: false,
|
||
|
|
right: false,
|
||
|
|
bottom: false,
|
||
|
|
left: false,
|
||
|
|
// circle的大小
|
||
|
|
size: _g6Core.BaseGlobal.defaultNode.linkPoints.size,
|
||
|
|
lineWidth: _g6Core.BaseGlobal.defaultNode.linkPoints.lineWidth,
|
||
|
|
fill: _g6Core.BaseGlobal.defaultNode.linkPoints.fill,
|
||
|
|
stroke: _g6Core.BaseGlobal.defaultNode.linkPoints.stroke
|
||
|
|
},
|
||
|
|
// 节点中icon配置
|
||
|
|
icon: {
|
||
|
|
// 是否显示icon,值为 false 则不渲染icon
|
||
|
|
show: false,
|
||
|
|
// icon的地址,字符串类型
|
||
|
|
img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',
|
||
|
|
width: 20,
|
||
|
|
height: 20,
|
||
|
|
offset: 6
|
||
|
|
},
|
||
|
|
stateStyles: (0, _tslib.__assign)({}, _g6Core.BaseGlobal.nodeStateStyles)
|
||
|
|
},
|
||
|
|
shapeType: 'triangle',
|
||
|
|
// 文本位置
|
||
|
|
labelPosition: 'bottom',
|
||
|
|
drawShape: function drawShape(cfg, group) {
|
||
|
|
var _a = this.mergeStyle || this.getOptions(cfg),
|
||
|
|
_b = _a.icon,
|
||
|
|
icon = _b === void 0 ? {} : _b,
|
||
|
|
defaultDirection = _a.direction;
|
||
|
|
var style = this.getShapeStyle(cfg);
|
||
|
|
var direction = cfg.direction || defaultDirection;
|
||
|
|
var keyShape = group.addShape('path', {
|
||
|
|
attrs: style,
|
||
|
|
className: "".concat(this.type, "-keyShape"),
|
||
|
|
name: "".concat(this.type, "-keyShape"),
|
||
|
|
draggable: true
|
||
|
|
});
|
||
|
|
group['shapeMap']["".concat(this.type, "-keyShape")] = keyShape;
|
||
|
|
var w = icon.width,
|
||
|
|
h = icon.height,
|
||
|
|
show = icon.show,
|
||
|
|
offset = icon.offset,
|
||
|
|
text = icon.text;
|
||
|
|
if (show) {
|
||
|
|
if (text) {
|
||
|
|
group['shapeMap']["".concat(this.type, "-icon")] = group.addShape('text', {
|
||
|
|
attrs: (0, _tslib.__assign)({
|
||
|
|
x: 0,
|
||
|
|
y: 0,
|
||
|
|
fontSize: 12,
|
||
|
|
fill: '#000',
|
||
|
|
stroke: '#000',
|
||
|
|
textBaseline: 'middle',
|
||
|
|
textAlign: 'center'
|
||
|
|
}, icon),
|
||
|
|
className: "".concat(this.type, "-icon"),
|
||
|
|
name: "".concat(this.type, "-icon"),
|
||
|
|
draggable: true
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
var iconW = -w / 2;
|
||
|
|
var iconH = -h / 2;
|
||
|
|
if (direction === 'up' || direction === 'down') {
|
||
|
|
iconH += offset;
|
||
|
|
}
|
||
|
|
if (direction === 'left' || direction === 'right') {
|
||
|
|
iconW += offset;
|
||
|
|
}
|
||
|
|
group['shapeMap']["".concat(this.type, "-icon")] = group.addShape('image', {
|
||
|
|
attrs: (0, _tslib.__assign)({
|
||
|
|
x: iconW,
|
||
|
|
y: iconH
|
||
|
|
}, icon),
|
||
|
|
className: "".concat(this.type, "-icon"),
|
||
|
|
name: "".concat(this.type, "-icon"),
|
||
|
|
draggable: true
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.drawLinkPoints(cfg, group);
|
||
|
|
return keyShape;
|
||
|
|
},
|
||
|
|
/**
|
||
|
|
* 绘制节点上的LinkPoints
|
||
|
|
* @param {Object} cfg data数据配置项
|
||
|
|
* @param {Group} group Group实例
|
||
|
|
*/
|
||
|
|
drawLinkPoints: function drawLinkPoints(cfg, group) {
|
||
|
|
var _a = this.mergeStyle || this.getOptions(cfg),
|
||
|
|
_b = _a.linkPoints,
|
||
|
|
linkPoints = _b === void 0 ? {} : _b,
|
||
|
|
defaultDirection = _a.direction;
|
||
|
|
var direction = cfg.direction || defaultDirection;
|
||
|
|
var top = linkPoints.top,
|
||
|
|
left = linkPoints.left,
|
||
|
|
right = linkPoints.right,
|
||
|
|
bottom = linkPoints.bottom,
|
||
|
|
markSize = linkPoints.size,
|
||
|
|
markR = linkPoints.r,
|
||
|
|
markStyle = (0, _tslib.__rest)(linkPoints, ["top", "left", "right", "bottom", "size", "r"]);
|
||
|
|
var size = this.getSize(cfg);
|
||
|
|
var len = size[0];
|
||
|
|
if (left) {
|
||
|
|
// up down left right 四个方向的坐标均不相同
|
||
|
|
var leftPos = null;
|
||
|
|
var diffY = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var r = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
if (direction === 'up') {
|
||
|
|
leftPos = [-r, diffY];
|
||
|
|
} else if (direction === 'down') {
|
||
|
|
leftPos = [-r, -diffY];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
leftPos = [-r, r - diffY];
|
||
|
|
}
|
||
|
|
if (leftPos) {
|
||
|
|
// left circle
|
||
|
|
group['shapeMap']['link-point-left'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
|
||
|
|
x: leftPos[0],
|
||
|
|
y: leftPos[1],
|
||
|
|
r: markSize / 2 || markR || 5
|
||
|
|
}),
|
||
|
|
className: 'link-point-left',
|
||
|
|
name: 'link-point-left'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (right) {
|
||
|
|
// right circle
|
||
|
|
// up down left right 四个方向的坐标均不相同
|
||
|
|
var rightPos = null;
|
||
|
|
var diffY = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var r = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
if (direction === 'up') {
|
||
|
|
rightPos = [r, diffY];
|
||
|
|
} else if (direction === 'down') {
|
||
|
|
rightPos = [r, -diffY];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
rightPos = [r, r - diffY];
|
||
|
|
}
|
||
|
|
if (rightPos) {
|
||
|
|
group['shapeMap']['link-point-right'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
|
||
|
|
x: rightPos[0],
|
||
|
|
y: rightPos[1],
|
||
|
|
r: markSize / 2 || markR || 5
|
||
|
|
}),
|
||
|
|
className: 'link-point-right',
|
||
|
|
name: 'link-point-right'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (top) {
|
||
|
|
// up down left right 四个方向的坐标均不相同
|
||
|
|
var topPos = null;
|
||
|
|
var diffY = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var r = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
if (direction === 'up') {
|
||
|
|
topPos = [r - diffY, -diffY];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
topPos = [r, -diffY];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
topPos = [-r, -diffY];
|
||
|
|
}
|
||
|
|
if (topPos) {
|
||
|
|
// top circle
|
||
|
|
group['shapeMap']['link-point-top'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
|
||
|
|
x: topPos[0],
|
||
|
|
y: topPos[1],
|
||
|
|
r: markSize / 2 || markR || 5
|
||
|
|
}),
|
||
|
|
className: 'link-point-top',
|
||
|
|
name: 'link-point-top'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (bottom) {
|
||
|
|
// up down left right 四个方向的坐标均不相同
|
||
|
|
var bottomPos = null;
|
||
|
|
var diffY = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var r = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
if (direction === 'down') {
|
||
|
|
bottomPos = [-r + diffY, diffY];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
bottomPos = [r, diffY];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
bottomPos = [-r, diffY];
|
||
|
|
}
|
||
|
|
if (bottomPos) {
|
||
|
|
// bottom circle
|
||
|
|
group['shapeMap']['link-point-bottom'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
|
||
|
|
x: bottomPos[0],
|
||
|
|
y: bottomPos[1],
|
||
|
|
r: markSize / 2 || markR || 5
|
||
|
|
}),
|
||
|
|
className: 'link-point-bottom',
|
||
|
|
name: 'link-point-bottom'
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
getPath: function getPath(cfg) {
|
||
|
|
var defaultDirection = (this.mergeStyle || this.getOptions(cfg)).direction;
|
||
|
|
var direction = cfg.direction || defaultDirection;
|
||
|
|
var size = this.getSize(cfg);
|
||
|
|
var len = size[0];
|
||
|
|
var diffY = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var r = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var path = [['M', -r, diffY], ['L', 0, -diffY], ['L', r, diffY], ['Z'] // 封闭
|
||
|
|
];
|
||
|
|
if (direction === 'down') {
|
||
|
|
path = [['M', -r, -diffY], ['L', r, -diffY], ['L', 0, diffY], ['Z'] // 封闭
|
||
|
|
];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
path = [['M', -r, r - diffY], ['L', r, -r], ['L', r, r], ['Z'] // 封闭
|
||
|
|
];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
path = [['M', r, r - diffY], ['L', -r, r], ['L', -r, -r], ['Z'] // 封闭
|
||
|
|
];
|
||
|
|
}
|
||
|
|
return path;
|
||
|
|
},
|
||
|
|
/**
|
||
|
|
* 获取节点的样式,供基于该节点自定义时使用
|
||
|
|
* @param {Object} cfg 节点数据模型
|
||
|
|
* @return {Object} 节点的样式
|
||
|
|
*/
|
||
|
|
getShapeStyle: function getShapeStyle(cfg) {
|
||
|
|
var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;
|
||
|
|
var strokeStyle = {
|
||
|
|
stroke: cfg.color
|
||
|
|
};
|
||
|
|
// 如果设置了color,则覆盖默认的stroke属性
|
||
|
|
var style = (0, _util.mix)({}, defaultStyle, strokeStyle);
|
||
|
|
var path = this.getPath(cfg);
|
||
|
|
var styles = (0, _tslib.__assign)({
|
||
|
|
path: path
|
||
|
|
}, style);
|
||
|
|
return styles;
|
||
|
|
},
|
||
|
|
update: function update(cfg, item, updateType) {
|
||
|
|
var group = item.getContainer();
|
||
|
|
// 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式
|
||
|
|
var defaultStyle = this.getOptions({}).style;
|
||
|
|
var path = this.getPath(cfg);
|
||
|
|
// 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。
|
||
|
|
var strokeStyle = {
|
||
|
|
stroke: cfg.color,
|
||
|
|
path: path
|
||
|
|
};
|
||
|
|
// 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。
|
||
|
|
var keyShape = item.get('keyShape');
|
||
|
|
var style = (0, _util.mix)({}, defaultStyle, keyShape.attr(), strokeStyle);
|
||
|
|
style = (0, _util.mix)(style, cfg.style);
|
||
|
|
this.updateShape(cfg, item, style, true, updateType);
|
||
|
|
this.updateLinkPoints(cfg, group);
|
||
|
|
},
|
||
|
|
/**
|
||
|
|
* 更新linkPoints
|
||
|
|
* @param {Object} cfg 节点数据配置项
|
||
|
|
* @param {Group} group Item所在的group
|
||
|
|
*/
|
||
|
|
updateLinkPoints: function updateLinkPoints(cfg, group) {
|
||
|
|
var _a = this.getOptions({}),
|
||
|
|
defaultLinkPoints = _a.linkPoints,
|
||
|
|
defaultDirection = _a.direction;
|
||
|
|
var direction = cfg.direction || defaultDirection;
|
||
|
|
var markLeft = group['shapeMap']['link-point-left'] || group.find(function (element) {
|
||
|
|
return element.get('className') === 'link-point-left';
|
||
|
|
});
|
||
|
|
var markRight = group['shapeMap']['link-point-right'] || group.find(function (element) {
|
||
|
|
return element.get('className') === 'link-point-right';
|
||
|
|
});
|
||
|
|
var markTop = group['shapeMap']['link-point-top'] || group.find(function (element) {
|
||
|
|
return element.get('className') === 'link-point-top';
|
||
|
|
});
|
||
|
|
var markBottom = group['shapeMap']['link-point-bottom'] || group.find(function (element) {
|
||
|
|
return element.get('className') === 'link-point-bottom';
|
||
|
|
});
|
||
|
|
var currentLinkPoints = defaultLinkPoints;
|
||
|
|
var existLinkPoint = markLeft || markRight || markTop || markBottom;
|
||
|
|
if (existLinkPoint) {
|
||
|
|
currentLinkPoints = existLinkPoint.attr();
|
||
|
|
}
|
||
|
|
var linkPoints = (0, _util.mix)({}, currentLinkPoints, cfg.linkPoints);
|
||
|
|
var markFill = linkPoints.fill,
|
||
|
|
markStroke = linkPoints.stroke,
|
||
|
|
borderWidth = linkPoints.lineWidth;
|
||
|
|
var markSize = linkPoints.size / 2;
|
||
|
|
if (!markSize) markSize = linkPoints.r;
|
||
|
|
var _b = cfg.linkPoints ? cfg.linkPoints : {
|
||
|
|
left: undefined,
|
||
|
|
right: undefined,
|
||
|
|
top: undefined,
|
||
|
|
bottom: undefined
|
||
|
|
},
|
||
|
|
left = _b.left,
|
||
|
|
right = _b.right,
|
||
|
|
top = _b.top,
|
||
|
|
bottom = _b.bottom;
|
||
|
|
var size = this.getSize(cfg);
|
||
|
|
var len = size[0];
|
||
|
|
var styles = {
|
||
|
|
r: markSize,
|
||
|
|
fill: markFill,
|
||
|
|
stroke: markStroke,
|
||
|
|
lineWidth: borderWidth
|
||
|
|
};
|
||
|
|
var leftPos = null;
|
||
|
|
var diffY = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
var r = len * Math.sin(1 / 3 * Math.PI);
|
||
|
|
if (direction === 'up') {
|
||
|
|
leftPos = [-r, diffY];
|
||
|
|
} else if (direction === 'down') {
|
||
|
|
leftPos = [-r, -diffY];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
leftPos = [-r, r - diffY];
|
||
|
|
}
|
||
|
|
if (leftPos) {
|
||
|
|
if (markLeft) {
|
||
|
|
if (!left && left !== undefined) {
|
||
|
|
markLeft.remove();
|
||
|
|
delete group['shapeMap']['link-point-left'];
|
||
|
|
} else {
|
||
|
|
markLeft.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: leftPos[0],
|
||
|
|
y: leftPos[1]
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
} else if (left) {
|
||
|
|
group['shapeMap']['link-point-left'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: leftPos[0],
|
||
|
|
y: leftPos[1]
|
||
|
|
}),
|
||
|
|
className: 'link-point-left',
|
||
|
|
name: 'link-point-left',
|
||
|
|
isAnchorPoint: true
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
var rightPos = null;
|
||
|
|
if (direction === 'up') {
|
||
|
|
rightPos = [r, diffY];
|
||
|
|
} else if (direction === 'down') {
|
||
|
|
rightPos = [r, -diffY];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
rightPos = [r, r - diffY];
|
||
|
|
}
|
||
|
|
if (rightPos) {
|
||
|
|
if (markRight) {
|
||
|
|
if (!right && right !== undefined) {
|
||
|
|
markRight.remove();
|
||
|
|
delete group['shapeMap']['link-point-right'];
|
||
|
|
} else {
|
||
|
|
markRight.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: rightPos[0],
|
||
|
|
y: rightPos[1]
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
} else if (right) {
|
||
|
|
group['shapeMap']['link-point-right'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: rightPos[0],
|
||
|
|
y: rightPos[1]
|
||
|
|
}),
|
||
|
|
className: 'link-point-right',
|
||
|
|
name: 'link-point-right',
|
||
|
|
isAnchorPoint: true
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
var topPos = null;
|
||
|
|
if (direction === 'up') {
|
||
|
|
topPos = [r - diffY, -diffY];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
topPos = [r, -diffY];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
topPos = [-r, -diffY];
|
||
|
|
}
|
||
|
|
if (topPos) {
|
||
|
|
if (markTop) {
|
||
|
|
if (!top && top !== undefined) {
|
||
|
|
markTop.remove();
|
||
|
|
delete group['shapeMap']['link-point-top'];
|
||
|
|
} else {
|
||
|
|
// top circle
|
||
|
|
markTop.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: topPos[0],
|
||
|
|
y: topPos[1]
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
} else if (top) {
|
||
|
|
group['shapeMap']['link-point-top'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: topPos[0],
|
||
|
|
y: topPos[1]
|
||
|
|
}),
|
||
|
|
className: 'link-point-top',
|
||
|
|
name: 'link-point-top',
|
||
|
|
isAnchorPoint: true
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
var bottomPos = null;
|
||
|
|
if (direction === 'down') {
|
||
|
|
bottomPos = [-r + diffY, diffY];
|
||
|
|
} else if (direction === 'left') {
|
||
|
|
bottomPos = [r, diffY];
|
||
|
|
} else if (direction === 'right') {
|
||
|
|
bottomPos = [-r, diffY];
|
||
|
|
}
|
||
|
|
if (bottomPos) {
|
||
|
|
if (markBottom) {
|
||
|
|
if (!bottom && bottom !== undefined) {
|
||
|
|
markBottom.remove();
|
||
|
|
delete group['shapeMap']['link-point-bottom'];
|
||
|
|
} else {
|
||
|
|
markBottom.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: bottomPos[0],
|
||
|
|
y: bottomPos[1]
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
} else if (bottom) {
|
||
|
|
group['shapeMap']['link-point-bottom'] = group.addShape('circle', {
|
||
|
|
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
|
||
|
|
x: bottomPos[0],
|
||
|
|
y: bottomPos[1]
|
||
|
|
}),
|
||
|
|
className: 'link-point-bottom',
|
||
|
|
name: 'link-point-bottom',
|
||
|
|
isAnchorPoint: true
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}, 'single-node');
|