@visactor/vchart 1.7.2 → 1.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/es5/index.js +1 -1
- package/build/index.js +16937 -13789
- package/build/index.min.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/cjs/animation/utils.d.ts +1 -0
- package/cjs/animation/utils.js +16 -8
- package/cjs/animation/utils.js.map +1 -1
- package/cjs/chart/bar/bar-3d.d.ts +2 -2
- package/cjs/chart/bar/bar-3d.js +2 -2
- package/cjs/chart/bar/bar-3d.js.map +1 -1
- package/cjs/chart/base-chart.js +2 -0
- package/cjs/chart/base-chart.js.map +1 -1
- package/cjs/chart/cartesian/interface.d.ts +1 -1
- package/cjs/chart/cartesian/interface.js.map +1 -1
- package/cjs/chart/sequence/sequence.js +1 -0
- package/cjs/chart/sequence/sequence.js.map +1 -1
- package/cjs/component/axis/cartesian/axis.js +4 -2
- package/cjs/component/axis/cartesian/axis.js.map +1 -1
- package/cjs/component/axis/cartesian/band-axis.js +2 -2
- package/cjs/component/axis/cartesian/band-axis.js.map +1 -1
- package/cjs/component/axis/cartesian/util/common.d.ts +0 -2
- package/cjs/component/axis/cartesian/util/common.js +2 -14
- package/cjs/component/axis/cartesian/util/common.js.map +1 -1
- package/cjs/component/axis/interface/common.d.ts +1 -0
- package/cjs/component/axis/interface/common.js.map +1 -1
- package/cjs/component/axis/polar/axis.js +3 -1
- package/cjs/component/axis/polar/axis.js.map +1 -1
- package/cjs/component/axis/polar/interface/common.d.ts +2 -3
- package/cjs/component/axis/polar/interface/common.js.map +1 -1
- package/cjs/component/base/base-component.js +1 -1
- package/cjs/component/base/base-component.js.map +1 -1
- package/cjs/component/crosshair/base.d.ts +4 -5
- package/cjs/component/crosshair/base.js +38 -25
- package/cjs/component/crosshair/base.js.map +1 -1
- package/cjs/component/crosshair/cartesian.d.ts +11 -34
- package/cjs/component/crosshair/cartesian.js +118 -109
- package/cjs/component/crosshair/cartesian.js.map +1 -1
- package/cjs/component/crosshair/config.d.ts +6 -0
- package/cjs/component/crosshair/config.js +8 -2
- package/cjs/component/crosshair/config.js.map +1 -1
- package/cjs/component/crosshair/interface/spec.d.ts +7 -3
- package/cjs/component/crosshair/interface/spec.js.map +1 -1
- package/cjs/component/crosshair/polar.d.ts +12 -54
- package/cjs/component/crosshair/polar.js +109 -82
- package/cjs/component/crosshair/polar.js.map +1 -1
- package/cjs/component/legend/continuous/interface.d.ts +1 -0
- package/cjs/component/legend/continuous/interface.js.map +1 -1
- package/cjs/component/legend/continuous/legend.js +5 -3
- package/cjs/component/legend/continuous/legend.js.map +1 -1
- package/cjs/component/marker/base-marker.d.ts +22 -24
- package/cjs/component/marker/base-marker.js +39 -50
- package/cjs/component/marker/base-marker.js.map +1 -1
- package/cjs/component/marker/interface.d.ts +19 -9
- package/cjs/component/marker/interface.js.map +1 -1
- package/cjs/component/marker/mark-area/interface/spec.d.ts +10 -12
- package/cjs/component/marker/mark-area/interface/spec.js.map +1 -1
- package/cjs/component/marker/mark-area/mark-area.d.ts +3 -2
- package/cjs/component/marker/mark-area/mark-area.js +12 -22
- package/cjs/component/marker/mark-area/mark-area.js.map +1 -1
- package/cjs/component/marker/mark-line/interface/spec.d.ts +20 -9
- package/cjs/component/marker/mark-line/interface/spec.js.map +1 -1
- package/cjs/component/marker/mark-line/mark-line.d.ts +4 -2
- package/cjs/component/marker/mark-line/mark-line.js +60 -60
- package/cjs/component/marker/mark-line/mark-line.js.map +1 -1
- package/cjs/component/marker/mark-point/interface/spec.d.ts +8 -6
- package/cjs/component/marker/mark-point/interface/spec.js.map +1 -1
- package/cjs/component/marker/mark-point/mark-point.d.ts +3 -2
- package/cjs/component/marker/mark-point/mark-point.js +15 -19
- package/cjs/component/marker/mark-point/mark-point.js.map +1 -1
- package/cjs/component/marker/utils.d.ts +13 -2
- package/cjs/component/marker/utils.js +108 -39
- package/cjs/component/marker/utils.js.map +1 -1
- package/cjs/component/tooltip/tooltip.js +3 -2
- package/cjs/component/tooltip/tooltip.js.map +1 -1
- package/cjs/core/index.d.ts +1 -1
- package/cjs/core/index.js +1 -1
- package/cjs/core/index.js.map +1 -1
- package/cjs/core/vchart.js +1 -0
- package/cjs/core/vchart.js.map +1 -1
- package/cjs/data/transforms/aggregation.d.ts +3 -3
- package/cjs/data/transforms/aggregation.js +5 -7
- package/cjs/data/transforms/aggregation.js.map +1 -1
- package/cjs/event/events/dimension/util/polar.js +2 -2
- package/cjs/event/events/dimension/util/polar.js.map +1 -1
- package/cjs/layout/layout3d/index.js +1 -1
- package/cjs/layout/layout3d/index.js.map +1 -1
- package/cjs/model/base-model.js +4 -4
- package/cjs/model/base-model.js.map +1 -1
- package/cjs/model/interface.d.ts +1 -0
- package/cjs/model/interface.js.map +1 -1
- package/cjs/region/region.js +4 -2
- package/cjs/region/region.js.map +1 -1
- package/cjs/series/bar/bar.js +6 -11
- package/cjs/series/bar/bar.js.map +1 -1
- package/cjs/series/base/base-series.js +6 -6
- package/cjs/series/base/base-series.js.map +1 -1
- package/cjs/series/box-plot/box-plot.js +4 -12
- package/cjs/series/box-plot/box-plot.js.map +1 -1
- package/cjs/series/heatmap/heatmap.js +4 -9
- package/cjs/series/heatmap/heatmap.js.map +1 -1
- package/cjs/series/pie/pie.js +1 -1
- package/cjs/series/pie/pie.js.map +1 -1
- package/cjs/series/range-column/range-column.js +7 -15
- package/cjs/series/range-column/range-column.js.map +1 -1
- package/cjs/series/util/utils.d.ts +5 -0
- package/cjs/series/util/utils.js +18 -2
- package/cjs/series/util/utils.js.map +1 -1
- package/cjs/series/waterfall/waterfall.js +7 -11
- package/cjs/series/waterfall/waterfall.js.map +1 -1
- package/cjs/theme/builtin/common/component/crosshair.js +0 -8
- package/cjs/theme/builtin/common/component/crosshair.js.map +1 -1
- package/cjs/typings/visual.d.ts +3 -2
- package/cjs/typings/visual.js.map +1 -1
- package/esm/animation/utils.d.ts +1 -0
- package/esm/animation/utils.js +12 -7
- package/esm/animation/utils.js.map +1 -1
- package/esm/chart/bar/bar-3d.d.ts +2 -2
- package/esm/chart/bar/bar-3d.js +3 -3
- package/esm/chart/bar/bar-3d.js.map +1 -1
- package/esm/chart/base-chart.js +2 -0
- package/esm/chart/base-chart.js.map +1 -1
- package/esm/chart/cartesian/interface.d.ts +1 -1
- package/esm/chart/cartesian/interface.js.map +1 -1
- package/esm/chart/sequence/sequence.js +1 -0
- package/esm/chart/sequence/sequence.js.map +1 -1
- package/esm/component/axis/cartesian/axis.js +4 -2
- package/esm/component/axis/cartesian/axis.js.map +1 -1
- package/esm/component/axis/cartesian/band-axis.js +1 -3
- package/esm/component/axis/cartesian/band-axis.js.map +1 -1
- package/esm/component/axis/cartesian/util/common.d.ts +0 -2
- package/esm/component/axis/cartesian/util/common.js +0 -11
- package/esm/component/axis/cartesian/util/common.js.map +1 -1
- package/esm/component/axis/interface/common.d.ts +1 -0
- package/esm/component/axis/interface/common.js.map +1 -1
- package/esm/component/axis/polar/axis.js +3 -1
- package/esm/component/axis/polar/axis.js.map +1 -1
- package/esm/component/axis/polar/interface/common.d.ts +2 -3
- package/esm/component/axis/polar/interface/common.js.map +1 -1
- package/esm/component/base/base-component.js +1 -1
- package/esm/component/base/base-component.js.map +1 -1
- package/esm/component/crosshair/base.d.ts +4 -5
- package/esm/component/crosshair/base.js +37 -25
- package/esm/component/crosshair/base.js.map +1 -1
- package/esm/component/crosshair/cartesian.d.ts +11 -34
- package/esm/component/crosshair/cartesian.js +111 -102
- package/esm/component/crosshair/cartesian.js.map +1 -1
- package/esm/component/crosshair/config.d.ts +6 -0
- package/esm/component/crosshair/config.js +7 -0
- package/esm/component/crosshair/config.js.map +1 -1
- package/esm/component/crosshair/interface/spec.d.ts +7 -3
- package/esm/component/crosshair/interface/spec.js.map +1 -1
- package/esm/component/crosshair/polar.d.ts +12 -54
- package/esm/component/crosshair/polar.js +109 -78
- package/esm/component/crosshair/polar.js.map +1 -1
- package/esm/component/legend/continuous/interface.d.ts +1 -0
- package/esm/component/legend/continuous/interface.js.map +1 -1
- package/esm/component/legend/continuous/legend.js +5 -3
- package/esm/component/legend/continuous/legend.js.map +1 -1
- package/esm/component/marker/base-marker.d.ts +22 -24
- package/esm/component/marker/base-marker.js +41 -52
- package/esm/component/marker/base-marker.js.map +1 -1
- package/esm/component/marker/interface.d.ts +19 -9
- package/esm/component/marker/interface.js.map +1 -1
- package/esm/component/marker/mark-area/interface/spec.d.ts +10 -12
- package/esm/component/marker/mark-area/interface/spec.js.map +1 -1
- package/esm/component/marker/mark-area/mark-area.d.ts +3 -2
- package/esm/component/marker/mark-area/mark-area.js +10 -22
- package/esm/component/marker/mark-area/mark-area.js.map +1 -1
- package/esm/component/marker/mark-line/interface/spec.d.ts +20 -9
- package/esm/component/marker/mark-line/interface/spec.js.map +1 -1
- package/esm/component/marker/mark-line/mark-line.d.ts +4 -2
- package/esm/component/marker/mark-line/mark-line.js +58 -54
- package/esm/component/marker/mark-line/mark-line.js.map +1 -1
- package/esm/component/marker/mark-point/interface/spec.d.ts +8 -6
- package/esm/component/marker/mark-point/interface/spec.js.map +1 -1
- package/esm/component/marker/mark-point/mark-point.d.ts +3 -2
- package/esm/component/marker/mark-point/mark-point.js +12 -20
- package/esm/component/marker/mark-point/mark-point.js.map +1 -1
- package/esm/component/marker/utils.d.ts +13 -2
- package/esm/component/marker/utils.js +103 -35
- package/esm/component/marker/utils.js.map +1 -1
- package/esm/component/tooltip/tooltip.js +3 -1
- package/esm/component/tooltip/tooltip.js.map +1 -1
- package/esm/core/index.d.ts +1 -1
- package/esm/core/index.js +1 -1
- package/esm/core/index.js.map +1 -1
- package/esm/core/vchart.js +1 -0
- package/esm/core/vchart.js.map +1 -1
- package/esm/data/transforms/aggregation.d.ts +3 -3
- package/esm/data/transforms/aggregation.js +6 -8
- package/esm/data/transforms/aggregation.js.map +1 -1
- package/esm/event/events/dimension/util/polar.js +2 -2
- package/esm/event/events/dimension/util/polar.js.map +1 -1
- package/esm/layout/layout3d/index.js +1 -1
- package/esm/layout/layout3d/index.js.map +1 -1
- package/esm/model/base-model.js +4 -5
- package/esm/model/base-model.js.map +1 -1
- package/esm/model/interface.d.ts +1 -0
- package/esm/model/interface.js.map +1 -1
- package/esm/region/region.js +5 -1
- package/esm/region/region.js.map +1 -1
- package/esm/series/bar/bar.js +5 -9
- package/esm/series/bar/bar.js.map +1 -1
- package/esm/series/base/base-series.js +4 -4
- package/esm/series/base/base-series.js.map +1 -1
- package/esm/series/box-plot/box-plot.js +5 -11
- package/esm/series/box-plot/box-plot.js.map +1 -1
- package/esm/series/heatmap/heatmap.js +4 -8
- package/esm/series/heatmap/heatmap.js.map +1 -1
- package/esm/series/pie/pie.js +1 -1
- package/esm/series/pie/pie.js.map +1 -1
- package/esm/series/range-column/range-column.js +6 -12
- package/esm/series/range-column/range-column.js.map +1 -1
- package/esm/series/util/utils.d.ts +5 -0
- package/esm/series/util/utils.js +15 -0
- package/esm/series/util/utils.js.map +1 -1
- package/esm/series/waterfall/waterfall.js +6 -9
- package/esm/series/waterfall/waterfall.js.map +1 -1
- package/esm/theme/builtin/common/component/crosshair.js +0 -8
- package/esm/theme/builtin/common/component/crosshair.js.map +1 -1
- package/esm/typings/visual.d.ts +3 -2
- package/esm/typings/visual.js.map +1 -1
- package/package.json +8 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var __rest = this && this.__rest || function(s, e) {
|
|
2
2
|
var t = {};
|
|
3
3
|
for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0 && (t[p] = s[p]);
|
|
4
4
|
if (null != s && "function" == typeof Object.getOwnPropertySymbols) {
|
|
@@ -30,10 +30,7 @@ import { getAxisLabelOffset } from "../axis/util";
|
|
|
30
30
|
|
|
31
31
|
import { Factory } from "../../core/factory";
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
LayoutType[LayoutType.ALL = 3] = "ALL", LayoutType[LayoutType.HORIZONTAL = 2] = "HORIZONTAL",
|
|
35
|
-
LayoutType[LayoutType.VERTICAL = 1] = "VERTICAL", LayoutType[LayoutType.NONE = 0] = "NONE";
|
|
36
|
-
}(LayoutType || (LayoutType = {}));
|
|
33
|
+
import { LayoutType } from "./config";
|
|
37
34
|
|
|
38
35
|
export class PolarCrossHair extends BaseCrossHair {
|
|
39
36
|
static createComponent(spec, options) {
|
|
@@ -49,71 +46,104 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
49
46
|
}
|
|
50
47
|
constructor(spec, options) {
|
|
51
48
|
super(spec, options), this.specKey = "crosshair", this.type = ComponentTypeEnum.polarCrosshair,
|
|
52
|
-
this.name = ComponentTypeEnum.polarCrosshair, this.
|
|
49
|
+
this.name = ComponentTypeEnum.polarCrosshair, this._currValueAngle = new Map, this._currValueRadius = new Map;
|
|
53
50
|
}
|
|
54
|
-
|
|
55
|
-
this.
|
|
51
|
+
_showDefaultCrosshairBySpec() {
|
|
52
|
+
const {categoryField: categoryField, valueField: valueField} = this._spec;
|
|
53
|
+
if ((null == categoryField ? void 0 : categoryField.visible) && categoryField.defaultSelect) {
|
|
54
|
+
const {axisIndex: axisIndex, datum: datum} = categoryField.defaultSelect;
|
|
55
|
+
this._defaultCrosshair(axisIndex, datum, LayoutType.VERTICAL);
|
|
56
|
+
}
|
|
57
|
+
if ((null == valueField ? void 0 : valueField.visible) && valueField.defaultSelect) {
|
|
58
|
+
const {axisIndex: axisIndex, datum: datum} = valueField.defaultSelect;
|
|
59
|
+
this._defaultCrosshair(axisIndex, datum, LayoutType.HORIZONTAL);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
_defaultCrosshair(axisIndex, datum, tag) {
|
|
63
|
+
const axis = this._option.getComponentsByKey("axes").find((c => c.getSpecIndex() === axisIndex));
|
|
64
|
+
if (axis) {
|
|
65
|
+
if (tag === LayoutType.VERTICAL) {
|
|
66
|
+
this._currValueAngle.clear();
|
|
67
|
+
const polarCoord = {
|
|
68
|
+
angle: axis.valueToPosition(datum),
|
|
69
|
+
radius: axis.getOuterRadius()
|
|
70
|
+
}, canvasPosition = axis.coordToPoint(polarCoord);
|
|
71
|
+
this._currValueAngle.set(axisIndex, this._getValueByAxis(axis, canvasPosition));
|
|
72
|
+
} else {
|
|
73
|
+
this._currValueRadius.clear();
|
|
74
|
+
const polarCoord = {
|
|
75
|
+
angle: axis.startAngle,
|
|
76
|
+
radius: axis.valueToPosition(datum)
|
|
77
|
+
}, canvasPosition = axis.coordToPoint(polarCoord);
|
|
78
|
+
this._currValueRadius.set(axisIndex, this._getValueByAxis(axis, canvasPosition));
|
|
79
|
+
}
|
|
80
|
+
this.layoutByValue(LayoutType.ALL);
|
|
81
|
+
}
|
|
56
82
|
}
|
|
57
83
|
hide() {
|
|
58
84
|
this._radiusCrosshair && this._radiusCrosshair.hideAll(), this._radiusLabelCrosshair && this._radiusLabelCrosshair.hideAll(),
|
|
59
85
|
this._angleCrosshair && this._angleCrosshair.hideAll(), this._angleLabelCrosshair && this._angleLabelCrosshair.hideAll();
|
|
60
86
|
}
|
|
61
|
-
|
|
62
|
-
const
|
|
87
|
+
_findAllAxisContains(relativeX, relativeY) {
|
|
88
|
+
const angleAxisMap = this._getAxisInfoByField("category"), radiusAxisMap = this._getAxisInfoByField("value");
|
|
63
89
|
return {
|
|
64
|
-
|
|
65
|
-
|
|
90
|
+
angleAxisMap: this._filterAxisByPoint(angleAxisMap, relativeX, relativeY),
|
|
91
|
+
radiusAxisMap: this._filterAxisByPoint(radiusAxisMap, relativeX, relativeY)
|
|
66
92
|
};
|
|
67
93
|
}
|
|
68
|
-
|
|
94
|
+
_getAllAxisValues(axisMap, point, currValue) {
|
|
69
95
|
let discrete = !1;
|
|
70
96
|
return axisMap.forEach((item => {
|
|
71
97
|
isDiscrete(item.axis.getScale().type) && (discrete ? this.enable = !1 : discrete = !0);
|
|
72
98
|
})), !!this.enable && (axisMap.forEach(((item, id) => {
|
|
73
|
-
const axis = item.axis
|
|
74
|
-
|
|
75
|
-
x: point.x - (axisStartX - x),
|
|
76
|
-
y: point.y - (axisStartY - y)
|
|
77
|
-
});
|
|
78
|
-
isContinuous(axis.getScale().type) && isValidNumber(+value) && (value = (+value).toFixed(2));
|
|
79
|
-
const center = {
|
|
80
|
-
x: axis.getCenter().x + this.getLayoutStartPoint().x,
|
|
81
|
-
y: axis.getCenter().y + this.getLayoutStartPoint().y
|
|
82
|
-
};
|
|
83
|
-
currValue.set(id, {
|
|
84
|
-
v: value,
|
|
85
|
-
axis: item.axis,
|
|
86
|
-
center: center,
|
|
87
|
-
innerRadius: axis.getInnerRadius(),
|
|
88
|
-
radius: axis.getOuterRadius(),
|
|
89
|
-
startAngle: axis.startAngle,
|
|
90
|
-
endAngle: axis.endAngle,
|
|
91
|
-
distance: PointService.distancePP(point, axis.getCenter()),
|
|
92
|
-
coord: axis.pointToCoord(point),
|
|
93
|
-
point: point
|
|
94
|
-
});
|
|
99
|
+
const axis = item.axis;
|
|
100
|
+
currValue.set(id, this._getValueByAxis(axis, point));
|
|
95
101
|
})), !0);
|
|
96
102
|
}
|
|
103
|
+
_getValueByAxis(axis, point) {
|
|
104
|
+
const {x: axisStartX, y: axisStartY} = axis.getLayoutStartPoint(), {x: x, y: y} = this.getLayoutStartPoint();
|
|
105
|
+
let value = axis.positionToData({
|
|
106
|
+
x: point.x - (axisStartX - x),
|
|
107
|
+
y: point.y - (axisStartY - y)
|
|
108
|
+
});
|
|
109
|
+
isContinuous(axis.getScale().type) && isValidNumber(+value) && (value = (+value).toFixed(2));
|
|
110
|
+
const center = {
|
|
111
|
+
x: axis.getCenter().x + this.getLayoutStartPoint().x,
|
|
112
|
+
y: axis.getCenter().y + this.getLayoutStartPoint().y
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
v: value,
|
|
116
|
+
axis: axis,
|
|
117
|
+
center: center,
|
|
118
|
+
innerRadius: axis.getInnerRadius(),
|
|
119
|
+
radius: axis.getOuterRadius(),
|
|
120
|
+
startAngle: axis.startAngle,
|
|
121
|
+
endAngle: axis.endAngle,
|
|
122
|
+
distance: PointService.distancePP(point, axis.getCenter()),
|
|
123
|
+
coord: axis.pointToCoord(point),
|
|
124
|
+
point: point
|
|
125
|
+
};
|
|
126
|
+
}
|
|
97
127
|
_layoutCrosshair(relativeX, relativeY) {
|
|
98
|
-
const {
|
|
99
|
-
if (0 !==
|
|
100
|
-
|
|
128
|
+
const {angleAxisMap: angleAxisMap, radiusAxisMap: radiusAxisMap} = this._findAllAxisContains(relativeX, relativeY);
|
|
129
|
+
if (0 !== angleAxisMap.size || 0 !== radiusAxisMap.size) this._currValueAngle.clear(),
|
|
130
|
+
this._currValueRadius.clear(), angleAxisMap && this._getAllAxisValues(angleAxisMap, {
|
|
101
131
|
x: relativeX,
|
|
102
132
|
y: relativeY
|
|
103
|
-
}, this.
|
|
133
|
+
}, this._currValueAngle), radiusAxisMap && this._getAllAxisValues(radiusAxisMap, {
|
|
104
134
|
x: relativeX,
|
|
105
135
|
y: relativeY
|
|
106
|
-
}, this.
|
|
136
|
+
}, this._currValueRadius), this.layoutByValue(LayoutType.ALL); else {
|
|
107
137
|
if (this.enableRemain) return;
|
|
108
138
|
this.hide();
|
|
109
139
|
}
|
|
110
140
|
}
|
|
111
|
-
layoutByValue(tag) {
|
|
141
|
+
layoutByValue(tag = LayoutType.ALL) {
|
|
112
142
|
var _a, _b, _c, _d;
|
|
113
143
|
if (!this.enable) return;
|
|
114
144
|
const series = this._firstSeries();
|
|
115
145
|
if (!series) return;
|
|
116
|
-
let
|
|
146
|
+
let angleCrossHairInfo = {
|
|
117
147
|
x: 0,
|
|
118
148
|
y: 0,
|
|
119
149
|
center: {
|
|
@@ -131,7 +161,7 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
131
161
|
text: "",
|
|
132
162
|
offset: 0
|
|
133
163
|
}
|
|
134
|
-
},
|
|
164
|
+
}, radiusCrossHairInfo = {
|
|
135
165
|
x: 0,
|
|
136
166
|
y: 0,
|
|
137
167
|
center: {
|
|
@@ -151,35 +181,36 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
151
181
|
offset: 0
|
|
152
182
|
}
|
|
153
183
|
};
|
|
154
|
-
if (this.
|
|
155
|
-
|
|
184
|
+
if (this._angleHair) {
|
|
185
|
+
angleCrossHairInfo.visible = !!this._currValueAngle.size;
|
|
156
186
|
const bandWidth = series.angleAxisHelper.getBandwidth(0);
|
|
157
|
-
this.
|
|
187
|
+
this._currValueAngle.forEach((_a => {
|
|
158
188
|
var _b, {axis: axis, v: v, coord: coord} = _a, rest = __rest(_a, [ "axis", "v", "coord" ]);
|
|
159
|
-
v = null != v ? v : "", mergeSpec(
|
|
189
|
+
v = null != v ? v : "", mergeSpec(angleCrossHairInfo, rest);
|
|
160
190
|
const angle = series.angleAxisHelper.dataToPosition([ v ]);
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
191
|
+
angleCrossHairInfo.angle = angle, (null === (_b = this._angleHair.label) || void 0 === _b ? void 0 : _b.visible) && (angleCrossHairInfo.label.visible = !0,
|
|
192
|
+
angleCrossHairInfo.label.text = v, angleCrossHairInfo.label.offset = getAxisLabelOffset(axis.getSpec())),
|
|
193
|
+
angleCrossHairInfo.startAngle = angle - bandWidth / 2, angleCrossHairInfo.endAngle = angle + bandWidth / 2;
|
|
164
194
|
}));
|
|
165
195
|
}
|
|
166
|
-
if (this.
|
|
196
|
+
if (this._radiusHair && (radiusCrossHairInfo.visible = !!this._currValueRadius.size,
|
|
197
|
+
this._currValueRadius.forEach((_a => {
|
|
167
198
|
var _b, {axis: axis, v: v, coord: coord} = _a, rest = __rest(_a, [ "axis", "v", "coord" ]);
|
|
168
|
-
v = null != v ? v : "", (null === (_b = this.
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}))), this.enableRemain && !
|
|
172
|
-
const {label: label} =
|
|
173
|
-
label.text = this.
|
|
199
|
+
v = null != v ? v : "", (null === (_b = this._radiusHair.label) || void 0 === _b ? void 0 : _b.visible) && (radiusCrossHairInfo.label.visible = !0,
|
|
200
|
+
radiusCrossHairInfo.label.text = v, radiusCrossHairInfo.label.offset = getAxisLabelOffset(axis.getSpec())),
|
|
201
|
+
radiusCrossHairInfo.angle = coord.angle, radiusCrossHairInfo.axis = axis, mergeSpec(radiusCrossHairInfo, rest);
|
|
202
|
+
}))), this.enableRemain && !angleCrossHairInfo.visible && isValid(this._cacheAngleCrossHairInfo)) angleCrossHairInfo = this._cacheAngleCrossHairInfo; else if ((null === (_b = null === (_a = this._angleHair) || void 0 === _a ? void 0 : _a.label) || void 0 === _b ? void 0 : _b.formatMethod) && angleCrossHairInfo.label.visible) {
|
|
203
|
+
const {label: label} = angleCrossHairInfo;
|
|
204
|
+
label.text = this._angleHair.label.formatMethod(label.text, "angle");
|
|
174
205
|
}
|
|
175
|
-
if (this.enableRemain && !
|
|
176
|
-
const {label: label} =
|
|
177
|
-
label.text = this.
|
|
206
|
+
if (this.enableRemain && !radiusCrossHairInfo.visible && isValid(this._cacheRadiusCrossHairInfo)) radiusCrossHairInfo = this._cacheRadiusCrossHairInfo; else if ((null === (_d = null === (_c = this._radiusHair) || void 0 === _c ? void 0 : _c.label) || void 0 === _d ? void 0 : _d.formatMethod) && radiusCrossHairInfo.label.visible) {
|
|
207
|
+
const {label: label} = radiusCrossHairInfo;
|
|
208
|
+
label.text = this._radiusHair.label.formatMethod(label.text, "radius");
|
|
178
209
|
}
|
|
179
|
-
tag && (LayoutType.HORIZONTAL && this._layoutHorizontal(
|
|
180
|
-
this.enableRemain && (this.
|
|
210
|
+
tag && (LayoutType.HORIZONTAL && this._layoutHorizontal(radiusCrossHairInfo), LayoutType.VERTICAL && this._layoutVertical(angleCrossHairInfo)),
|
|
211
|
+
this.enableRemain && (this._cacheAngleCrossHairInfo = Object.assign(Object.assign({}, angleCrossHairInfo), {
|
|
181
212
|
_isCache: !0
|
|
182
|
-
}), this.
|
|
213
|
+
}), this._cacheRadiusCrossHairInfo = Object.assign(Object.assign({}, radiusCrossHairInfo), {
|
|
183
214
|
_isCache: !0
|
|
184
215
|
}));
|
|
185
216
|
}
|
|
@@ -188,7 +219,7 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
188
219
|
if (crosshairInfo._isCache && this.enableRemain) return;
|
|
189
220
|
const container = this.getContainer(), {angle: angle, innerRadius: innerRadius, radius: radius, label: label, startAngle: startAngle, endAngle: endAngle, center: center, visible: visible} = crosshairInfo;
|
|
190
221
|
if (visible) {
|
|
191
|
-
const crosshairType = "rect" === this.
|
|
222
|
+
const crosshairType = "rect" === this._angleHair.type ? "sector" : "line";
|
|
192
223
|
let positionAttrs;
|
|
193
224
|
if (positionAttrs = "sector" === crosshairType ? {
|
|
194
225
|
center: center,
|
|
@@ -202,16 +233,16 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
202
233
|
}, this._angleCrosshair) this._angleCrosshair.setAttributes(positionAttrs); else {
|
|
203
234
|
let crosshair;
|
|
204
235
|
"line" === crosshairType ? crosshair = new LineCrosshair(Object.assign(Object.assign({}, positionAttrs), {
|
|
205
|
-
lineStyle: this.
|
|
236
|
+
lineStyle: this._angleHair.style,
|
|
206
237
|
zIndex: this.gridZIndex
|
|
207
238
|
})) : "sector" === crosshairType && (crosshair = new SectorCrosshair(Object.assign(Object.assign({}, positionAttrs), {
|
|
208
|
-
sectorStyle: this.
|
|
239
|
+
sectorStyle: this._angleHair.style,
|
|
209
240
|
zIndex: this.gridZIndex
|
|
210
241
|
}))), this._angleCrosshair = crosshair, container.add(crosshair);
|
|
211
242
|
}
|
|
212
243
|
if (label.visible) {
|
|
213
|
-
const orient = angleLabelOrientAttribute(angle), labelAttrs = Object.assign(Object.assign(Object.assign(Object.assign({}, polarToCartesian(center, radius + label.offset, angle)), this.
|
|
214
|
-
textStyle: Object.assign(Object.assign({}, null === (_a = this.
|
|
244
|
+
const orient = angleLabelOrientAttribute(angle), labelAttrs = Object.assign(Object.assign(Object.assign(Object.assign({}, polarToCartesian(center, radius + label.offset, angle)), this._angleHair.label), label), {
|
|
245
|
+
textStyle: Object.assign(Object.assign({}, null === (_a = this._angleHair.label) || void 0 === _a ? void 0 : _a.textStyle), {
|
|
215
246
|
textAlign: orient.align,
|
|
216
247
|
textBaseline: orient.baseline
|
|
217
248
|
}),
|
|
@@ -228,7 +259,7 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
228
259
|
if (crosshairInfo._isCache && this.enableRemain) return;
|
|
229
260
|
const {center: center, startAngle: startAngle, endAngle: endAngle, distance: distance, sides: sides, axis: axis, label: label, point: point, radius: radius, innerRadius: innerRadius, visible: visible} = crosshairInfo, container = this.getContainer();
|
|
230
261
|
if (visible) {
|
|
231
|
-
const crosshairType = this.
|
|
262
|
+
const crosshairType = this._radiusHair.smooth ? "circle" : "polygon";
|
|
232
263
|
let polygonRadius = distance;
|
|
233
264
|
if ("polygon" === crosshairType) {
|
|
234
265
|
const axisCenter = axis.getCenter(), curAngle = getAngleByPoint(axisCenter, point), stepAngle = (endAngle - startAngle) / sides, index = Math.floor((curAngle - startAngle) / stepAngle), preAngle = index * stepAngle + startAngle, nextAngle = Math.min((index + 1) * stepAngle + startAngle, endAngle), prePoint = polarToCartesian(axisCenter, distance, preAngle), nextPoint = polarToCartesian(axisCenter, distance, nextAngle), insertPoint = getIntersectPoint([ nextPoint.x, nextPoint.y ], [ prePoint.x, prePoint.y ], [ axisCenter.x, axisCenter.y ], [ point.x, point.y ]);
|
|
@@ -244,16 +275,16 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
244
275
|
if (this._radiusCrosshair) this._radiusCrosshair.setAttributes(positionAttrs); else {
|
|
245
276
|
let crosshair;
|
|
246
277
|
crosshair = "polygon" === crosshairType ? new PolygonCrosshair(Object.assign(Object.assign({}, positionAttrs), {
|
|
247
|
-
lineStyle: this.
|
|
278
|
+
lineStyle: this._radiusHair.style,
|
|
248
279
|
zIndex: this.gridZIndex + 1
|
|
249
280
|
})) : new CircleCrosshair(Object.assign(Object.assign({}, positionAttrs), {
|
|
250
|
-
lineStyle: this.
|
|
281
|
+
lineStyle: this._radiusHair.style,
|
|
251
282
|
zIndex: this.gridZIndex
|
|
252
283
|
})), this._radiusCrosshair = crosshair, container.add(crosshair);
|
|
253
284
|
}
|
|
254
285
|
if (label.visible) {
|
|
255
|
-
const orient = radiusLabelOrientAttribute(startAngle), labelAttrs = Object.assign(Object.assign(Object.assign(Object.assign({}, polarToCartesian(center, polygonRadius, startAngle)), this.
|
|
256
|
-
textStyle: Object.assign(Object.assign({}, null === (_a = this.
|
|
286
|
+
const orient = radiusLabelOrientAttribute(startAngle), labelAttrs = Object.assign(Object.assign(Object.assign(Object.assign({}, polarToCartesian(center, polygonRadius, startAngle)), this._radiusHair.label), label), {
|
|
287
|
+
textStyle: Object.assign(Object.assign({}, null === (_a = this._radiusHair.label) || void 0 === _a ? void 0 : _a.textStyle), {
|
|
257
288
|
textAlign: orient.align,
|
|
258
289
|
textBaseline: orient.baseline
|
|
259
290
|
}),
|
|
@@ -267,14 +298,14 @@ export class PolarCrossHair extends BaseCrossHair {
|
|
|
267
298
|
}
|
|
268
299
|
_parseFieldInfo() {
|
|
269
300
|
var _a;
|
|
270
|
-
const {categoryField: categoryField, valueField: valueField} = this.
|
|
271
|
-
categoryField && categoryField.visible && (this.
|
|
272
|
-
valueField && valueField.visible && (this.
|
|
273
|
-
this.
|
|
301
|
+
const {categoryField: categoryField, valueField: valueField} = this._spec;
|
|
302
|
+
categoryField && categoryField.visible && (this._angleHair = this._parseField(categoryField, "categoryField")),
|
|
303
|
+
valueField && valueField.visible && (this._radiusHair = this._parseField(valueField, "valueField"),
|
|
304
|
+
this._radiusHair.smooth = null === (_a = null == valueField ? void 0 : valueField.line) || void 0 === _a ? void 0 : _a.smooth);
|
|
274
305
|
}
|
|
275
306
|
_updateCrosshairLabel(label, labelAttrs, callback) {
|
|
276
307
|
const container = this.getContainer();
|
|
277
|
-
label ? label.setAttributes(labelAttrs) : (label = new Tag(labelAttrs), container.add(label),
|
|
308
|
+
label ? label.setAttributes(labelAttrs) : (label = new Tag(labelAttrs), null == container || container.add(label),
|
|
278
309
|
callback(label)), limitTagInBounds(label, this._getLimitBounds());
|
|
279
310
|
}
|
|
280
311
|
_getNeedClearVRenderComponents() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/component/crosshair/polar.ts"],"names":[],"mappings":"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","file":"polar.js","sourcesContent":["import type { IPolarSeries } from '../../series/interface/series';\nimport { mergeSpec } from '../../util/spec/merge-spec';\nimport type { IComponentOption } from '../interface';\n// eslint-disable-next-line no-duplicate-imports\nimport { ComponentTypeEnum } from '../interface/type';\nimport type { IPolarCrosshairSpec } from './interface';\nimport type { BandScale } from '@visactor/vscale';\n// eslint-disable-next-line no-duplicate-imports\nimport { isDiscrete, isContinuous } from '@visactor/vscale';\n// import { registerComponent } from '@visactor/vgrammar-core';\nimport { Tag } from '@visactor/vrender-components';\n// eslint-disable-next-line no-duplicate-imports\nimport { LineCrosshair, SectorCrosshair, CircleCrosshair, PolygonCrosshair } from '@visactor/vrender-components';\nimport type { IPolarAxis } from '../axis/polar/interface';\nimport type { IPoint, StringOrNumber } from '../../typings';\nimport type { IHair } from './base';\n// eslint-disable-next-line no-duplicate-imports\nimport { BaseCrossHair } from './base';\nimport {\n polarToCartesian,\n getIntersectPoint,\n PointService,\n getAngleByPoint,\n isArray,\n isValid,\n isValidNumber,\n isNil,\n clamp\n} from '@visactor/vutils';\nimport type { IGraphic, IGroup, INode } from '@visactor/vrender-core';\nimport { angleLabelOrientAttribute, radiusLabelOrientAttribute } from '../../util/math';\nimport { limitTagInBounds } from './util';\nimport { getAxisLabelOffset } from '../axis/util';\nimport { Factory } from '../../core/factory';\n\ninterface ICrosshairInfo {\n x: number;\n y: number;\n center: IPoint;\n radius: number;\n distance: number;\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n visible: boolean;\n sides: number;\n angle: number;\n point: IPoint;\n _isCache?: boolean;\n label?: { visible: boolean; text: StringOrNumber; offset: number };\n axis?: IPolarAxis;\n}\n\nenum LayoutType {\n ALL = 0b0011,\n HORIZONTAL = 0b0010,\n VERTICAL = 0b0001,\n NONE = 0b0000\n}\n\ntype IBound = { x1: number; y1: number; x2: number; y2: number };\ntype IAxisInfo = Map<number, IBound & { axis: IPolarAxis }>;\n\nexport class PolarCrossHair<T extends IPolarCrosshairSpec = IPolarCrosshairSpec> extends BaseCrossHair<T> {\n static specKey = 'crosshair';\n specKey: string = 'crosshair';\n\n static type = ComponentTypeEnum.polarCrosshair;\n type = ComponentTypeEnum.polarCrosshair;\n name: string = ComponentTypeEnum.polarCrosshair;\n currValueX: Map<number, { v: StringOrNumber; axis: IPolarAxis; [key: string]: any }>;\n currValueY: Map<number, { v: StringOrNumber; axis: IPolarAxis; [key: string]: any }>;\n\n xHair: IHair | undefined;\n yHair: (IHair & { smooth: boolean }) | undefined;\n\n private _cacheXCrossHairInfo: ICrosshairInfo | undefined;\n private _cacheYCrossHairInfo: ICrosshairInfo | undefined;\n\n private _radiusCrosshair: IGroup;\n private _radiusLabelCrosshair: Tag;\n private _angleCrosshair: IGroup;\n private _angleLabelCrosshair: Tag;\n\n static createComponent(spec: any, options: IComponentOption) {\n const crosshairSpec = spec.crosshair;\n if (isNil(crosshairSpec)) {\n return undefined;\n }\n if (!isArray(crosshairSpec)) {\n if (crosshairSpec.categoryField || crosshairSpec.valueField) {\n return new PolarCrossHair(crosshairSpec, options);\n }\n return undefined;\n }\n const components: PolarCrossHair[] = [];\n crosshairSpec.forEach((s: IPolarCrosshairSpec, i: number) => {\n if (s.categoryField || s.valueField) {\n components.push(new PolarCrossHair(s, { ...options, specIndex: i }));\n }\n });\n return components;\n }\n\n constructor(spec: T, options: IComponentOption) {\n super(spec, options);\n this.currValueX = new Map();\n this.currValueY = new Map();\n }\n\n protected _showDefaultCrosshair() {\n if (!this.showDefault) {\n return;\n }\n // TODO: 待支持\n }\n\n hide() {\n this._radiusCrosshair && this._radiusCrosshair.hideAll();\n this._radiusLabelCrosshair && this._radiusLabelCrosshair.hideAll();\n this._angleCrosshair && this._angleCrosshair.hideAll();\n this._angleLabelCrosshair && this._angleLabelCrosshair.hideAll();\n }\n\n /**\n * 查找所有落在x和y区域的轴\n * @param relativeX\n * @param relativeY\n */\n findAllAxisContains(relativeX: number, relativeY: number) {\n const xAxisMap = this._getAxisInfoByField<IPolarAxis>('category');\n const yAxisMap = this._getAxisInfoByField<IPolarAxis>('value');\n return {\n xAxisMap: this._filterAxisByPoint<IPolarAxis>(xAxisMap, relativeX, relativeY),\n yAxisMap: this._filterAxisByPoint<IPolarAxis>(yAxisMap, relativeX, relativeY)\n };\n }\n\n /**\n * 根据位置获取所有轴上的value\n * @param axisMap\n * @param p\n * @returns\n */\n getAllAxisValues(\n axisMap: IAxisInfo,\n point: IPoint,\n currValue: Map<number, { v: StringOrNumber; axis: IPolarAxis; [key: string]: any }>\n ): boolean {\n // 首先不能存在两个离散轴\n let discrete = false;\n axisMap.forEach(item => {\n if (isDiscrete(item.axis.getScale().type)) {\n if (!discrete) {\n discrete = true;\n } else {\n this.enable = false;\n }\n }\n });\n if (!this.enable) {\n return false;\n }\n // 获取所有的value\n axisMap.forEach((item, id) => {\n const axis = item.axis;\n const { x: axisStartX, y: axisStartY } = item.axis.getLayoutStartPoint();\n const { x, y } = this.getLayoutStartPoint();\n let value = axis.positionToData({\n x: point.x - (axisStartX - x),\n y: point.y - (axisStartY - y)\n });\n if (isContinuous(axis.getScale().type) && isValidNumber(+value)) {\n value = (+value as number).toFixed(2);\n }\n const center = {\n x: axis.getCenter().x + this.getLayoutStartPoint().x,\n y: axis.getCenter().y + this.getLayoutStartPoint().y\n };\n currValue.set(id, {\n v: value,\n axis: item.axis,\n center,\n innerRadius: axis.getInnerRadius(),\n radius: axis.getOuterRadius(),\n startAngle: axis.startAngle,\n endAngle: axis.endAngle,\n distance: PointService.distancePP(point, axis.getCenter()),\n coord: axis.pointToCoord(point),\n point\n });\n });\n return true;\n }\n\n protected _layoutCrosshair(relativeX: number, relativeY: number) {\n // 找到所有的包含这个点的轴\n const { xAxisMap, yAxisMap } = this.findAllAxisContains(relativeX, relativeY);\n if (xAxisMap.size === 0 && yAxisMap.size === 0) {\n if (this.enableRemain) {\n return;\n }\n // 隐藏\n this.hide();\n return;\n }\n // 删除之前的currValue\n this.currValueX.clear();\n this.currValueY.clear();\n // 将数据保存到这个对象中,如果不存在,就直接不执行后续逻辑\n xAxisMap && this.getAllAxisValues(xAxisMap, { x: relativeX, y: relativeY }, this.currValueX);\n yAxisMap && this.getAllAxisValues(yAxisMap, { x: relativeX, y: relativeY }, this.currValueY);\n\n this.layoutByValue(LayoutType.ALL);\n }\n\n private layoutByValue(tag: number) {\n if (!this.enable) {\n return;\n }\n // 获取axisHelper\n const series = this._firstSeries<IPolarSeries>();\n if (!series) {\n return;\n }\n let xCrossHairInfo = {\n x: 0,\n y: 0,\n center: { x: 0, y: 0 },\n radius: 0,\n distance: 0,\n startAngle: 0,\n endAngle: 0,\n innerRadius: 0,\n visible: false,\n label: { visible: false, text: '', offset: 0 }\n } as ICrosshairInfo;\n let yCrossHairInfo = {\n x: 0,\n y: 0,\n center: { x: 0, y: 0 },\n radius: 0,\n distance: 0,\n startAngle: 0,\n endAngle: 0,\n innerRadius: 0,\n visible: false,\n sides: (series.angleAxisHelper.getScale(0) as BandScale).ticks().length,\n label: { visible: false, text: '', offset: 0 }\n } as ICrosshairInfo;\n\n // 计算x轴和y轴的数据,只允许最多一对x和一对y\n if (this.xHair) {\n xCrossHairInfo.visible = !!this.currValueX.size;\n const bandWidth = series.angleAxisHelper.getBandwidth(0);\n this.currValueX.forEach(({ axis, v, coord, ...rest }) => {\n v = v ?? '';\n mergeSpec(xCrossHairInfo, rest);\n const angle = series.angleAxisHelper.dataToPosition([v]);\n xCrossHairInfo.angle = angle;\n if (this.xHair.label?.visible) {\n xCrossHairInfo.label.visible = true;\n xCrossHairInfo.label.text = v;\n xCrossHairInfo.label.offset = getAxisLabelOffset(axis.getSpec());\n }\n\n xCrossHairInfo.startAngle = angle - bandWidth / 2;\n xCrossHairInfo.endAngle = angle + bandWidth / 2;\n });\n }\n\n if (this.yHair) {\n yCrossHairInfo.visible = !!this.currValueY.size;\n this.currValueY.forEach(({ axis, v, coord, ...rest }) => {\n v = v ?? '';\n if (this.yHair.label?.visible) {\n yCrossHairInfo.label.visible = true;\n yCrossHairInfo.label.text = v;\n yCrossHairInfo.label.offset = getAxisLabelOffset(axis.getSpec());\n }\n yCrossHairInfo.angle = coord.angle;\n yCrossHairInfo.axis = axis;\n mergeSpec(yCrossHairInfo, rest);\n });\n }\n\n if (this.enableRemain && !xCrossHairInfo.visible && isValid(this._cacheXCrossHairInfo)) {\n xCrossHairInfo = this._cacheXCrossHairInfo;\n } else {\n if (this.xHair?.label?.formatMethod && xCrossHairInfo.label.visible) {\n const { label } = xCrossHairInfo;\n label.text = this.xHair.label.formatMethod(label.text, 'angle') as string;\n }\n }\n\n if (this.enableRemain && !yCrossHairInfo.visible && isValid(this._cacheYCrossHairInfo)) {\n yCrossHairInfo = this._cacheYCrossHairInfo;\n } else {\n if (this.yHair?.label?.formatMethod && yCrossHairInfo.label.visible) {\n const { label } = yCrossHairInfo;\n label.text = this.yHair.label.formatMethod(label.text, 'radius') as string;\n }\n }\n\n if (tag) {\n LayoutType.HORIZONTAL && this._layoutHorizontal(yCrossHairInfo);\n LayoutType.VERTICAL && this._layoutVertical(xCrossHairInfo);\n }\n\n if (this.enableRemain) {\n this._cacheXCrossHairInfo = { ...xCrossHairInfo, _isCache: true };\n this._cacheYCrossHairInfo = { ...yCrossHairInfo, _isCache: true };\n }\n }\n\n private _layoutVertical(crosshairInfo: ICrosshairInfo) {\n if (crosshairInfo._isCache && this.enableRemain) {\n return;\n }\n\n const container = this.getContainer();\n const { angle, innerRadius, radius, label, startAngle, endAngle, center, visible } = crosshairInfo;\n if (visible) {\n const crosshairType = this.xHair.type === 'rect' ? 'sector' : 'line';\n let positionAttrs;\n if (crosshairType === 'sector') {\n positionAttrs = {\n center,\n innerRadius,\n radius,\n startAngle: startAngle,\n endAngle: endAngle\n };\n } else {\n positionAttrs = {\n start: polarToCartesian(center, innerRadius, angle),\n end: polarToCartesian(center, radius, angle)\n };\n }\n\n if (this._angleCrosshair) {\n this._angleCrosshair.setAttributes(positionAttrs as unknown as any);\n } else {\n let crosshair;\n // 创建\n if (crosshairType === 'line') {\n crosshair = new LineCrosshair({\n ...(positionAttrs as { start: IPoint; end: IPoint }),\n lineStyle: this.xHair.style,\n zIndex: this.gridZIndex\n });\n } else if (crosshairType === 'sector') {\n crosshair = new SectorCrosshair({\n ...(positionAttrs as {\n center: IPoint;\n innerRadius: number;\n radius: number;\n startAngle: number;\n endAngle: number;\n }),\n sectorStyle: this.xHair.style,\n zIndex: this.gridZIndex\n });\n }\n this._angleCrosshair = crosshair as unknown as IGroup;\n // 添加至场景树\n container.add(crosshair as unknown as INode);\n }\n\n // 文本\n if (label.visible) {\n const orient = angleLabelOrientAttribute(angle);\n const labelAttrs = {\n ...polarToCartesian(center, radius + label.offset, angle),\n ...this.xHair.label,\n ...label,\n textStyle: {\n ...this.xHair.label?.textStyle,\n textAlign: orient.align,\n textBaseline: orient.baseline\n },\n zIndex: this.labelZIndex\n };\n this._updateCrosshairLabel(this._angleLabelCrosshair, labelAttrs, label => {\n label.name = 'crosshair-angle-label';\n this._angleLabelCrosshair = label;\n });\n } else {\n this._angleLabelCrosshair && this._angleLabelCrosshair.hideAll();\n }\n }\n }\n\n private _layoutHorizontal(crosshairInfo: ICrosshairInfo) {\n if (crosshairInfo._isCache && this.enableRemain) {\n return;\n }\n\n const { center, startAngle, endAngle, distance, sides, axis, label, point, radius, innerRadius, visible } =\n crosshairInfo;\n const container = this.getContainer();\n if (visible) {\n const crosshairType = this.yHair.smooth ? 'circle' : 'polygon';\n\n let polygonRadius = distance;\n if (crosshairType === 'polygon') {\n const axisCenter = axis.getCenter();\n // 需要计算半径\n // 获取当前点的角度\n const curAngle = getAngleByPoint(axisCenter, point);\n const stepAngle = (endAngle - startAngle) / sides;\n const index = Math.floor((curAngle - startAngle) / stepAngle);\n const preAngle = index * stepAngle + startAngle;\n const nextAngle = Math.min((index + 1) * stepAngle + startAngle, endAngle);\n\n const prePoint = polarToCartesian(axisCenter, distance, preAngle);\n const nextPoint = polarToCartesian(axisCenter, distance, nextAngle);\n // 求交点\n const insertPoint = getIntersectPoint(\n [nextPoint.x, nextPoint.y],\n [prePoint.x, prePoint.y],\n [axisCenter.x, axisCenter.y],\n [point.x, point.y]\n );\n if (insertPoint) {\n polygonRadius = clamp(\n PointService.distancePN(point, insertPoint[0], insertPoint[1]) + distance,\n innerRadius,\n radius\n );\n }\n }\n const positionAttrs = {\n center,\n startAngle: startAngle,\n endAngle: endAngle,\n radius: polygonRadius,\n sides\n };\n\n if (this._radiusCrosshair) {\n this._radiusCrosshair.setAttributes(positionAttrs as unknown as any);\n } else {\n let crosshair;\n if (crosshairType === 'polygon') {\n crosshair = new PolygonCrosshair({\n ...positionAttrs,\n lineStyle: this.yHair.style,\n zIndex: this.gridZIndex + 1 // 样式优化:线盖在面上\n });\n } else {\n crosshair = new CircleCrosshair({\n ...positionAttrs,\n lineStyle: this.yHair.style,\n zIndex: this.gridZIndex\n });\n }\n this._radiusCrosshair = crosshair as unknown as IGroup;\n // 添加至场景树\n container.add(crosshair as unknown as INode);\n }\n\n // 文本\n if (label.visible) {\n const orient = radiusLabelOrientAttribute(startAngle);\n const labelAttrs = {\n ...polarToCartesian(center, polygonRadius, startAngle),\n ...this.yHair.label,\n ...label,\n textStyle: {\n ...this.yHair.label?.textStyle,\n textAlign: orient.align,\n textBaseline: orient.baseline\n },\n zIndex: this.labelZIndex\n };\n this._updateCrosshairLabel(this._radiusLabelCrosshair, labelAttrs, label => {\n label.name = 'crosshair-radius-label';\n this._radiusLabelCrosshair = label;\n });\n } else {\n this._radiusLabelCrosshair && this._radiusLabelCrosshair.hideAll();\n }\n }\n }\n\n protected _parseFieldInfo() {\n const { categoryField, valueField } = this._crosshairConfig as IPolarCrosshairSpec;\n if (categoryField && categoryField.visible) {\n this.xHair = this._parseField(categoryField, 'categoryField');\n }\n if (valueField && valueField.visible) {\n this.yHair = this._parseField(valueField, 'valueField');\n this.yHair.smooth = valueField?.line?.smooth;\n }\n }\n\n private _updateCrosshairLabel(label: Tag, labelAttrs: any, callback: (label: Tag) => void) {\n // 文本\n const container = this.getContainer();\n if (label) {\n label.setAttributes(labelAttrs);\n } else {\n label = new Tag(labelAttrs);\n container.add(label as unknown as INode);\n callback(label);\n }\n limitTagInBounds(label, this._getLimitBounds());\n }\n\n protected _getNeedClearVRenderComponents(): IGraphic[] {\n return [\n this._radiusCrosshair,\n this._radiusLabelCrosshair,\n this._angleCrosshair,\n this._angleLabelCrosshair\n ] as unknown as IGroup[];\n }\n}\n\nexport const registerPolarCrossHair = () => {\n Factory.registerComponent(PolarCrossHair.type, PolarCrossHair);\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/component/crosshair/polar.ts"],"names":[],"mappings":"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","file":"polar.js","sourcesContent":["/* eslint-disable no-duplicate-imports */\nimport type { IPolarSeries } from '../../series/interface/series';\nimport { mergeSpec } from '../../util/spec/merge-spec';\nimport type { IComponentOption } from '../interface';\nimport { ComponentTypeEnum } from '../interface/type';\nimport type { IPolarCrosshairSpec } from './interface';\nimport type { BandScale } from '@visactor/vscale';\nimport { isDiscrete, isContinuous } from '@visactor/vscale';\nimport { Tag } from '@visactor/vrender-components';\nimport { LineCrosshair, SectorCrosshair, CircleCrosshair, PolygonCrosshair } from '@visactor/vrender-components';\nimport type { IPolarAxis } from '../axis/polar/interface';\nimport type { IPoint, StringOrNumber } from '../../typings';\nimport type { IAxisInfo, IHair } from './base';\nimport { BaseCrossHair } from './base';\nimport {\n polarToCartesian,\n getIntersectPoint,\n PointService,\n getAngleByPoint,\n isArray,\n isValid,\n isValidNumber,\n isNil,\n clamp\n} from '@visactor/vutils';\nimport type { IGraphic, IGroup, INode } from '@visactor/vrender-core';\nimport { angleLabelOrientAttribute, radiusLabelOrientAttribute } from '../../util/math';\nimport { limitTagInBounds } from './util';\nimport { getAxisLabelOffset } from '../axis/util';\nimport { Factory } from '../../core/factory';\nimport { LayoutType } from './config';\n\ninterface ICrosshairInfo {\n x: number;\n y: number;\n center: IPoint;\n radius: number;\n distance: number;\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n visible: boolean;\n sides: number;\n angle: number;\n point: IPoint;\n _isCache?: boolean;\n label?: { visible: boolean; text: StringOrNumber; offset: number };\n axis?: IPolarAxis;\n}\n\nexport class PolarCrossHair<T extends IPolarCrosshairSpec = IPolarCrosshairSpec> extends BaseCrossHair<T> {\n static specKey = 'crosshair';\n specKey: string = 'crosshair';\n\n static type = ComponentTypeEnum.polarCrosshair;\n type = ComponentTypeEnum.polarCrosshair;\n name: string = ComponentTypeEnum.polarCrosshair;\n private _currValueAngle: Map<number, { v: StringOrNumber; axis: IPolarAxis; [key: string]: any }>;\n private _currValueRadius: Map<number, { v: StringOrNumber; axis: IPolarAxis; [key: string]: any }>;\n\n private _angleHair: IHair | undefined;\n private _radiusHair: (IHair & { smooth: boolean }) | undefined;\n\n private _cacheAngleCrossHairInfo: ICrosshairInfo | undefined;\n private _cacheRadiusCrossHairInfo: ICrosshairInfo | undefined;\n\n private _radiusCrosshair: IGroup;\n private _radiusLabelCrosshair: Tag;\n private _angleCrosshair: IGroup;\n private _angleLabelCrosshair: Tag;\n\n static createComponent(spec: any, options: IComponentOption) {\n const crosshairSpec = spec.crosshair;\n if (isNil(crosshairSpec)) {\n return undefined;\n }\n if (!isArray(crosshairSpec)) {\n if (crosshairSpec.categoryField || crosshairSpec.valueField) {\n return new PolarCrossHair(crosshairSpec, options);\n }\n return undefined;\n }\n const components: PolarCrossHair[] = [];\n crosshairSpec.forEach((s: IPolarCrosshairSpec, i: number) => {\n if (s.categoryField || s.valueField) {\n components.push(new PolarCrossHair(s, { ...options, specIndex: i }));\n }\n });\n return components;\n }\n\n constructor(spec: T, options: IComponentOption) {\n super(spec, options);\n this._currValueAngle = new Map();\n this._currValueRadius = new Map();\n }\n\n protected _showDefaultCrosshairBySpec() {\n const { categoryField, valueField } = this._spec as IPolarCrosshairSpec;\n if (categoryField?.visible && categoryField.defaultSelect) {\n const { axisIndex, datum } = categoryField.defaultSelect;\n this._defaultCrosshair(axisIndex, datum, LayoutType.VERTICAL);\n }\n if (valueField?.visible && valueField.defaultSelect) {\n const { axisIndex, datum } = valueField.defaultSelect;\n this._defaultCrosshair(axisIndex, datum, LayoutType.HORIZONTAL);\n }\n }\n\n private _defaultCrosshair(axisIndex: number, datum: StringOrNumber, tag: number) {\n const axis = this._option.getComponentsByKey('axes').find(c => c.getSpecIndex() === axisIndex) as IPolarAxis;\n if (!axis) {\n return;\n }\n // 横轴\n if (tag === LayoutType.VERTICAL) {\n this._currValueAngle.clear();\n // 根据数值拿到对应的坐标点\n const polarCoord = {\n angle: axis.valueToPosition(datum),\n radius: axis.getOuterRadius()\n };\n const canvasPosition = axis.coordToPoint(polarCoord);\n this._currValueAngle.set(axisIndex, this._getValueByAxis(axis, canvasPosition));\n } else {\n this._currValueRadius.clear();\n // 根据数值拿到对应的坐标点\n const polarCoord = {\n angle: axis.startAngle,\n radius: axis.valueToPosition(datum)\n };\n const canvasPosition = axis.coordToPoint(polarCoord);\n this._currValueRadius.set(axisIndex, this._getValueByAxis(axis, canvasPosition));\n }\n this.layoutByValue(LayoutType.ALL);\n }\n\n hide() {\n this._radiusCrosshair && this._radiusCrosshair.hideAll();\n this._radiusLabelCrosshair && this._radiusLabelCrosshair.hideAll();\n this._angleCrosshair && this._angleCrosshair.hideAll();\n this._angleLabelCrosshair && this._angleLabelCrosshair.hideAll();\n }\n\n /**\n * 查找所有落在x和y区域的轴\n * @param relativeX\n * @param relativeY\n */\n private _findAllAxisContains(relativeX: number, relativeY: number) {\n const angleAxisMap = this._getAxisInfoByField<IPolarAxis>('category');\n const radiusAxisMap = this._getAxisInfoByField<IPolarAxis>('value');\n return {\n angleAxisMap: this._filterAxisByPoint<IPolarAxis>(angleAxisMap, relativeX, relativeY),\n radiusAxisMap: this._filterAxisByPoint<IPolarAxis>(radiusAxisMap, relativeX, relativeY)\n };\n }\n\n /**\n * 根据位置获取所有轴上的value\n * @param axisMap\n * @param p\n * @returns\n */\n private _getAllAxisValues(\n axisMap: IAxisInfo<IPolarAxis>,\n point: IPoint,\n currValue: Map<number, { v: StringOrNumber; axis: IPolarAxis; [key: string]: any }>\n ): boolean {\n // 首先不能存在两个离散轴\n let discrete = false;\n axisMap.forEach(item => {\n if (isDiscrete(item.axis.getScale().type)) {\n if (!discrete) {\n discrete = true;\n } else {\n this.enable = false;\n }\n }\n });\n if (!this.enable) {\n return false;\n }\n // 获取所有的value\n axisMap.forEach((item, id) => {\n const axis = item.axis;\n currValue.set(id, this._getValueByAxis(axis, point));\n });\n return true;\n }\n\n private _getValueByAxis(axis: IPolarAxis, point: IPoint) {\n const { x: axisStartX, y: axisStartY } = axis.getLayoutStartPoint();\n const { x, y } = this.getLayoutStartPoint();\n let value = axis.positionToData({\n x: point.x - (axisStartX - x),\n y: point.y - (axisStartY - y)\n });\n if (isContinuous(axis.getScale().type) && isValidNumber(+value)) {\n value = (+value as number).toFixed(2);\n }\n const center = {\n x: axis.getCenter().x + this.getLayoutStartPoint().x,\n y: axis.getCenter().y + this.getLayoutStartPoint().y\n };\n\n return {\n v: value,\n axis,\n center,\n innerRadius: axis.getInnerRadius(),\n radius: axis.getOuterRadius(),\n startAngle: axis.startAngle,\n endAngle: axis.endAngle,\n distance: PointService.distancePP(point, axis.getCenter()),\n coord: axis.pointToCoord(point),\n point\n };\n }\n\n protected _layoutCrosshair(relativeX: number, relativeY: number) {\n // 找到所有的包含这个点的轴\n const { angleAxisMap, radiusAxisMap } = this._findAllAxisContains(relativeX, relativeY);\n if (angleAxisMap.size === 0 && radiusAxisMap.size === 0) {\n if (this.enableRemain) {\n return;\n }\n // 隐藏\n this.hide();\n return;\n }\n // 删除之前的currValue\n this._currValueAngle.clear();\n this._currValueRadius.clear();\n // 将数据保存到这个对象中,如果不存在,就直接不执行后续逻辑\n angleAxisMap && this._getAllAxisValues(angleAxisMap, { x: relativeX, y: relativeY }, this._currValueAngle);\n radiusAxisMap && this._getAllAxisValues(radiusAxisMap, { x: relativeX, y: relativeY }, this._currValueRadius);\n\n this.layoutByValue(LayoutType.ALL);\n }\n\n layoutByValue(tag: number = LayoutType.ALL) {\n if (!this.enable) {\n return;\n }\n // 获取axisHelper\n const series = this._firstSeries<IPolarSeries>();\n if (!series) {\n return;\n }\n let angleCrossHairInfo = {\n x: 0,\n y: 0,\n center: { x: 0, y: 0 },\n radius: 0,\n distance: 0,\n startAngle: 0,\n endAngle: 0,\n innerRadius: 0,\n visible: false,\n label: { visible: false, text: '', offset: 0 }\n } as ICrosshairInfo;\n let radiusCrossHairInfo = {\n x: 0,\n y: 0,\n center: { x: 0, y: 0 },\n radius: 0,\n distance: 0,\n startAngle: 0,\n endAngle: 0,\n innerRadius: 0,\n visible: false,\n sides: (series.angleAxisHelper.getScale(0) as BandScale).ticks().length,\n label: { visible: false, text: '', offset: 0 }\n } as ICrosshairInfo;\n\n // 计算x轴和y轴的数据,只允许最多一对x和一对y\n if (this._angleHair) {\n angleCrossHairInfo.visible = !!this._currValueAngle.size;\n const bandWidth = series.angleAxisHelper.getBandwidth(0);\n this._currValueAngle.forEach(({ axis, v, coord, ...rest }) => {\n v = v ?? '';\n mergeSpec(angleCrossHairInfo, rest);\n const angle = series.angleAxisHelper.dataToPosition([v]);\n angleCrossHairInfo.angle = angle;\n if (this._angleHair.label?.visible) {\n angleCrossHairInfo.label.visible = true;\n angleCrossHairInfo.label.text = v;\n angleCrossHairInfo.label.offset = getAxisLabelOffset(axis.getSpec());\n }\n\n angleCrossHairInfo.startAngle = angle - bandWidth / 2;\n angleCrossHairInfo.endAngle = angle + bandWidth / 2;\n });\n }\n\n if (this._radiusHair) {\n radiusCrossHairInfo.visible = !!this._currValueRadius.size;\n this._currValueRadius.forEach(({ axis, v, coord, ...rest }) => {\n v = v ?? '';\n if (this._radiusHair.label?.visible) {\n radiusCrossHairInfo.label.visible = true;\n radiusCrossHairInfo.label.text = v;\n radiusCrossHairInfo.label.offset = getAxisLabelOffset(axis.getSpec());\n }\n radiusCrossHairInfo.angle = coord.angle;\n radiusCrossHairInfo.axis = axis;\n mergeSpec(radiusCrossHairInfo, rest);\n });\n }\n\n if (this.enableRemain && !angleCrossHairInfo.visible && isValid(this._cacheAngleCrossHairInfo)) {\n angleCrossHairInfo = this._cacheAngleCrossHairInfo;\n } else {\n if (this._angleHair?.label?.formatMethod && angleCrossHairInfo.label.visible) {\n const { label } = angleCrossHairInfo;\n label.text = this._angleHair.label.formatMethod(label.text, 'angle') as string;\n }\n }\n\n if (this.enableRemain && !radiusCrossHairInfo.visible && isValid(this._cacheRadiusCrossHairInfo)) {\n radiusCrossHairInfo = this._cacheRadiusCrossHairInfo;\n } else {\n if (this._radiusHair?.label?.formatMethod && radiusCrossHairInfo.label.visible) {\n const { label } = radiusCrossHairInfo;\n label.text = this._radiusHair.label.formatMethod(label.text, 'radius') as string;\n }\n }\n\n if (tag) {\n LayoutType.HORIZONTAL && this._layoutHorizontal(radiusCrossHairInfo);\n LayoutType.VERTICAL && this._layoutVertical(angleCrossHairInfo);\n }\n\n if (this.enableRemain) {\n this._cacheAngleCrossHairInfo = { ...angleCrossHairInfo, _isCache: true };\n this._cacheRadiusCrossHairInfo = { ...radiusCrossHairInfo, _isCache: true };\n }\n }\n\n private _layoutVertical(crosshairInfo: ICrosshairInfo) {\n if (crosshairInfo._isCache && this.enableRemain) {\n return;\n }\n\n const container = this.getContainer();\n const { angle, innerRadius, radius, label, startAngle, endAngle, center, visible } = crosshairInfo;\n if (visible) {\n const crosshairType = this._angleHair.type === 'rect' ? 'sector' : 'line';\n let positionAttrs;\n if (crosshairType === 'sector') {\n positionAttrs = {\n center,\n innerRadius,\n radius,\n startAngle: startAngle,\n endAngle: endAngle\n };\n } else {\n positionAttrs = {\n start: polarToCartesian(center, innerRadius, angle),\n end: polarToCartesian(center, radius, angle)\n };\n }\n\n if (this._angleCrosshair) {\n this._angleCrosshair.setAttributes(positionAttrs as unknown as any);\n } else {\n let crosshair;\n // 创建\n if (crosshairType === 'line') {\n crosshair = new LineCrosshair({\n ...(positionAttrs as { start: IPoint; end: IPoint }),\n lineStyle: this._angleHair.style,\n zIndex: this.gridZIndex\n });\n } else if (crosshairType === 'sector') {\n crosshair = new SectorCrosshair({\n ...(positionAttrs as {\n center: IPoint;\n innerRadius: number;\n radius: number;\n startAngle: number;\n endAngle: number;\n }),\n sectorStyle: this._angleHair.style,\n zIndex: this.gridZIndex\n });\n }\n this._angleCrosshair = crosshair as unknown as IGroup;\n // 添加至场景树\n container.add(crosshair as unknown as INode);\n }\n\n // 文本\n if (label.visible) {\n const orient = angleLabelOrientAttribute(angle);\n const labelAttrs = {\n ...polarToCartesian(center, radius + label.offset, angle),\n ...this._angleHair.label,\n ...label,\n textStyle: {\n ...this._angleHair.label?.textStyle,\n textAlign: orient.align,\n textBaseline: orient.baseline\n },\n zIndex: this.labelZIndex\n };\n this._updateCrosshairLabel(this._angleLabelCrosshair, labelAttrs, label => {\n label.name = 'crosshair-angle-label';\n this._angleLabelCrosshair = label;\n });\n } else {\n this._angleLabelCrosshair && this._angleLabelCrosshair.hideAll();\n }\n }\n }\n\n private _layoutHorizontal(crosshairInfo: ICrosshairInfo) {\n if (crosshairInfo._isCache && this.enableRemain) {\n return;\n }\n\n const { center, startAngle, endAngle, distance, sides, axis, label, point, radius, innerRadius, visible } =\n crosshairInfo;\n const container = this.getContainer();\n if (visible) {\n const crosshairType = this._radiusHair.smooth ? 'circle' : 'polygon';\n\n let polygonRadius = distance;\n if (crosshairType === 'polygon') {\n const axisCenter = axis.getCenter();\n // 需要计算半径\n // 获取当前点的角度\n const curAngle = getAngleByPoint(axisCenter, point);\n const stepAngle = (endAngle - startAngle) / sides;\n const index = Math.floor((curAngle - startAngle) / stepAngle);\n const preAngle = index * stepAngle + startAngle;\n const nextAngle = Math.min((index + 1) * stepAngle + startAngle, endAngle);\n\n const prePoint = polarToCartesian(axisCenter, distance, preAngle);\n const nextPoint = polarToCartesian(axisCenter, distance, nextAngle);\n // 求交点\n const insertPoint = getIntersectPoint(\n [nextPoint.x, nextPoint.y],\n [prePoint.x, prePoint.y],\n [axisCenter.x, axisCenter.y],\n [point.x, point.y]\n );\n if (insertPoint) {\n polygonRadius = clamp(\n PointService.distancePN(point, insertPoint[0], insertPoint[1]) + distance,\n innerRadius,\n radius\n );\n }\n }\n const positionAttrs = {\n center,\n startAngle: startAngle,\n endAngle: endAngle,\n radius: polygonRadius,\n sides\n };\n\n if (this._radiusCrosshair) {\n this._radiusCrosshair.setAttributes(positionAttrs as unknown as any);\n } else {\n let crosshair;\n if (crosshairType === 'polygon') {\n crosshair = new PolygonCrosshair({\n ...positionAttrs,\n lineStyle: this._radiusHair.style,\n zIndex: this.gridZIndex + 1 // 样式优化:线盖在面上\n });\n } else {\n crosshair = new CircleCrosshair({\n ...positionAttrs,\n lineStyle: this._radiusHair.style,\n zIndex: this.gridZIndex\n });\n }\n this._radiusCrosshair = crosshair as unknown as IGroup;\n // 添加至场景树\n container.add(crosshair as unknown as INode);\n }\n\n // 文本\n if (label.visible) {\n const orient = radiusLabelOrientAttribute(startAngle);\n const labelAttrs = {\n ...polarToCartesian(center, polygonRadius, startAngle),\n ...this._radiusHair.label,\n ...label,\n textStyle: {\n ...this._radiusHair.label?.textStyle,\n textAlign: orient.align,\n textBaseline: orient.baseline\n },\n zIndex: this.labelZIndex\n };\n this._updateCrosshairLabel(this._radiusLabelCrosshair, labelAttrs, label => {\n label.name = 'crosshair-radius-label';\n this._radiusLabelCrosshair = label;\n });\n } else {\n this._radiusLabelCrosshair && this._radiusLabelCrosshair.hideAll();\n }\n }\n }\n\n protected _parseFieldInfo() {\n const { categoryField, valueField } = this._spec as IPolarCrosshairSpec;\n if (categoryField && categoryField.visible) {\n this._angleHair = this._parseField(categoryField, 'categoryField');\n }\n if (valueField && valueField.visible) {\n this._radiusHair = this._parseField(valueField, 'valueField');\n this._radiusHair.smooth = valueField?.line?.smooth;\n }\n }\n\n private _updateCrosshairLabel(label: Tag, labelAttrs: any, callback: (label: Tag) => void) {\n // 文本\n const container = this.getContainer();\n if (label) {\n label.setAttributes(labelAttrs);\n } else {\n label = new Tag(labelAttrs);\n container?.add(label as unknown as INode);\n callback(label);\n }\n limitTagInBounds(label, this._getLimitBounds());\n }\n\n protected _getNeedClearVRenderComponents(): IGraphic[] {\n return [\n this._radiusCrosshair,\n this._radiusLabelCrosshair,\n this._angleCrosshair,\n this._angleLabelCrosshair\n ] as unknown as IGroup[];\n }\n}\n\nexport const registerPolarCrossHair = () => {\n Factory.registerComponent(PolarCrossHair.type, PolarCrossHair);\n};\n"]}
|
|
@@ -41,6 +41,7 @@ export type IColorLegendSpec = IContinuousLegendSpec & {
|
|
|
41
41
|
export type ISizeLegendSpec = IContinuousLegendSpec & {
|
|
42
42
|
type: 'size';
|
|
43
43
|
sizeBackground?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'visible' | 'width' | 'height'>;
|
|
44
|
+
align?: 'top' | 'bottom' | 'left' | 'right';
|
|
44
45
|
};
|
|
45
46
|
export type IContinuousLegendTheme = Omit<IContinuousLegendSpec, 'type' | 'field' | 'scale' | 'regionIndex' | 'regionId' | 'seriesIndex' | 'seriesId' | 'id' | 'defaultSelected'>;
|
|
46
47
|
export interface IColorLegendTheme {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/component/legend/continuous/interface.ts"],"names":[],"mappings":"","file":"interface.js","sourcesContent":["import type { IRectMarkSpec, ISymbolMarkSpec, ITextMarkSpec, StringOrNumber } from '../../../typings';\nimport type { ILegendCommonSpec, NoVisibleMarkStyle } from '../interface';\n\ntype Text = StringOrNumber;\n\nexport type TextAttribute = {\n /** 是否展示 */\n visible?: boolean;\n /** 文本内容 */\n text?: Text;\n /**\n * 文本同滑块的间距,默认为 6\n */\n space?: number;\n /**\n * 文本样式\n */\n style?: Omit<NoVisibleMarkStyle<ITextMarkSpec>, 'text'>;\n};\n\nexport type HandlerTextAttribute = {\n /** 是否展示 */\n visible?: boolean;\n /**\n * 数据展示的小数精度,默认为0,无小数点。\n */\n precision?: number;\n /** 文本内容格式化函数 */\n formatter?: (text: Text) => Text;\n /**\n * 文本同滑块的间距,默认为 6\n */\n space?: number;\n /**\n * 文本样式\n */\n style?: Omit<NoVisibleMarkStyle<ITextMarkSpec>, 'text'>;\n};\n\n// 连续图例通用配置\nexport type IContinuousLegendSpec = ILegendCommonSpec & {\n /**\n * 声明关联的映射字段\n */\n field?: string;\n /**\n * 连续图例关联的映射 scale\n */\n scale?: string;\n /**\n * 默认筛选的数据范围\n */\n defaultSelected?: [number, number];\n /**\n * 是否允许拖动,默认为 true\n */\n slidable?: boolean;\n /**\n * 滑块轨道配置\n */\n rail?: {\n /**\n * 滑块的宽度\n */\n width?: number;\n /**\n * 滑块的高度\n */\n height?: number;\n /**\n * 背景轨道样式配置\n */\n style?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'width' | 'height'>;\n };\n /**\n * 滑块手柄配置\n */\n handler?: {\n /**\n * 是否绘制 handler,默认为 true\n */\n visible?: boolean;\n /**\n * 滑块手柄的样式配置\n */\n style?: NoVisibleMarkStyle<ISymbolMarkSpec>;\n };\n /**\n * 选中区域样式配置\n */\n track?: {\n style?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'width' | 'height'>;\n };\n /**\n * 滑块首部文本配置\n */\n startText?: TextAttribute;\n /**\n * 滑块尾部文本配置\n */\n endText?: TextAttribute;\n /**\n * 滑块对应的文本配置项\n */\n handlerText?: HandlerTextAttribute;\n};\n\n// 颜色图例配置\nexport type IColorLegendSpec = IContinuousLegendSpec & {\n /**\n * 声明 color 类型图例\n */\n type: 'color';\n};\n\n// 尺寸图例配置\nexport type ISizeLegendSpec = IContinuousLegendSpec & {\n /**\n * 声明 size 类型图例\n */\n type: 'size';\n /**\n * size 背景样式配置\n */\n sizeBackground?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'visible' | 'width' | 'height'>;\n};\n\nexport type IContinuousLegendTheme = Omit<\n IContinuousLegendSpec,\n 'type' | 'field' | 'scale' | 'regionIndex' | 'regionId' | 'seriesIndex' | 'seriesId' | 'id' | 'defaultSelected'\n>;\n\nexport interface IColorLegendTheme {\n horizontal?: IContinuousLegendTheme;\n vertical?: IContinuousLegendTheme;\n}\n\n// TODO: 加上 sizeBackground\nexport interface ISizeLegendTheme {\n horizontal?: IContinuousLegendTheme & {\n sizeBackground?: ISizeLegendSpec['sizeBackground'];\n };\n vertical?: IContinuousLegendTheme & {\n sizeBackground?: ISizeLegendSpec['sizeBackground'];\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/component/legend/continuous/interface.ts"],"names":[],"mappings":"","file":"interface.js","sourcesContent":["import type { IRectMarkSpec, ISymbolMarkSpec, ITextMarkSpec, StringOrNumber } from '../../../typings';\nimport type { ILegendCommonSpec, NoVisibleMarkStyle } from '../interface';\n\ntype Text = StringOrNumber;\n\nexport type TextAttribute = {\n /** 是否展示 */\n visible?: boolean;\n /** 文本内容 */\n text?: Text;\n /**\n * 文本同滑块的间距,默认为 6\n */\n space?: number;\n /**\n * 文本样式\n */\n style?: Omit<NoVisibleMarkStyle<ITextMarkSpec>, 'text'>;\n};\n\nexport type HandlerTextAttribute = {\n /** 是否展示 */\n visible?: boolean;\n /**\n * 数据展示的小数精度,默认为0,无小数点。\n */\n precision?: number;\n /** 文本内容格式化函数 */\n formatter?: (text: Text) => Text;\n /**\n * 文本同滑块的间距,默认为 6\n */\n space?: number;\n /**\n * 文本样式\n */\n style?: Omit<NoVisibleMarkStyle<ITextMarkSpec>, 'text'>;\n};\n\n// 连续图例通用配置\nexport type IContinuousLegendSpec = ILegendCommonSpec & {\n /**\n * 声明关联的映射字段\n */\n field?: string;\n /**\n * 连续图例关联的映射 scale\n */\n scale?: string;\n /**\n * 默认筛选的数据范围\n */\n defaultSelected?: [number, number];\n /**\n * 是否允许拖动,默认为 true\n */\n slidable?: boolean;\n /**\n * 滑块轨道配置\n */\n rail?: {\n /**\n * 滑块的宽度\n */\n width?: number;\n /**\n * 滑块的高度\n */\n height?: number;\n /**\n * 背景轨道样式配置\n */\n style?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'width' | 'height'>;\n };\n /**\n * 滑块手柄配置\n */\n handler?: {\n /**\n * 是否绘制 handler,默认为 true\n */\n visible?: boolean;\n /**\n * 滑块手柄的样式配置\n */\n style?: NoVisibleMarkStyle<ISymbolMarkSpec>;\n };\n /**\n * 选中区域样式配置\n */\n track?: {\n style?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'width' | 'height'>;\n };\n /**\n * 滑块首部文本配置\n */\n startText?: TextAttribute;\n /**\n * 滑块尾部文本配置\n */\n endText?: TextAttribute;\n /**\n * 滑块对应的文本配置项\n */\n handlerText?: HandlerTextAttribute;\n};\n\n// 颜色图例配置\nexport type IColorLegendSpec = IContinuousLegendSpec & {\n /**\n * 声明 color 类型图例\n */\n type: 'color';\n};\n\n// 尺寸图例配置\nexport type ISizeLegendSpec = IContinuousLegendSpec & {\n /**\n * 声明 size 类型图例\n */\n type: 'size';\n /**\n * size 背景样式配置\n */\n sizeBackground?: Omit<NoVisibleMarkStyle<IRectMarkSpec>, 'visible' | 'width' | 'height'>;\n /**\n * 指定组件中手柄和文字的摆放位置,可选值为:\n * 'left' 手柄和label在滑块左侧,layout 为 vertical 时有效。\n * 'right' 手柄和label在滑块右侧,layout 为 vertical 时有效。\n * 'top' 手柄和label在滑块上侧,layout 为 horizontal 时有效。\n * 'bottom' 手柄和label在滑块下侧,layout 为 horizontal 时有效。\n */\n align?: 'top' | 'bottom' | 'left' | 'right';\n};\n\nexport type IContinuousLegendTheme = Omit<\n IContinuousLegendSpec,\n 'type' | 'field' | 'scale' | 'regionIndex' | 'regionId' | 'seriesIndex' | 'seriesId' | 'id' | 'defaultSelected'\n>;\n\nexport interface IColorLegendTheme {\n horizontal?: IContinuousLegendTheme;\n vertical?: IContinuousLegendTheme;\n}\n\n// TODO: 加上 sizeBackground\nexport interface ISizeLegendTheme {\n horizontal?: IContinuousLegendTheme & {\n sizeBackground?: ISizeLegendSpec['sizeBackground'];\n };\n vertical?: IContinuousLegendTheme & {\n sizeBackground?: ISizeLegendSpec['sizeBackground'];\n };\n}\n"]}
|
|
@@ -31,12 +31,14 @@ export class ContinuousLegend extends BaseLegend {
|
|
|
31
31
|
const legendSpec = spec.legends;
|
|
32
32
|
if (!legendSpec) return;
|
|
33
33
|
if (!isArray(legendSpec)) return isContinuousLegend(legendSpec.type) ? new ContinuousLegend(legendSpec, Object.assign(Object.assign({}, options), {
|
|
34
|
+
type: "color" === legendSpec.type ? ComponentTypeEnum.colorLegend : ComponentTypeEnum.sizeLegend,
|
|
34
35
|
specIndex: 0
|
|
35
36
|
})) : void 0;
|
|
36
37
|
const legends = [];
|
|
37
38
|
return legendSpec.forEach(((s, i) => {
|
|
38
39
|
isContinuousLegend(s.type) && legends.push(new ContinuousLegend(s, Object.assign(Object.assign({}, options), {
|
|
39
|
-
specIndex: i
|
|
40
|
+
specIndex: i,
|
|
41
|
+
type: "color" === s.type ? ComponentTypeEnum.colorLegend : ComponentTypeEnum.sizeLegend
|
|
40
42
|
})));
|
|
41
43
|
})), legends;
|
|
42
44
|
}
|
|
@@ -115,7 +117,7 @@ export class ContinuousLegend extends BaseLegend {
|
|
|
115
117
|
let min = null !== (_a = this._legendData.getLatestData()[0]) && void 0 !== _a ? _a : 0, max = null !== (_b = this._legendData.getLatestData()[1]) && void 0 !== _b ? _b : 1;
|
|
116
118
|
this._legendData.getLatestData()[0] === this._legendData.getLatestData()[1] && (min = Math.min(0, this._legendData.getLatestData()[0]),
|
|
117
119
|
max = 0 === this._legendData.getLatestData()[0] ? 1 : Math.max(0, this._legendData.getLatestData()[0]));
|
|
118
|
-
const attrs = Object.assign(
|
|
120
|
+
const attrs = Object.assign({
|
|
119
121
|
layout: layout,
|
|
120
122
|
align: align,
|
|
121
123
|
zIndex: this.layoutZIndex,
|
|
@@ -123,7 +125,7 @@ export class ContinuousLegend extends BaseLegend {
|
|
|
123
125
|
max: max,
|
|
124
126
|
value: this._spec.defaultSelected,
|
|
125
127
|
["color" === this._legendType ? "colors" : "sizeRange"]: visualMappingRange
|
|
126
|
-
});
|
|
128
|
+
}, getContinuousLegendAttributes(this._spec));
|
|
127
129
|
return this._addDefaultTitleText(attrs), attrs;
|
|
128
130
|
}
|
|
129
131
|
_getLegendConstructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/component/legend/continuous/legend.ts"],"names":[],"mappings":"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","file":"legend.js","sourcesContent":["/**\n * @description color legend component\n */\nimport { debounce, isEmpty, isNil, isArray, get } from '@visactor/vutils';\nimport { DataView } from '@visactor/vdataset';\n// eslint-disable-next-line no-duplicate-imports\nimport type { ISeries } from '../../../series/interface';\nimport type { IModelInitOption } from '../../../model/interface';\nimport type { IComponentOption } from '../../interface';\n// eslint-disable-next-line no-duplicate-imports\nimport { ComponentTypeEnum } from '../../interface/type';\n// eslint-disable-next-line no-duplicate-imports\nimport { registerDataSetInstanceTransform } from '../../../data/register';\nimport { eachSeries } from '../../../util/model';\nimport { getFieldAlias } from '../../../util/data';\nimport { isDataDomainSpec } from '../../../util/type';\n// eslint-disable-next-line no-duplicate-imports\nimport type { ILegend } from '../interface';\nimport type { IColorLegendSpec, IColorLegendTheme, ISizeLegendSpec } from './interface';\nimport {\n continuousLegendDataMake,\n continuousLegendFilter\n} from '../../../data/transforms/legend-data/continuous/continuous';\nimport { ContinuousLegendMap, getContinuousLegendAttributes, isContinuousLegend } from './util';\nimport { BaseLegend } from '../base-legend';\nimport { ChartEvent } from '../../../constant';\nimport { Factory } from '../../../core/factory';\nimport { TransformLevel } from '../../../data/initialize';\nimport type { ILayoutRect } from '../../../typings/layout';\n\nconst SINGLE_SEQUENCE = ['#C4E7FF', '#98CAFF', '#75ACFF', '#518FF9', '#2775DC', '#005CBE', '#00429F', '#00287E'];\nconst SIZE = [2, 10];\n\nexport class ContinuousLegend<\n T extends IColorLegendSpec | ISizeLegendSpec = IColorLegendSpec | ISizeLegendSpec\n> extends BaseLegend<T> {\n static specKey = 'legends';\n specKey: string = 'legends';\n static type = ComponentTypeEnum.continuousLegend;\n type = ComponentTypeEnum.colorLegend;\n name: string = ComponentTypeEnum.colorLegend;\n\n protected declare _theme: IColorLegendTheme; // TODO: 看下是否需要区分\n\n private _field: string | undefined;\n private _legendType: string;\n\n static createComponent(spec: any, options: IComponentOption) {\n const legendSpec = spec.legends;\n if (!legendSpec) {\n return undefined;\n }\n if (!isArray(legendSpec)) {\n if (isContinuousLegend(legendSpec.type)) {\n return new ContinuousLegend(legendSpec, {\n ...options,\n specIndex: 0\n });\n }\n\n return undefined;\n }\n const legends: ILegend[] = [];\n legendSpec.forEach((s: IColorLegendSpec | ISizeLegendSpec, i: number) => {\n if (isContinuousLegend(s.type)) {\n legends.push(new ContinuousLegend(s, { ...options, specIndex: i }));\n }\n });\n return legends;\n }\n\n constructor(spec: T, options: IComponentOption) {\n super(spec, options);\n\n // 这里需要区分下是 colorLegend 还是 sizeLegend\n const legendName = this._spec.type === 'color' ? ComponentTypeEnum.colorLegend : ComponentTypeEnum.sizeLegend;\n this.type = legendName;\n this.name = legendName;\n }\n\n setAttrFromSpec() {\n super.setAttrFromSpec();\n this._field = this._spec.field;\n this._legendType = this._spec.type;\n }\n\n init(option: IModelInitOption): void {\n super.init(option);\n eachSeries(\n this._regions,\n s => {\n s.addViewDataFilter({\n type: 'continuousLegendFilter',\n options: {\n selected: () => this._selectedData,\n field: () => this._field,\n data: () => this._legendData.getLatestData()\n },\n level: TransformLevel.legendFilter\n });\n },\n {\n userId: this._seriesUserId,\n specIndex: this._seriesIndex\n }\n );\n }\n\n private _getScaleInGlobal() {\n const globalScale = this._option.globalScale;\n let scaleKey = this._spec.scale;\n if (!scaleKey) {\n scaleKey = this._legendType;\n }\n return globalScale.getScale(scaleKey);\n }\n\n protected _initLegendData(): DataView {\n registerDataSetInstanceTransform(this._option.dataSet, 'continuousLegendFilter', continuousLegendFilter);\n registerDataSetInstanceTransform(this._option.dataSet, 'continuousLegendDataMake', continuousLegendDataMake);\n const legendData = new DataView(this._option.dataSet, { name: `${this.type}_${this.id}_data` });\n legendData.transform({\n type: 'continuousLegendDataMake',\n options: {\n series: () => {\n return this._regions.reduce((pre, r) => {\n pre.push(...r.getSeries());\n return pre;\n }, [] as ISeries[]);\n },\n field: () => this._field,\n scale: this._getScaleInGlobal.bind(this)\n }\n });\n return legendData;\n }\n\n protected _initSelectedData(): void {\n if (this._spec.defaultSelected) {\n this._selectedData = [...this._spec.defaultSelected];\n } else {\n this._selectedData = this._legendData.getLatestData();\n }\n }\n\n private _addDefaultTitleText(attrs: any) {\n if (attrs.title?.visible && isNil(attrs.title.text) && isNil(attrs.title.style?.text)) {\n const field = this._field;\n if (field) {\n // 默认使用第0个系列的对应别名\n const series = this._regions?.[0]?.getSeries()[0];\n if (!series) {\n return;\n }\n // 如果没有别名继续保持 空字符串\n attrs.title.text = getFieldAlias(series.getRawData(), field);\n return;\n }\n let scaleKey = this._spec.scale;\n if (!scaleKey) {\n scaleKey = this._legendType;\n }\n const scaleSpec = this._option.globalScale.getScaleSpec(scaleKey);\n if (!isDataDomainSpec(scaleSpec?.domain)) {\n return;\n }\n const dataInfo = scaleSpec.domain[0];\n if (dataInfo.fields.length === 0) {\n return;\n }\n // 如果没有别名继续保持 空字符串\n attrs.title.text = getFieldAlias(this._option.dataSet.getDataView(dataInfo.dataId), dataInfo.fields[0]);\n return;\n }\n }\n\n protected _getLegendAttributes(rect: ILayoutRect) {\n const layout = this.layoutOrient === 'bottom' || this.layoutOrient === 'top' ? 'horizontal' : 'vertical';\n const align = layout === 'horizontal' ? 'bottom' : this.layoutOrient;\n\n // 获取关联的 scale 以获取 colors / size\n let visualMappingRange = [];\n const scale = this._getScaleInGlobal();\n if (scale && scale.type === 'linear') {\n visualMappingRange = scale.range();\n }\n if (isEmpty(visualMappingRange)) {\n visualMappingRange = this._legendType === 'color' ? SINGLE_SEQUENCE : SIZE;\n }\n let min = this._legendData.getLatestData()[0] ?? 0;\n let max = this._legendData.getLatestData()[1] ?? 1;\n\n const isSame = this._legendData.getLatestData()[0] === this._legendData.getLatestData()[1];\n if (isSame) {\n min = Math.min(0, this._legendData.getLatestData()[0]);\n max = this._legendData.getLatestData()[0] === 0 ? 1 : Math.max(0, this._legendData.getLatestData()[0]);\n }\n\n const attrs: any = {\n ...getContinuousLegendAttributes(this._spec),\n layout,\n align,\n zIndex: this.layoutZIndex,\n min,\n max,\n value: this._spec.defaultSelected,\n [this._legendType === 'color' ? 'colors' : 'sizeRange']: visualMappingRange\n };\n this._addDefaultTitleText(attrs);\n return attrs;\n }\n\n protected _getLegendConstructor() {\n return ContinuousLegendMap[this._legendType];\n }\n\n protected _initEvent() {\n if (this._legendComponent) {\n const doFilter = this._spec.filter !== false;\n this._legendComponent.addEventListener(\n 'change',\n debounce((e: any) => {\n const selectedData = get(e, 'detail.value');\n if (doFilter) {\n this.setSelectedData(selectedData);\n }\n this.event.emit(ChartEvent.legendFilter, { model: this, value: selectedData, event: e });\n }, 30)\n );\n }\n }\n}\n\nexport const registerContinuousLegend = () => {\n Factory.registerComponent(ContinuousLegend.type, ContinuousLegend);\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/component/legend/continuous/legend.ts"],"names":[],"mappings":"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","file":"legend.js","sourcesContent":["/**\n * @description color legend component\n */\nimport { debounce, isEmpty, isNil, isArray, get } from '@visactor/vutils';\nimport { DataView } from '@visactor/vdataset';\n// eslint-disable-next-line no-duplicate-imports\nimport type { ISeries } from '../../../series/interface';\nimport type { IModelInitOption } from '../../../model/interface';\nimport type { IComponentOption } from '../../interface';\n// eslint-disable-next-line no-duplicate-imports\nimport { ComponentTypeEnum } from '../../interface/type';\n// eslint-disable-next-line no-duplicate-imports\nimport { registerDataSetInstanceTransform } from '../../../data/register';\nimport { eachSeries } from '../../../util/model';\nimport { getFieldAlias } from '../../../util/data';\nimport { isDataDomainSpec } from '../../../util/type';\n// eslint-disable-next-line no-duplicate-imports\nimport type { ILegend } from '../interface';\nimport type { IColorLegendSpec, IColorLegendTheme, ISizeLegendSpec } from './interface';\nimport {\n continuousLegendDataMake,\n continuousLegendFilter\n} from '../../../data/transforms/legend-data/continuous/continuous';\nimport { ContinuousLegendMap, getContinuousLegendAttributes, isContinuousLegend } from './util';\nimport { BaseLegend } from '../base-legend';\nimport { ChartEvent } from '../../../constant';\nimport { Factory } from '../../../core/factory';\nimport { TransformLevel } from '../../../data/initialize';\nimport type { ILayoutRect } from '../../../typings/layout';\n\nconst SINGLE_SEQUENCE = ['#C4E7FF', '#98CAFF', '#75ACFF', '#518FF9', '#2775DC', '#005CBE', '#00429F', '#00287E'];\nconst SIZE = [2, 10];\n\nexport class ContinuousLegend<\n T extends IColorLegendSpec | ISizeLegendSpec = IColorLegendSpec | ISizeLegendSpec\n> extends BaseLegend<T> {\n static specKey = 'legends';\n specKey: string = 'legends';\n static type = ComponentTypeEnum.continuousLegend;\n type = ComponentTypeEnum.colorLegend;\n name: string = ComponentTypeEnum.colorLegend;\n\n protected declare _theme: IColorLegendTheme; // TODO: 看下是否需要区分\n\n private _field: string | undefined;\n private _legendType: string;\n\n static createComponent(spec: any, options: IComponentOption) {\n const legendSpec = spec.legends;\n if (!legendSpec) {\n return undefined;\n }\n if (!isArray(legendSpec)) {\n if (isContinuousLegend(legendSpec.type)) {\n return new ContinuousLegend(legendSpec, {\n ...options,\n type: legendSpec.type === 'color' ? ComponentTypeEnum.colorLegend : ComponentTypeEnum.sizeLegend,\n specIndex: 0\n });\n }\n\n return undefined;\n }\n const legends: ILegend[] = [];\n legendSpec.forEach((s: IColorLegendSpec | ISizeLegendSpec, i: number) => {\n if (isContinuousLegend(s.type)) {\n legends.push(\n new ContinuousLegend(s, {\n ...options,\n specIndex: i,\n type: s.type === 'color' ? ComponentTypeEnum.colorLegend : ComponentTypeEnum.sizeLegend\n })\n );\n }\n });\n return legends;\n }\n\n constructor(spec: T, options: IComponentOption) {\n super(spec, options);\n\n // 这里需要区分下是 colorLegend 还是 sizeLegend\n const legendName = this._spec.type === 'color' ? ComponentTypeEnum.colorLegend : ComponentTypeEnum.sizeLegend;\n this.type = legendName;\n this.name = legendName;\n }\n\n setAttrFromSpec() {\n super.setAttrFromSpec();\n this._field = this._spec.field;\n this._legendType = this._spec.type;\n }\n\n init(option: IModelInitOption): void {\n super.init(option);\n eachSeries(\n this._regions,\n s => {\n s.addViewDataFilter({\n type: 'continuousLegendFilter',\n options: {\n selected: () => this._selectedData,\n field: () => this._field,\n data: () => this._legendData.getLatestData()\n },\n level: TransformLevel.legendFilter\n });\n },\n {\n userId: this._seriesUserId,\n specIndex: this._seriesIndex\n }\n );\n }\n\n private _getScaleInGlobal() {\n const globalScale = this._option.globalScale;\n let scaleKey = this._spec.scale;\n if (!scaleKey) {\n scaleKey = this._legendType;\n }\n return globalScale.getScale(scaleKey);\n }\n\n protected _initLegendData(): DataView {\n registerDataSetInstanceTransform(this._option.dataSet, 'continuousLegendFilter', continuousLegendFilter);\n registerDataSetInstanceTransform(this._option.dataSet, 'continuousLegendDataMake', continuousLegendDataMake);\n const legendData = new DataView(this._option.dataSet, { name: `${this.type}_${this.id}_data` });\n legendData.transform({\n type: 'continuousLegendDataMake',\n options: {\n series: () => {\n return this._regions.reduce((pre, r) => {\n pre.push(...r.getSeries());\n return pre;\n }, [] as ISeries[]);\n },\n field: () => this._field,\n scale: this._getScaleInGlobal.bind(this)\n }\n });\n return legendData;\n }\n\n protected _initSelectedData(): void {\n if (this._spec.defaultSelected) {\n this._selectedData = [...this._spec.defaultSelected];\n } else {\n this._selectedData = this._legendData.getLatestData();\n }\n }\n\n private _addDefaultTitleText(attrs: any) {\n if (attrs.title?.visible && isNil(attrs.title.text) && isNil(attrs.title.style?.text)) {\n const field = this._field;\n if (field) {\n // 默认使用第0个系列的对应别名\n const series = this._regions?.[0]?.getSeries()[0];\n if (!series) {\n return;\n }\n // 如果没有别名继续保持 空字符串\n attrs.title.text = getFieldAlias(series.getRawData(), field);\n return;\n }\n let scaleKey = this._spec.scale;\n if (!scaleKey) {\n scaleKey = this._legendType;\n }\n const scaleSpec = this._option.globalScale.getScaleSpec(scaleKey);\n if (!isDataDomainSpec(scaleSpec?.domain)) {\n return;\n }\n const dataInfo = scaleSpec.domain[0];\n if (dataInfo.fields.length === 0) {\n return;\n }\n // 如果没有别名继续保持 空字符串\n attrs.title.text = getFieldAlias(this._option.dataSet.getDataView(dataInfo.dataId), dataInfo.fields[0]);\n return;\n }\n }\n\n protected _getLegendAttributes(rect: ILayoutRect) {\n const layout = this.layoutOrient === 'bottom' || this.layoutOrient === 'top' ? 'horizontal' : 'vertical';\n const align = layout === 'horizontal' ? 'bottom' : this.layoutOrient;\n\n // 获取关联的 scale 以获取 colors / size\n let visualMappingRange = [];\n const scale = this._getScaleInGlobal();\n if (scale && scale.type === 'linear') {\n visualMappingRange = scale.range();\n }\n if (isEmpty(visualMappingRange)) {\n visualMappingRange = this._legendType === 'color' ? SINGLE_SEQUENCE : SIZE;\n }\n let min = this._legendData.getLatestData()[0] ?? 0;\n let max = this._legendData.getLatestData()[1] ?? 1;\n\n const isSame = this._legendData.getLatestData()[0] === this._legendData.getLatestData()[1];\n if (isSame) {\n min = Math.min(0, this._legendData.getLatestData()[0]);\n max = this._legendData.getLatestData()[0] === 0 ? 1 : Math.max(0, this._legendData.getLatestData()[0]);\n }\n\n const attrs: any = {\n layout,\n align,\n zIndex: this.layoutZIndex,\n min,\n max,\n value: this._spec.defaultSelected,\n [this._legendType === 'color' ? 'colors' : 'sizeRange']: visualMappingRange,\n ...getContinuousLegendAttributes(this._spec)\n };\n this._addDefaultTitleText(attrs);\n return attrs;\n }\n\n protected _getLegendConstructor() {\n return ContinuousLegendMap[this._legendType];\n }\n\n protected _initEvent() {\n if (this._legendComponent) {\n const doFilter = this._spec.filter !== false;\n this._legendComponent.addEventListener(\n 'change',\n debounce((e: any) => {\n const selectedData = get(e, 'detail.value');\n if (doFilter) {\n this.setSelectedData(selectedData);\n }\n this.event.emit(ChartEvent.legendFilter, { model: this, value: selectedData, event: e });\n }, 30)\n );\n }\n }\n}\n\nexport const registerContinuousLegend = () => {\n Factory.registerComponent(ContinuousLegend.type, ContinuousLegend);\n};\n"]}
|