Skip to content

Commit 943067e

Browse files
authored
Merge pull request #1977 from VisActor/feat/support-filterBeforeOverlap-in-label
Feat/support filter before overlap in label
2 parents 21f0929 + 1d332f8 commit 943067e

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"changes": [
3+
{
4+
"comment": "feat: support filterBeforeOverlap in label\n\n",
5+
"type": "none",
6+
"packageName": "@visactor/vrender-components"
7+
}
8+
],
9+
"packageName": "@visactor/vrender-components",
10+
"email": "[email protected]"
11+
}

packages/vrender-components/src/label/base.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ import {
2929
isNil,
3030
isArray,
3131
isObject,
32-
pointInRect
32+
pointInRect,
33+
isBoolean
3334
} from '@visactor/vutils';
3435
import type { PointLocationCfg } from '../core/type';
3536
import { labelSmartInvert, contrastAccessibilityChecker, smartInvertStrategy } from '../util/label-smartInvert';
@@ -212,17 +213,30 @@ export class LabelBase<T extends BaseLabelAttrs> extends AnimateComponent<T> {
212213
labels = this._layout(labels);
213214
}
214215

216+
const filteredLabels: (IText | IRichText)[] = [];
217+
const overlapLabels: (IText | IRichText)[] = labels;
218+
if (!isBoolean(overlap) && isFunction(overlap.filterBeforeOverlap)) {
219+
const getRelatedGraphic = this.getRelatedGraphic.bind(this);
220+
labels.forEach(label => {
221+
if (overlap.filterBeforeOverlap(label, getRelatedGraphic, this)) {
222+
overlapLabels.push(label);
223+
} else {
224+
filteredLabels.push(label);
225+
}
226+
});
227+
}
228+
215229
if (isFunction(customOverlapFunc)) {
216230
labels = customOverlapFunc(
217-
labels as Text[],
231+
overlapLabels as Text[],
218232
this.getRelatedGraphic.bind(this),
219233
this._isCollectionBase ? (d: LabelItem) => this._idToPoint.get(d.id) : null,
220234
this
221-
);
235+
).concat(filteredLabels);
222236
} else {
223237
// 防重叠逻辑
224238
if (overlap !== false) {
225-
labels = this._overlapping(labels);
239+
labels = this._overlapping(overlapLabels).concat(filteredLabels);
226240
}
227241
}
228242

packages/vrender-components/src/label/type.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,19 @@ export interface BaseLabelAttrs extends IGroupGraphicAttribute {
152152
getRelatedPoint: ((data: LabelItem) => IPointLike) | null | undefined,
153153
labelComponent: IGroup
154154
) => void;
155+
156+
/**
157+
* 防重叠计算前的回调函数
158+
* 返回true的标签会被计算防重叠
159+
* 返回false的标签会被直接跳过防重叠计算
160+
* @since 1.19.16
161+
*/
162+
filterBeforeOverlap?: (
163+
label: IText | IRichText,
164+
getRelatedGraphic: (data: LabelItem) => IGraphic,
165+
labelComponent: IGroup
166+
) => boolean;
167+
155168
/**
156169
* 关闭交互效果
157170
* @default false
@@ -225,6 +238,18 @@ export interface OverlapAttrs {
225238
* @returns number 数值越大,权重越高。权重越高的标签越优先被布局。
226239
*/
227240
priority?: (labelItem: LabelItem) => number;
241+
242+
/**
243+
* 防重叠计算前的回调函数
244+
* 返回true的标签会被计算防重叠
245+
* 返回false的标签会被直接跳过防重叠计算
246+
* @since 1.0.24
247+
*/
248+
filterBeforeOverlap?: (
249+
label: IText | IRichText,
250+
getRelatedGraphic: (data: LabelItem) => IGraphic,
251+
labelComponent: IGroup
252+
) => boolean;
228253
}
229254

230255
export interface SmartInvertAttrs {

0 commit comments

Comments
 (0)