@antv/g2
Version:
the Grammar of Graphics in Javascript
99 lines • 3.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pathAdjustPosition = void 0;
var tslib_1 = require("tslib");
var util_1 = require("@antv/util");
var util_2 = require("../../util");
/**
* 对同一组(相同 xField )的 Label 进行排序:第一个、最后一个、其他...
* @param geometry
* @param labels
*/
function sortLabels(geometry, labels) {
var yField = geometry.getXYFields()[1];
var result = [];
var sortedLabels = labels.sort(function (left, right) { return left.get('data')[yField] - left.get('data')[yField]; });
if (sortedLabels.length > 0) {
result.push(sortedLabels.shift());
}
if (sortedLabels.length > 0) {
result.push(sortedLabels.pop());
}
result.push.apply(result, tslib_1.__spreadArray([], tslib_1.__read(sortedLabels), false));
return result;
}
function hasSome(dones, current, compare) {
return dones.some(function (done) { return compare(done, current); });
}
/**
* 计算两个矩形之间的堆叠区域面积
*/
function getOverlapArea(a, b, margin) {
if (margin === void 0) { margin = 0; }
var xOverlap = Math.max(0, Math.min(a.x + a.width + margin, b.x + b.width + margin) - Math.max(a.x - margin, b.x - margin));
var yOverlap = Math.max(0, Math.min(a.y + a.height + margin, b.y + b.height + margin) - Math.max(a.y - margin, b.y - margin));
return xOverlap * yOverlap;
}
/**
* 判断新添加的 Label 是否和已存在的发生重叠
* @param dones
* @param current
*/
function checkShapeOverlap(dones, current) {
return hasSome(dones, current, function (left, right) {
var leftText = (0, util_2.findLabelTextShape)(left);
var rightText = (0, util_2.findLabelTextShape)(right);
return getOverlapArea(leftText.getCanvasBBox(), rightText.getCanvasBBox(), 2) > 0;
});
}
/**
* 适用于 point geometry 的数据标签位置自动调整布局方法
* @param items
* @param labels
* @param shapes
* @param region
* @param cfg
*/
function pathAdjustPosition(items, labels, shapes, region, cfg) {
var _a, _b;
if (shapes.length === 0) {
return;
}
var element = (_a = shapes[0]) === null || _a === void 0 ? void 0 : _a.get('element');
var geometry = element === null || element === void 0 ? void 0 : element.geometry;
if (!geometry || ['path', 'line', 'area'].indexOf(geometry.type) < 0) {
return;
}
var _c = tslib_1.__read(geometry.getXYFields(), 2), xField = _c[0], yField = _c[1];
var groupedLabels = (0, util_1.groupBy)(labels, function (label) { return label.get('data')[xField]; });
var dones = [];
var offset = (cfg && cfg.offset) || ((_b = items[0]) === null || _b === void 0 ? void 0 : _b.offset) || 12;
(0, util_1.map)((0, util_1.keys)(groupedLabels).reverse(), function (xValue) {
var sortedCollections = sortLabels(geometry, groupedLabels[xValue]);
while (sortedCollections.length) {
var current = sortedCollections.shift();
var textShape = (0, util_2.findLabelTextShape)(current);
if (hasSome(dones, current, function (left, right) {
return left.get('data')[xField] === right.get('data')[xField] &&
left.get('data')[yField] === right.get('data')[yField];
})) {
// 重复位置,直接隐藏
textShape.set('visible', false);
continue;
}
var upFail = checkShapeOverlap(dones, current);
var downFail = false;
if (upFail) {
textShape.attr('y', textShape.attr('y') + 2 * offset);
downFail = checkShapeOverlap(dones, current);
}
if (downFail) {
textShape.set('visible', false);
continue;
}
dones.push(current);
}
});
}
exports.pathAdjustPosition = pathAdjustPosition;
//# sourceMappingURL=adjust-position.js.map