NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/component/lib/axis/base.js
2023-09-14 14:47:11 +08:00

649 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var Component = require('../component');
var Util = require('../util');
var Grid = require('./grid');
var Label = require('../label/base');
var _require = require('../const'),
FONT_FAMILY = _require.FONT_FAMILY;
var Axis = /*#__PURE__*/function (_Component) {
_inheritsLoose(Axis, _Component);
var _super = _createSuper(Axis);
function Axis() {
return _Component.apply(this, arguments) || this;
}
var _proto = Axis.prototype;
_proto.getDefaultCfg = function getDefaultCfg() {
var cfg = _Component.prototype.getDefaultCfg.call(this);
return Util.mix({}, cfg, {
/**
* 用于动画,唯一标识的 id
* @type {[type]}
*/
_id: null,
zIndex: 4,
/**
* 坐标轴上的坐标点
* @type {Array}
*/
ticks: null,
/**
* 坐标轴线的配置信息如果设置成null则不显示轴线
* @type {Object}
*/
line: null,
/**
* 坐标轴刻度线的配置,如果设置成null则不显示刻度线
* @type {Object}
*/
tickLine: null,
/**
* 次刻度线个数配置
* @type {Number}
*/
subTickCount: 0,
/**
* 次刻度线样式配置
* @type {Object}
*/
subTickLine: null,
/**
* 网格线配置,如果值为 null则不显示
* @type {Object}
*/
grid: null,
/**
* 坐标轴文本配置
* @type {Object}
*/
label: {
offset: 0,
offsetX: 0,
offsetY: 0,
textStyle: {},
// 坐标轴文本样式
autoRotate: true,
autoHide: false,
formatter: null // 坐标轴文本格式化回调函数
},
labelItems: [],
/**
* 坐标轴标题配置
* @type {Object}
*/
title: {
autoRotate: true,
// 文本是否自动旋转
textStyle: {} // 坐标轴标题样式
},
autoPaint: true
});
};
_proto.beforeRender = function beforeRender() {
var self = this;
var title = self.get('title');
var label = self.get('label');
var grid = self.get('grid');
if (title) {
self.set('title', Util.deepMix({
autoRotate: true,
textStyle: {
fontSize: 12,
fill: '#ccc',
textBaseline: 'middle',
fontFamily: FONT_FAMILY,
textAlign: 'center'
},
offset: 48
}, title));
}
if (label) {
self.set('label', Util.deepMix({
autoRotate: true,
autoHide: true,
textStyle: {
fontSize: 12,
fill: '#ccc',
textBaseline: 'middle',
fontFamily: FONT_FAMILY
},
offset: 10
}, label));
}
if (grid) {
self.set('grid', Util.deepMix({
lineStyle: {
lineWidth: 1,
stroke: '#C0D0E0'
}
}, grid));
}
};
_proto.render = function render() {
var self = this;
self.beforeRender();
var labelCfg = self.get('label');
if (labelCfg) {
self.renderLabels();
}
if (self.get('autoPaint')) {
self.paint();
}
if (!Util.isNil(self.get('title'))) {
self.renderTitle();
}
self.get('group').sort();
};
_proto.renderLabels = function renderLabels() {
var self = this;
var group = self.get('group');
var labelCfg = self.get('label');
var labelRenderer = new Label({
name: 'axis-label'
});
self.set('labelRenderer', labelRenderer);
labelRenderer.set('labelCfg', labelCfg);
var cfgs2copy = ['formatter', 'htmlTemplate', 'labelLine', 'textStyle', 'useHtml'];
Util.each(cfgs2copy, function (cfg) {
if (labelCfg[cfg]) {
labelRenderer.set(cfg, labelCfg[cfg]);
}
});
labelRenderer.set('coord', self.get('coord'));
labelRenderer.set('group', group.addGroup());
labelRenderer.set('canvas', self.get('canvas'));
};
_proto._parseTicks = function _parseTicks(ticks) {
ticks = ticks || [];
var ticksLength = ticks.length;
for (var i = 0; i < ticksLength; i++) {
var item = ticks[i];
if (!Util.isObject(item)) {
ticks[i] = this.parseTick(item, i, ticksLength);
}
}
this.set('ticks', ticks);
return ticks;
};
_proto._addTickItem = function _addTickItem(index, point, length, type) {
if (type === void 0) {
type = '';
}
var tickItems = this.get('tickItems');
var subTickItems = this.get('subTickItems');
var end = this.getTickEnd(point, length, index);
var cfg = {
x1: point.x,
y1: point.y,
x2: end.x,
y2: end.y
};
if (!tickItems) {
tickItems = [];
}
if (!subTickItems) {
subTickItems = [];
}
if (type === 'sub') {
subTickItems.push(cfg);
} else {
tickItems.push(cfg);
}
this.set('tickItems', tickItems);
this.set('subTickItems', subTickItems);
};
_proto._renderLine = function _renderLine() {
var self = this;
var lineCfg = self.get('line');
var path;
if (lineCfg) {
path = self.getLinePath();
lineCfg = Util.mix({
path: path
}, lineCfg);
var group = self.get('group');
var lineShape = group.addShape('path', {
attrs: lineCfg
});
lineShape.name = 'axis-line';
self.get('appendInfo') && lineShape.setSilent('appendInfo', self.get('appendInfo'));
self.set('lineShape', lineShape);
}
};
_proto._processCatTicks = function _processCatTicks() {
var self = this;
var labelCfg = self.get('label');
var tickLineCfg = self.get('tickLine');
var ticks = self.get('ticks');
ticks = self._parseTicks(ticks);
var new_ticks = self._getNormalizedTicks(ticks);
for (var i = 0; i < new_ticks.length; i += 3) {
var p = self.getTickPoint(new_ticks[i]);
var p0 = self.getTickPoint(new_ticks[i + 1]);
var p1 = self.getTickPoint(new_ticks[i + 2]);
var index = Math.floor(i / 3);
var tick = ticks[index];
if (tickLineCfg) {
if (index === 0) {
self._addTickItem(index, p0, tickLineCfg.length);
}
self._addTickItem(index, p1, tickLineCfg.length);
}
if (labelCfg) {
self.addLabel(tick, p, index);
}
}
};
_proto._getNormalizedTicks = function _getNormalizedTicks(ticks) {
var tickSeg = 0;
if (ticks.length > 1) {
tickSeg = (ticks[1].value - ticks[0].value) / 2;
}
var points = [];
for (var i = 0; i < ticks.length; i++) {
var tick = ticks[i];
var p = tick.value;
var p0 = tick.value - tickSeg;
var p1 = tick.value + tickSeg;
points.push(p, p0, p1);
}
var range = Util.arrayUtil.getRange(points);
return points.map(function (p) {
var norm = (p - range.min) / (range.max - range.min);
return norm;
});
};
_proto.addLabel = function addLabel(tick, point, index) {
var self = this;
var labelItems = self.get('labelItems');
var labelRenderer = self.get('labelRenderer');
var label = Util.deepMix({}, self.get('label'));
var rst;
if (labelRenderer) {
var offset = self.get('_labelOffset');
if (!Util.isNil(self.get('label').offset)) {
offset = self.get('label').offset;
}
var vector = self.getSideVector(offset, point, index);
point = {
x: point.x + vector[0] + label.offsetX,
y: point.y + vector[1] + label.offsetY
};
label.text = tick.text;
label.x = point.x;
label.y = point.y;
label.point = point;
label.textAlign = self.getTextAnchor(vector);
if (point.rotate) {
label.rotate = point.rotate;
}
labelItems.push(label);
}
return rst;
};
_proto._processTicks = function _processTicks() {
var self = this;
var labelCfg = self.get('label');
var subTickCount = self.get('subTickCount');
var tickLineCfg = self.get('tickLine');
var ticks = self.get('ticks');
ticks = self._parseTicks(ticks);
Util.each(ticks, function (tick, index) {
var tickPoint = self.getTickPoint(tick.value, index);
if (tickLineCfg) {
self._addTickItem(index, tickPoint, tickLineCfg.length);
}
if (labelCfg) {
self.addLabel(tick, tickPoint, index);
}
});
if (subTickCount) {
// 如果有设置次级分点添加次级tick
var subTickLineCfg = self.get('subTickLine');
Util.each(ticks, function (tick, index) {
if (index > 0) {
var diff = tick.value - ticks[index - 1].value;
diff = diff / (self.get('subTickCount') + 1);
for (var i = 1; i <= subTickCount; i++) {
var subTick = {
text: '',
value: index ? ticks[index - 1].value + i * diff : i * diff
};
var tickPoint = self.getTickPoint(subTick.value);
var subTickLength = void 0;
if (subTickLineCfg && subTickLineCfg.length) {
subTickLength = subTickLineCfg.length;
} else {
subTickLength = parseInt(tickLineCfg.length * (3 / 5), 10);
}
self._addTickItem(i - 1, tickPoint, subTickLength, 'sub');
}
}
});
}
};
_proto._addTickLine = function _addTickLine(ticks, lineCfg) {
var self = this;
var cfg = Util.mix({}, lineCfg);
var path = [];
Util.each(ticks, function (item) {
path.push(['M', item.x1, item.y1]);
path.push(['L', item.x2, item.y2]);
});
delete cfg.length;
cfg.path = path;
var group = self.get('group');
var tickShape = group.addShape('path', {
attrs: cfg
});
tickShape.name = 'axis-ticks';
tickShape._id = self.get('_id') + '-ticks';
tickShape.set('coord', self.get('coord'));
self.get('appendInfo') && tickShape.setSilent('appendInfo', self.get('appendInfo'));
};
_proto._renderTicks = function _renderTicks() {
var self = this;
var tickItems = self.get('tickItems');
var subTickItems = self.get('subTickItems');
if (!Util.isEmpty(tickItems)) {
var tickLineCfg = self.get('tickLine');
self._addTickLine(tickItems, tickLineCfg);
}
if (!Util.isEmpty(subTickItems)) {
var subTickLineCfg = self.get('subTickLine') || self.get('tickLine');
self._addTickLine(subTickItems, subTickLineCfg);
}
};
_proto._renderGrid = function _renderGrid() {
var grid = this.get('grid');
if (!grid) {
return;
}
grid.coord = this.get('coord');
grid.appendInfo = this.get('appendInfo');
var group = this.get('group');
this.set('gridGroup', group.addGroup(Grid, grid));
};
_proto._renderLabels = function _renderLabels() {
var self = this;
var labelRenderer = self.get('labelRenderer');
var labelItems = self.get('labelItems');
if (labelRenderer) {
labelRenderer.set('items', labelItems);
labelRenderer._dryDraw();
}
};
_proto.paint = function paint() {
var self = this;
var tickLineCfg = self.get('tickLine');
var alignWithLabel = true;
if (tickLineCfg && tickLineCfg.hasOwnProperty('alignWithLabel')) {
alignWithLabel = tickLineCfg.alignWithLabel;
}
self._renderLine();
var type = self.get('type');
var isCat = type === 'cat' || type === 'timeCat';
if (isCat && alignWithLabel === false) {
self._processCatTicks();
} else {
self._processTicks();
}
self._renderTicks();
self._renderGrid();
self._renderLabels();
var labelCfg = this.get('label');
if (labelCfg && labelCfg.autoRotate) {
self.autoRotateLabels();
}
if (labelCfg && labelCfg.autoHide) {
self.autoHideLabels();
}
};
_proto.parseTick = function parseTick(tick, index, length) {
return {
text: tick,
value: index / (length - 1)
};
};
_proto.getTextAnchor = function getTextAnchor(vector) {
var ratio = Math.abs(vector[1] / vector[0]);
var align;
if (ratio >= 1) {
// 上面或者下面
align = 'center';
} else {
if (vector[0] > 0) {
// 右侧
align = 'start';
} else {
// 左侧
align = 'end';
}
}
return align;
};
_proto.getMaxLabelWidth = function getMaxLabelWidth(labelRenderer) {
var labels = labelRenderer.getLabels();
var max = 0;
Util.each(labels, function (label) {
var bbox = label.getBBox();
var width = bbox.width;
if (max < width) {
max = width;
}
});
return max;
};
_proto.getMaxLabelHeight = function getMaxLabelHeight(labelRenderer) {
var labels = labelRenderer.getLabels();
var max = 0;
Util.each(labels, function (label) {
var bbox = label.getBBox();
var height = bbox.height;
if (max < height) {
max = height;
}
});
return max;
};
_proto.destroy = function destroy() {
var self = this;
if (!self.destroyed) {
var gridGroup = self.get('gridGroup');
gridGroup && gridGroup.remove();
var labelRenderer = this.get('labelRenderer');
labelRenderer && labelRenderer.destroy();
var group = self.get('group');
group.destroy();
_Component.prototype.destroy.call(this); // 要最后调用 super.destroy 否则 get 属性会无效
}
};
_proto.clear = function clear() {
var self = this;
var group = self.get('group');
if (!group.get('destroyed') && group.get('children').length) {
var gridGroup = self.get('gridGroup');
gridGroup && gridGroup.clear();
var labelRenderer = this.get('labelRenderer');
labelRenderer && labelRenderer.clear();
var _group = self.get('group');
_group.clear();
}
}
/**
* 旋转文本
* @abstract
* @return {[type]} [description]
*/
;
_proto.autoRotateLabels = function autoRotateLabels() {}
/**
* 文本自动防遮罩
* @abstract
* @return {[type]} [description]
*/
;
_proto.autoHideLabels = function autoHideLabels() {}
/**
* 渲染标题
* @abstract
* @return {[type]} [description]
*/
;
_proto.renderTitle = function renderTitle() {}
/**
* 获取坐标轴线的 path
* @abstract
* @return {[type]} [description]
*/
;
_proto.getLinePath = function getLinePath() {}
/**
* 获取 tick 在画布上的位置
* @abstract
* @return {[type]} [description]
*/
;
_proto.getTickPoint = function getTickPoint() {}
/**
* 获取标示坐标点的线的终点
* @abstract
* @return {[type]} [description]
*/
;
_proto.getTickEnd = function getTickEnd() {}
/**
* 获取距离坐标轴的向量
* @abstract
* @return {[type]} [description]
*/
;
_proto.getSideVector = function getSideVector() {};
return Axis;
}(Component);
module.exports = Axis;