diff --git a/src/main/angular/src/app/editor/circuit/Circuit.ts b/src/main/angular/src/app/editor/circuit/Circuit.ts
index 17b9d90..089753d 100644
--- a/src/main/angular/src/app/editor/circuit/Circuit.ts
+++ b/src/main/angular/src/app/editor/circuit/Circuit.ts
@@ -23,7 +23,26 @@ export class Circuit {
}
calculate() {
- Calculation.calculate(this);
+ for (let i = 0; i < 50; i++) {
+ Calculation.calculate(this);
+ const changedParts = [];
+ for (const part of this.parts) {
+ if (part.loop()) {
+ changedParts.push(part);
+ }
+ }
+ if (changedParts.length === 0) {
+ return;
+ }
+ console.log("Recalculating due to parts changed:", changedParts.map(p => p.name).join(", "));
+ }
+ console.error("Too many recalculations!");
+ this.resetCalculations();
+ }
+
+ private resetCalculations() {
+ this.parts.forEach(part => part.resetCalculations());
+ this.wires.forEach(wire => wire.resetCalculations());
}
}
diff --git a/src/main/angular/src/app/editor/circuit/DEMO_003.ts b/src/main/angular/src/app/editor/circuit/DEMO_003.ts
new file mode 100644
index 0000000..69de832
--- /dev/null
+++ b/src/main/angular/src/app/editor/circuit/DEMO_003.ts
@@ -0,0 +1,28 @@
+import {Circuit} from "./Circuit";
+import {Battery} from '../parts/battery/Battery';
+import {Light} from '../parts/light/Light';
+import {Wire} from '../wire/Wire';
+import {RESISTANCE_MIN} from './Calculation';
+import {Relay} from '../parts/relay/Relay';
+
+const batteryLight = new Battery(1, 1, "Licht Batterie");
+
+const light = new Light(2, 1, "Licht");
+
+const relay = new Relay(1, 2, "Relais");
+
+const batteryRelay = new Battery(1, 3, "Relais Batterie");
+
+export const DEMO_003 = new Circuit(
+ "DEMO_003",
+ "3. Relais",
+ [batteryRelay, relay, batteryLight, light],
+ [
+ new Wire(batteryLight.plus, light.a, RESISTANCE_MIN, ""),
+ new Wire(batteryLight.minus, relay.common, RESISTANCE_MIN, ""),
+ new Wire(light.b, relay.active, RESISTANCE_MIN, ""),
+
+ new Wire(batteryRelay.minus, relay.coilA, RESISTANCE_MIN, ""),
+ new Wire(batteryRelay.plus, relay.coilB, RESISTANCE_MIN, ""),
+ ],
+);
diff --git a/src/main/angular/src/app/editor/circuit/Parts.ts b/src/main/angular/src/app/editor/circuit/Parts.ts
index 2ddf520..8e5ee83 100644
--- a/src/main/angular/src/app/editor/circuit/Parts.ts
+++ b/src/main/angular/src/app/editor/circuit/Parts.ts
@@ -2,6 +2,7 @@ import {Point} from '../Point';
import {Part, RASTER} from '../parts/Part';
import {Battery} from '../parts/battery/Battery';
import {Light} from '../parts/light/Light';
+import {Relay} from '../parts/relay/Relay';
import {Circuit} from './Circuit';
export class Parts {
@@ -49,6 +50,10 @@ export class Parts {
return this.add(new Light(rasterX, rasterY, this.generateName("Licht")));
}
+ newRelay(rasterX: number, rasterY: number): Relay {
+ return this.add(new Relay(rasterX, rasterY, this.generateName("Relais")));
+ }
+
private generateName(baseName: string) {
let counter = 1;
let name: string;
diff --git a/src/main/angular/src/app/editor/circuit/Wires.ts b/src/main/angular/src/app/editor/circuit/Wires.ts
index b24218e..90e92ac 100644
--- a/src/main/angular/src/app/editor/circuit/Wires.ts
+++ b/src/main/angular/src/app/editor/circuit/Wires.ts
@@ -107,8 +107,7 @@ export class Wires {
disconnect(wire: Wire) {
this.circuit.wires.splice(this.circuit.wires.indexOf(wire), 1);
- wire.start.wires.splice(wire.start.wires.indexOf(wire), 1);
- wire.end.wires.splice(wire.end.wires.indexOf(wire), 1);
+ wire.disconnect();
console.log("Wire disconnected: ", wire);
this.circuit.calculate();
}
diff --git a/src/main/angular/src/app/editor/circuit/circuit.component.less b/src/main/angular/src/app/editor/circuit/circuit.component.less
index 18b0f1c..d9249a2 100644
--- a/src/main/angular/src/app/editor/circuit/circuit.component.less
+++ b/src/main/angular/src/app/editor/circuit/circuit.component.less
@@ -1,33 +1,31 @@
.circuit {
width: 100%;
height: 100%;
-
- -webkit-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- .wire {
- stroke-width: 9px;
- stroke-linecap: round;
- pointer-events: none;
- }
-
- .wireBack {
- stroke-width: 11px;
- stroke: black;
- }
-
- .wireOpen {
- stroke: blue;
- stroke-dasharray: 5px 15px;
- }
-
- .wireEnd {
- stroke: green;
- }
-
- .wireDuplicate {
- stroke: red;
- }
-
+}
+
+.wireBack {
+ stroke-linecap: round;
+ stroke-width: 11px;
+ stroke: black;
+ pointer-events: none;
+}
+
+.wire {
+ stroke-width: 9px;
+ stroke-dasharray: 0 20;
+ stroke-linecap: round;
+ pointer-events: none;
+}
+
+.wireOpen {
+ stroke: blue;
+ stroke-dasharray: 5px 15px;
+}
+
+.wireEnd {
+ stroke: green;
+}
+
+.wireDuplicate {
+ stroke: red;
}
diff --git a/src/main/angular/src/app/editor/circuit/circuit.component.svg b/src/main/angular/src/app/editor/circuit/circuit.component.svg
index 756c3b5..67926cc 100644
--- a/src/main/angular/src/app/editor/circuit/circuit.component.svg
+++ b/src/main/angular/src/app/editor/circuit/circuit.component.svg
@@ -2,27 +2,7 @@
-
-
-
-
- 0" attributeName="stroke-dashoffset" from="16" to="0" [attr.dur]="(1 / wire.absCurrent) / 200" repeatCount="indefinite"/>
-
-
+
diff --git a/src/main/angular/src/app/editor/circuit/circuit.component.ts b/src/main/angular/src/app/editor/circuit/circuit.component.ts
index 3ca3268..13984fb 100644
--- a/src/main/angular/src/app/editor/circuit/circuit.component.ts
+++ b/src/main/angular/src/app/editor/circuit/circuit.component.ts
@@ -4,10 +4,9 @@ import {MessageService} from '../message/message.service';
import {Wires} from './Wires';
import {Parts} from './Parts';
import {PartComponent} from '../parts/part.component';
-import {Wire} from '../wire/Wire';
-import {fadeColor} from '../colorHelpers';
import {Circuit} from './Circuit';
+import {WireComponent} from '../part-wire/wire.component';
@Component({
selector: 'app-circuit',
@@ -15,6 +14,7 @@ import {Circuit} from './Circuit';
NgForOf,
NgIf,
PartComponent,
+ WireComponent,
],
templateUrl: './circuit.component.svg',
styleUrl: './circuit.component.less'
@@ -55,15 +55,4 @@ export class CircuitComponent {
this.parts.mouseUp($event);
}
- voltageColor(wire: Wire) {
- if (wire.start.voltage === null || wire.start.minCircuitVoltage === null || wire.start.maxCircuitVoltage === null) {
- return 'gray';
- }
- const ratio = (wire.start.voltage - wire.start.minCircuitVoltage) / (wire.start.maxCircuitVoltage - wire.start.minCircuitVoltage);
- if (ratio < 0.5) {
- return fadeColor(ratio * 2, '#008cff', 'magenta');
- }
- return fadeColor((ratio - 0.5) * 2, 'magenta', 'red');
- }
-
}
diff --git a/src/main/angular/src/app/editor/editor.component.ts b/src/main/angular/src/app/editor/editor.component.ts
index eb55fb8..470a66e 100644
--- a/src/main/angular/src/app/editor/editor.component.ts
+++ b/src/main/angular/src/app/editor/editor.component.ts
@@ -3,7 +3,7 @@ import {CircuitComponent} from './circuit/circuit.component';
import {MessagesComponent} from './message/messages/messages.component';
import {MenubarComponent} from './menubar/menubar.component';
import {Circuit} from './circuit/Circuit';
-import {DEMO_002} from './circuit/DEMO_002';
+import {DEMO_003} from './circuit/DEMO_003';
@Component({
selector: 'app-editor',
@@ -20,7 +20,7 @@ export class EditorComponent implements OnInit {
private _circuit: Circuit = Circuit.new();
ngOnInit(): void {
- this.circuit = DEMO_002;
+ this.circuit = DEMO_003;
}
set circuit(circuit: Circuit) {
diff --git a/src/main/angular/src/app/editor/junction/Junction.ts b/src/main/angular/src/app/editor/junction/Junction.ts
index 8989bb8..a932ec5 100644
--- a/src/main/angular/src/app/editor/junction/Junction.ts
+++ b/src/main/angular/src/app/editor/junction/Junction.ts
@@ -2,6 +2,7 @@ import {Wire} from "../wire/Wire";
import {Part} from '../parts/Part';
import {Rect} from '../../Rect';
import {selectTowardsRoot} from '../../selectTowardsRoot';
+import {fadeColor} from '../colorHelpers';
export const JUNCTION_RADIUS_PERCENT = 15;
@@ -9,9 +10,9 @@ export class Junction {
readonly uuid: string = self.crypto.randomUUID();
- readonly percentX: number;
+ readonly centerPercentX: number;
- readonly percentY: number;
+ readonly centerPercentY: number;
readonly wires: Wire[] = [];
@@ -25,11 +26,11 @@ export class Junction {
constructor(
public readonly part: Part,
- percentX: number,
- percentY: number,
+ public readonly percentX: number,
+ public readonly percentY: number,
readonly name: string) {
- this.percentX = percentX - JUNCTION_RADIUS_PERCENT;
- this.percentY = percentY - JUNCTION_RADIUS_PERCENT;
+ this.centerPercentX = percentX - JUNCTION_RADIUS_PERCENT;
+ this.centerPercentY = percentY - JUNCTION_RADIUS_PERCENT;
}
get fullName(): string {
@@ -77,7 +78,7 @@ export class Junction {
private findRect(): Rect {
const child = document.getElementById(this.uuid);
if (!child) {
- throw Error(`No HTMLElement found for Junction: uuid=${this.uuid}, name=${this.name}`);
+ throw Error(`No HTMLElement found for Junction: name=${this.fullName}, uuid=${this.uuid}`);
}
const parent = selectTowardsRoot(child, "svg.circuit");
@@ -95,4 +96,19 @@ export class Junction {
};
}
+ voltageColor(): string {
+ if (this.voltage === null || this.minCircuitVoltage === null || this.maxCircuitVoltage === null) {
+ return 'lightgray';
+ }
+ const ratio = (this.voltage - this.minCircuitVoltage) / (this.maxCircuitVoltage - this.minCircuitVoltage);
+ if (ratio < 0.5) {
+ return fadeColor(ratio * 2, '#008cff', 'magenta');
+ }
+ return fadeColor((ratio - 0.5) * 2, 'magenta', 'red');
+ }
+
+ resetCalculations() {
+ this.voltage = null;
+ }
+
}
diff --git a/src/main/angular/src/app/editor/junction/junction.component.svg b/src/main/angular/src/app/editor/junction/junction.component.svg
index 7bbd72c..8ceb3f4 100644
--- a/src/main/angular/src/app/editor/junction/junction.component.svg
+++ b/src/main/angular/src/app/editor/junction/junction.component.svg
@@ -1,7 +1,7 @@