Skip to content

Commit 650a5d2

Browse files
authored
fix: recompute connections on datagraph when device is re-added (#109)
Depends on #98
1 parent 55669e7 commit 650a5d2

File tree

3 files changed

+51
-26
lines changed

3 files changed

+51
-26
lines changed

src/types/graphs/datagraph.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ export class DataGraph {
140140
return;
141141
}
142142
this.devices.set(idDevice, deviceInfo);
143+
deviceInfo.connections.forEach((connectedId) => {
144+
this.devices.get(connectedId)?.connections.add(idDevice);
145+
});
143146
if (this.idCounter <= idDevice) {
144147
this.idCounter = idDevice + 1;
145148
}

src/types/graphs/viewgraph.ts

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,44 +36,58 @@ export class ViewGraph {
3636
this.datagraph.getDevices().forEach((graphNode, deviceId) => {
3737
if (layerIncluded(layerFromType(graphNode.type), this.layer)) {
3838
const deviceInfo = { id: deviceId, node: graphNode };
39-
this.addDevice(deviceInfo);
40-
41-
this.layer_dfs(
42-
this.datagraph.getDevices(),
43-
deviceId,
44-
deviceId,
45-
new Set([deviceId]),
46-
connections,
47-
);
39+
this.createDevice(deviceInfo);
40+
41+
this.computeLayerConnections(deviceId, connections);
4842
}
4943
});
5044

51-
connections.forEach((key) => {
52-
const connection = parseConnectionKey(key);
53-
const device1 = this.getDevice(connection.id1);
54-
const device2 = this.getDevice(connection.id2);
55-
this.drawEdge(device1, device2);
56-
device1.addConnection(device2.id);
57-
device2.addConnection(device1.id);
58-
});
45+
this.addConnections(connections);
5946
console.log("Finished constructing ViewGraph");
6047
}
6148

49+
addDevice(deviceData: CreateDevice) {
50+
const device = this.createDevice(deviceData);
51+
if (deviceData.node.connections.size !== 0) {
52+
const connections = new Set<string>();
53+
this.computeLayerConnections(deviceData.id, connections);
54+
55+
this.addConnections(connections);
56+
}
57+
return device;
58+
}
59+
6260
// Add a device to the graph
63-
addDevice(deviceData: CreateDevice): Device {
64-
if (!this.devices.has(deviceData.id)) {
65-
const device = createDevice(deviceData, this);
66-
this.devices.set(device.id, device);
67-
this.viewport.addChild(device);
68-
console.log(`Device added with ID ${device.id}`);
69-
} else {
61+
private createDevice(deviceData: CreateDevice): Device {
62+
if (this.devices.has(deviceData.id)) {
7063
console.warn(
7164
`Device with ID ${deviceData.id} already exists in the graph.`,
7265
);
66+
return this.devices.get(deviceData.id);
7367
}
68+
const device = createDevice(deviceData, this);
69+
70+
this.devices.set(device.id, device);
71+
this.viewport.addChild(device);
72+
console.log(`Device added with ID ${device.id}`);
7473
return this.devices.get(deviceData.id);
7574
}
7675

76+
private addConnections(connections: Set<string>) {
77+
connections.forEach((key) => {
78+
const connection = parseConnectionKey(key);
79+
const device1 = this.getDevice(connection.id1);
80+
const device2 = this.getDevice(connection.id2);
81+
if (!(device1 && device2)) {
82+
console.warn("At least one device in connection does not exist");
83+
return;
84+
}
85+
this.drawEdge(device1, device2);
86+
device1.addConnection(device2.id);
87+
device2.addConnection(device1.id);
88+
});
89+
}
90+
7791
drawEdge(device1: Device, device2: Device): Edge {
7892
const connectedNodes: EdgeEdges = { n1: device1.id, n2: device2.id };
7993
const id = Edge.generateConnectionKey(connectedNodes);
@@ -333,6 +347,16 @@ export class ViewGraph {
333347
return path.reverse();
334348
}
335349

350+
private computeLayerConnections(source: DeviceId, connections: Set<string>) {
351+
this.layer_dfs(
352+
this.datagraph.getDevices(),
353+
source,
354+
source,
355+
new Set([source]),
356+
connections,
357+
);
358+
}
359+
336360
private layer_dfs(
337361
graph: Map<DeviceId, GraphNode>,
338362
s: DeviceId, // source node

src/types/undo-redo/moves/addRemoveDevice.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export abstract class AddRemoveDeviceMove implements Move {
3535
// "Move" is here because it conflicts with AddDevice from viewportManager
3636
export class AddDeviceMove extends AddRemoveDeviceMove {
3737
type = TypeMove.AddDevice;
38-
data: CreateDevice;
3938

4039
undo(viewgraph: ViewGraph): void {
4140
this.removeDevice(viewgraph);
@@ -49,7 +48,6 @@ export class AddDeviceMove extends AddRemoveDeviceMove {
4948
// Check if the viewgraph is the best place to load the move into the manager
5049
export class RemoveDeviceMove extends AddRemoveDeviceMove {
5150
type: TypeMove = TypeMove.RemoveDevice;
52-
data: CreateDevice; // Data of the removed device
5351

5452
undo(viewgraph: ViewGraph): void {
5553
this.addDevice(viewgraph);

0 commit comments

Comments
 (0)