Skip to content

Commit d14d315

Browse files
committed
refactor: adapt radial layout node size
1 parent 317e92c commit d14d315

File tree

3 files changed

+39
-49
lines changed

3 files changed

+39
-49
lines changed

packages/layout/src/radial/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type {
1313
import {
1414
cloneFormatData,
1515
floydWarshall,
16-
formatNodeSize,
16+
formatNodeSizeToNumber,
1717
getAdjMatrix,
1818
getEuclideanDistance,
1919
} from '../util';
@@ -37,7 +37,7 @@ const DEFAULTS_LAYOUT_OPTIONS: Partial<RadialLayoutOptions> = {
3737

3838
/**
3939
* <zh/> 径向布局
40-
*
40+
*
4141
* <en/> Radial layout
4242
*/
4343
export class RadialLayout implements Layout<RadialLayoutOptions> {
@@ -193,7 +193,7 @@ export class RadialLayout implements Layout<RadialLayoutOptions> {
193193
let nodeSizeFunc;
194194
// stagger the overlapped nodes
195195
if (preventOverlap) {
196-
nodeSizeFunc = formatNodeSize(nodeSize, nodeSpacing);
196+
nodeSizeFunc = formatNodeSizeToNumber(nodeSize, nodeSpacing);
197197
const nonoverlapForceParams: RadialNonoverlapForceOptions = {
198198
nodes,
199199
nodeSizeFunc,

packages/layout/src/types.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Edge as IEdge, Graph as IGraph, Node as INode } from '@antv/graphlib';
2+
import type { Size } from './util/size';
23

34
/**
45
* <zh/> 节点数据
@@ -240,7 +241,7 @@ export interface CircularLayoutOptions {
240241
*
241242
* <en/> Node size (diameter). Used for collision detection when nodes overlap
242243
*/
243-
nodeSize?: number | number[] | ((nodeData: Node) => number);
244+
nodeSize?: Size | ((nodeData: Node) => Size);
244245
}
245246

246247
export interface GridLayoutOptions {
@@ -290,7 +291,7 @@ export interface GridLayoutOptions {
290291
*
291292
* <en/> Node size (diameter). Used for collision detection when nodes overlap
292293
*/
293-
nodeSize?: number | number[] | ((nodeData: Node) => number);
294+
nodeSize?: Size | ((nodeData: Node) => Size);
294295
/**
295296
* <zh/> 避免重叠时节点的间距 padding。preventOverlap 为 true 时生效
296297
*
@@ -416,7 +417,7 @@ export interface ConcentricLayoutOptions {
416417
*
417418
* <en/> Node size (diameter). Used for collision detection when preventing node overlap
418419
*/
419-
nodeSize?: number | PointTuple | ((nodeData: Node) => number);
420+
nodeSize?: Size | ((nodeData: Node) => Size);
420421
/**
421422
* <zh/> 第一个节点与最后一个节点之间的弧度差
422423
*
@@ -564,14 +565,14 @@ export interface RadialLayoutOptions {
564565
*
565566
* <en/> Node size (diameter). Used for collision detection when preventing node overlap
566567
*/
567-
nodeSize?: number | number[] | ((nodeData: Node) => number);
568+
nodeSize?: Size | ((nodeData: Node) => Size);
568569
/**
569570
* <zh/> preventOverlap 为 true 时生效, 防止重叠时节点边缘间距的最小值。可以是回调函数, 为不同节点设置不同的最小间距
570571
*
571572
* <en/> Effective when preventOverlap is true. The minimum edge spacing when preventing node overlap. It can be a callback function, and set different minimum spacing for different nodes
572573
* @defaultValue 10
573574
*/
574-
nodeSpacing?: number | Function;
575+
nodeSpacing?: number | ((nodeData: Node) => number);
575576
/**
576577
* <zh/> 防止重叠步骤的最大迭代次数
577578
*
@@ -674,13 +675,13 @@ export interface D3ForceLayoutOptions {
674675
*
675676
* <en/> Node size (diameter). Used for collision detection when preventing node overlapping
676677
*/
677-
nodeSize?: number | number[] | ((node?: Node) => number);
678+
nodeSize?: Size | ((node?: Node) => Size);
678679
/**
679680
* <zh/> preventOverlap 为 true 时生效, 防止重叠时节点边缘间距的最小值。可以是回调函数, 为不同节点设置不同的最小间距
680681
*
681682
* <en/> It takes effect when preventOverlap is true. The minimum spacing of the node edge when preventing node overlapping. It can be a callback function, and set different minimum spacing for different nodes
682683
*/
683-
nodeSpacing?: number | number[] | ((node?: Node) => number);
684+
nodeSpacing?: number | ((node?: Node) => number);
684685
/**
685686
* <zh/> 当前的迭代收敛阈值
686687
*
@@ -850,7 +851,7 @@ export interface ComboCombinedLayoutOptions {
850851
* @example
851852
* ```ts
852853
* import { ForceLayout } from '@antv/layout';
853-
*
854+
*
854855
* outerLayout: new ForceLayout({
855856
* gravity: 1,
856857
* factor: 2,
@@ -870,7 +871,7 @@ export interface ComboCombinedLayoutOptions {
870871
* @example
871872
* ```ts
872873
* import { ConcentricLayout } from '@antv/layout';
873-
*
874+
*
874875
* innerLayout: new ConcentricLayout({
875876
* sortBy: 'id'
876877
* });
@@ -995,7 +996,7 @@ export interface ForceLayoutOptions extends CommonForceLayoutOptions {
995996
*
996997
* <en/> The size of the node (diameter). Used for collision detection when preventing node overlap
997998
*/
998-
nodeSize?: number | number[] | ((d?: Node) => number);
999+
nodeSize?: Size | ((d?: Node) => Size);
9991000
/**
10001001
* <zh/> preventOverlap 为 true 时生效, 防止重叠时节点边缘间距的最小值。可以是回调函数, 为不同节点设置不同的最小间距
10011002
*
@@ -1236,7 +1237,7 @@ export interface ForceAtlas2LayoutOptions extends CommonForceLayoutOptions {
12361237
*
12371238
* <en/> Node size (diameter). Used for collision detection when preventing node overlap
12381239
*/
1239-
nodeSize?: number | number[] | ((node?: Node) => number);
1240+
nodeSize?: Size | ((node?: Node) => Size);
12401241
/**
12411242
* <zh/> 每一次迭代的回调函数
12421243
*

packages/layout/src/util/function.ts

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { isFunction, isNumber, isObject } from '@antv/util';
22
import { Node } from '../types';
3-
import type { Size } from './size';
3+
import { parseSize, type Size } from './size';
44

55
/**
66
* Format value with multiple types into a function returns number.
@@ -85,50 +85,39 @@ export function formatSizeFn<T extends Node>(
8585
* @param nodeSpacing
8686
* @returns
8787
*/
88-
export const formatNodeSize = (
89-
nodeSize: Size | ((nodeData: Node) => Size) | undefined,
90-
nodeSpacing: number | Function | undefined,
91-
): ((nodeData: Node) => Size) => {
88+
export const formatNodeSizeToNumber = (
89+
nodeSize: Size | ((node: Node) => Size) | undefined,
90+
nodeSpacing: number | ((node: Node) => number) | undefined,
91+
): ((node: Node) => number) => {
9292
let nodeSizeFunc;
93-
let nodeSpacingFunc: Function;
94-
if (isNumber(nodeSpacing)) {
95-
nodeSpacingFunc = () => nodeSpacing;
96-
} else if (isFunction(nodeSpacing)) {
97-
nodeSpacingFunc = nodeSpacing;
98-
} else {
99-
nodeSpacingFunc = () => 0;
100-
}
93+
const nodeSpacingFunc =
94+
typeof nodeSpacing === 'function' ? nodeSpacing : () => nodeSpacing || 0;
10195

10296
if (!nodeSize) {
10397
nodeSizeFunc = (d: Node) => {
104-
if (d.data?.bboxSize) {
105-
return (
106-
Math.max(d.data.bboxSize[0], d.data.bboxSize[1]) + nodeSpacingFunc(d)
107-
);
108-
}
98+
if (d.data?.bboxSize) return d.data?.bboxSize;
10999
if (d.data?.size) {
110-
if (Array.isArray(d.data.size)) {
111-
return Math.max(d.data.size[0], d.data.size[1]) + nodeSpacingFunc(d);
112-
}
113100
const dataSize = d.data.size;
114-
if (isObject<{ width: number; height: number }>(dataSize)) {
115-
const res =
116-
dataSize.width > dataSize.height ? dataSize.width : dataSize.height;
117-
return res + nodeSpacingFunc(d);
118-
}
119-
return dataSize + nodeSpacingFunc(d);
101+
if (Array.isArray(dataSize)) return dataSize;
102+
if (isObject<{ width: number; height: number }>(dataSize))
103+
return [dataSize.width, dataSize.height];
104+
return dataSize;
120105
}
121-
return 10 + nodeSpacingFunc(d);
106+
return 10;
122107
};
123108
} else if (Array.isArray(nodeSize)) {
124-
nodeSizeFunc = (d: Node) => {
125-
const res = nodeSize[0] > nodeSize[1] ? nodeSize[0] : nodeSize[1];
126-
return res + nodeSpacingFunc(d);
127-
};
109+
nodeSizeFunc = (d: Node) => nodeSize;
128110
} else if (isFunction(nodeSize)) {
129-
nodeSizeFunc = nodeSize as (nodeData: Node) => number;
111+
nodeSizeFunc = nodeSize;
130112
} else {
131-
nodeSizeFunc = (d: Node) => nodeSize + nodeSpacingFunc(d);
113+
nodeSizeFunc = (d: Node) => nodeSize;
132114
}
133-
return nodeSizeFunc;
115+
116+
const func = (d: Node) => {
117+
const nodeSize = nodeSizeFunc(d);
118+
const nodeSpacing = nodeSpacingFunc(d);
119+
return Math.max(...parseSize(nodeSize)) + nodeSpacing;
120+
};
121+
122+
return func;
134123
};

0 commit comments

Comments
 (0)