UNPKG

@antv/g6

Version:

graph visualization frame work

220 lines (196 loc) 7.48 kB
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;