NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/esm/chart/controller/axis.js

695 lines
28 KiB
Java
Raw Normal View History

2023-09-14 14:47:11 +08:00
import { __assign, __extends } from "tslib";
import { deepMix, each, get, isUndefined } from '@antv/util';
import { COMPONENT_TYPE, DIRECTION, LAYER } from '../../constant';
import { CircleAxis, CircleGrid, LineAxis, LineGrid } from '../../dependents';
import { DEFAULT_ANIMATE_CFG } from '../../animate/';
import { getAxisDirection, getAxisFactorByRegion, getAxisRegion, getAxisThemeCfg, getAxisTitleText, getCircleAxisCenterRadius } from '../../util/axis';
import { getAxisOption } from '../../util/axis';
import { getCircleGridItems, getGridThemeCfg, getLineGridItems, showGrid } from '../../util/grid';
import { omit } from '../../util/helper';
import { Controller } from './base';
// update 组件的时候,忽略的数据更新
var OMIT_CFG = ['container'];
// 坐标轴默认动画配置
var AXIS_DEFAULT_ANIMATE_CFG = __assign(__assign({}, DEFAULT_ANIMATE_CFG), { appear: null });
/**
* @ignore
* G2 Axis controller, will:
* - create component
* - axis
* - grid
* - life circle
*/
var Axis = /** @class */ (function (_super) {
__extends(Axis, _super);
function Axis(view) {
var _this = _super.call(this, view) || this;
/** 使用 object 存储组件 */
_this.cache = new Map();
// 先创建 gridContainer将 grid 放到 axis 底层
_this.gridContainer = _this.view.getLayer(LAYER.BG).addGroup();
_this.axisContainer = _this.view.getLayer(LAYER.BG).addGroup();
return _this;
}
Object.defineProperty(Axis.prototype, "name", {
get: function () {
return 'axis';
},
enumerable: false,
configurable: true
});
Axis.prototype.init = function () { };
Axis.prototype.render = function () {
this.option = this.view.getOptions().axes;
this.createXAxes();
this.createYAxes();
};
/**
* 更新组件布局位置大小
*/
Axis.prototype.layout = function () {
var _this = this;
var coordinate = this.view.getCoordinate();
each(this.getComponents(), function (co) {
var component = co.component, direction = co.direction, type = co.type, extra = co.extra;
var dim = extra.dim, scale = extra.scale, alignTick = extra.alignTick;
var updated;
if (type === COMPONENT_TYPE.AXIS) {
if (coordinate.isPolar) {
if (dim === 'x') {
updated = coordinate.isTransposed ? getAxisRegion(coordinate, direction) : getCircleAxisCenterRadius(coordinate);
}
else if (dim === 'y') {
updated = coordinate.isTransposed ? getCircleAxisCenterRadius(coordinate) : getAxisRegion(coordinate, direction);
}
}
else {
updated = getAxisRegion(coordinate, direction);
}
}
else if (type === COMPONENT_TYPE.GRID) {
if (coordinate.isPolar) {
var items = void 0;
if (coordinate.isTransposed) {
items = dim === 'x' ?
getCircleGridItems(coordinate, _this.view.getYScales()[0], scale, alignTick, dim) :
getLineGridItems(coordinate, scale, dim, alignTick);
}
else {
items = dim === 'x' ?
getLineGridItems(coordinate, scale, dim, alignTick) :
getCircleGridItems(coordinate, _this.view.getXScale(), scale, alignTick, dim);
}
updated = {
items: items,
// coordinate 更新之后center 也变化了
center: _this.view.getCoordinate().getCenter(),
};
}
else {
updated = { items: getLineGridItems(coordinate, scale, dim, alignTick) };
}
}
component.update(updated);
});
};
/**
* 更新 axis 组件
*/
Axis.prototype.update = function () {
this.option = this.view.getOptions().axes;
var updatedCache = new Map();
this.updateXAxes(updatedCache);
this.updateYAxes(updatedCache);
// 处理完成之后,销毁删除的
// 不在处理中的
var newCache = new Map();
this.cache.forEach(function (co, key) {
if (updatedCache.has(key)) {
newCache.set(key, co);
}
else {
// 不存在,则是所有需要被销毁的组件
co.component.destroy();
}
});
// 更新缓存
this.cache = newCache;
};
Axis.prototype.clear = function () {
_super.prototype.clear.call(this);
this.cache.clear();
this.gridContainer.clear();
this.axisContainer.clear();
};
Axis.prototype.destroy = function () {
_super.prototype.destroy.call(this);
this.gridContainer.remove(true);
this.axisContainer.remove(true);
};
/**
* @override
*/
Axis.prototype.getComponents = function () {
var co = [];
this.cache.forEach(function (value) {
co.push(value);
});
return co;
};
/**
* 更新 x axis
* @param updatedCache
*/
Axis.prototype.updateXAxes = function (updatedCache) {
// x axis
var scale = this.view.getXScale();
// @ts-ignore
if (!scale || scale.isIdentity) {
return;
}
var field = scale.field;
var xAxisOption = getAxisOption(this.option, scale.field);
if (xAxisOption === false) {
return;
}
var coordinate = this.view.getCoordinate();
var axisId = this.getId('axis', field);
var gridId = this.getId('grid', field);
var direction = getAxisDirection(xAxisOption, DIRECTION.BOTTOM);
var layer = LAYER.BG;
var dim = 'x';
if (coordinate.isRect) {
// 1. do axis update
var axis = this.cache.get(axisId);
// 存在则更新
if (axis) {
var cfg = this.getLineAxisCfg(scale, xAxisOption, direction);
omit(cfg, OMIT_CFG);
axis.component.update(cfg);
updatedCache.set(axisId, axis);
}
else {
// 不存在,则创建
axis = this.createLineAxis(scale, xAxisOption, layer, direction, dim);
this.cache.set(axisId, axis);
updatedCache.set(axisId, axis);
}
// 2. do grid update
var grid = this.cache.get(gridId);
// 存在则更新
if (grid) {
var cfg = this.getLineGridCfg(scale, xAxisOption, direction, dim);
omit(cfg, OMIT_CFG);
grid.component.update(cfg);
updatedCache.set(gridId, grid);
}
else {
// 不存在则创建
grid = this.createLineGrid(scale, xAxisOption, layer, direction, dim);
if (grid) {
this.cache.set(gridId, grid);
updatedCache.set(gridId, grid);
}
}
}
else if (coordinate.isPolar) {
// 1. do axis update
var axis = this.cache.get(axisId);
// 存在则更新
if (axis) {
var cfg = coordinate.isTransposed ?
// @ts-ignore
this.getLineAxisCfg(scale, xAxisOption, 'radius') :
this.getCircleAxisCfg(scale, xAxisOption, direction);
omit(cfg, OMIT_CFG);
axis.component.update(cfg);
updatedCache.set(axisId, axis);
}
else {
// 不存在,则创建
if (coordinate.isTransposed) {
if (isUndefined(xAxisOption)) {
// 默认不渲染转置极坐标下的坐标轴
return;
}
else {
// @ts-ignore
axis = this.createLineAxis(scale, xAxisOption, layer, 'radius', dim);
}
}
else {
axis = this.createCircleAxis(scale, xAxisOption, layer, direction, dim);
}
this.cache.set(axisId, axis);
updatedCache.set(axisId, axis);
}
// 2. do grid update
var grid = this.cache.get(gridId);
// 存在则更新
if (grid) {
var cfg = coordinate.isTransposed ?
// @ts-ignore
this.getCircleGridCfg(scale, xAxisOption, 'radius', dim) :
// @ts-ignore
this.getLineGridCfg(scale, xAxisOption, 'circle', dim);
omit(cfg, OMIT_CFG);
grid.component.update(cfg);
updatedCache.set(gridId, grid);
}
else {
// 不存在则创建
if (coordinate.isTransposed) {
if (isUndefined(xAxisOption)) {
return;
}
else {
// @ts-ignore
grid = this.createCircleGrid(scale, xAxisOption, layer, 'radius', dim);
}
}
else {
// @ts-ignore
grid = this.createLineGrid(scale, xAxisOption, layer, 'circle', dim);
}
if (grid) {
this.cache.set(gridId, grid);
updatedCache.set(gridId, grid);
}
}
}
else {
// helix and other, do not draw axis
}
};
Axis.prototype.updateYAxes = function (updatedCache) {
var _this = this;
// y axes
var yScales = this.view.getYScales();
each(yScales, function (scale, idx) {
// @ts-ignore
if (!scale || scale.isIdentity) {
return;
}
var field = scale.field;
var yAxisOption = getAxisOption(_this.option, field);
if (yAxisOption !== false) {
var layer = LAYER.BG;
var dim = 'y';
var axisId = _this.getId('axis', field);
var gridId = _this.getId('grid', field);
var coordinate = _this.view.getCoordinate();
if (coordinate.isRect) {
var direction = getAxisDirection(yAxisOption, idx === 0 ? DIRECTION.LEFT : DIRECTION.RIGHT);
// 1. do axis update
var axis = _this.cache.get(axisId);
// 存在则更新
if (axis) {
var cfg = _this.getLineAxisCfg(scale, yAxisOption, direction);
omit(cfg, OMIT_CFG);
axis.component.update(cfg);
updatedCache.set(axisId, axis);
}
else {
// 不存在,则创建
axis = _this.createLineAxis(scale, yAxisOption, layer, direction, dim);
_this.cache.set(axisId, axis);
updatedCache.set(axisId, axis);
}
// 2. do grid update
var grid = _this.cache.get(gridId);
// 存在则更新
if (grid) {
var cfg = _this.getLineGridCfg(scale, yAxisOption, direction, dim);
omit(cfg, OMIT_CFG);
grid.component.update(cfg);
updatedCache.set(gridId, grid);
}
else {
// 不存在则创建
grid = _this.createLineGrid(scale, yAxisOption, layer, direction, dim);
if (grid) {
_this.cache.set(gridId, grid);
updatedCache.set(gridId, grid);
}
}
}
else if (coordinate.isPolar) {
// 1. do axis update
var axis = _this.cache.get(axisId);
// 存在则更新
if (axis) {
var cfg = coordinate.isTransposed ?
// @ts-ignore
_this.getCircleAxisCfg(scale, yAxisOption, 'circle') :
// @ts-ignore
_this.getLineAxisCfg(scale, yAxisOption, 'radius');
// @ts-ignore
omit(cfg, OMIT_CFG);
axis.component.update(cfg);
updatedCache.set(axisId, axis);
}
else {
// 不存在,则创建
if (coordinate.isTransposed) {
if (isUndefined(yAxisOption)) {
return;
}
else {
// @ts-ignore
axis = _this.createCircleAxis(scale, yAxisOption, layer, 'circle', dim);
}
}
else {
// @ts-ignore
axis = _this.createLineAxis(scale, yAxisOption, layer, 'radius', dim);
}
_this.cache.set(axisId, axis);
updatedCache.set(axisId, axis);
}
// 2. do grid update
var grid = _this.cache.get(gridId);
// 存在则更新
if (grid) {
var cfg = coordinate.isTransposed ?
// @ts-ignore
_this.getLineGridCfg(scale, yAxisOption, 'circle', dim) :
// @ts-ignore
_this.getCircleGridCfg(scale, yAxisOption, 'radius', dim);
omit(cfg, OMIT_CFG);
grid.component.update(cfg);
updatedCache.set(gridId, grid);
}
else {
// 不存在则创建
if (coordinate.isTransposed) {
if (isUndefined(yAxisOption)) {
return;
}
else {
// @ts-ignore
grid = _this.createLineGrid(scale, yAxisOption, layer, 'circle', dim);
}
}
else {
// @ts-ignore
grid = _this.createCircleGrid(scale, yAxisOption, layer, 'radius', dim);
}
if (grid) {
_this.cache.set(gridId, grid);
updatedCache.set(gridId, grid);
}
}
}
else {
// helix and other, do not draw axis
}
}
});
};
/**
* 创建 x axis 组件
*/
Axis.prototype.createXAxes = function () {
// x axis
var scale = this.view.getXScale();
if (!scale || scale.isIdentity) {
return;
}
var xAxisOption = getAxisOption(this.option, scale.field);
if (xAxisOption !== false) {
var direction = getAxisDirection(xAxisOption, DIRECTION.BOTTOM);
var layer = LAYER.BG;
var dim = 'x';
var coordinate = this.view.getCoordinate();
var axisId = this.getId('axis', scale.field);
var gridId = this.getId('grid', scale.field);
if (coordinate.isRect) {
// axis
var axis = this.createLineAxis(scale, xAxisOption, layer, direction, dim);
this.cache.set(axisId, axis);
// grid
var grid = this.createLineGrid(scale, xAxisOption, layer, direction, dim);
if (grid) {
this.cache.set(gridId, grid);
}
}
else if (coordinate.isPolar) {
var axis = void 0;
var grid = void 0;
if (coordinate.isTransposed) {
if (isUndefined(xAxisOption)) {
// 默认不渲染转置极坐标的坐标轴
return;
}
else {
// 如果用户打开了隐藏的坐标轴 chart.axis(true)/chart.axis('x', true)
// 那么对于转置了的极坐标,半径轴显示的是 x 轴对应的数据
// @ts-ignore
axis = this.createLineAxis(scale, xAxisOption, layer, 'radius', dim);
// @ts-ignore
grid = this.createCircleGrid(scale, xAxisOption, layer, 'radius', dim);
}
}
else {
axis = this.createCircleAxis(scale, xAxisOption, layer, direction, dim);
// grid极坐标下的 x 轴网格线沿着半径方向绘制
// @ts-ignore
grid = this.createLineGrid(scale, xAxisOption, layer, 'circle', dim);
}
this.cache.set(axisId, axis);
if (grid) {
this.cache.set(gridId, grid);
}
}
else {
// helix and other, do not draw axis
}
}
};
/**
* create y axis
*/
Axis.prototype.createYAxes = function () {
var _this = this;
// y axes
var yScales = this.view.getYScales();
each(yScales, function (scale, idx) {
// @ts-ignore
if (!scale || scale.isIdentity) {
return;
}
var field = scale.field;
var yAxisOption = getAxisOption(_this.option, field);
if (yAxisOption !== false) {
var layer = LAYER.BG;
var dim = 'y';
var axisId = _this.getId('axis', field);
var gridId = _this.getId('grid', field);
var coordinate = _this.view.getCoordinate();
if (coordinate.isRect) {
var direction = getAxisDirection(yAxisOption, idx === 0 ? DIRECTION.LEFT : DIRECTION.RIGHT);
// axis
var axis = _this.createLineAxis(scale, yAxisOption, layer, direction, dim);
_this.cache.set(axisId, axis);
// grid
var grid = _this.createLineGrid(scale, yAxisOption, layer, direction, dim);
if (grid) {
_this.cache.set(gridId, grid);
}
}
else if (coordinate.isPolar) {
var axis = void 0;
var grid = void 0;
if (coordinate.isTransposed) {
if (isUndefined(yAxisOption)) {
return;
}
else {
// @ts-ignore
axis = _this.createCircleAxis(scale, yAxisOption, layer, 'circle', dim);
// @ts-ignore
grid = _this.createLineGrid(scale, yAxisOption, layer, 'circle', dim);
}
}
else {
// @ts-ignore
axis = _this.createLineAxis(scale, yAxisOption, layer, 'radius', dim);
// @ts-ignore
grid = _this.createCircleGrid(scale, yAxisOption, layer, 'radius', dim);
}
_this.cache.set(_this.getId('axis', scale.field), axis);
if (grid) {
_this.cache.set(gridId, grid);
}
}
else {
// helix and other, do not draw axis
}
}
});
};
/**
* 创建 line axis
* @param scale
* @param option
* @param layer
* @param direction
* @param dim
*/
Axis.prototype.createLineAxis = function (scale, option, layer, direction, dim) {
// axis
var axis = {
component: new LineAxis(this.getLineAxisCfg(scale, option, direction)),
layer: layer,
// @ts-ignore
direction: direction === 'radius' ? DIRECTION.NONE : direction,
type: COMPONENT_TYPE.AXIS,
extra: { dim: dim, scale: scale },
};
axis.component.set('field', scale.field);
axis.component.init();
return axis;
};
Axis.prototype.createLineGrid = function (scale, option, layer, direction, dim) {
var cfg = this.getLineGridCfg(scale, option, direction, dim);
if (cfg) {
var grid = {
component: new LineGrid(cfg),
layer: layer,
direction: DIRECTION.NONE,
type: COMPONENT_TYPE.GRID,
extra: {
dim: dim,
scale: scale,
alignTick: get(cfg, 'alignTick', true),
},
};
grid.component.init();
return grid;
}
};
Axis.prototype.createCircleAxis = function (scale, option, layer, direction, dim) {
var axis = {
component: new CircleAxis(this.getCircleAxisCfg(scale, option, direction)),
layer: layer,
direction: direction,
type: COMPONENT_TYPE.AXIS,
extra: { dim: dim, scale: scale },
};
axis.component.set('field', scale.field);
axis.component.init();
return axis;
};
Axis.prototype.createCircleGrid = function (scale, option, layer, direction, dim) {
var cfg = this.getCircleGridCfg(scale, option, direction, dim);
if (cfg) {
var grid = {
component: new CircleGrid(cfg),
layer: layer,
direction: DIRECTION.NONE,
type: COMPONENT_TYPE.GRID,
extra: {
dim: dim,
scale: scale,
alignTick: get(cfg, 'alignTick', true),
},
};
grid.component.init();
return grid;
}
};
/**
* generate line axis cfg
* @param scale
* @param axisOption
* @param direction
* @return line axis cfg
*/
Axis.prototype.getLineAxisCfg = function (scale, axisOption, direction) {
var container = this.axisContainer;
var coordinate = this.view.getCoordinate();
var region = getAxisRegion(coordinate, direction);
var titleText = getAxisTitleText(scale, axisOption);
var axisThemeCfg = getAxisThemeCfg(this.view.getTheme(), direction);
// the cfg order should be ensure
var optionWithTitle = get(axisOption, ['title'])
? deepMix({ title: { style: { text: titleText } } }, axisOption)
: axisOption;
var cfg = deepMix(__assign(__assign({ container: container }, region), { ticks: scale.getTicks().map(function (tick) { return ({ id: "" + tick.tickValue, name: tick.text, value: tick.value }); }), verticalFactor: coordinate.isPolar
? getAxisFactorByRegion(region, coordinate.getCenter()) * -1
: getAxisFactorByRegion(region, coordinate.getCenter()) }), axisThemeCfg, optionWithTitle);
var _a = this.getAnimateCfg(cfg), animate = _a.animate, animateOption = _a.animateOption;
cfg.animateOption = animateOption;
cfg.animate = animate;
return cfg;
};
/**
* generate line grid cfg
* @param scale
* @param axisOption
* @param direction
* @param dim
* @return line grid cfg
*/
Axis.prototype.getLineGridCfg = function (scale, axisOption, direction, dim) {
if (!showGrid(getAxisThemeCfg(this.view.getTheme(), direction), axisOption)) {
return undefined;
}
var gridThemeCfg = getGridThemeCfg(this.view.getTheme(), direction);
// the cfg order should be ensure
// grid 动画以 axis 为准
var gridCfg = deepMix({
container: this.gridContainer,
}, gridThemeCfg, get(axisOption, 'grid'), this.getAnimateCfg(axisOption));
gridCfg.items = getLineGridItems(this.view.getCoordinate(), scale, dim, get(gridCfg, 'alignTick', true));
return gridCfg;
};
/**
* generate circle axis cfg
* @param scale
* @param axisOption
* @param direction
* @return circle axis cfg
*/
Axis.prototype.getCircleAxisCfg = function (scale, axisOption, direction) {
var container = this.axisContainer;
var coordinate = this.view.getCoordinate();
var ticks = scale.getTicks().map(function (tick) { return ({ id: "" + tick.tickValue, name: tick.text, value: tick.value }); });
if (!scale.isCategory && Math.abs(coordinate.endAngle - coordinate.startAngle) === Math.PI * 2) {
// x 轴对应的值如果是非 cat 类型,在整圆的情况下坐标轴第一个和最后一个文本会重叠,默认只展示第一个文本
ticks.pop();
}
var titleText = getAxisTitleText(scale, axisOption);
var axisThemeCfg = getAxisThemeCfg(this.view.getTheme(), 'circle');
// the cfg order should be ensure
var optionWithTitle = get(axisOption, ['title'])
? deepMix({ title: { style: { text: titleText } } }, axisOption)
: axisOption;
var cfg = deepMix(__assign(__assign({ container: container }, getCircleAxisCenterRadius(this.view.getCoordinate())), { ticks: ticks, verticalFactor: 1 }), axisThemeCfg, optionWithTitle);
var _a = this.getAnimateCfg(cfg), animate = _a.animate, animateOption = _a.animateOption;
cfg.animate = animate;
cfg.animateOption = animateOption;
return cfg;
};
/**
* generate circle grid cfg
* @param scale
* @param axisOption
* @param direction
* @return circle grid cfg
*/
Axis.prototype.getCircleGridCfg = function (scale, axisOption, direction, dim) {
if (!showGrid(getAxisThemeCfg(this.view.getTheme(), direction), axisOption)) {
return undefined;
}
// the cfg order should be ensure
// grid 动画以 axis 为准
// @ts-ignore
var gridThemeCfg = getGridThemeCfg(this.view.getTheme(), 'radius');
var gridCfg = deepMix({
container: this.gridContainer,
center: this.view.getCoordinate().getCenter(),
}, gridThemeCfg, get(axisOption, 'grid'), this.getAnimateCfg(axisOption));
var alignTick = get(gridCfg, 'alignTick', true);
var verticalScale = dim === 'x' ? this.view.getYScales()[0] : this.view.getXScale();
gridCfg.items = getCircleGridItems(this.view.getCoordinate(), verticalScale, scale, alignTick, dim);
// the cfg order should be ensure
// grid 动画以 axis 为准
return gridCfg;
};
Axis.prototype.getId = function (name, key) {
var coordinate = this.view.getCoordinate();
// 坐标系类型也作为组件的 key
return name + "-" + key + "-" + coordinate.type;
};
Axis.prototype.getAnimateCfg = function (cfg) {
return {
animate: this.view.getOptions().animate && get(cfg, 'animate'),
animateOption: cfg && cfg.animateOption ? deepMix({}, AXIS_DEFAULT_ANIMATE_CFG, cfg.animateOption) : AXIS_DEFAULT_ANIMATE_CFG,
};
};
return Axis;
}(Controller));
export default Axis;
//# sourceMappingURL=axis.js.map