@visactor/vrender-components 1.0.27-alpha.0 → 1.0.27

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/es/axis/line.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { TextAlignType, IGroup, IText, TextBaselineType } from '@visactor/vrender-core';
2
- import { type TagAttributes } from '../tag';
2
+ import type { TagAttributes } from '../tag';
3
3
  import type { LineAxisAttributes, AxisItem } from './type';
4
4
  import { AxisBase } from './base';
5
5
  import { LineAxisMixin } from './mixin/line';
@@ -30,26 +30,6 @@ export declare class LineAxis extends AxisBase<LineAxisAttributes> {
30
30
  fillOpacity: number;
31
31
  };
32
32
  };
33
- labelHoverOnAxis: {
34
- visible: boolean;
35
- space: number;
36
- padding: number;
37
- position: number;
38
- autoRotate: boolean;
39
- textStyle: {
40
- fontSize: number;
41
- fill: string;
42
- fontWeight: string;
43
- fillOpacity: number;
44
- };
45
- background: {
46
- visible: boolean;
47
- style: {
48
- cornerRadius: number;
49
- fill: string;
50
- };
51
- };
52
- };
53
33
  tick: {
54
34
  visible: boolean;
55
35
  inside: boolean;
@@ -81,15 +61,12 @@ export declare class LineAxis extends AxisBase<LineAxisAttributes> {
81
61
  };
82
62
  };
83
63
  };
84
- private _breaks;
85
- private labelHoverOnAxisGroup;
86
64
  constructor(attributes: LineAxisAttributes, options?: ComponentOptions);
65
+ private _breaks;
87
66
  protected _renderInner(container: IGroup): void;
88
- protected renderLabelHoverOnAxis(): void;
89
67
  protected renderLine(container: IGroup): void;
90
68
  protected getTextAlign(vector: number[]): TextAlignType;
91
69
  protected getTitleAttribute(): TagAttributes;
92
- protected getLabelHoverOnAxisAttribute(): TagAttributes;
93
70
  protected getTextBaseline(vector: number[], inside?: boolean): TextBaselineType;
