@antv/g6
Version:
graph visualization frame work
220 lines (196 loc) • 7.48 kB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* @fileOverview edge item
* @author huangtonger@aliyun.com
*/
var Util = require('../util/');
var Item = require('./item');
var Edge = function (_Item) {
_inherits(Edge, _Item);
function Edge(cfg) {
_classCallCheck(this, Edge);
var defaultCfg = {
type: 'edge',
isEdge: true,
zIndex: 2
};
Util.mix(defaultCfg, cfg);
return _possibleConstructorReturn(this, _Item.call(this, defaultCfg));
}
Edge.prototype._beforeDraw = function _beforeDraw() {
var model = this.model;
var itemMap = this.itemMap;
if (!Util.isObject(model.source)) {
this.source = itemMap[model.source];
} else {
this.source = model.source;
}
if (!Util.isObject(model.target)) {
this.target = itemMap[model.target];
} else {
this.target = model.target;
}
_Item.prototype._beforeDraw.call(this);
};
Edge.prototype._afterDraw = function _afterDraw() {
if (!this.linkedItemVisible()) {
this.hide();
}
this._addArrow();
_Item.prototype._afterDraw.call(this);
};
Edge.prototype._addArrow = function _addArrow() {
var model = this.model;
var keyShape = this.keyShape;
var shapeObj = this.shapeObj;
var styleEndArrow = keyShape.attr('endArrow');
var styleStartArrow = keyShape.attr('startArrow');
var endArrow = model.endArrow || styleEndArrow;
var startArrow = model.startArrow || styleStartArrow;
styleStartArrow && keyShape.attr('startArrow', false);
styleEndArrow && keyShape.attr('endArrow', false);
endArrow && this._drawArrow(shapeObj.endArrow, 'end');
startArrow && this._drawArrow(shapeObj.startArrow, 'start');
};
Edge.prototype._drawArrow = function _drawArrow(_ref, type) {
var path = _ref.path,
dindent = _ref.dindent,
tangent = _ref.tangent,
ratio = _ref.ratio,
style = _ref.style;
tangent = tangent(this);
dindent = dindent(this);
path = path(this);
style = style(this);
ratio = ratio();
var group = this.group;
var keyShape = this.keyShape;
var point = keyShape.getPoint(ratio);
if (!point) {
return;
}
var keyShapePath = Util.cloneDeep(keyShape.attr('path'));
var marker = group.addShape('marker', {
attrs: _extends({
symbol: function symbol() {
return path;
}
}, style)
});
var x = tangent[1][0] - tangent[0][0];
var y = tangent[1][1] - tangent[0][1];
var tangentLength = Math.sqrt(x * x + y * y);
var dindentRatio = dindent / tangentLength;
var vDindent = [-x * dindentRatio, -y * dindentRatio];
var deg = 0;
var tan = Math.atan(x / y);
if (y === 0 && x < 0) {
deg = Math.PI;
} else if (x > 0 && y > 0) {
deg = Math.PI / 2 - tan;
} else if (x < 0 && y < 0) {
deg = -Math.PI / 2 - tan;
} else if (x >= 0 && y < 0) {
deg = -tan - Math.PI / 2;
} else if (x <= 0 && y > 0) {
deg = Math.PI / 2 - tan;
}
marker.rotate(deg);
marker.translate(point.x, point.y);
if (type === 'end') {
var lastSegment = keyShapePath[keyShapePath.length - 1];
lastSegment[lastSegment.length - 1] = vDindent[1] + point.y;
lastSegment[lastSegment.length - 2] = vDindent[0] + point.x;
} else {
var startSegment = keyShapePath[0];
startSegment[startSegment.length - 1] = vDindent[1] + point.y;
startSegment[startSegment.length - 2] = vDindent[0] + point.x;
}
keyShape.attr('path', keyShapePath);
};
Edge.prototype._getControlPoints = function _getControlPoints() {
var controlPoints = this.model.controlPoints;
if (Util.isArray(controlPoints)) {
return controlPoints;
}
return [];
};
Edge.prototype._shouldDraw = function _shouldDraw() {
return _Item.prototype._shouldDraw.call(this) && this.linkedItemVisible();
};
Edge.prototype._getPoint = function _getPoint(point) {
if (point.linkable) {
var box = point.getBBox();
return {
x: box.centerX,
y: box.centerY
};
}
return {
x: point.x,
y: point.y
};
};
// layoutUpdate() {
// const group = this.getGraphicGroup();
// const children = group.get('children');
// this._beforeDraw();
// if (children.length === 1) {
// const keyShape = this.keyShape;
// const shapeObj = this.shapeObj;
// keyShape.attr('path', shapeObj.getPath(this));
// } else {
// this.draw();
// }
// this._afterDraw();
// }
Edge.prototype.linkedItemVisible = function linkedItemVisible() {
var source = this.source;
var target = this.target;
return Util.isPlainObject(source) || Util.isPlainObject(target) || source.isVisible() || target.isVisible() || source.collapsedParent !== target.collapsedParent;
};
Edge.prototype.getSource = function getSource() {
var source = this.source;
var collapsedParent = source.collapsedParent;
var itemMap = this.itemMap;
if (collapsedParent) {
return itemMap[collapsedParent.id];
}
return source;
};
Edge.prototype.getTarget = function getTarget() {
var target = this.target;
var collapsedParent = target.collapsedParent;
var itemMap = this.itemMap;
if (collapsedParent) {
return itemMap[collapsedParent.id];
}
return target;
};
Edge.prototype.getPoints = function getPoints() {
var source = this.getSource();
var target = this.getTarget();
var model = this.model;
var controlPoints = this._getControlPoints();
var sourcePoint = this._getPoint(source);
var targetPoint = this._getPoint(target);
var points = [sourcePoint].concat(controlPoints).concat([targetPoint]);
var psl = points.length;
if (source.linkable) {
var point = Util.isNumber(this.model.sourceAnchor) && source.id === model.source ? this.model.sourceAnchor : points[1];
var interPoint = source.getLinkPoints(point);
points[0] = interPoint[0];
}
if (target.linkable) {
var _point = Util.isNumber(this.model.targetAnchor) && target.id === model.target ? this.model.targetAnchor : points[psl - 2];
var _interPoint = target.getLinkPoints(_point);
points[psl - 1] = _interPoint[0];
}
return points;
};
return Edge;
}(Item);
module.exports = Edge;