UNPKG

@antv/g2plot

Version:

G2 Plot, a market of plots built with the Grammar of Graphics'

101 lines 4.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var g2_1 = require("@antv/g2"); var _ = tslib_1.__importStar(require("lodash")); var utils_1 = require("./utils"); var base_label_1 = tslib_1.__importDefault(require("./base-label")); var math_1 = require("../../../../util/math"); function percent2Number(value) { var percentage = Number(value.endsWith('%') ? value.slice(0, -1) : value); return percentage / 100; } exports.percent2Number = percent2Number; /** * @desc 饼图 inner-label 布局 * @done */ var InnerLabel = /** @class */ (function (_super) { tslib_1.__extends(InnerLabel, _super); function InnerLabel() { return _super !== null && _super.apply(this, arguments) || this; } InnerLabel.prototype.adjustPosition = function (labels, items, coord) { var _this = this; var center = coord.getCenter(); var radius = coord.getRadius(); var offset = this.getOffsetOfLabel(); var r = radius + offset; labels.forEach(function (label, idx) { var anchor = items.find(function (i) { return i.id === label.id; }); var _a = utils_1.getEndPoint(center, anchor.angle, r), newX = _a.x, newY = _a.y; label.attr('x', newX); label.attr('y', newY); label.attr('textBaseline', 'middle'); if (idx > 0) { var prevLabel = labels[idx - 1]; _this.resolveCollision(label, prevLabel, anchor, coord); } }); }; /** @override inner布局不需要拉线 */ InnerLabel.prototype.adjustLines = function (labels, items, labelLines, coord) { labelLines.forEach(function (l) { return l.set('visible', false); }); }; /** @override */ InnerLabel.prototype.adjustLabelText = function () { }; /** @override 不能大于0 */ InnerLabel.prototype.getOffsetOfLabel = function () { var labelOptions = this.get('labelOptions'); var offset = labelOptions.offset; var radius = this.get('coord').getRadius(); if (_.isString(offset)) { offset = radius * percent2Number(offset); } return offset > 0 ? 0 : offset; }; /** label 碰撞调整 */ InnerLabel.prototype.resolveCollision = function (label, prev, anchor, coord) { var angle = anchor.angle; var box = label.getBBox(); var prevBBox = prev.getBBox(); var pos = { x: (box.minX + box.maxX) / 2, y: (box.minY + box.maxY) / 2 }; // 两种调整方案 /** 先偏移 x 方向 -> 再计算 y 位置 */ var pos1 = _.clone(pos); /** 先偏移 y 方向 -> 再计算 x 位置 */ var pos2 = _.clone(pos); // check overlap if (prev.id !== label.id) { var _a = utils_1.getOverlapInfo(box, prevBBox), xOverlap = _a.xOverlap, yOverlap = _a.yOverlap; if (xOverlap) { pos1.x = pos.x + xOverlap; pos1.y = pos.y + Math.tan(angle) * xOverlap; } if (yOverlap) { // fix issue-460 var yMover = yOverlap; var center = coord.getCenter(); if (pos.y < center.y) { // 上方label优先往上偏移 yMover = yMover < 0 ? yMover : prevBBox.minY - box.maxY; } else { // 下方label优先往下偏移 yMover = yMover > 0 ? yMover : prevBBox.maxY - box.minY; } pos2.y = pos.y + yMover; pos2.x = pos.x + yMover / Math.tan(angle); } var dist1 = math_1.distBetweenPoints(pos, pos1); var dist2 = math_1.distBetweenPoints(pos, pos2); var actualPos = dist1 < dist2 ? pos1 : pos2; // 取偏移距离最小的 label.attr('x', actualPos.x); label.attr('y', actualPos.y); } }; return InnerLabel; }(base_label_1.default)); g2_1.registerElementLabels('inner', InnerLabel); //# sourceMappingURL=inner-label.js.map