94
71
  protected getLabelAlign(vector: [number, number], inside?: boolean, angle?: number): {
95
72
  textAlign: TextAlignType;
@@ -99,7 +76,5 @@ export declare class LineAxis extends AxisBase<LineAxisAttributes> {
99
76
  protected handleLabelsOverlap(labelShapes: IText[], labelData: AxisItem[], labelContainer: IGroup, layer: number, layerCount: number): void;
100
77
  protected afterLabelsOverlap(labelShapes: IText[], labelData: AxisItem[], labelContainer: IGroup, layer: number, layerCount: number): void;
101
78
  private _getAxisLabelLimitLength;
102
- showLabelHoverOnAxis(position: number, text: string, adjustPosition?: boolean): void;
103
- hideLabelHoverOnAxis(): void;
104
79
  release(): void;
105
80
  }
package/es/axis/line.js CHANGED
@@ -16,8 +16,6 @@ import { Segment } from "../segment";
16
16
 
17
17
  import { angleTo } from "../util/matrix";
18
18
 
19
- import { Tag } from "../tag";
20
-
21
19
  import { AxisBase } from "./base";
22
20
 
23
21
  import { DEFAULT_AXIS_THEME } from "./config";
@@ -46,14 +44,7 @@ loadLineAxisComponent();
46
44
 
47
45
  export class LineAxis extends AxisBase {
48
46
  constructor(attributes, options) {
49
- var _a;
50
- if (attributes.labelHoverOnAxis && (attributes.labelHoverOnAxis.textStyle = Object.assign({}, attributes.label.style, attributes.labelHoverOnAxis.textStyle),
51
- void 0 === attributes.labelHoverOnAxis.space)) {
52
- const {padding: padding = 2} = attributes.labelHoverOnAxis, parsedPadding = normalizePadding(padding), toDiffPadding = "bottom" === attributes.orient ? parsedPadding[0] : "left" === attributes.orient ? parsedPadding[1] : "top" === attributes.orient ? parsedPadding[2] : parsedPadding[3], space = (null !== (_a = attributes.label.space) && void 0 !== _a ? _a : LineAxis.defaultAttributes.label.space) - toDiffPadding;
53
- attributes.labelHoverOnAxis.space = space;
54
- }
55
- super((null == options ? void 0 : options.skipDefault) ? attributes : merge({}, LineAxis.defaultAttributes, attributes), options),
56
- this.labelHoverOnAxisGroup = null;
47
+ super((null == options ? void 0 : options.skipDefault) ? attributes : merge({}, LineAxis.defaultAttributes, attributes), options);
57
48
  }
58
49
  _renderInner(container) {
59
50
  var _a;
@@ -104,13 +95,6 @@ export class LineAxis extends AxisBase {
104
95
  bgRect.states = merge({}, DEFAULT_STATES, null !== (_a = panel.state) && void 0 !== _a ? _a : {}),
105
96
  axisContainer.insertBefore(bgRect, axisContainer.firstChild);
106
97
  }
107
- const {labelHoverOnAxis: labelHoverOnAxis} = this.attribute;
108
- labelHoverOnAxis && labelHoverOnAxis.visible && this.renderLabelHoverOnAxis();
109
- }
110
- renderLabelHoverOnAxis() {
111
- const hoverOnLabelAttributes = this.getLabelHoverOnAxisAttribute(), hoverOnLabel = new Tag(Object.assign({}, hoverOnLabelAttributes));
112
- hoverOnLabel.name = AXIS_ELEMENT_NAME.title, hoverOnLabel.id = this._getNodeId("hover-on-label"),
113
- this.labelHoverOnAxisGroup = hoverOnLabel, this.axisContainer.add(hoverOnLabel);
114
98
  }
115
99
  renderLine(container) {
116
100
  const {start: start, end: end, line: line} = this.attribute, _a = line, {startSymbol: startSymbol, endSymbol: endSymbol, style: style, state: state} = _a, restLineAttrs = __rest(_a, [ "startSymbol", "endSymbol", "style", "state" ]), lineAttrs = Object.assign({
@@ -205,39 +189,6 @@ export class LineAxis extends AxisBase {
205
189
  visible: !0
206
190
  }, background.style)), attrs;
207
191
  }
208
- getLabelHoverOnAxisAttribute() {
209
- var _a, _b;
210
- const {orient: orient} = this.attribute, _c = this.attribute.labelHoverOnAxis, {position: position = 0, space: space = 4, autoRotate: autoRotate = !0, textStyle: textStyle = {}, background: background = {}, formatMethod: formatMethod, text: textContent = "", maxWidth: maxWidth} = _c, restAttrs = __rest(_c, [ "position", "space", "autoRotate", "textStyle", "background", "formatMethod", "text", "maxWidth" ]), point = this.getTickCoord(0);
211
- "bottom" === orient || "top" === orient ? point.x = position : point.y = position;
212
- let tickLength = 0;
213
- (null === (_a = this.attribute.tick) || void 0 === _a ? void 0 : _a.visible) && !1 === this.attribute.tick.inside && (tickLength = this.attribute.tick.length || 4),
214
- (null === (_b = this.attribute.subTick) || void 0 === _b ? void 0 : _b.visible) && !1 === this.attribute.subTick.inside && (tickLength = Math.max(tickLength, this.attribute.subTick.length || 2));
215
- const offset = tickLength + 0 + space, labelPoint = this.getVerticalCoord(point, offset, !1), vector = this.getVerticalVector(offset, !1, {
216
- x: 0,
217
- y: 0
218
- });
219
- let textBaseline, {angle: angle} = restAttrs, textAlign = "center";
220
- if (isNil(angle) && autoRotate) {
221
- const axisVector = this.getRelativeVector();
222
- angle = angleTo(axisVector, [ 1, 0 ], !0);
223
- const {verticalFactor: verticalFactor = 1} = this.attribute;
224
- textBaseline = 1 === -1 * verticalFactor ? "bottom" : "top";
225
- } else {
226
- const {textAlign: textAlign2, textBaseline: textBaseline2} = this.getLabelAlign(vector, !1, textStyle.angle);
227
- textAlign = textAlign2, textBaseline = textBaseline2;
228
- }
229
- const maxTagWidth = maxWidth, text = formatMethod ? formatMethod(textContent) : textContent, attrs = Object.assign(Object.assign(Object.assign({}, labelPoint), restAttrs), {
230
- maxWidth: maxTagWidth,
231
- textStyle: Object.assign({
232
- textAlign: textAlign,
233
- textBaseline: textBaseline
234
- }, textStyle),
235
- text: text
236
- });
237
- return attrs.angle = angle, background && background.visible && (attrs.panel = Object.assign(Object.assign({
238
- visible: !0
239
- }, restAttrs.panel), background.style)), attrs;
240
- }
241
192
  getTextBaseline(vector, inside) {
242
193
  let base = "middle";
243
194
  const {verticalFactor: verticalFactor = 1} = this.attribute, factor = (inside ? 1 : -1) * verticalFactor;
@@ -376,35 +327,10 @@ export class LineAxis extends AxisBase {
376
327
  return limitLength && (limitLength = (limitLength - labelSpace - titleSpacing - titleHeight - axisLineWidth - tickLength) / layerCount),
377
328
  limitLength;
378
329
  }
379
- showLabelHoverOnAxis(position, text, adjustPosition = !0) {
380
- if (this.attribute.labelHoverOnAxis) {
381
- const preContainerBounds = this.axisContainer.AABBBounds, preWidth = preContainerBounds.width(), preHeight = preContainerBounds.height(), preX1 = preContainerBounds.x1, preY1 = preContainerBounds.y1, preX2 = preContainerBounds.x2, preY2 = preContainerBounds.y2;
382
- if (this.labelHoverOnAxisGroup) {
383
- const {formatMethod: formatMethod} = this.attribute.labelHoverOnAxis, textStr = formatMethod ? formatMethod(text) : text;
384
- this.labelHoverOnAxisGroup.setAttribute("text", textStr), this.labelHoverOnAxisGroup.setAttribute("visible", !0),
385
- this.labelHoverOnAxisGroup.setAttribute("visibleAll", !0), "left" === this.attribute.orient || "right" === this.attribute.orient ? this.labelHoverOnAxisGroup.setAttributes({
386
- y: position
387
- }) : this.labelHoverOnAxisGroup.setAttributes({
388
- x: position
389
- });
390
- } else this.attribute.labelHoverOnAxis.visible = !0, this.attribute.labelHoverOnAxis.position = position,
391
- this.attribute.labelHoverOnAxis.text = text, this.renderLabelHoverOnAxis();
392
- if (adjustPosition) {
393
- const afterContainerBounds = this.axisContainer.AABBBounds, diffWidth = afterContainerBounds.width() - preWidth, diffHeight = afterContainerBounds.height() - preHeight;
394
- diffWidth > 0 && ("top" === this.attribute.orient || "bottom" === this.attribute.orient) && (afterContainerBounds.x1 < preX1 ? this.showLabelHoverOnAxis(position + diffWidth, text, !1) : afterContainerBounds.x2 > preX2 && this.showLabelHoverOnAxis(position - diffWidth, text, !1)),
395
- diffHeight > 0 && ("left" === this.attribute.orient || "right" === this.attribute.orient) && (afterContainerBounds.y1 < preY1 ? this.showLabelHoverOnAxis(position + diffHeight, text, !1) : afterContainerBounds.y2 > preY2 && this.showLabelHoverOnAxis(position - diffHeight, text, !1));
396
- }
397
- }
398
- }
399
- hideLabelHoverOnAxis() {
400
- this.attribute.labelHoverOnAxis && this.labelHoverOnAxisGroup && this.labelHoverOnAxisGroup.setAttributes({
401
- visible: !1,
402
- visibleAll: !1
403
- });
404
- }
405
330
  release() {
406
331
  super.release(), this._breaks = null;
407
332
  }
408
333
  }
409
334
 
410
- LineAxis.defaultAttributes = DEFAULT_AXIS_THEME, mixin(LineAxis, LineAxisMixin);
335
+ LineAxis.defaultAttributes = DEFAULT_AXIS_THEME, mixin(LineAxis, LineAxisMixin);
336
+ //# sourceMappingURL=line.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axis/line.ts"],"names":[],"mappings":"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","file":"line.js","sourcesContent":["/**\n * @description 直线型坐标轴\n */\n// eslint-disable-next-line no-duplicate-imports\nimport {\n get,\n isNil,\n merge,\n isNumberClose,\n isEmpty,\n isFunction,\n isValidNumber,\n isValid,\n normalizePadding,\n mixin,\n last as peek\n} from '@visactor/vutils';\nimport { graphicCreator } from '@visactor/vrender-core';\n// eslint-disable-next-line no-duplicate-imports\nimport type {\n TextAlignType,\n IGroup,\n INode,\n IText,\n TextBaselineType,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\nimport type { SegmentAttributes } from '../segment';\n// eslint-disable-next-line no-duplicate-imports\nimport { Segment } from '../segment';\nimport { angleTo } from '../util/matrix';\nimport { Tag, type TagAttributes } from '../tag';\nimport type {\n LineAttributes,\n LineAxisAttributes,\n TitleAttributes,\n AxisItem,\n TransformedAxisBreak,\n LabelHoverOnAxisAttributes\n} from './type';\nimport { AxisBase } from './base';\nimport { DEFAULT_AXIS_THEME } from './config';\nimport { AXIS_ELEMENT_NAME, DEFAULT_STATES, TopZIndex } from './constant';\nimport { measureTextSize } from '../util';\nimport { autoHide as autoHideFunc } from './overlap/auto-hide';\nimport { autoRotate as autoRotateFunc, getXAxisLabelAlign, getYAxisLabelAlign } from './overlap/auto-rotate';\nimport { autoLimit as autoLimitFunc } from './overlap/auto-limit';\nimport { autoWrap as autoWrapFunc } from './overlap/auto-wrap';\n\nimport { alignAxisLabels } from '../util/align';\nimport { LineAxisMixin } from './mixin/line';\nimport type { ComponentOptions } from '../interface';\nimport { loadLineAxisComponent } from './register';\nimport { getAxisBreakSymbolAttrs } from './util';\n\nloadLineAxisComponent();\nexport interface LineAxis\n extends Pick<LineAxisMixin, 'isInValidValue' | 'getTickCoord' | 'getVerticalVector' | 'getRelativeVector'>,\n AxisBase<LineAxisAttributes> {}\n\nexport class LineAxis extends AxisBase<LineAxisAttributes> {\n static defaultAttributes = DEFAULT_AXIS_THEME;\n private _breaks: TransformedAxisBreak[];\n private labelHoverOnAxisGroup: Tag | null = null;\n constructor(attributes: LineAxisAttributes, options?: ComponentOptions) {\n if (attributes.labelHoverOnAxis) {\n attributes.labelHoverOnAxis.textStyle = Object.assign(\n {},\n attributes.label.style,\n attributes.labelHoverOnAxis.textStyle\n );\n if (attributes.labelHoverOnAxis.space === undefined) {\n const { padding = 2 } = attributes.labelHoverOnAxis;\n const parsedPadding = normalizePadding(padding as any);\n const toDiffPadding =\n attributes.orient === 'bottom'\n ? parsedPadding[0]\n : attributes.orient === 'left'\n ? parsedPadding[1]\n : attributes.orient === 'top'\n ? parsedPadding[2]\n : parsedPadding[3];\n const space = (attributes.label.space ?? LineAxis.defaultAttributes.label.space) - toDiffPadding;\n attributes.labelHoverOnAxis.space = space;\n }\n }\n super(options?.skipDefault ? attributes : merge({}, LineAxis.defaultAttributes, attributes), options);\n }\n\n protected _renderInner(container: IGroup) {\n this._breaks = null; // 置空,防止轴更新时缓存了旧值\n if (this.attribute.breaks && this.attribute.breaks.length) {\n const transformedBreaks = [];\n for (let index = 0; index < this.attribute.breaks.length; index++) {\n const aBreak = this.attribute.breaks[index];\n const { range, breakSymbol, rawRange } = aBreak;\n transformedBreaks.push({\n startPoint: this.getTickCoord(range[0]),\n endPoint: this.getTickCoord(range[1]),\n range,\n breakSymbol,\n rawRange\n });\n }\n this._breaks = transformedBreaks;\n }\n super._renderInner(container);\n\n // 渲染 break symbol\n if (this._breaks && this._breaks.length) {\n this._breaks.forEach((b, index) => {\n const { startPoint, endPoint, breakSymbol, rawRange } = b;\n\n if (breakSymbol?.visible !== false) {\n const axisBreakGroup = graphicCreator.group({\n zIndex: TopZIndex // 层级需要高于轴线\n });\n axisBreakGroup.name = AXIS_ELEMENT_NAME.axisBreak;\n axisBreakGroup.id = this._getNodeId(`${AXIS_ELEMENT_NAME.axisBreak}-${index}`);\n axisBreakGroup.data = rawRange;\n const symbolStyle = getAxisBreakSymbolAttrs(breakSymbol);\n const shape1 = graphicCreator.symbol({\n x: startPoint.x,\n y: startPoint.y,\n ...symbolStyle\n });\n shape1.name = AXIS_ELEMENT_NAME.axisBreakSymbol;\n const shape2 = graphicCreator.symbol({\n x: endPoint.x,\n y: endPoint.y,\n ...symbolStyle\n });\n shape2.name = AXIS_ELEMENT_NAME.axisBreakSymbol;\n\n axisBreakGroup.add(shape1);\n axisBreakGroup.add(shape2);\n\n container.add(axisBreakGroup);\n }\n });\n }\n\n const { panel } = this.attribute;\n\n // TODO: 目前是通过包围盒绘制,在一些情况下会有那问题,比如圆弧轴、带了箭头的坐标轴等\n // 坐标轴主体 panel\n if (panel && panel.visible) {\n const axisContainer = this.axisContainer;\n const axisContainerBounds = axisContainer.AABBBounds;\n const bgRect = graphicCreator.rect({\n x: axisContainerBounds.x1,\n y: axisContainerBounds.y1,\n width: axisContainerBounds.width(),\n height: axisContainerBounds.height(),\n ...panel.style\n });\n bgRect.name = AXIS_ELEMENT_NAME.background;\n bgRect.id = this._getNodeId('background');\n\n bgRect.states = merge({}, DEFAULT_STATES, panel.state ?? {});\n axisContainer.insertBefore(bgRect, axisContainer.firstChild);\n }\n const { labelHoverOnAxis } = this.attribute;\n if (labelHoverOnAxis && labelHoverOnAxis.visible) {\n this.renderLabelHoverOnAxis();\n }\n }\n protected renderLabelHoverOnAxis() {\n const hoverOnLabelAttributes = this.getLabelHoverOnAxisAttribute();\n const hoverOnLabel = new Tag({\n ...hoverOnLabelAttributes\n });\n hoverOnLabel.name = AXIS_ELEMENT_NAME.title;\n hoverOnLabel.id = this._getNodeId('hover-on-label');\n this.labelHoverOnAxisGroup = hoverOnLabel;\n // hoverOnLabel.setAttributes({ globalZIndex: 1 });\n this.axisContainer.add(hoverOnLabel as unknown as INode);\n }\n\n protected renderLine(container: IGroup): void {\n const { start, end, line } = this.attribute as LineAxisAttributes;\n const { startSymbol, endSymbol, style, state, ...restLineAttrs } = line as LineAttributes;\n\n const lineAttrs = {\n startSymbol,\n endSymbol,\n lineStyle: style,\n ...restLineAttrs\n } as SegmentAttributes;\n\n if (this._breaks && this._breaks.length) {\n // 配置了轴截断\n const linePoints = [];\n let lastStartPoint = start;\n this._breaks.forEach(b => {\n const { startPoint, endPoint } = b;\n linePoints.push([lastStartPoint, startPoint]);\n lastStartPoint = endPoint;\n });\n linePoints.push([lastStartPoint, end]);\n lineAttrs.points = linePoints;\n lineAttrs.multiSegment = true;\n } else {\n lineAttrs.points = [start, end];\n }\n\n if (!isEmpty(state)) {\n lineAttrs.state = {\n line: merge({}, DEFAULT_STATES, state),\n symbol: merge({}, DEFAULT_STATES, state)\n };\n }\n\n const axisLineGroup = new Segment(lineAttrs);\n axisLineGroup.name = AXIS_ELEMENT_NAME.line;\n axisLineGroup.id = this._getNodeId('line');\n container.add(axisLineGroup as unknown as INode);\n }\n\n protected getTextAlign(vector: number[]): TextAlignType {\n let align: TextAlignType = 'center';\n\n if (isNumberClose(vector[0], 0)) {\n if (isNumberClose(vector[1], 0)) {\n if (Object.is(vector[1], -0)) {\n align = 'start';\n } else if (Object.is(vector[0], -0)) {\n align = 'end';\n }\n } else {\n align = 'center';\n }\n } else if (vector[0] > 0) {\n align = 'start';\n } else if (vector[0] < 0) {\n align = 'end';\n }\n return align;\n }\n\n // TODO: 太 hack 了,需要静心优化\n protected getTitleAttribute() {\n const {\n position = 'middle',\n space = 4,\n textStyle = {},\n autoRotate = true,\n shape,\n background,\n state = {},\n maxWidth,\n ...restAttrs\n } = this.attribute.title as TitleAttributes;\n let percent = 0.5;\n if (position === 'start') {\n percent = 0;\n } else if (position === 'end') {\n percent = 1;\n }\n const { verticalFactor = 1 } = this.attribute;\n const factor = -1 * verticalFactor;\n const point = this.getTickCoord(percent);\n const axisVector = this.getRelativeVector();\n // HACK;\n let labelLength = 0;\n if (this.attribute.label?.visible && this.attribute.label.inside === false) {\n const space = +get(this.attribute, 'label.space', 4);\n labelLength += space;\n const layerCount = Object.keys(this.axisLabelLayerSize).length;\n if (axisVector[1] === 0) {\n const labelBoundsHeight = this.axisLabelsContainer ? this.axisLabelsContainer.AABBBounds.height() : 0;\n if (isFinite(labelBoundsHeight)) {\n labelLength += labelBoundsHeight + (layerCount - 1) * space;\n } else {\n labelLength = 0;\n }\n } else {\n if (axisVector[0] === 0) {\n if (\n this.axisLabelsContainer &&\n this.axisLabelsContainer.AABBBounds &&\n !this.axisLabelsContainer.AABBBounds.empty()\n ) {\n const baseX = this.axisLabelLayerSize[0].labelPos;\n const bounds = this.axisLabelsContainer.AABBBounds;\n\n labelLength +=\n (factor === 1\n ? bounds.x2 > baseX\n ? Math.min(bounds.x2 - baseX, bounds.width())\n : 0\n : bounds.x1 < baseX\n ? Math.min(baseX - bounds.x1, bounds.width())\n : 0) +\n (layerCount - 1) * space;\n } else {\n labelLength = 0;\n }\n } else {\n // 发生了旋转\n Object.keys(this.axisLabelLayerSize).forEach((layer, index) => {\n labelLength += this.axisLabelLayerSize[layer].width + (index > 0 ? space : 0);\n });\n }\n }\n }\n\n // 标题都默认朝外\n let tickLength = 0;\n if (this.attribute.tick?.visible && this.attribute.tick.inside === false) {\n tickLength = this.attribute.tick.length || 4;\n }\n if (this.attribute.subTick?.visible && this.attribute.subTick.inside === false) {\n tickLength = Math.max(tickLength, this.attribute.subTick.length || 2);\n }\n\n const offset = tickLength + labelLength + space;\n const titlePoint = this.getVerticalCoord(point, offset, false); // 标题的点\n const vector = this.getVerticalVector(offset, false, { x: 0, y: 0 });\n\n let { angle } = restAttrs; // 用户设置的是角度\n let textAlign;\n if (position === 'start') {\n textAlign = 'start';\n } else if (position === 'end') {\n textAlign = 'end';\n } else {\n textAlign = 'center';\n }\n let textBaseline;\n if (isNil(angle) && autoRotate) {\n const v1: [number, number] = [1, 0]; // 水平方向的向量\n const radian = angleTo(axisVector, v1, true);\n angle = radian;\n const { verticalFactor = 1 } = this.attribute;\n const factor = -1 * verticalFactor;\n if (factor === 1) {\n textBaseline = 'bottom';\n } else {\n textBaseline = 'top';\n }\n } else {\n // if (isValid(angle)) {\n // angle = degreeToRadian(angle);\n // }\n textAlign = this.getTextAlign(vector as number[]);\n textBaseline = this.getTextBaseline(vector as number[], false);\n }\n\n // 计算标题缩略\n let maxTagWidth = maxWidth;\n if (isNil(maxTagWidth)) {\n const { verticalLimitSize, verticalMinSize, orient } = this.attribute;\n const limitSize = Math.min(verticalLimitSize || Infinity, verticalMinSize || Infinity);\n if (isValidNumber(limitSize)) {\n const isX = orient === 'bottom' || orient === 'top';\n if (isX) {\n if (angle !== Math.PI / 2) {\n const cosValue = Math.abs(Math.cos(angle ?? 0));\n maxTagWidth = cosValue < 1e-6 ? Infinity : this.attribute.end.x / cosValue;\n } else {\n maxTagWidth = limitSize - offset;\n }\n } else {\n if (angle && angle !== 0) {\n const sinValue = Math.abs(Math.sin(angle));\n maxTagWidth = sinValue < 1e-6 ? Infinity : this.attribute.end.y / sinValue;\n } else {\n maxTagWidth = limitSize - offset;\n }\n }\n }\n }\n\n const attrs: TagAttributes = {\n ...titlePoint,\n ...restAttrs,\n maxWidth: maxTagWidth,\n textStyle: {\n // @ts-ignore\n textAlign,\n // @ts-ignore\n textBaseline,\n ...textStyle\n },\n state: {\n text: merge({}, DEFAULT_STATES, state.text),\n shape: merge({}, DEFAULT_STATES, state.shape),\n panel: merge({}, DEFAULT_STATES, state.background)\n }\n };\n attrs.angle = angle;\n\n if (shape && shape.visible) {\n attrs.shape = {\n visible: true,\n ...shape.style\n };\n if (shape.space) {\n attrs.space = shape.space;\n }\n }\n\n if (background && background.visible) {\n attrs.panel = {\n visible: true,\n ...background.style\n };\n }\n\n return attrs;\n }\n\n protected getLabelHoverOnAxisAttribute() {\n const { orient } = this.attribute;\n const {\n position = 0,\n space = 4,\n autoRotate = true,\n textStyle = {},\n background = {},\n formatMethod,\n text: textContent = '' as string,\n maxWidth,\n ...restAttrs\n } = this.attribute.labelHoverOnAxis as LabelHoverOnAxisAttributes;\n const point = this.getTickCoord(0);\n /** 指定的位置position与轴的方位有关系 */\n if (orient === 'bottom' || orient === 'top') {\n point.x = position;\n } else {\n point.y = position;\n }\n\n // HACK;\n\n // 计算悬浮标签的偏移量(距离轴线的距离)\n let tickLength = 0;\n if (this.attribute.tick?.visible && this.attribute.tick.inside === false) {\n tickLength = this.attribute.tick.length || 4;\n }\n if (this.attribute.subTick?.visible && this.attribute.subTick.inside === false) {\n tickLength = Math.max(tickLength, this.attribute.subTick.length || 2);\n }\n const labelLength = 0;\n const offset = tickLength + labelLength + space;\n const labelPoint = this.getVerticalCoord(point, offset, false);\n const vector = this.getVerticalVector(offset, false, { x: 0, y: 0 });\n\n let { angle } = restAttrs; // 用户设置的是角度\n let textAlign = 'center';\n\n let textBaseline;\n if (isNil(angle) && autoRotate) {\n const axisVector = this.getRelativeVector();\n const v1: [number, number] = [1, 0]; // 水平方向的向量\n const radian = angleTo(axisVector, v1, true);\n angle = radian;\n const { verticalFactor = 1 } = this.attribute;\n const factor = -1 * verticalFactor;\n if (factor === 1) {\n textBaseline = 'bottom';\n } else {\n textBaseline = 'top';\n }\n } else {\n const { textAlign: textAlign2, textBaseline: textBaseline2 } = this.getLabelAlign(\n vector,\n false,\n (textStyle as ITextGraphicAttribute).angle\n );\n textAlign = textAlign2;\n textBaseline = textBaseline2;\n // textBaseline = this.getTextBaseline(vector as number[], false);\n }\n\n // 计算悬浮标签的缩略\n const maxTagWidth = maxWidth; // maxWidth;\n // if (isNil(maxTagWidth)) {\n // const { verticalLimitSize, verticalMinSize, orient } = this.attribute;\n // const limitSize = Math.min(verticalLimitSize || Infinity, verticalMinSize || Infinity);\n // if (isValidNumber(limitSize)) {\n // const isX = orient === 'bottom' || orient === 'top';\n // if (isX) {\n // if (angle !== Math.PI / 2) {\n // const cosValue = Math.abs(Math.cos(angle ?? 0));\n // maxTagWidth = cosValue < 1e-6 ? Infinity : this.attribute.end.x / cosValue;\n // } else {\n // maxTagWidth = limitSize - offset;\n // }\n // } else {\n // if (angle && angle !== 0) {\n // const sinValue = Math.abs(Math.sin(angle));\n // maxTagWidth = sinValue < 1e-6 ? Infinity : this.attribute.end.y / sinValue;\n // } else {\n // maxTagWidth = limitSize - offset;\n // }\n // }\n // }\n // }\n const text = formatMethod ? formatMethod(textContent as string) : (textContent as string);\n const attrs: TagAttributes = {\n ...labelPoint,\n ...restAttrs,\n maxWidth: maxTagWidth,\n textStyle: {\n // @ts-ignore\n textAlign,\n // @ts-ignore\n textBaseline,\n\n ...textStyle\n },\n text\n };\n attrs.angle = angle;\n\n if (background && background.visible) {\n attrs.panel = {\n visible: true,\n ...(restAttrs as any).panel,\n ...background.style\n };\n }\n\n return attrs;\n }\n\n protected getTextBaseline(vector: number[], inside?: boolean): TextBaselineType {\n let base: TextBaselineType = 'middle';\n const { verticalFactor = 1 } = this.attribute;\n const factor = (inside ? 1 : -1) * verticalFactor;\n if (isNumberClose(vector[1], 0)) {\n if (isNumberClose(vector[0], 0) && !Object.is(vector[0], -0) && !Object.is(vector[1], -0)) {\n base = factor === 1 ? 'bottom' : 'top';\n } else {\n base = 'middle';\n }\n } else if (vector[1] > 0) {\n base = 'top';\n } else if (vector[1] < 0) {\n base = 'bottom';\n }\n return base;\n }\n\n protected getLabelAlign(\n vector: [number, number],\n inside?: boolean,\n angle?: number\n ): { textAlign: TextAlignType; textBaseline: TextBaselineType } {\n const orient = this.attribute.orient;\n const isCartesian = ['top', 'bottom', 'right', 'left'].includes(orient);\n // 目前的向量方法暂无法返回正确的笛卡尔坐标轴下文本旋转后的问题,所以通过这种方法判断,保证旋转后 textAlign 和 textBaseline 也正确\n if (isCartesian || (vector[0] === 0 && vector[1] === 0)) {\n if (orient === 'top' || orient === 'bottom') {\n return getXAxisLabelAlign(inside ? (orient === 'bottom' ? 'top' : 'bottom') : orient, angle);\n }\n if (orient === 'left' || orient === 'right') {\n return getYAxisLabelAlign(inside ? (orient === 'left' ? 'right' : 'left') : orient, angle);\n }\n }\n\n return {\n textAlign: this.getTextAlign(vector),\n textBaseline: this.getTextBaseline(vector, inside)\n };\n }\n\n protected beforeLabelsOverlap(\n labelShapes: IText[],\n labelData: AxisItem[],\n labelContainer: IGroup,\n layer: number,\n layerCount: number\n ): void {\n const { flush = false } = this.attribute.label || {};\n if (flush && labelShapes.length) {\n // 首尾标签向内偏移\n const { orient, start: axisStart, end: axisEnd } = this.attribute;\n const isX = orient === 'bottom' || orient === 'top';\n const first = labelShapes[0];\n const last = peek(labelShapes);\n const isInverse = isX ? first.attribute.x > last.attribute.x : first.attribute.y < last.attribute.y;\n if (isX) {\n const leftMostLabel = isInverse ? last : first;\n const rightMostLabel = isInverse ? first : last;\n const left = axisStart.x;\n const right = axisEnd.x;\n const leftBound = leftMostLabel.AABBBounds.x1;\n const rightBound = rightMostLabel.AABBBounds.x2;\n\n if (leftBound < left) {\n const angle = leftMostLabel.attribute.angle;\n\n if (angle) {\n leftMostLabel.setAttributes({ dx: (leftMostLabel.attribute.dx ?? 0) + left - leftBound });\n } else {\n leftMostLabel.setAttributes({\n x: left,\n textAlign: 'left'\n });\n }\n }\n\n if (rightBound > right) {\n const angle = rightMostLabel.attribute.angle;\n\n if (angle) {\n rightMostLabel.setAttributes({ dx: (rightMostLabel.attribute.dx ?? 0) + right - rightBound });\n } else {\n rightMostLabel.setAttributes({\n x: right,\n textAlign: 'right'\n });\n }\n }\n } else {\n const bottomMostLabel = isInverse ? last : first;\n const topMostLabel = isInverse ? first : last;\n const bottomBound = bottomMostLabel.AABBBounds.y2;\n const topBound = topMostLabel.AABBBounds.y1;\n const top = axisStart.y;\n const bottom = axisEnd.y;\n\n if (topBound < top) {\n const angle = topMostLabel.attribute.angle;\n\n if (angle) {\n // has rotate\n topMostLabel.setAttributes({\n dy: (topMostLabel.attribute.dy ?? 0) + top - topBound\n });\n } else {\n topMostLabel.setAttributes({\n y: top,\n textBaseline: 'top'\n });\n }\n }\n\n if (bottomBound > bottom) {\n const angle = bottomMostLabel.attribute.angle;\n\n if (angle) {\n bottomMostLabel.setAttributes({\n dy: (bottomMostLabel.attribute.dy ?? 0) + bottom - bottomBound\n });\n } else {\n bottomMostLabel.setAttributes({\n y: bottom,\n textBaseline: 'bottom'\n });\n }\n }\n }\n }\n\n return;\n }\n protected handleLabelsOverlap(\n labelShapes: IText[],\n labelData: AxisItem[],\n labelContainer: IGroup,\n layer: number,\n layerCount: number\n ): void {\n if (isEmpty(labelShapes)) {\n return;\n }\n\n const { verticalLimitSize, label, orient } = this.attribute;\n const limitLength = this._getAxisLabelLimitLength(verticalLimitSize, layerCount);\n\n const {\n layoutFunc,\n autoRotate,\n autoRotateAngle,\n autoLimit,\n limitEllipsis,\n autoHide,\n autoHideMethod,\n autoHideSeparation,\n lastVisible,\n firstVisible,\n autoWrap,\n overflowLimitLength\n } = label;\n\n if (isFunction(layoutFunc)) {\n // 自定义布局\n layoutFunc(labelShapes, labelData, layer, this);\n } else {\n // order: autoRotate Or autoRotate -> autoLimit -> autoHide\n // priority: autoRotate > autoWrap\n if (autoRotate) {\n autoRotateFunc(labelShapes, {\n labelRotateAngle: autoRotateAngle,\n orient\n });\n } else if (autoWrap) {\n const isVertical = orient === 'left' || orient === 'right';\n const axisLength = isVertical\n ? Math.abs(this.attribute.start.y - this.attribute.end.y)\n : Math.abs(this.attribute.start.x - this.attribute.end.x);\n autoWrapFunc(labelShapes, { orient, limitLength, axisLength, ellipsis: limitEllipsis });\n }\n\n // autoWrap has computed width & height limit\n if (!autoWrap && autoLimit && isValidNumber(limitLength) && limitLength > 0) {\n const isVertical = orient === 'left' || orient === 'right';\n const axisLength = isVertical\n ? Math.abs(this.attribute.start.y - this.attribute.end.y)\n : Math.abs(this.attribute.start.x - this.attribute.end.x);\n\n const verticalLimitLength = isVertical\n ? axisLength / labelShapes.length\n : !autoHide && !autoRotate\n ? axisLength / labelShapes.length\n : Infinity;\n\n autoLimitFunc(labelShapes, {\n limitLength,\n verticalLimitLength,\n ellipsis: limitEllipsis,\n orient,\n axisLength,\n overflowLimitLength\n });\n }\n if (autoHide) {\n autoHideFunc(labelShapes, {\n orient,\n method: autoHideMethod,\n separation: autoHideSeparation,\n lastVisible,\n firstVisible\n });\n }\n }\n }\n\n protected afterLabelsOverlap(\n labelShapes: IText[],\n labelData: AxisItem[],\n labelContainer: IGroup,\n layer: number,\n layerCount: number\n ) {\n const { verticalLimitSize, orient } = this.attribute;\n\n // 处理 verticalMinSize,根据 verticalMinSize 调整 labelContainer 的大小\n const isHorizontal = orient === 'bottom' || orient === 'top';\n const axisLabelContainerBounds = labelContainer.AABBBounds;\n let axisLabelContainerSize = isHorizontal ? axisLabelContainerBounds.height() : axisLabelContainerBounds.width();\n const { verticalMinSize } = this.attribute;\n\n if (isValidNumber(verticalMinSize) && (!isValidNumber(verticalLimitSize) || verticalMinSize <= verticalLimitSize)) {\n const minSize = this._getAxisLabelLimitLength(verticalMinSize, layerCount);\n axisLabelContainerSize = Math.max(axisLabelContainerSize, minSize);\n\n let x;\n let y;\n if (orient === 'left') {\n x = axisLabelContainerBounds.x2 - axisLabelContainerSize;\n y = axisLabelContainerBounds.y1;\n } else if (orient === 'right') {\n x = axisLabelContainerBounds.x1;\n y = axisLabelContainerBounds.y1;\n } else if (orient === 'top') {\n x = axisLabelContainerBounds.x1;\n y = axisLabelContainerBounds.y2 - axisLabelContainerSize;\n } else if (orient === 'bottom') {\n x = axisLabelContainerBounds.x1;\n y = axisLabelContainerBounds.y1;\n }\n\n const bgRect = graphicCreator.rect({\n x,\n y,\n width: isHorizontal ? axisLabelContainerBounds.width() : axisLabelContainerSize,\n height: isHorizontal ? axisLabelContainerSize : axisLabelContainerBounds.height(),\n pickable: false\n });\n bgRect.name = AXIS_ELEMENT_NAME.axisLabelBackground;\n bgRect.id = this._getNodeId('axis-label-background');\n labelContainer.insertBefore(bgRect, labelContainer.firstChild);\n }\n\n // 处理 align,进行整体的对齐操作\n if (isValid(this.attribute.label.containerAlign)) {\n let start;\n if (orient === 'left') {\n start = axisLabelContainerBounds.x2 - axisLabelContainerSize;\n } else if (orient === 'right') {\n start = axisLabelContainerBounds.x1;\n } else if (orient === 'top') {\n start = axisLabelContainerBounds.y2 - axisLabelContainerSize;\n } else if (orient === 'bottom') {\n start = axisLabelContainerBounds.y1;\n }\n\n alignAxisLabels(labelShapes, start, axisLabelContainerSize, orient, this.attribute.label.containerAlign);\n }\n }\n\n private _getAxisLabelLimitLength(limitSize: number, layerCount: number): number {\n const { label, title, line, tick } = this.attribute;\n const labelSpace = label.space ?? 4;\n let limitLength = limitSize;\n let titleHeight = 0;\n let titleSpacing = 0;\n const axisLineWidth = line && line.visible ? line.style.lineWidth ?? 1 : 0;\n const tickLength = tick && tick.visible ? tick.length ?? 4 : 0;\n if (title && title.visible && typeof title.text === 'string') {\n titleHeight = measureTextSize(title.text, title.textStyle, this.stage?.getTheme()?.text).height;\n const padding = normalizePadding(title.padding);\n titleSpacing = title.space + padding[0] + padding[2];\n }\n if (limitLength) {\n limitLength = (limitLength - labelSpace - titleSpacing - titleHeight - axisLineWidth - tickLength) / layerCount;\n }\n return limitLength;\n }\n /** 显示交互中的悬浮标签 */\n showLabelHoverOnAxis(position: number, text: string, adjustPosition: boolean = true) {\n if (this.attribute.labelHoverOnAxis) {\n const preContainerBounds = this.axisContainer.AABBBounds;\n const preWidth = preContainerBounds.width();\n const preHeight = preContainerBounds.height();\n const preX1 = preContainerBounds.x1;\n const preY1 = preContainerBounds.y1;\n const preX2 = preContainerBounds.x2;\n const preY2 = preContainerBounds.y2;\n if (this.labelHoverOnAxisGroup) {\n const { formatMethod } = this.attribute.labelHoverOnAxis as LabelHoverOnAxisAttributes;\n const textStr = formatMethod ? formatMethod(text) : text;\n this.labelHoverOnAxisGroup.setAttribute('text', textStr);\n this.labelHoverOnAxisGroup.setAttribute('visible', true);\n this.labelHoverOnAxisGroup.setAttribute('visibleAll', true);\n if (this.attribute.orient === 'left' || this.attribute.orient === 'right') {\n this.labelHoverOnAxisGroup.setAttributes({\n y: position\n });\n } else {\n this.labelHoverOnAxisGroup.setAttributes({\n x: position\n });\n }\n } else {\n this.attribute.labelHoverOnAxis.visible = true;\n this.attribute.labelHoverOnAxis.position = position;\n this.attribute.labelHoverOnAxis.text = text;\n this.renderLabelHoverOnAxis();\n }\n if (adjustPosition) {\n //防止死循环\n const afterContainerBounds = this.axisContainer.AABBBounds;\n const afterWidth = afterContainerBounds.width();\n const afterHeight = afterContainerBounds.height();\n const diffWidth = afterWidth - preWidth;\n const diffHeight = afterHeight - preHeight;\n if (diffWidth > 0 && (this.attribute.orient === 'top' || this.attribute.orient === 'bottom')) {\n if (afterContainerBounds.x1 < preX1) {\n this.showLabelHoverOnAxis(position + diffWidth, text, false);\n } else if (afterContainerBounds.x2 > preX2) {\n this.showLabelHoverOnAxis(position - diffWidth, text, false);\n }\n }\n if (diffHeight > 0 && (this.attribute.orient === 'left' || this.attribute.orient === 'right')) {\n if (afterContainerBounds.y1 < preY1) {\n this.showLabelHoverOnAxis(position + diffHeight, text, false);\n } else if (afterContainerBounds.y2 > preY2) {\n this.showLabelHoverOnAxis(position - diffHeight, text, false);\n }\n }\n }\n }\n }\n /** 隐藏交互中的悬浮标签 */\n hideLabelHoverOnAxis() {\n if (this.attribute.labelHoverOnAxis && this.labelHoverOnAxisGroup) {\n this.labelHoverOnAxisGroup.setAttributes({\n visible: false,\n visibleAll: false\n });\n }\n }\n release(): void {\n super.release();\n this._breaks = null;\n }\n}\n\nmixin(LineAxis, LineAxisMixin);\n"]}
1
+ {"version":3,"sources":["../src/axis/line.ts"],"names":[],"mappings":"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","file":"line.js","sourcesContent":["/**\n * @description 直线型坐标轴\n */\n// eslint-disable-next-line no-duplicate-imports\nimport {\n get,\n isNil,\n merge,\n isNumberClose,\n isEmpty,\n isFunction,\n isValidNumber,\n isValid,\n normalizePadding,\n mixin,\n last as peek\n} from '@visactor/vutils';\nimport { diff, graphicCreator } from '@visactor/vrender-core';\n// eslint-disable-next-line no-duplicate-imports\nimport type { TextAlignType, IGroup, INode, IText, TextBaselineType, IGraphic } from '@visactor/vrender-core';\nimport type { SegmentAttributes } from '../segment';\n// eslint-disable-next-line no-duplicate-imports\nimport { Segment } from '../segment';\nimport { angleTo } from '../util/matrix';\nimport type { TagAttributes } from '../tag';\nimport type { LineAttributes, LineAxisAttributes, TitleAttributes, AxisItem, TransformedAxisBreak } from './type';\nimport { AxisBase } from './base';\nimport { DEFAULT_AXIS_THEME } from './config';\nimport { AXIS_ELEMENT_NAME, DEFAULT_STATES, TopZIndex } from './constant';\nimport { measureTextSize, traverseGroup } from '../util';\nimport { autoHide as autoHideFunc } from './overlap/auto-hide';\nimport { autoRotate as autoRotateFunc, getXAxisLabelAlign, getYAxisLabelAlign } from './overlap/auto-rotate';\nimport { autoLimit as autoLimitFunc } from './overlap/auto-limit';\nimport { autoWrap as autoWrapFunc } from './overlap/auto-wrap';\n\nimport { alignAxisLabels } from '../util/align';\nimport { LineAxisMixin } from './mixin/line';\nimport type { ComponentOptions } from '../interface';\nimport { loadLineAxisComponent } from './register';\nimport { getAxisBreakSymbolAttrs } from './util';\n\nloadLineAxisComponent();\nexport interface LineAxis\n extends Pick<LineAxisMixin, 'isInValidValue' | 'getTickCoord' | 'getVerticalVector' | 'getRelativeVector'>,\n AxisBase<LineAxisAttributes> {}\n\nexport class LineAxis extends AxisBase<LineAxisAttributes> {\n static defaultAttributes = DEFAULT_AXIS_THEME;\n\n constructor(attributes: LineAxisAttributes, options?: ComponentOptions) {\n super(options?.skipDefault ? attributes : merge({}, LineAxis.defaultAttributes, attributes), options);\n }\n\n private _breaks: TransformedAxisBreak[];\n\n protected _renderInner(container: IGroup) {\n this._breaks = null; // 置空,防止轴更新时缓存了旧值\n if (this.attribute.breaks && this.attribute.breaks.length) {\n const transformedBreaks = [];\n for (let index = 0; index < this.attribute.breaks.length; index++) {\n const aBreak = this.attribute.breaks[index];\n const { range, breakSymbol, rawRange } = aBreak;\n transformedBreaks.push({\n startPoint: this.getTickCoord(range[0]),\n endPoint: this.getTickCoord(range[1]),\n range,\n breakSymbol,\n rawRange\n });\n }\n this._breaks = transformedBreaks;\n }\n super._renderInner(container);\n\n // 渲染 break symbol\n if (this._breaks && this._breaks.length) {\n this._breaks.forEach((b, index) => {\n const { startPoint, endPoint, breakSymbol, rawRange } = b;\n\n if (breakSymbol?.visible !== false) {\n const axisBreakGroup = graphicCreator.group({\n zIndex: TopZIndex // 层级需要高于轴线\n });\n axisBreakGroup.name = AXIS_ELEMENT_NAME.axisBreak;\n axisBreakGroup.id = this._getNodeId(`${AXIS_ELEMENT_NAME.axisBreak}-${index}`);\n axisBreakGroup.data = rawRange;\n const symbolStyle = getAxisBreakSymbolAttrs(breakSymbol);\n const shape1 = graphicCreator.symbol({\n x: startPoint.x,\n y: startPoint.y,\n ...symbolStyle\n });\n shape1.name = AXIS_ELEMENT_NAME.axisBreakSymbol;\n const shape2 = graphicCreator.symbol({\n x: endPoint.x,\n y: endPoint.y,\n ...symbolStyle\n });\n shape2.name = AXIS_ELEMENT_NAME.axisBreakSymbol;\n\n axisBreakGroup.add(shape1);\n axisBreakGroup.add(shape2);\n\n container.add(axisBreakGroup);\n }\n });\n }\n\n const { panel } = this.attribute;\n\n // TODO: 目前是通过包围盒绘制,在一些情况下会有那问题,比如圆弧轴、带了箭头的坐标轴等\n // 坐标轴主体 panel\n if (panel && panel.visible) {\n const axisContainer = this.axisContainer;\n const axisContainerBounds = axisContainer.AABBBounds;\n const bgRect = graphicCreator.rect({\n x: axisContainerBounds.x1,\n y: axisContainerBounds.y1,\n width: axisContainerBounds.width(),\n height: axisContainerBounds.height(),\n ...panel.style\n });\n bgRect.name = AXIS_ELEMENT_NAME.background;\n bgRect.id = this._getNodeId('background');\n\n bgRect.states = merge({}, DEFAULT_STATES, panel.state ?? {});\n axisContainer.insertBefore(bgRect, axisContainer.firstChild);\n }\n }\n\n protected renderLine(container: IGroup): void {\n const { start, end, line } = this.attribute as LineAxisAttributes;\n const { startSymbol, endSymbol, style, state, ...restLineAttrs } = line as LineAttributes;\n\n const lineAttrs = {\n startSymbol,\n endSymbol,\n lineStyle: style,\n ...restLineAttrs\n } as SegmentAttributes;\n\n if (this._breaks && this._breaks.length) {\n // 配置了轴截断\n const linePoints = [];\n let lastStartPoint = start;\n this._breaks.forEach(b => {\n const { startPoint, endPoint } = b;\n linePoints.push([lastStartPoint, startPoint]);\n lastStartPoint = endPoint;\n });\n linePoints.push([lastStartPoint, end]);\n lineAttrs.points = linePoints;\n lineAttrs.multiSegment = true;\n } else {\n lineAttrs.points = [start, end];\n }\n\n if (!isEmpty(state)) {\n lineAttrs.state = {\n line: merge({}, DEFAULT_STATES, state),\n symbol: merge({}, DEFAULT_STATES, state)\n };\n }\n\n const axisLineGroup = new Segment(lineAttrs);\n axisLineGroup.name = AXIS_ELEMENT_NAME.line;\n axisLineGroup.id = this._getNodeId('line');\n container.add(axisLineGroup as unknown as INode);\n }\n\n protected getTextAlign(vector: number[]): TextAlignType {\n let align: TextAlignType = 'center';\n\n if (isNumberClose(vector[0], 0)) {\n if (isNumberClose(vector[1], 0)) {\n if (Object.is(vector[1], -0)) {\n align = 'start';\n } else if (Object.is(vector[0], -0)) {\n align = 'end';\n }\n } else {\n align = 'center';\n }\n } else if (vector[0] > 0) {\n align = 'start';\n } else if (vector[0] < 0) {\n align = 'end';\n }\n return align;\n }\n\n // TODO: 太 hack 了,需要静心优化\n protected getTitleAttribute() {\n const {\n position = 'middle',\n space = 4,\n textStyle = {},\n autoRotate = true,\n shape,\n background,\n state = {},\n maxWidth,\n ...restAttrs\n } = this.attribute.title as TitleAttributes;\n let percent = 0.5;\n if (position === 'start') {\n percent = 0;\n } else if (position === 'end') {\n percent = 1;\n }\n const { verticalFactor = 1 } = this.attribute;\n const factor = -1 * verticalFactor;\n const point = this.getTickCoord(percent);\n const axisVector = this.getRelativeVector();\n // HACK;\n let labelLength = 0;\n if (this.attribute.label?.visible && this.attribute.label.inside === false) {\n const space = +get(this.attribute, 'label.space', 4);\n labelLength += space;\n const layerCount = Object.keys(this.axisLabelLayerSize).length;\n if (axisVector[1] === 0) {\n const labelBoundsHeight = this.axisLabelsContainer ? this.axisLabelsContainer.AABBBounds.height() : 0;\n if (isFinite(labelBoundsHeight)) {\n labelLength += labelBoundsHeight + (layerCount - 1) * space;\n } else {\n labelLength = 0;\n }\n } else {\n if (axisVector[0] === 0) {\n if (\n this.axisLabelsContainer &&\n this.axisLabelsContainer.AABBBounds &&\n !this.axisLabelsContainer.AABBBounds.empty()\n ) {\n const baseX = this.axisLabelLayerSize[0].labelPos;\n const bounds = this.axisLabelsContainer.AABBBounds;\n\n labelLength +=\n (factor === 1\n ? bounds.x2 > baseX\n ? Math.min(bounds.x2 - baseX, bounds.width())\n : 0\n : bounds.x1 < baseX\n ? Math.min(baseX - bounds.x1, bounds.width())\n : 0) +\n (layerCount - 1) * space;\n } else {\n labelLength = 0;\n }\n } else {\n // 发生了旋转\n Object.keys(this.axisLabelLayerSize).forEach((layer, index) => {\n labelLength += this.axisLabelLayerSize[layer].width + (index > 0 ? space : 0);\n });\n }\n }\n }\n\n // 标题都默认朝外\n let tickLength = 0;\n if (this.attribute.tick?.visible && this.attribute.tick.inside === false) {\n tickLength = this.attribute.tick.length || 4;\n }\n if (this.attribute.subTick?.visible && this.attribute.subTick.inside === false) {\n tickLength = Math.max(tickLength, this.attribute.subTick.length || 2);\n }\n\n const offset = tickLength + labelLength + space;\n const titlePoint = this.getVerticalCoord(point, offset, false); // 标题的点\n const vector = this.getVerticalVector(offset, false, { x: 0, y: 0 });\n\n let { angle } = restAttrs; // 用户设置的是角度\n let textAlign;\n if (position === 'start') {\n textAlign = 'start';\n } else if (position === 'end') {\n textAlign = 'end';\n } else {\n textAlign = 'center';\n }\n let textBaseline;\n if (isNil(angle) && autoRotate) {\n const v1: [number, number] = [1, 0]; // 水平方向的向量\n const radian = angleTo(axisVector, v1, true);\n angle = radian;\n const { verticalFactor = 1 } = this.attribute;\n const factor = -1 * verticalFactor;\n if (factor === 1) {\n textBaseline = 'bottom';\n } else {\n textBaseline = 'top';\n }\n } else {\n // if (isValid(angle)) {\n // angle = degreeToRadian(angle);\n // }\n textAlign = this.getTextAlign(vector as number[]);\n textBaseline = this.getTextBaseline(vector as number[], false);\n }\n\n // 计算标题缩略\n let maxTagWidth = maxWidth;\n if (isNil(maxTagWidth)) {\n const { verticalLimitSize, verticalMinSize, orient } = this.attribute;\n const limitSize = Math.min(verticalLimitSize || Infinity, verticalMinSize || Infinity);\n if (isValidNumber(limitSize)) {\n const isX = orient === 'bottom' || orient === 'top';\n if (isX) {\n if (angle !== Math.PI / 2) {\n const cosValue = Math.abs(Math.cos(angle ?? 0));\n maxTagWidth = cosValue < 1e-6 ? Infinity : this.attribute.end.x / cosValue;\n } else {\n maxTagWidth = limitSize - offset;\n }\n } else {\n if (angle && angle !== 0) {\n const sinValue = Math.abs(Math.sin(angle));\n maxTagWidth = sinValue < 1e-6 ? Infinity : this.attribute.end.y / sinValue;\n } else {\n maxTagWidth = limitSize - offset;\n }\n }\n }\n }\n\n const attrs: TagAttributes = {\n ...titlePoint,\n ...restAttrs,\n maxWidth: maxTagWidth,\n textStyle: {\n // @ts-ignore\n textAlign,\n // @ts-ignore\n textBaseline,\n ...textStyle\n },\n state: {\n text: merge({}, DEFAULT_STATES, state.text),\n shape: merge({}, DEFAULT_STATES, state.shape),\n panel: merge({}, DEFAULT_STATES, state.background)\n }\n };\n attrs.angle = angle;\n\n if (shape && shape.visible) {\n attrs.shape = {\n visible: true,\n ...shape.style\n };\n if (shape.space) {\n attrs.space = shape.space;\n }\n }\n\n if (background && background.visible) {\n attrs.panel = {\n visible: true,\n ...background.style\n };\n }\n\n return attrs;\n }\n\n protected getTextBaseline(vector: number[], inside?: boolean): TextBaselineType {\n let base: TextBaselineType = 'middle';\n const { verticalFactor = 1 } = this.attribute;\n const factor = (inside ? 1 : -1) * verticalFactor;\n if (isNumberClose(vector[1], 0)) {\n if (isNumberClose(vector[0], 0) && !Object.is(vector[0], -0) && !Object.is(vector[1], -0)) {\n base = factor === 1 ? 'bottom' : 'top';\n } else {\n base = 'middle';\n }\n } else if (vector[1] > 0) {\n base = 'top';\n } else if (vector[1] < 0) {\n base = 'bottom';\n }\n return base;\n }\n\n protected getLabelAlign(\n vector: [number, number],\n inside?: boolean,\n angle?: number\n ): { textAlign: TextAlignType; textBaseline: TextBaselineType } {\n const orient = this.attribute.orient;\n const isCartesian = ['top', 'bottom', 'right', 'left'].includes(orient);\n // 目前的向量方法暂无法返回正确的笛卡尔坐标轴下文本旋转后的问题,所以通过这种方法判断,保证旋转后 textAlign 和 textBaseline 也正确\n if (isCartesian || (vector[0] === 0 && vector[1] === 0)) {\n if (orient === 'top' || orient === 'bottom') {\n return getXAxisLabelAlign(inside ? (orient === 'bottom' ? 'top' : 'bottom') : orient, angle);\n }\n if (orient === 'left' || orient === 'right') {\n return getYAxisLabelAlign(inside ? (orient === 'left' ? 'right' : 'left') : orient, angle);\n }\n }\n\n return {\n textAlign: this.getTextAlign(vector),\n textBaseline: this.getTextBaseline(vector, inside)\n };\n }\n\n protected beforeLabelsOverlap(\n labelShapes: IText[],\n labelData: AxisItem[],\n labelContainer: IGroup,\n layer: number,\n layerCount: number\n ): void {\n const { flush = false } = this.attribute.label || {};\n if (flush && labelShapes.length) {\n // 首尾标签向内偏移\n const { orient, start: axisStart, end: axisEnd } = this.attribute;\n const isX = orient === 'bottom' || orient === 'top';\n const first = labelShapes[0];\n const last = peek(labelShapes);\n const isInverse = isX ? first.attribute.x > last.attribute.x : first.attribute.y < last.attribute.y;\n if (isX) {\n const leftMostLabel = isInverse ? last : first;\n const rightMostLabel = isInverse ? first : last;\n const left = axisStart.x;\n const right = axisEnd.x;\n const leftBound = leftMostLabel.AABBBounds.x1;\n const rightBound = rightMostLabel.AABBBounds.x2;\n\n if (leftBound < left) {\n const angle = leftMostLabel.attribute.angle;\n\n if (angle) {\n leftMostLabel.setAttributes({ dx: (leftMostLabel.attribute.dx ?? 0) + left - leftBound });\n } else {\n leftMostLabel.setAttributes({\n x: left,\n textAlign: 'left'\n });\n }\n }\n\n if (rightBound > right) {\n const angle = rightMostLabel.attribute.angle;\n\n if (angle) {\n rightMostLabel.setAttributes({ dx: (rightMostLabel.attribute.dx ?? 0) + right - rightBound });\n } else {\n rightMostLabel.setAttributes({\n x: right,\n textAlign: 'right'\n });\n }\n }\n } else {\n const bottomMostLabel = isInverse ? last : first;\n const topMostLabel = isInverse ? first : last;\n const bottomBound = bottomMostLabel.AABBBounds.y2;\n const topBound = topMostLabel.AABBBounds.y1;\n const top = axisStart.y;\n const bottom = axisEnd.y;\n\n if (topBound < top) {\n const angle = topMostLabel.attribute.angle;\n\n if (angle) {\n // has rotate\n topMostLabel.setAttributes({\n dy: (topMostLabel.attribute.dy ?? 0) + top - topBound\n });\n } else {\n topMostLabel.setAttributes({\n y: top,\n textBaseline: 'top'\n });\n }\n }\n\n if (bottomBound > bottom) {\n const angle = bottomMostLabel.attribute.angle;\n\n if (angle) {\n bottomMostLabel.setAttributes({\n dy: (bottomMostLabel.attribute.dy ?? 0) + bottom - bottomBound\n });\n } else {\n bottomMostLabel.setAttributes({\n y: bottom,\n textBaseline: 'bottom'\n });\n }\n }\n }\n }\n\n return;\n }\n protected handleLabelsOverlap(\n labelShapes: IText[],\n labelData: AxisItem[],\n labelContainer: IGroup,\n layer: number,\n layerCount: number\n ): void {\n if (isEmpty(labelShapes)) {\n return;\n }\n\n const { verticalLimitSize, label, orient } = this.attribute;\n const limitLength = this._getAxisLabelLimitLength(verticalLimitSize, layerCount);\n\n const {\n layoutFunc,\n autoRotate,\n autoRotateAngle,\n autoLimit,\n limitEllipsis,\n autoHide,\n autoHideMethod,\n autoHideSeparation,\n lastVisible,\n firstVisible,\n autoWrap,\n overflowLimitLength\n } = label;\n\n if (isFunction(layoutFunc)) {\n // 自定义布局\n layoutFunc(labelShapes, labelData, layer, this);\n } else {\n // order: autoRotate Or autoRotate -> autoLimit -> autoHide\n // priority: autoRotate > autoWrap\n if (autoRotate) {\n autoRotateFunc(labelShapes, {\n labelRotateAngle: autoRotateAngle,\n orient\n });\n } else if (autoWrap) {\n const isVertical = orient === 'left' || orient === 'right';\n const axisLength = isVertical\n ? Math.abs(this.attribute.start.y - this.attribute.end.y)\n : Math.abs(this.attribute.start.x - this.attribute.end.x);\n autoWrapFunc(labelShapes, { orient, limitLength, axisLength, ellipsis: limitEllipsis });\n }\n\n // autoWrap has computed width & height limit\n if (!autoWrap && autoLimit && isValidNumber(limitLength) && limitLength > 0) {\n const isVertical = orient === 'left' || orient === 'right';\n const axisLength = isVertical\n ? Math.abs(this.attribute.start.y - this.attribute.end.y)\n : Math.abs(this.attribute.start.x - this.attribute.end.x);\n\n const verticalLimitLength = isVertical\n ? axisLength / labelShapes.length\n : !autoHide && !autoRotate\n ? axisLength / labelShapes.length\n : Infinity;\n\n autoLimitFunc(labelShapes, {\n limitLength,\n verticalLimitLength,\n ellipsis: limitEllipsis,\n orient,\n axisLength,\n overflowLimitLength\n });\n }\n if (autoHide) {\n autoHideFunc(labelShapes, {\n orient,\n method: autoHideMethod,\n separation: autoHideSeparation,\n lastVisible,\n firstVisible\n });\n }\n }\n }\n\n protected afterLabelsOverlap(\n labelShapes: IText[],\n labelData: AxisItem[],\n labelContainer: IGroup,\n layer: number,\n layerCount: number\n ) {\n const { verticalLimitSize, orient } = this.attribute;\n\n // 处理 verticalMinSize,根据 verticalMinSize 调整 labelContainer 的大小\n const isHorizontal = orient === 'bottom' || orient === 'top';\n const axisLabelContainerBounds = labelContainer.AABBBounds;\n let axisLabelContainerSize = isHorizontal ? axisLabelContainerBounds.height() : axisLabelContainerBounds.width();\n const { verticalMinSize } = this.attribute;\n\n if (isValidNumber(verticalMinSize) && (!isValidNumber(verticalLimitSize) || verticalMinSize <= verticalLimitSize)) {\n const minSize = this._getAxisLabelLimitLength(verticalMinSize, layerCount);\n axisLabelContainerSize = Math.max(axisLabelContainerSize, minSize);\n\n let x;\n let y;\n if (orient === 'left') {\n x = axisLabelContainerBounds.x2 - axisLabelContainerSize;\n y = axisLabelContainerBounds.y1;\n } else if (orient === 'right') {\n x = axisLabelContainerBounds.x1;\n y = axisLabelContainerBounds.y1;\n } else if (orient === 'top') {\n x = axisLabelContainerBounds.x1;\n y = axisLabelContainerBounds.y2 - axisLabelContainerSize;\n } else if (orient === 'bottom') {\n x = axisLabelContainerBounds.x1;\n y = axisLabelContainerBounds.y1;\n }\n\n const bgRect = graphicCreator.rect({\n x,\n y,\n width: isHorizontal ? axisLabelContainerBounds.width() : axisLabelContainerSize,\n height: isHorizontal ? axisLabelContainerSize : axisLabelContainerBounds.height(),\n pickable: false\n });\n bgRect.name = AXIS_ELEMENT_NAME.axisLabelBackground;\n bgRect.id = this._getNodeId('axis-label-background');\n labelContainer.insertBefore(bgRect, labelContainer.firstChild);\n }\n\n // 处理 align,进行整体的对齐操作\n if (isValid(this.attribute.label.containerAlign)) {\n let start;\n if (orient === 'left') {\n start = axisLabelContainerBounds.x2 - axisLabelContainerSize;\n } else if (orient === 'right') {\n start = axisLabelContainerBounds.x1;\n } else if (orient === 'top') {\n start = axisLabelContainerBounds.y2 - axisLabelContainerSize;\n } else if (orient === 'bottom') {\n start = axisLabelContainerBounds.y1;\n }\n\n alignAxisLabels(labelShapes, start, axisLabelContainerSize, orient, this.attribute.label.containerAlign);\n }\n }\n\n private _getAxisLabelLimitLength(limitSize: number, layerCount: number): number {\n const { label, title, line, tick } = this.attribute;\n const labelSpace = label.space ?? 4;\n let limitLength = limitSize;\n let titleHeight = 0;\n let titleSpacing = 0;\n const axisLineWidth = line && line.visible ? (line.style.lineWidth ?? 1) : 0;\n const tickLength = tick && tick.visible ? (tick.length ?? 4) : 0;\n if (title && title.visible && typeof title.text === 'string') {\n titleHeight = measureTextSize(title.text, title.textStyle, this.stage?.getTheme()?.text).height;\n const padding = normalizePadding(title.padding);\n titleSpacing = title.space + padding[0] + padding[2];\n }\n if (limitLength) {\n limitLength = (limitLength - labelSpace - titleSpacing - titleHeight - axisLineWidth - tickLength) / layerCount;\n }\n return limitLength;\n }\n\n release(): void {\n super.release();\n this._breaks = null;\n }\n}\n\nmixin(LineAxis, LineAxisMixin);\n"]}
@@ -30,7 +30,7 @@ export const getPolarAngleLabelBounds = (scale, domain, op) => {
30
30
 
31
31
  export const polarAngleAxisDiscreteTicks = (scale, op) => {
32
32
  const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, getRadius: getRadius, labelOffset: labelOffset, labelGap: labelGap = 0, labelStyle: labelStyle} = op, radius = null == getRadius ? void 0 : getRadius();
33
- if (!radius) return convertDomainToTickData(scale.domain());
33
+ if (!radius || radius <= 0) return convertDomainToTickData(scale.domain());
34
34
  let scaleTicks;
35
35
  if (isValid(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if (isValid(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if (isValid(tickCount)) {
36
36
  const range = scale.range(), rangeSize = Math.abs(range[range.length - 1] - range[0]), count = isFunction(tickCount) ? tickCount({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axis/tick-data/discrete/polar-angle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9F,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAiB,EAAE,MAAa,EAAE,EAAqB,EAAgB,EAAE;;IAChH,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,EAAI,CAAC;IAC7B,MAAM,UAAU,GAAG,MAAA,UAAU,CAAC,KAAK,mCAAI,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAGxD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAGlD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,UAAU,CAAC,SAAS;YAC3B,QAAQ,EAAE,UAAU,CAAC,YAAY;SAClC,CAAC;QAEF,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAExF,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACjB,IAAI,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;gBAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;oBACpB,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE;wBAChB,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;qBACzB;yBAAM;wBACL,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;qBAC5B;iBACF;aACF;iBAAM,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE;gBACvB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;aACvB;iBAAM,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE;gBACvB,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;aACxB;SACF;QAED,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACnG,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAG3G,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;aAC5B,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,GAAG,UAAU,CAAC;aACxD,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAWF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,KAAgB,EAAE,EAAqB,EAAe,EAAE;IAClG,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACrG,MAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,EAAI,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;KAChD;IAED,IAAI,UAAU,CAAC;IACf,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;QACrB,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;KACxC;SAAM,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE;QAClC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;KAC/C;SAAM,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC;YACjC,CAAC,CAAE,SAAqD,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;YAC/F,CAAC,CAAC,SAAS,CAAC;QACd,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACjC;SAAM,IAAI,EAAE,CAAC,QAAQ,EAAE;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAE5B,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;QAC5E,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QACjD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAChC,MAAM,EACN,eAAe,EACf,QAAQ,EACR,IAAI,CAAC,KAAK,CACR,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;YACxC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,aAAa,CACrC,CACF,CAAC;QAEF,UAAU,GAAI,KAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;KAChE;SAAM;QACL,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;KAC7B;IAED,OAAO,uBAAuB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC,CAAC;AAGF,MAAM,OAAO,GAAG,CAAC,MAAa,EAAE,eAA6B,EAAE,QAAgB,EAAE,WAAmB,EAAE,EAAE;IACtG,IAAI,IAAI,GAAG,WAAW,CAAC;IAEvB,GAAG;QACD,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,EAAE,CAAC;QACP,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,GAAG;YACD,IAAI,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE;gBAC3G,OAAO,GAAG,KAAK,CAAC;aACjB;YACD,GAAG,IAAI,IAAI,CAAC;SACb,QAAQ,OAAO,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE;QACzC,IAAI,OAAO,EAAE;YACX,MAAM;SACP;KACF,QAAQ,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE;IAEhC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACrB,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACjD,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE;YACxB,GAAG,IAAI,IAAI,CAAC;SACb;QAED,OAAO,GAAG,GAAG,CAAC,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE;YACxE,QAAQ,EAAE,CAAC;YACX,GAAG,IAAI,IAAI,CAAC;SACb;KACF;IAED,OAAO;QACL,IAAI;QACJ,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC","file":"polar-angle.js","sourcesContent":["import type { BandScale, IBaseScale } from '@visactor/vscale';\nimport { isFunction, isValid, maxInArray, minInArray, isNumberClose } from '@visactor/vutils';\nimport type { IPolarTickDataOpt, ITickCallbackOption, ITickData } from '../../type';\nimport { MIN_TICK_GAP, convertDomainToTickData, labelOverlap } from '../util';\nimport { AABBBounds } from '@visactor/vutils';\nimport { initTextMeasure } from '../../../util/text';\nimport { getPolarAngleLabelPosition } from '../../util';\n\nexport const getPolarAngleLabelBounds = (scale: IBaseScale, domain: any[], op: IPolarTickDataOpt): AABBBounds[] => {\n const { labelStyle, getRadius, labelOffset, labelFormatter, inside } = op;\n const radius = getRadius?.();\n const labelAngle = labelStyle.angle ?? 0;\n\n const textMeasure = initTextMeasure(labelStyle);\n const labelBoundsList = domain.map((v: any) => {\n const str = labelFormatter ? labelFormatter(v) : `${v}`;\n\n // 估算文本宽高\n const { width, height } = textMeasure.quickMeasure(str);\n const textWidth = Math.max(width, MIN_TICK_GAP);\n const textHeight = Math.max(height, MIN_TICK_GAP);\n\n // 估算文本位置\n const angle = scale.scale(v);\n const center = { x: 0, y: 0 };\n let textX = 0;\n let textY = 0;\n const orient = {\n align: labelStyle.textAlign,\n baseline: labelStyle.textBaseline\n };\n\n const { x, y } = getPolarAngleLabelPosition(angle, center, radius, labelOffset, inside);\n\n if (!orient.align) {\n if (isNumberClose(x, center.x)) {\n if (!orient.baseline) {\n if (y > center.y) {\n orient.baseline = 'top';\n } else {\n orient.baseline = 'bottom';\n }\n }\n } else if (x > center.x) {\n orient.align = 'left';\n } else if (x < center.x) {\n orient.align = 'right';\n }\n }\n\n textX = x + (orient.align === 'right' ? -textWidth : orient.align === 'left' ? 0 : -textWidth / 2);\n textY = y + (orient.baseline === 'bottom' ? -textHeight : orient.baseline === 'top' ? 0 : -textHeight / 2);\n\n // 计算 label 包围盒\n const bounds = new AABBBounds()\n .set(textX, textY, textX + textWidth, textY + textHeight)\n .rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);\n return bounds;\n });\n\n return labelBoundsList;\n};\n/**\n * 对于离散轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出BandScale的ticks()、forceTicks()、stepTicks()结果;\n * - 估算所有轴label的宽高并存为数组labelBoundsList;\n * - 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡(此处用到labelBoundsList和scale.range());\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const polarAngleAxisDiscreteTicks = (scale: BandScale, op: IPolarTickDataOpt): ITickData[] => {\n const { tickCount, forceTickCount, tickStep, getRadius, labelOffset, labelGap = 0, labelStyle } = op;\n const radius = getRadius?.();\n if (!radius) {\n return convertDomainToTickData(scale.domain());\n }\n\n let scaleTicks;\n if (isValid(tickStep)) {\n scaleTicks = scale.stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = scale.forceTicks(forceTickCount);\n } else if (isValid(tickCount)) {\n const range = scale.range();\n const rangeSize = Math.abs(range[range.length - 1] - range[0]);\n const count = isFunction(tickCount)\n ? (tickCount as (option: ITickCallbackOption) => number)({ axisLength: rangeSize, labelStyle })\n : tickCount;\n scaleTicks = scale.ticks(count);\n } else if (op.sampling) {\n const domain = scale.domain();\n const range = scale.range();\n\n const labelBoundsList = getPolarAngleLabelBounds(scale, domain, op);\n\n const rangeStart = minInArray(range);\n const rangeEnd = maxInArray(range);\n\n const axisLength = Math.abs(rangeEnd - rangeStart) * (radius + labelOffset);\n const incrementUnit = axisLength / domain.length;\n const { step, delCount } = getStep(\n domain,\n labelBoundsList,\n labelGap,\n Math.floor(\n labelBoundsList.reduce((min, curBounds) => {\n return Math.min(min, curBounds.width(), curBounds.height());\n }, Number.MAX_VALUE) / incrementUnit\n ) // 给step赋上合适的初值,有效改善外层循环次数\n );\n\n scaleTicks = (scale as BandScale).stepTicks(step);\n scaleTicks = scaleTicks.slice(0, scaleTicks.length - delCount);\n } else {\n scaleTicks = scale.domain();\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\n/** 计算合适的step */\nconst getStep = (domain: any[], labelBoundsList: AABBBounds[], labelGap: number, defaultStep: number) => {\n let step = defaultStep;\n // 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡\n do {\n let success = true;\n step++;\n let ptr = 0;\n do {\n if (ptr + step < domain.length && labelOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap)) {\n success = false;\n }\n ptr += step;\n } while (success && ptr < domain.length);\n if (success) {\n break;\n }\n } while (step <= domain.length);\n\n let delCount = 0;\n if (domain.length > 2) {\n let ptr = domain.length - (domain.length % step);\n if (ptr >= domain.length) {\n ptr -= step;\n }\n // 判断首尾是否互相覆盖\n while (ptr > 0 && labelOverlap(labelBoundsList[0], labelBoundsList[ptr])) {\n delCount++;\n ptr -= step;\n }\n }\n\n return {\n step,\n delCount\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/axis/tick-data/discrete/polar-angle.ts"],"names":[],"mappings":"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","file":"polar-angle.js","sourcesContent":["import type { BandScale, IBaseScale } from '@visactor/vscale';\nimport { isFunction, isValid, maxInArray, minInArray, isNumberClose } from '@visactor/vutils';\nimport type { IPolarTickDataOpt, ITickCallbackOption, ITickData } from '../../type';\nimport { MIN_TICK_GAP, convertDomainToTickData, labelOverlap } from '../util';\nimport { AABBBounds } from '@visactor/vutils';\nimport { initTextMeasure } from '../../../util/text';\nimport { getPolarAngleLabelPosition } from '../../util';\n\nexport const getPolarAngleLabelBounds = (scale: IBaseScale, domain: any[], op: IPolarTickDataOpt): AABBBounds[] => {\n const { labelStyle, getRadius, labelOffset, labelFormatter, inside } = op;\n const radius = getRadius?.();\n const labelAngle = labelStyle.angle ?? 0;\n\n const textMeasure = initTextMeasure(labelStyle);\n const labelBoundsList = domain.map((v: any) => {\n const str = labelFormatter ? labelFormatter(v) : `${v}`;\n\n // 估算文本宽高\n const { width, height } = textMeasure.quickMeasure(str);\n const textWidth = Math.max(width, MIN_TICK_GAP);\n const textHeight = Math.max(height, MIN_TICK_GAP);\n\n // 估算文本位置\n const angle = scale.scale(v);\n const center = { x: 0, y: 0 };\n let textX = 0;\n let textY = 0;\n const orient = {\n align: labelStyle.textAlign,\n baseline: labelStyle.textBaseline\n };\n\n const { x, y } = getPolarAngleLabelPosition(angle, center, radius, labelOffset, inside);\n\n if (!orient.align) {\n if (isNumberClose(x, center.x)) {\n if (!orient.baseline) {\n if (y > center.y) {\n orient.baseline = 'top';\n } else {\n orient.baseline = 'bottom';\n }\n }\n } else if (x > center.x) {\n orient.align = 'left';\n } else if (x < center.x) {\n orient.align = 'right';\n }\n }\n\n textX = x + (orient.align === 'right' ? -textWidth : orient.align === 'left' ? 0 : -textWidth / 2);\n textY = y + (orient.baseline === 'bottom' ? -textHeight : orient.baseline === 'top' ? 0 : -textHeight / 2);\n\n // 计算 label 包围盒\n const bounds = new AABBBounds()\n .set(textX, textY, textX + textWidth, textY + textHeight)\n .rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);\n return bounds;\n });\n\n return labelBoundsList;\n};\n/**\n * 对于离散轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出BandScale的ticks()、forceTicks()、stepTicks()结果;\n * - 估算所有轴label的宽高并存为数组labelBoundsList;\n * - 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡(此处用到labelBoundsList和scale.range());\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const polarAngleAxisDiscreteTicks = (scale: BandScale, op: IPolarTickDataOpt): ITickData[] => {\n const { tickCount, forceTickCount, tickStep, getRadius, labelOffset, labelGap = 0, labelStyle } = op;\n const radius = getRadius?.();\n if (!radius || radius <= 0) {\n return convertDomainToTickData(scale.domain());\n }\n\n let scaleTicks;\n if (isValid(tickStep)) {\n scaleTicks = scale.stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = scale.forceTicks(forceTickCount);\n } else if (isValid(tickCount)) {\n const range = scale.range();\n const rangeSize = Math.abs(range[range.length - 1] - range[0]);\n const count = isFunction(tickCount)\n ? (tickCount as (option: ITickCallbackOption) => number)({ axisLength: rangeSize, labelStyle })\n : tickCount;\n scaleTicks = scale.ticks(count);\n } else if (op.sampling) {\n const domain = scale.domain();\n const range = scale.range();\n\n const labelBoundsList = getPolarAngleLabelBounds(scale, domain, op);\n\n const rangeStart = minInArray(range);\n const rangeEnd = maxInArray(range);\n\n const axisLength = Math.abs(rangeEnd - rangeStart) * (radius + labelOffset);\n const incrementUnit = axisLength / domain.length;\n const { step, delCount } = getStep(\n domain,\n labelBoundsList,\n labelGap,\n Math.floor(\n labelBoundsList.reduce((min, curBounds) => {\n return Math.min(min, curBounds.width(), curBounds.height());\n }, Number.MAX_VALUE) / incrementUnit\n ) // 给step赋上合适的初值,有效改善外层循环次数\n );\n\n scaleTicks = (scale as BandScale).stepTicks(step);\n scaleTicks = scaleTicks.slice(0, scaleTicks.length - delCount);\n } else {\n scaleTicks = scale.domain();\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\n/** 计算合适的step */\nconst getStep = (domain: any[], labelBoundsList: AABBBounds[], labelGap: number, defaultStep: number) => {\n let step = defaultStep;\n // 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡\n do {\n let success = true;\n step++;\n let ptr = 0;\n do {\n if (ptr + step < domain.length && labelOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap)) {\n success = false;\n }\n ptr += step;\n } while (success && ptr < domain.length);\n if (success) {\n break;\n }\n } while (step <= domain.length);\n\n let delCount = 0;\n if (domain.length > 2) {\n let ptr = domain.length - (domain.length % step);\n if (ptr >= domain.length) {\n ptr -= step;\n }\n // 判断首尾是否互相覆盖\n while (ptr > 0 && labelOverlap(labelBoundsList[0], labelBoundsList[ptr])) {\n delCount++;\n ptr -= step;\n }\n }\n\n return {\n step,\n delCount\n };\n};\n"]}
package/es/axis/type.d.ts CHANGED
@@ -42,7 +42,6 @@ export interface AxisBaseAttributes extends IGroupGraphicAttribute {
42
42
  items: AxisItem[][];
43
43
  title?: TitleAttributes;
44
44
  label?: LabelAttributes;
45
- labelHoverOnAxis?: LabelHoverOnAxisAttributes;
46
45
  tick?: TickAttributes;
47
46
  subTick?: SubTickAttributes;
48
47
  line?: LineAttributes;
@@ -164,17 +163,6 @@ export type LabelAttributes = Omit<AxisLabelOverlap, 'text'> & TextContent & {
164
163
  state?: AxisItemStateStyle<Partial<ITextGraphicAttribute> | callbackFunc<Partial<ITextGraphicAttribute> | undefined>>;
165
164
  dataFilter?: (data: AxisItem[], layer: number) => AxisItem[];
166
165
  };
167
- export type LabelHoverOnAxisAttributes = Omit<TagAttributes, 'shape' | 'space' | 'panel' | 'state'> & {
168
- visible?: boolean;
169
- space?: number;
170
- position?: number;
171
- autoRotate?: boolean;
172
- background?: {
173
- visible?: boolean;
174
- style?: Omit<Partial<IRectGraphicAttribute>, 'visible' | 'width' | 'height'>;
175
- };
176
- formatMethod?: (value: string) => string;
177
- };
178
166
  export type CoordinateType = 'cartesian' | 'polar' | 'geo' | 'none';
179
167
  export type IOrientType = 'left' | 'top' | 'right' | 'bottom' | 'z';
180
168
  export type IPolarOrientType = 'radius' | 'angle';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/axis/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n ILineGraphicAttribute,\n ITextGraphicAttribute,\n ISymbolGraphicAttribute,\n IRectGraphicAttribute,\n IGroupGraphicAttribute,\n IText,\n IGroup,\n IGraphic\n} from '@visactor/vrender-core';\nimport type { Dict } from '@visactor/vutils';\nimport type { ContinuousScale, CustomTicksFunc } from '@visactor/vscale';\nimport type { Point, TextContent } from '../core/type';\nimport type { SegmentAttributes } from '../segment/type';\nimport type { TagAttributes } from '../tag/type';\n\nexport type AxisItemStateStyle<T> = {\n hover?: T;\n hover_reverse?: T;\n selected?: T;\n selected_reverse?: T;\n};\n\nexport type callbackFunc<T> = (datum: Dict<any>, index: number, data?: Dict<any>[], layer?: number) => T;\n\n// 处理过的用于绘制的 tickLine 数据\nexport type TickLineItem = {\n start: Point;\n end: Point;\n /** 归一化后的数据 */\n value: number;\n // 3d数据\n anchor?: [number, number];\n alpha?: number;\n beta?: number;\n [key: string]: any;\n};\n\n// 处理过的用于绘制的数据\nexport type TransformedAxisItem = AxisItem & {\n point: Point;\n};\n\nexport type AxisItem = {\n /** 标识符,用于动画以及图形查找 */\n id?: string | number;\n /** 显示文本 */\n label: string | number;\n /** 归一化后的数据 */\n value: number;\n /** 对应原始数据 */\n rawValue: any;\n [key: string]: any;\n};\n\nexport interface AxisBaseAttributes extends IGroupGraphicAttribute {\n /**\n * 是否开启动画\n * @default false\n */\n animation?: boolean;\n /**\n * 标签入场动画配置\n */\n animationEnter?: boolean;\n /**\n * 标签更新动画配置\n */\n animationUpdate?: boolean;\n /**\n * 标签离场动画配置\n */\n animationExit?: boolean;\n /**\n * 是否开启选中交互\n * @default false\n */\n select?: boolean;\n /**\n * 是否开启 hover 交互\n * @default false\n */\n hover?: boolean;\n /**\n * 垂直于坐标轴方向的因子,默认为 1\n */\n verticalFactor?: number;\n /**\n * 坐标轴的显示位置,用于文本的防重叠处理\n */\n orient?: string;\n /** 坐标轴数据 */\n items: AxisItem[][];\n /**\n * 轴标题配置\n */\n title?: TitleAttributes;\n /**\n * 轴标签配置\n */\n label?: LabelAttributes;\n /**\n * 轴上悬浮label标签配置\n */\n labelHoverOnAxis?: LabelHoverOnAxisAttributes;\n /**\n * 轴刻度线配置\n */\n tick?: TickAttributes;\n /**\n * 自刻度线配置\n */\n subTick?: SubTickAttributes;\n /**\n * 轴线配置\n */\n line?: LineAttributes;\n /**\n * 关闭交互效果\n * @default false\n */\n disableTriggerEvent?: boolean;\n}\n\nexport interface ILine3dType {\n alpha: number;\n anchor3d?: [number, number];\n}\n\nexport interface BreakSymbol {\n /**\n * 是否显示\n */\n visible?: boolean;\n /**\n * 截断图形旋转的弧度。\n */\n angle?: number;\n\n /**\n * 样式配置\n */\n style?: Partial<ISymbolGraphicAttribute>;\n}\nexport interface AxisBreakProps {\n /**\n * 轴截断的范围,值为归一化后的数据\n */\n range: [number, number];\n /**\n * 截断图形配置\n */\n breakSymbol?: BreakSymbol;\n /**\n * 轴截断原始的数据范围\n */\n rawRange?: [number, number];\n}\n\nexport interface TransformedAxisBreak extends AxisBreakProps {\n /**\n * 截断的起始点\n */\n startPoint: Point;\n /**\n * 截断的结束点\n */\n endPoint: Point;\n}\n\nexport interface LineAxisAttributes extends Omit<AxisBaseAttributes, 'label'> {\n /**\n * 起始点坐标\n */\n start: Point;\n /**\n * 结束点坐标\n */\n end: Point;\n /**\n * 坐标轴垂直方向的限制空间,该配置会影响文本的显示,\n * 即如果超出,文本则会进行自动旋转、自动隐藏等动作。\n */\n verticalLimitSize?: number;\n /**\n * 坐标轴垂直方向的最小空间,如果小于该值,则以该值占据显示空间。\n * 如果同时声明了 verticalLimitSize,请保证 verticalMinSize <= verticalLimitSize,否则会以 verticalLimitSize 为准。\n */\n verticalMinSize?: number;\n\n /**\n * 轴标签配置\n */\n label?: LabelAttributes & {\n /**\n * label 相对于容器整体的对齐方式\n * - `top`:整体向上对齐(垂直方向)\n * - `middle`:整体居中对齐(垂直方向)\n * - `bottom`:整体向下对齐(垂直方向)\n * - `left`:整体向左对齐(水平方向)\n * - `center`:整体居中对齐(水平方向)\n * - `right`:整体向右对齐(水平方向)\n */\n containerAlign?: 'left' | 'right' | 'center' | 'top' | 'bottom' | 'middle';\n /**\n * 坐标轴首尾文字向内收缩\n * @default false\n */\n flush?: boolean;\n /**\n * 保证最后的label必须展示\n * @default false\n * @since 0.17.10\n */\n lastVisible?: boolean;\n /**\n * 保证第一个的label必须展示\n * @default false\n * @since 0.20.7\n */\n firstVisible?: boolean;\n };\n /**\n * 坐标轴背景配置\n */\n panel?: {\n /**\n * 是否绘制坐标轴背景\n */\n visible?: boolean;\n /**\n * 坐标轴背景配置\n */\n style?: Partial<IRectGraphicAttribute>;\n /**\n * 坐标轴背景交互状态样式配置\n */\n state?: AxisItemStateStyle<Partial<IRectGraphicAttribute>>;\n };\n\n /**\n * 轴截断配置\n * @since 0.20.3\n */\n breaks?: AxisBreakProps[];\n}\n\nexport interface CircleAxisAttributes extends AxisBaseAttributes {\n /**\n * 坐标轴可用布局区域的大小,之前是通过width,height传入,会影响组件的Bounds大小,影响拾取\n * @since 0.20.11\n */\n size?: { width: number; height: number };\n /**\n * 当配置了 innerRadius 时,可以通过设置 inside: true,将坐标轴战士在内圆半径上。\n * @default false\n */\n inside?: boolean;\n /**\n * 圆心坐标\n */\n center: Point;\n /**\n * **弧度值**,起始弧度,默认 -0.5 * Math.PI\n *\n */\n startAngle?: number;\n /**\n * **弧度值**,结束弧度,默认 1.5 * Math.PI\n */\n endAngle?: number;\n /**\n * 半径\n */\n radius: number;\n /** 内半径 */\n innerRadius?: number;\n /**\n * 边数\n * @since 0.19.24\n */\n sides?: number;\n}\n\n// 坐标轴标题配置\nexport type TitleAttributes = Omit<TagAttributes, 'shape' | 'space' | 'panel' | 'state'> & {\n /**\n * 是否展示标题\n */\n visible?: boolean;\n /**\n * 标题的显示位置,默认 'middle'\n */\n position?: 'start' | 'middle' | 'end';\n /**\n * 标题距离坐标轴(轴线、刻度、标签共同构成的包围盒)的距离\n */\n space?: number;\n /**\n * 标题是否自动旋转以和坐标轴平行\n */\n autoRotate?: boolean;\n shape?: {\n /**\n * 是否展示 shape\n */\n visible?: boolean;\n /**\n * shape 同 文本的间距\n */\n space?: number;\n style?: Omit<Partial<ISymbolGraphicAttribute>, 'visible'>;\n };\n /**\n * 背景设置\n */\n background?: {\n /**\n * 是否绘制背景层\n */\n visible?: boolean;\n /**\n * 背景层样式\n */\n style?: Omit<Partial<IRectGraphicAttribute>, 'visible' | 'width' | 'height'>;\n };\n\n /**\n * 交互状态样式配置\n */\n state?: {\n /**\n * text 文本的状态配置\n */\n text?: AxisItemStateStyle<Partial<ITextGraphicAttribute>>;\n /**\n * shape 标记的状态配置\n */\n shape?: AxisItemStateStyle<Partial<ISymbolGraphicAttribute>>;\n /**\n * panel 背景的状态配置\n */\n background?: AxisItemStateStyle<Partial<IRectGraphicAttribute>>;\n };\n};\n// 坐标轴线配置\nexport interface LineAttributes extends Pick<SegmentAttributes, 'startSymbol' | 'endSymbol'> {\n /**\n * 是否展示轴线\n */\n visible?: boolean;\n /**\n * 线的样式配置\n */\n style?: Partial<ILineGraphicAttribute>;\n state?: AxisItemStateStyle<Partial<ILineGraphicAttribute>>;\n}\n\n// 轴刻度线配置\nexport interface TickAttributes {\n /** 是否显示轴刻度线 */\n visible: boolean;\n /**\n * 刻度线朝向,默认朝外(坐标线包围盒外部)\n * @default false\n */\n inside?: boolean;\n /**\n * tick 是否与 label 对齐\n * @default true\n */\n alignWithLabel?: boolean;\n /**\n * 刻度线的长度\n */\n length?: number;\n /**\n * 刻度线样式配置\n */\n style?: Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>;\n /**\n * 刻度线状态样式配置\n */\n state?: AxisItemStateStyle<Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>>;\n /**\n * 用于 tick 的数据过滤\n * @param data\n * @returns\n */\n dataFilter?: (data: AxisItem[]) => AxisItem[];\n}\n\n// 子轴刻度线配置\nexport interface SubTickAttributes {\n /** 是否显示子轴刻度线 */\n visible: boolean;\n /**\n * TODO: 考虑下 log 轴,自刻度线之间的间距是不均匀的问题\n * 子刻度个数\n */\n count?: number;\n /**\n * 子刻度线朝向,默认朝外(坐标线包围盒外部)\n * @default false\n */\n inside?: boolean;\n /**\n * 子刻度线的长度\n */\n length?: number;\n /**\n * 子刻度线样式配置\n */\n style?: Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>;\n /**\n * 子刻度线状态样式配置\n */\n state?: AxisItemStateStyle<Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>>;\n}\n\nexport type CustomMethod = (items: IText[], separation: number) => IText[];\n\nexport interface AxisLabelOverlap {\n /**\n * 自动旋转配置\n * @default false\n */\n autoRotate?: boolean;\n /**\n * 仅当 `autoRotate` 为 true 时生效,可选的旋转范围,默认为 [0, 45, 90]\n * @default [0, 45, 90]\n */\n autoRotateAngle?: number[];\n /**\n * 自动隐藏配置\n * @default false\n */\n autoHide?: boolean;\n /**\n * 防重叠策略,默认为 'parity'。\n * - 'parity': 奇偶校验,使用删除所有其他标签的策略(这对于标准线性轴非常有效)。\n * - 'greedy': 将执行标签的线性扫描,并删除与最后一个可见标签重叠的所有标签。\n * - 也可以传入函数用于自定义策略\n * @default 'parity'\n */\n autoHideMethod?: 'parity' | 'greedy' | CustomMethod;\n /**\n * 仅当 `autoHide` 为 true 时生效,设置文本之间的间隔距离,单位 px\n * @default 0\n */\n autoHideSeparation?: number;\n /**\n * 自动隐藏配置\n * @default false\n */\n autoLimit?: boolean;\n /**\n * 仅当 `autoLimit` 为 true 时生效,省略占位符,默认为 '...'\n * @default '...'\n */\n limitEllipsis?: string;\n /**\n * 文字超出坐标轴范围时,两侧可以提供扩充的空间大小。\n * 例如,x 轴坐标 135 度旋转时,左侧第一个标签可能超出坐标轴范围,导致文本被缩略,此时可以通过配置 `overflowLimitLength` 优化效果。\n * 仅当 `autoLimit` 为 true 时生效。\n * @default 0\n * @since 0.20.3 支持 X 轴配置生效\n */\n overflowLimitLength?:\n | number\n | {\n /**\n * 左侧扩充空间的大小\n */\n left?: number;\n /**\n * 右侧扩充空间的大小\n */\n right?: number;\n // top?: number;\n // bottom?: number;\n };\n\n /**\n * 自定义布局配置,如果声明了 `layoutFunc`,则默认提供的防重叠相关的配置(`autoHide`, `autoRotate`, `autoLimit`)均不生效\n * @param labels 标签图形元素\n * @param labelData 标签数据\n * @param layer 当前轴的层级\n * @param axis 当前轴组件实例\n * @returns void\n */\n layoutFunc?: (labels: IText[], labelData: AxisItem[], layer: number, axis: IGroup) => void;\n\n /**\n * 标签自动换行。与 `autoRotate` 不能同时生效,若开启了 `autoRotate`,则优先使用自动旋转策略。\n * @since 0.20.3\n * @default false\n */\n autoWrap?: boolean;\n}\n\nexport type LabelAttributes = Omit<AxisLabelOverlap, 'text'> &\n TextContent & {\n /** 是否展示标签 */\n visible: boolean;\n /**\n * 标签朝向,默认朝外(坐标线包围盒外部)\n * @default false\n */\n inside?: boolean;\n /** 标签同 tick 之间的间距 */\n space?: number;\n /**\n * 格式化文本回调\n * @param text 文本原始值\n * @param item 对应的图形元素\n * @param index 文本索引顺序\n * @returns 格式化文本\n */\n formatMethod?: (value: string, datum: Dict<any>, index: number, data?: Dict<any>[], layer?: number) => string;\n /**\n * 文本样式\n */\n style?: Partial<ITextGraphicAttribute> | callbackFunc<Partial<ITextGraphicAttribute> | undefined>;\n /**\n * 文本状态样式配置\n */\n state?: AxisItemStateStyle<\n Partial<ITextGraphicAttribute> | callbackFunc<Partial<ITextGraphicAttribute> | undefined>\n >;\n\n /**\n * 用于 label 的数据过滤\n * @param data\n * @param layer\n * @returns\n */\n dataFilter?: (data: AxisItem[], layer: number) => AxisItem[];\n };\n\nexport type LabelHoverOnAxisAttributes = Omit<TagAttributes, 'shape' | 'space' | 'panel' | 'state'> & {\n /**\n * 是否展示悬浮标签\n */\n visible?: boolean;\n /** 标签同 tick 之间的间距 */\n space?: number;\n /**\n * 悬浮标签的位置 ,与轴的方位有关系,如果是水平轴,则position代表x的位置,如果是垂直轴,则position代表y的位置\n */\n position?: number;\n /**\n * 是否自动旋转以和坐标轴平行\n */\n autoRotate?: boolean;\n /**\n * 背景设置\n */\n background?: {\n /**\n * 是否绘制背景层\n */\n visible?: boolean;\n /**\n * 背景层样式\n */\n style?: Omit<Partial<IRectGraphicAttribute>, 'visible' | 'width' | 'height'>;\n };\n /**\n * 格式化文本回调\n * @param value 文本原始值\n * @returns 格式化文本\n */\n formatMethod?: (value: string) => string;\n};\nexport type CoordinateType = 'cartesian' | 'polar' | 'geo' | 'none';\nexport type IOrientType = 'left' | 'top' | 'right' | 'bottom' | 'z';\nexport type IPolarOrientType = 'radius' | 'angle';\n\ntype breakData = {\n /**\n * 截断后的值域范围\n */\n domain?: [number, number][];\n /**\n * 截断后的归一化范围\n */\n scope?: [number, number][];\n /**\n * 用户配置的截断范围\n */\n breakDomains: [number, number][];\n};\n\nexport interface ITickDataOpt {\n /**\n * 是否进行轴采样\n */\n sampling?: boolean;\n tickCount?: number | ((option: ITickCallbackOption) => number);\n forceTickCount?: number;\n tickStep?: number;\n tickMode?: 'average' | 'd3' | string | CustomTicksFunc<ContinuousScale>;\n noDecimals?: boolean;\n\n coordinateType: CoordinateType;\n axisOrientType: IOrientType | IPolarOrientType;\n startAngle?: number;\n\n labelFormatter?: (value: any) => string;\n labelStyle: ITextGraphicAttribute;\n labelGap?: number;\n labelFirstVisible?: boolean;\n labelLastVisible?: boolean;\n /**\n * 截断数据范围配置\n */\n breakData?: () => breakData;\n}\n\nexport interface ICartesianTickDataOpt extends ITickDataOpt {\n axisOrientType: IOrientType;\n labelFlush: boolean;\n /**\n * 截断数据范围配置\n */\n breakData?: () => breakData;\n}\n\nexport interface IPolarTickDataOpt extends ITickDataOpt {\n axisOrientType: IPolarOrientType;\n getRadius: () => number;\n labelOffset: number;\n inside: boolean;\n}\n\nexport interface ITickData {\n index: number;\n value: number | string;\n // label: string;\n}\n\nexport type ITickCallbackOption = {\n /**\n * 坐标轴占据的画布大小。\n * 直角坐标系中为轴的宽度或高度。\n * 极坐标系中半径轴的长度。\n */\n axisLength?: number;\n /**\n * 轴标签的样式\n */\n labelStyle?: ITextGraphicAttribute;\n};\n\nexport interface ILabelItem<T> extends Pick<IGraphic, 'AABBBounds'> {\n value?: T;\n}\n"]}
1
+ {"version":3,"sources":["../src/axis/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n ILineGraphicAttribute,\n ITextGraphicAttribute,\n ISymbolGraphicAttribute,\n IRectGraphicAttribute,\n IGroupGraphicAttribute,\n IText,\n IGroup,\n IGraphic\n} from '@visactor/vrender-core';\nimport type { Dict } from '@visactor/vutils';\nimport type { ContinuousScale, CustomTicksFunc } from '@visactor/vscale';\nimport type { Point, TextContent } from '../core/type';\nimport type { SegmentAttributes } from '../segment/type';\nimport type { TagAttributes } from '../tag/type';\n\nexport type AxisItemStateStyle<T> = {\n hover?: T;\n hover_reverse?: T;\n selected?: T;\n selected_reverse?: T;\n};\n\nexport type callbackFunc<T> = (datum: Dict<any>, index: number, data?: Dict<any>[], layer?: number) => T;\n\n// 处理过的用于绘制的 tickLine 数据\nexport type TickLineItem = {\n start: Point;\n end: Point;\n /** 归一化后的数据 */\n value: number;\n // 3d数据\n anchor?: [number, number];\n alpha?: number;\n beta?: number;\n [key: string]: any;\n};\n\n// 处理过的用于绘制的数据\nexport type TransformedAxisItem = AxisItem & {\n point: Point;\n};\n\nexport type AxisItem = {\n /** 标识符,用于动画以及图形查找 */\n id?: string | number;\n /** 显示文本 */\n label: string | number;\n /** 归一化后的数据 */\n value: number;\n /** 对应原始数据 */\n rawValue: any;\n [key: string]: any;\n};\n\nexport interface AxisBaseAttributes extends IGroupGraphicAttribute {\n /**\n * 是否开启动画\n * @default false\n */\n animation?: boolean;\n /**\n * 标签入场动画配置\n */\n animationEnter?: boolean;\n /**\n * 标签更新动画配置\n */\n animationUpdate?: boolean;\n /**\n * 标签离场动画配置\n */\n animationExit?: boolean;\n /**\n * 是否开启选中交互\n * @default false\n */\n select?: boolean;\n /**\n * 是否开启 hover 交互\n * @default false\n */\n hover?: boolean;\n /**\n * 垂直于坐标轴方向的因子,默认为 1\n */\n verticalFactor?: number;\n /**\n * 坐标轴的显示位置,用于文本的防重叠处理\n */\n orient?: string;\n /** 坐标轴数据 */\n items: AxisItem[][];\n /**\n * 轴标题配置\n */\n title?: TitleAttributes;\n /**\n * 轴标签配置\n */\n label?: LabelAttributes;\n /**\n * 轴刻度线配置\n */\n tick?: TickAttributes;\n /**\n * 自刻度线配置\n */\n subTick?: SubTickAttributes;\n /**\n * 轴线配置\n */\n line?: LineAttributes;\n /**\n * 关闭交互效果\n * @default false\n */\n disableTriggerEvent?: boolean;\n}\n\nexport interface ILine3dType {\n alpha: number;\n anchor3d?: [number, number];\n}\n\nexport interface BreakSymbol {\n /**\n * 是否显示\n */\n visible?: boolean;\n /**\n * 截断图形旋转的弧度。\n */\n angle?: number;\n\n /**\n * 样式配置\n */\n style?: Partial<ISymbolGraphicAttribute>;\n}\nexport interface AxisBreakProps {\n /**\n * 轴截断的范围,值为归一化后的数据\n */\n range: [number, number];\n /**\n * 截断图形配置\n */\n breakSymbol?: BreakSymbol;\n /**\n * 轴截断原始的数据范围\n */\n rawRange?: [number, number];\n}\n\nexport interface TransformedAxisBreak extends AxisBreakProps {\n /**\n * 截断的起始点\n */\n startPoint: Point;\n /**\n * 截断的结束点\n */\n endPoint: Point;\n}\n\nexport interface LineAxisAttributes extends Omit<AxisBaseAttributes, 'label'> {\n /**\n * 起始点坐标\n */\n start: Point;\n /**\n * 结束点坐标\n */\n end: Point;\n /**\n * 坐标轴垂直方向的限制空间,该配置会影响文本的显示,\n * 即如果超出,文本则会进行自动旋转、自动隐藏等动作。\n */\n verticalLimitSize?: number;\n /**\n * 坐标轴垂直方向的最小空间,如果小于该值,则以该值占据显示空间。\n * 如果同时声明了 verticalLimitSize,请保证 verticalMinSize <= verticalLimitSize,否则会以 verticalLimitSize 为准。\n */\n verticalMinSize?: number;\n\n /**\n * 轴标签配置\n */\n label?: LabelAttributes & {\n /**\n * label 相对于容器整体的对齐方式\n * - `top`:整体向上对齐(垂直方向)\n * - `middle`:整体居中对齐(垂直方向)\n * - `bottom`:整体向下对齐(垂直方向)\n * - `left`:整体向左对齐(水平方向)\n * - `center`:整体居中对齐(水平方向)\n * - `right`:整体向右对齐(水平方向)\n */\n containerAlign?: 'left' | 'right' | 'center' | 'top' | 'bottom' | 'middle';\n /**\n * 坐标轴首尾文字向内收缩\n * @default false\n */\n flush?: boolean;\n /**\n * 保证最后的label必须展示\n * @default false\n * @since 0.17.10\n */\n lastVisible?: boolean;\n /**\n * 保证第一个的label必须展示\n * @default false\n * @since 0.20.7\n */\n firstVisible?: boolean;\n };\n /**\n * 坐标轴背景配置\n */\n panel?: {\n /**\n * 是否绘制坐标轴背景\n */\n visible?: boolean;\n /**\n * 坐标轴背景配置\n */\n style?: Partial<IRectGraphicAttribute>;\n /**\n * 坐标轴背景交互状态样式配置\n */\n state?: AxisItemStateStyle<Partial<IRectGraphicAttribute>>;\n };\n\n /**\n * 轴截断配置\n * @since 0.20.3\n */\n breaks?: AxisBreakProps[];\n}\n\nexport interface CircleAxisAttributes extends AxisBaseAttributes {\n /**\n * 坐标轴可用布局区域的大小,之前是通过width,height传入,会影响组件的Bounds大小,影响拾取\n * @since 0.20.11\n */\n size?: { width: number; height: number };\n /**\n * 当配置了 innerRadius 时,可以通过设置 inside: true,将坐标轴战士在内圆半径上。\n * @default false\n */\n inside?: boolean;\n /**\n * 圆心坐标\n */\n center: Point;\n /**\n * **弧度值**,起始弧度,默认 -0.5 * Math.PI\n *\n */\n startAngle?: number;\n /**\n * **弧度值**,结束弧度,默认 1.5 * Math.PI\n */\n endAngle?: number;\n /**\n * 半径\n */\n radius: number;\n /** 内半径 */\n innerRadius?: number;\n /**\n * 边数\n * @since 0.19.24\n */\n sides?: number;\n}\n\n// 坐标轴标题配置\nexport type TitleAttributes = Omit<TagAttributes, 'shape' | 'space' | 'panel' | 'state'> & {\n /**\n * 是否展示标题\n */\n visible?: boolean;\n /**\n * 标题的显示位置,默认 'middle'\n */\n position?: 'start' | 'middle' | 'end';\n /**\n * 标题距离坐标轴(轴线、刻度、标签共同构成的包围盒)的距离\n */\n space?: number;\n /**\n * 标题是否自动旋转以和坐标轴平行\n */\n autoRotate?: boolean;\n shape?: {\n /**\n * 是否展示 shape\n */\n visible?: boolean;\n /**\n * shape 同 文本的间距\n */\n space?: number;\n style?: Omit<Partial<ISymbolGraphicAttribute>, 'visible'>;\n };\n /**\n * 背景设置\n */\n background?: {\n /**\n * 是否绘制背景层\n */\n visible?: boolean;\n /**\n * 背景层样式\n */\n style?: Omit<Partial<IRectGraphicAttribute>, 'visible' | 'width' | 'height'>;\n };\n\n /**\n * 交互状态样式配置\n */\n state?: {\n /**\n * text 文本的状态配置\n */\n text?: AxisItemStateStyle<Partial<ITextGraphicAttribute>>;\n /**\n * shape 标记的状态配置\n */\n shape?: AxisItemStateStyle<Partial<ISymbolGraphicAttribute>>;\n /**\n * panel 背景的状态配置\n */\n background?: AxisItemStateStyle<Partial<IRectGraphicAttribute>>;\n };\n};\n// 坐标轴线配置\nexport interface LineAttributes extends Pick<SegmentAttributes, 'startSymbol' | 'endSymbol'> {\n /**\n * 是否展示轴线\n */\n visible?: boolean;\n /**\n * 线的样式配置\n */\n style?: Partial<ILineGraphicAttribute>;\n state?: AxisItemStateStyle<Partial<ILineGraphicAttribute>>;\n}\n\n// 轴刻度线配置\nexport interface TickAttributes {\n /** 是否显示轴刻度线 */\n visible: boolean;\n /**\n * 刻度线朝向,默认朝外(坐标线包围盒外部)\n * @default false\n */\n inside?: boolean;\n /**\n * tick 是否与 label 对齐\n * @default true\n */\n alignWithLabel?: boolean;\n /**\n * 刻度线的长度\n */\n length?: number;\n /**\n * 刻度线样式配置\n */\n style?: Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>;\n /**\n * 刻度线状态样式配置\n */\n state?: AxisItemStateStyle<Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>>;\n /**\n * 用于 tick 的数据过滤\n * @param data\n * @returns\n */\n dataFilter?: (data: AxisItem[]) => AxisItem[];\n}\n\n// 子轴刻度线配置\nexport interface SubTickAttributes {\n /** 是否显示子轴刻度线 */\n visible: boolean;\n /**\n * TODO: 考虑下 log 轴,自刻度线之间的间距是不均匀的问题\n * 子刻度个数\n */\n count?: number;\n /**\n * 子刻度线朝向,默认朝外(坐标线包围盒外部)\n * @default false\n */\n inside?: boolean;\n /**\n * 子刻度线的长度\n */\n length?: number;\n /**\n * 子刻度线样式配置\n */\n style?: Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>;\n /**\n * 子刻度线状态样式配置\n */\n state?: AxisItemStateStyle<Partial<ILineGraphicAttribute> | callbackFunc<Partial<ILineGraphicAttribute> | undefined>>;\n}\n\nexport type CustomMethod = (items: IText[], separation: number) => IText[];\n\nexport interface AxisLabelOverlap {\n /**\n * 自动旋转配置\n * @default false\n */\n autoRotate?: boolean;\n /**\n * 仅当 `autoRotate` 为 true 时生效,可选的旋转范围,默认为 [0, 45, 90]\n * @default [0, 45, 90]\n */\n autoRotateAngle?: number[];\n /**\n * 自动隐藏配置\n * @default false\n */\n autoHide?: boolean;\n /**\n * 防重叠策略,默认为 'parity'。\n * - 'parity': 奇偶校验,使用删除所有其他标签的策略(这对于标准线性轴非常有效)。\n * - 'greedy': 将执行标签的线性扫描,并删除与最后一个可见标签重叠的所有标签。\n * - 也可以传入函数用于自定义策略\n * @default 'parity'\n */\n autoHideMethod?: 'parity' | 'greedy' | CustomMethod;\n /**\n * 仅当 `autoHide` 为 true 时生效,设置文本之间的间隔距离,单位 px\n * @default 0\n */\n autoHideSeparation?: number;\n /**\n * 自动隐藏配置\n * @default false\n */\n autoLimit?: boolean;\n /**\n * 仅当 `autoLimit` 为 true 时生效,省略占位符,默认为 '...'\n * @default '...'\n */\n limitEllipsis?: string;\n /**\n * 文字超出坐标轴范围时,两侧可以提供扩充的空间大小。\n * 例如,x 轴坐标 135 度旋转时,左侧第一个标签可能超出坐标轴范围,导致文本被缩略,此时可以通过配置 `overflowLimitLength` 优化效果。\n * 仅当 `autoLimit` 为 true 时生效。\n * @default 0\n * @since 0.20.3 支持 X 轴配置生效\n */\n overflowLimitLength?:\n | number\n | {\n /**\n * 左侧扩充空间的大小\n */\n left?: number;\n /**\n * 右侧扩充空间的大小\n */\n right?: number;\n // top?: number;\n // bottom?: number;\n };\n\n /**\n * 自定义布局配置,如果声明了 `layoutFunc`,则默认提供的防重叠相关的配置(`autoHide`, `autoRotate`, `autoLimit`)均不生效\n * @param labels 标签图形元素\n * @param labelData 标签数据\n * @param layer 当前轴的层级\n * @param axis 当前轴组件实例\n * @returns void\n */\n layoutFunc?: (labels: IText[], labelData: AxisItem[], layer: number, axis: IGroup) => void;\n\n /**\n * 标签自动换行。与 `autoRotate` 不能同时生效,若开启了 `autoRotate`,则优先使用自动旋转策略。\n * @since 0.20.3\n * @default false\n */\n autoWrap?: boolean;\n}\n\nexport type LabelAttributes = Omit<AxisLabelOverlap, 'text'> &\n TextContent & {\n /** 是否展示标签 */\n visible: boolean;\n /**\n * 标签朝向,默认朝外(坐标线包围盒外部)\n * @default false\n */\n inside?: boolean;\n /** 标签同 tick 之间的间距 */\n space?: number;\n /**\n * 格式化文本回调\n * @param text 文本原始值\n * @param item 对应的图形元素\n * @param index 文本索引顺序\n * @returns 格式化文本\n */\n formatMethod?: (value: string, datum: Dict<any>, index: number, data?: Dict<any>[], layer?: number) => string;\n /**\n * 文本样式\n */\n style?: Partial<ITextGraphicAttribute> | callbackFunc<Partial<ITextGraphicAttribute> | undefined>;\n /**\n * 文本状态样式配置\n */\n state?: AxisItemStateStyle<\n Partial<ITextGraphicAttribute> | callbackFunc<Partial<ITextGraphicAttribute> | undefined>\n >;\n\n /**\n * 用于 label 的数据过滤\n * @param data\n * @param layer\n * @returns\n */\n dataFilter?: (data: AxisItem[], layer: number) => AxisItem[];\n };\n\nexport type CoordinateType = 'cartesian' | 'polar' | 'geo' | 'none';\nexport type IOrientType = 'left' | 'top' | 'right' | 'bottom' | 'z';\nexport type IPolarOrientType = 'radius' | 'angle';\n\ntype breakData = {\n /**\n * 截断后的值域范围\n */\n domain?: [number, number][];\n /**\n * 截断后的归一化范围\n */\n scope?: [number, number][];\n /**\n * 用户配置的截断范围\n */\n breakDomains: [number, number][];\n};\n\nexport interface ITickDataOpt {\n /**\n * 是否进行轴采样\n */\n sampling?: boolean;\n tickCount?: number | ((option: ITickCallbackOption) => number);\n forceTickCount?: number;\n tickStep?: number;\n tickMode?: 'average' | 'd3' | string | CustomTicksFunc<ContinuousScale>;\n noDecimals?: boolean;\n\n coordinateType: CoordinateType;\n axisOrientType: IOrientType | IPolarOrientType;\n startAngle?: number;\n\n labelFormatter?: (value: any) => string;\n labelStyle: ITextGraphicAttribute;\n labelGap?: number;\n labelFirstVisible?: boolean;\n labelLastVisible?: boolean;\n /**\n * 截断数据范围配置\n */\n breakData?: () => breakData;\n}\n\nexport interface ICartesianTickDataOpt extends ITickDataOpt {\n axisOrientType: IOrientType;\n labelFlush: boolean;\n /**\n * 截断数据范围配置\n */\n breakData?: () => breakData;\n}\n\nexport interface IPolarTickDataOpt extends ITickDataOpt {\n axisOrientType: IPolarOrientType;\n getRadius: () => number;\n labelOffset: number;\n inside: boolean;\n}\n\nexport interface ITickData {\n index: number;\n value: number | string;\n // label: string;\n}\n\nexport type ITickCallbackOption = {\n /**\n * 坐标轴占据的画布大小。\n * 直角坐标系中为轴的宽度或高度。\n * 极坐标系中半径轴的长度。\n */\n axisLength?: number;\n /**\n * 轴标签的样式\n */\n labelStyle?: ITextGraphicAttribute;\n};\n\nexport interface ILabelItem<T> extends Pick<IGraphic, 'AABBBounds'> {\n value?: T;\n}\n"]}
@@ -24,5 +24,4 @@ export const DEFAULT_BRUSH_ATTRIBUTES = {
24
24
  }
25
25
  };
26
26
 
27
- export const DEFAULT_SIZE_THRESHOLD = 5;
28
- //# sourceMappingURL=config.js.map
27
+ export const DEFAULT_SIZE_THRESHOLD = 5;