Skip to content

Commit 428f4d2

Browse files
Merge branch 'new/simulator-fixes' into new/add-setters-and-getters
2 parents d802e50 + 3b74263 commit 428f4d2

File tree

3 files changed

+52
-11
lines changed

3 files changed

+52
-11
lines changed

src/models/graph.ts

+45-9
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,18 @@ import { getEdgeOffsets } from './topology';
77
import { IEntityState, EntityState } from '../utils/entity.utils';
88
import { IObserver, IObserverDataPayload, ISubject, Subject } from '../utils/observer.utils';
99
import { patchProperties } from '../utils/object.utils';
10+
import { dedupArrays } from '../utils/array.utils';
1011

1112
export interface IGraphData<N extends INodeBase, E extends IEdgeBase> {
1213
nodes: N[];
1314
edges: E[];
1415
}
1516

17+
export interface IGraphObjectsIds {
18+
nodeIds: any[];
19+
edgeIds: any[];
20+
}
21+
1622
export type IEdgeFilter<N extends INodeBase, E extends IEdgeBase> = (edge: IEdge<N, E>) => boolean;
1723

1824
export type INodeFilter<N extends INodeBase, E extends IEdgeBase> = (node: INode<N, E>) => boolean;
@@ -35,7 +41,10 @@ export interface IGraph<N extends INodeBase, E extends IEdgeBase> extends ISubje
3541
setup(data: Partial<IGraphData<N, E>>): void;
3642
clearPositions(): void;
3743
merge(data: Partial<IGraphData<N, E>>): void;
38-
remove(data: Partial<{ nodeIds: number[]; edgeIds: number[] }>): void;
44+
remove(data: Partial<IGraphObjectsIds>): void;
45+
removeAll(): void;
46+
removeAllNodes(): void;
47+
removeAllEdges(): void;
3948
isEqual<T extends INodeBase, K extends IEdgeBase>(graph: Graph<T, K>): boolean;
4049
getBoundingBox(): IRectangle;
4150
getNearestNode(point: IPosition): INode<N, E> | undefined;
@@ -49,7 +58,7 @@ export interface IGraphSettings<N extends INodeBase, E extends IEdgeBase> {
4958
onLoadedImages?: () => void;
5059
onSetupData?: (data: Partial<IGraphData<N, E>>) => void;
5160
onMergeData?: (data: Partial<IGraphData<N, E>>) => void;
52-
onRemoveData?: (data: Partial<{ nodeIds: number[]; edgeIds: number[] }>) => void;
61+
onRemoveData?: (data: Partial<IGraphObjectsIds>) => void;
5362
listeners?: IObserver[];
5463
}
5564

@@ -269,18 +278,41 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
269278
this._settings?.onMergeData?.(data);
270279
}
271280

272-
// TODO(dlozic): Add delete all mechanic.
273-
remove(data: Partial<{ nodeIds: number[]; edgeIds: number[] }>) {
281+
remove(data: Partial<IGraphObjectsIds>) {
274282
const nodeIds = data.nodeIds ?? [];
275283
const edgeIds = data.edgeIds ?? [];
276284

277-
this._removeNodes(nodeIds);
278-
this._removeEdges(edgeIds);
285+
const removedNodesData = this._removeNodes(nodeIds);
286+
const removedEdgesData = this._removeEdges(edgeIds);
279287

280288
this._applyEdgeOffsets();
281289
this._applyStyle();
282290

283-
this._settings?.onRemoveData?.(data);
291+
if (this._settings && this._settings.onRemoveData) {
292+
const removedData: IGraphObjectsIds = {
293+
nodeIds: dedupArrays(removedNodesData.nodeIds, removedEdgesData.nodeIds),
294+
edgeIds: dedupArrays(removedNodesData.edgeIds, removedEdgesData.edgeIds),
295+
};
296+
297+
this._settings.onRemoveData(removedData);
298+
}
299+
}
300+
301+
removeAll() {
302+
const nodeIds = this._nodes.getAll().map((node) => node.id);
303+
const edgeIds = this._edges.getAll().map((edge) => edge.id);
304+
305+
this.remove({ nodeIds, edgeIds });
306+
}
307+
308+
removeAllEdges() {
309+
const edgeIds = this._edges.getAll().map((edge) => edge.id);
310+
311+
this.remove({ edgeIds });
312+
}
313+
314+
removeAllNodes() {
315+
this.removeAll();
284316
}
285317

286318
isEqual<T extends INodeBase, K extends IEdgeBase>(graph: Graph<T, K>): boolean {
@@ -527,7 +559,7 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
527559
this._edges.removeMany(removedEdgeIds);
528560
}
529561

530-
private _removeNodes(nodeIds: any[]) {
562+
private _removeNodes(nodeIds: any[]): IGraphObjectsIds {
531563
const removedNodeIds: any[] = [];
532564
const removedEdgeIds: any[] = [];
533565

@@ -549,9 +581,11 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
549581
}
550582
this._nodes.removeMany(removedNodeIds);
551583
this._edges.removeMany(removedEdgeIds);
584+
585+
return { nodeIds: removedNodeIds, edgeIds: removedEdgeIds };
552586
}
553587

554-
private _removeEdges(edgeIds: any[]) {
588+
private _removeEdges(edgeIds: any[]): IGraphObjectsIds {
555589
const removedEdgeIds: any[] = [];
556590

557591
for (let i = 0; i < edgeIds.length; i++) {
@@ -565,6 +599,8 @@ export class Graph<N extends INodeBase, E extends IEdgeBase> extends Subject imp
565599
removedEdgeIds.push(edge.getId());
566600
}
567601
this._edges.removeMany(removedEdgeIds);
602+
603+
return { nodeIds: [], edgeIds: removedEdgeIds };
568604
}
569605

570606
private _applyEdgeOffsets() {

src/simulator/engine/d3-simulator-engine.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { Emitter } from '../../utils/emitter.utils';
1616
import { isObjectEqual, copyObject } from '../../utils/object.utils';
1717

1818
const MANY_BODY_MAX_DISTANCE_TO_LINK_DISTANCE_RATIO = 100;
19-
const DEFAULT_LINK_DISTANCE = 30;
19+
const DEFAULT_LINK_DISTANCE = 50;
2020

2121
export enum D3SimulatorEngineEventType {
2222
SIMULATION_START = 'simulation-start',
@@ -115,7 +115,7 @@ export const DEFAULT_SETTINGS: ID3SimulatorEngineSettings = {
115115
},
116116
links: {
117117
distance: DEFAULT_LINK_DISTANCE,
118-
strength: undefined,
118+
strength: 1,
119119
iterations: 1,
120120
},
121121
manyBody: {

src/utils/array.utils.ts

+5
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,8 @@ export const copyArray = <T>(array: Array<T>): Array<T> => {
1515
}
1616
return newArray;
1717
};
18+
19+
export const dedupArrays = <T>(...arrays: T[][]): T[] => {
20+
const combinedArray = arrays.reduce((acc, curr) => acc.concat(curr), []);
21+
return Array.from(new Set(combinedArray));
22+
};

0 commit comments

Comments
 (0)