FIX: auto-evaluation from Part-change -> Circuit

This commit is contained in:
Patrick Haßel 2024-05-23 09:03:00 +02:00
parent 8da0cf8071
commit de5d1bfc2c
23 changed files with 152 additions and 113 deletions

View File

@ -42,7 +42,7 @@ public class Circuit {
public Circuit(final CircuitDto dto) {
created = dto.getCreated();
for (PartDto partDto : dto.getParts()) {
final Part part = Part.of(partDto);
final Part part = Part.of(this, partDto);
verifyFree(part.getPosition());
parts.add(part);
}
@ -56,7 +56,7 @@ public class Circuit {
public void connect(final Junction a, final Junction b) {
wires.add(new Wire(a, b));
setDirty();
evaluate();
}
public void disconnect(final Wire wire) {
@ -66,7 +66,7 @@ public class Circuit {
wires.remove(wire);
wire.getA().getWires().remove(wire);
wire.getB().getWires().remove(wire);
setDirty();
evaluate();
}
public <T extends Part> T addPart(final T part) {
@ -76,7 +76,7 @@ public class Circuit {
verifyFree(part.getPosition());
parts.add(part);
part.render();
setDirty();
evaluate();
return part;
}
@ -86,15 +86,11 @@ public class Circuit {
}
verifyFree(position);
part.setPosition(position);
setDirty();
}
private void setDirty() {
evaluate();
dirty = true;
}
public void evaluate() {
dirty = true;
Calculation.calculate(this);
parts.forEach(Part::render);
}

View File

@ -8,7 +8,7 @@ import java.io.OutputStream;
public class CircuitIOService {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
public static void write(final Circuit circuit, final OutputStream stream) throws IOException {
objectMapper.writeValue(stream, new CircuitDto(circuit));

View File

@ -20,9 +20,9 @@ public class CircuitPanel extends JPanel {
public CircuitPanel() {
new CircuitPanelDropTarget(this, circuit);
final Battery battery = circuit.addPart(new Battery(RST(2, 0)));
final Light light = circuit.addPart(new Light(RST(0, 2)));
final Poti poti = circuit.addPart(new Poti(RST(2, 2)));
final Battery battery = circuit.addPart(new Battery(circuit, RST(2, 0)));
final Light light = circuit.addPart(new Light(circuit, RST(0, 2)));
final Poti poti = circuit.addPart(new Poti(circuit, RST(2, 2)));
poti.rotate();
poti.rotate();
light.rotate();

View File

@ -23,23 +23,23 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
protected boolean drop(final Point point, final String data) {
final Position position = new Position(point);
if (data.equals(Battery.class.getSimpleName())) {
circuit.addPart(new Battery(position));
circuit.addPart(new Battery(circuit, position));
} else if (data.equals(ConnectorCorner.class.getSimpleName())) {
circuit.addPart(new ConnectorCorner(position));
circuit.addPart(new ConnectorCorner(circuit, position));
} else if (data.equals(ConnectorEdge.class.getSimpleName())) {
circuit.addPart(new ConnectorEdge(position));
circuit.addPart(new ConnectorEdge(circuit, position));
} else if (data.equals(ConnectorMiddle.class.getSimpleName())) {
circuit.addPart(new ConnectorMiddle(position));
circuit.addPart(new ConnectorMiddle(circuit, position));
} else if (data.equals(Light.class.getSimpleName())) {
circuit.addPart(new Light(position));
circuit.addPart(new Light(circuit, position));
} else if (data.equals(Switch1x1.class.getSimpleName())) {
circuit.addPart(new Switch1x1(position));
circuit.addPart(new Switch1x1(circuit, position));
} else if (data.equals(Switch1x2.class.getSimpleName())) {
circuit.addPart(new Switch1x2(position));
circuit.addPart(new Switch1x2(circuit, position));
} else if (data.equals(SwitchCross.class.getSimpleName())) {
circuit.addPart(new SwitchCross(position));
circuit.addPart(new SwitchCross(circuit, position));
} else if (data.equals(Poti.class.getSimpleName())) {
circuit.addPart(new Poti(position));
circuit.addPart(new Poti(circuit, position));
} else {
throw new RuntimeException();
}

View File

@ -56,7 +56,6 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
switch (event.getButton()) {
case BUTTON1:
part.action();
circuit.evaluate();
circuitPanel.repaint();
break;
case BUTTON3:

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.junction.Junction;
import de.ph87.electro.circuit.part.junction.JunctionDto;
import de.ph87.electro.circuit.part.parts.*;
@ -15,32 +16,40 @@ import static de.ph87.electro.CONFIG.PART_BACKGROUND;
import static de.ph87.electro.CONFIG.RASTER;
import static de.ph87.electro.circuit.part.Position.ZERO;
@Getter
@ToString(onlyExplicitlyIncluded = true)
public abstract class Part {
private final Circuit circuit;
@Getter
@ToString.Include
private final String uuid;
@Getter
@Setter
@ToString.Include
private String name;
@Getter
private Position position;
@Getter
private Orientation orientation = Orientation.R0;
@Getter
private final List<Junction> junctions = new ArrayList<>();
protected final Render render = new Render();
protected Part(final String name, final Position position) {
protected Part(final Circuit circuit, final String name, final Position position) {
this.circuit = circuit;
this.uuid = UUID.randomUUID().toString();
this.name = name;
setPosition(position);
}
protected Part(final PartDto dto) {
protected Part(final Circuit circuit, final PartDto dto) {
this.circuit = circuit;
this.uuid = dto.getUuid();
this.name = dto.getName();
this.orientation = dto.getOrientation();
@ -96,7 +105,12 @@ public abstract class Part {
return junctions.stream().filter(junction -> junction.intersects(position)).findFirst();
}
public void action() {
public final void action() {
_action();
evaluate();
}
public void _action() {
// may be overwritten
}
@ -112,20 +126,26 @@ public abstract class Part {
// may be overwritten
}
protected void evaluate() {
if (circuit != null) {
circuit.evaluate();
}
}
public List<InnerConnection> getInnerConnections() {
return Collections.emptyList();
}
public static Part of(final PartDto abstractDto) {
public static Part of(final Circuit circuit, final PartDto abstractDto) {
return switch (abstractDto) {
case final BatteryDto dto -> new Battery(dto);
case final ConnectorCornerDto dto -> new ConnectorCorner(dto);
case final ConnectorEdgeDto dto -> new ConnectorEdge(dto);
case final ConnectorMiddleDto dto -> new ConnectorMiddle(dto);
case final LightDto dto -> new Light(dto);
case final Switch1x1Dto dto -> new Switch1x1(dto);
case final Switch1x2Dto dto -> new Switch1x2(dto);
case final SwitchCrossDto dto -> new SwitchCross(dto);
case final BatteryDto dto -> new Battery(circuit, dto);
case final ConnectorCornerDto dto -> new ConnectorCorner(circuit, dto);
case final ConnectorEdgeDto dto -> new ConnectorEdge(circuit, dto);
case final ConnectorMiddleDto dto -> new ConnectorMiddle(circuit, dto);
case final LightDto dto -> new Light(circuit, dto);
case final Switch1x1Dto dto -> new Switch1x1(circuit, dto);
case final Switch1x2Dto dto -> new Switch1x2(circuit, dto);
case final SwitchCrossDto dto -> new SwitchCross(circuit, dto);
case null, default -> throw new RuntimeException();
};
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.Orientation;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
@ -40,14 +41,14 @@ public class Battery extends Part {
@ToString.Include
private double resistance = 0.05;
public Battery(final Position position) {
super("Batterie", position);
public Battery(final Circuit circuit, final Position position) {
super(circuit, "Batterie", position);
minus = addJunction("MINUS", P10, P50);
plus = addJunction("PLUS", P90, P50);
}
public Battery(final BatteryDto dto) {
super(dto);
public Battery(final Circuit circuit, final BatteryDto dto) {
super(circuit, dto);
minus = addJunction(dto.getMinus(), P10, P50);
plus = addJunction(dto.getPlus(), P90, P50);
voltage = dto.getVoltage();

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.junction.Junction;
@ -17,14 +18,14 @@ public class ConnectorCorner extends Part {
private final Junction j1;
public ConnectorCorner(final Position position) {
super("", position);
public ConnectorCorner(final Circuit circuit, final Position position) {
super(circuit, "", position);
j0 = addJunction("J0", P10, P10);
j1 = addJunction("J1", P90, P90);
}
public ConnectorCorner(final ConnectorCornerDto dto) {
super(dto);
public ConnectorCorner(final Circuit circuit, final ConnectorCornerDto dto) {
super(circuit, dto);
j0 = addJunction(dto.getJ0(), P10, P10);
j1 = addJunction(dto.getJ1(), P90, P90);
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.junction.Junction;
@ -17,14 +18,14 @@ public class ConnectorEdge extends Part {
private final Junction j1;
public ConnectorEdge(final Position position) {
super("", position);
public ConnectorEdge(final Circuit circuit, final Position position) {
super(circuit, "", position);
j0 = addJunction("J0", P10, P50);
j1 = addJunction("J1", P50, P10);
}
public ConnectorEdge(final ConnectorEdgeDto dto) {
super(dto);
public ConnectorEdge(final Circuit circuit, final ConnectorEdgeDto dto) {
super(circuit, dto);
j0 = addJunction(dto.getJ0(), P10, P50);
j1 = addJunction(dto.getJ1(), P50, P10);
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.junction.Junction;
@ -14,13 +15,13 @@ public class ConnectorMiddle extends Part {
private final Junction junction;
public ConnectorMiddle(final Position position) {
super("", position);
public ConnectorMiddle(final Circuit circuit, final Position position) {
super(circuit, "", position);
junction = addJunction("J", P50, P50);
}
public ConnectorMiddle(final ConnectorMiddleDto dto) {
super(dto);
public ConnectorMiddle(final Circuit circuit, final ConnectorMiddleDto dto) {
super(circuit, dto);
junction = addJunction(dto.getJunction(), P50, P50);
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.InnerConnection;
import de.ph87.electro.circuit.part.Orientation;
import de.ph87.electro.circuit.part.Part;
@ -51,14 +52,14 @@ public class Light extends Part {
private Color color = BULB_OFF_COLOR;
public Light(final Position position) {
super("Licht", position);
public Light(final Circuit circuit, final Position position) {
super(circuit, "Licht", position);
a = addJunction("A", P10, P50);
b = addJunction("B", P90, P50);
}
public Light(final LightDto dto) {
super(dto);
public Light(final Circuit circuit, final LightDto dto) {
super(circuit, dto);
a = addJunction(dto.getB(), P10, P50);
b = addJunction(dto.getA(), P90, P50);
resistance = dto.getResistance();
@ -67,7 +68,7 @@ public class Light extends Part {
}
@Override
public void action() {
public void _action() {
defect = false;
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.InnerConnection;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
@ -28,25 +29,29 @@ public class Poti extends Part {
@Setter
private double resistance = 10;
@Setter
private double ratio = 0.0;
public Poti(final Position position) {
super("Poti", position);
public Poti(final Circuit circuit, final Position position) {
super(circuit, "Poti", position);
common = addJunction("C", P10, P50);
middle = addJunction("M", P50, P10);
end = addJunction("E", P90, P50);
}
protected Poti(final PotiDto dto) {
super(dto);
protected Poti(final Circuit circuit, final PotiDto dto) {
super(circuit, dto);
common = addJunction(dto.getCommon().getName(), P10, P50);
middle = addJunction(dto.getMiddle().getName(), P50, P10);
end = addJunction(dto.getEnd().getName(), P90, P50);
}
public void setRatio(final double ratio) {
this.ratio = ratio;
evaluate();
}
@Override
public void action() {
public void _action() {
if (ratio > 0.95) {
ratio = 0;
} else {

View File

@ -1,11 +1,11 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.InnerConnection;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.junction.Junction;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.awt.*;
@ -22,24 +22,28 @@ public class Switch1x1 extends Part {
private final Junction output;
@Setter
private boolean state = false;
public Switch1x1(final Position position) {
super("Ausschalter", position);
public Switch1x1(final Circuit circuit, final Position position) {
super(circuit, "Ausschalter", position);
common = addJunction("C", P10, P50);
output = addJunction("O", P90, P50);
}
public Switch1x1(final Switch1x1Dto dto) {
super(dto);
public Switch1x1(final Circuit circuit, final Switch1x1Dto dto) {
super(circuit, dto);
common = addJunction(dto.getCommon(), P10, P50);
output = addJunction(dto.getOutput(), P90, P50);
state = dto.isState();
}
public void setState(final boolean state) {
this.state = state;
evaluate();
}
@Override
public void action() {
public void _action() {
state = !state;
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.InnerConnection;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
@ -23,26 +24,30 @@ public class Switch1x2 extends Part {
private final Junction output1;
@Setter
private boolean state = false;
public Switch1x2(final Position position) {
super("Wechselschalter", position);
public Switch1x2(final Circuit circuit, final Position position) {
super(circuit, "Wechselschalter", position);
common = addJunction("C", P10, P50);
output0 = addJunction("O0", P90, P25);
output1 = addJunction("O1", P90, P75);
}
public Switch1x2(final Switch1x2Dto dto) {
super(dto);
public Switch1x2(final Circuit circuit, final Switch1x2Dto dto) {
super(circuit, dto);
common = addJunction(dto.getCommon(), P10, P50);
output0 = addJunction(dto.getOutput0(), P90, P25);
output1 = addJunction(dto.getOutput1(), P90, P75);
state = dto.isState();
}
public void setState(final boolean state) {
this.state = state;
evaluate();
}
@Override
public void action() {
public void _action() {
state = !state;
}

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit.part.parts;
import de.ph87.electro.circuit.Circuit;
import de.ph87.electro.circuit.part.InnerConnection;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
@ -25,19 +26,18 @@ public class SwitchCross extends Part {
private final Junction output1;
@Setter
private boolean state = false;
public SwitchCross(final Position position) {
super("Kreuzschalter", position);
public SwitchCross(final Circuit circuit, final Position position) {
super(circuit, "Kreuzschalter", position);
common0 = addJunction("C0", P10, P25);
common1 = addJunction("C1", P10, P75);
output0 = addJunction("O0", P90, P25);
output1 = addJunction("O1", P90, P75);
}
public SwitchCross(final SwitchCrossDto dto) {
super(dto);
public SwitchCross(final Circuit circuit, final SwitchCrossDto dto) {
super(circuit, dto);
common0 = addJunction(dto.getCommon0(), P10, P25);
common1 = addJunction(dto.getCommon1(), P10, P75);
output0 = addJunction(dto.getOutput0(), P90, P25);
@ -45,8 +45,13 @@ public class SwitchCross extends Part {
state = dto.isState();
}
public void setState(final boolean state) {
this.state = state;
evaluate();
}
@Override
public void action() {
public void _action() {
state = !state;
}

View File

@ -28,15 +28,15 @@ public class Sidebar extends JPanel {
});
add(toggleDetails);
add(new Battery(Position.ZERO));
add(new ConnectorCorner(Position.ZERO));
add(new ConnectorEdge(Position.ZERO));
add(new ConnectorMiddle(Position.ZERO));
add(new Light(Position.ZERO));
add(new Switch1x1(Position.ZERO));
add(new Switch1x2(Position.ZERO));
add(new SwitchCross(Position.ZERO));
add(new Poti(Position.ZERO));
add(new Battery(null, Position.ZERO));
add(new ConnectorCorner(null, Position.ZERO));
add(new ConnectorEdge(null, Position.ZERO));
add(new ConnectorMiddle(null, Position.ZERO));
add(new Light(null, Position.ZERO));
add(new Switch1x1(null, Position.ZERO));
add(new Switch1x2(null, Position.ZERO));
add(new SwitchCross(null, Position.ZERO));
add(new Poti(null, Position.ZERO));
setPreferredSize(new Dimension(0, 200));
}

View File

@ -16,8 +16,8 @@ class CalculationServiceTest {
@Test
void test() {
final Circuit circuit = new Circuit();
final Battery battery = circuit.addPart(new Battery(RST(0, 0)));
final Light light = circuit.addPart(new Light(RST(0, 1)));
final Battery battery = circuit.addPart(new Battery(circuit, RST(0, 0)));
final Light light = circuit.addPart(new Light(circuit, RST(0, 1)));
circuit.connect(battery.getMinus(), light.getA());
circuit.connect(battery.getPlus(), light.getB());

View File

@ -22,8 +22,8 @@ class CircuitIOServiceTest {
@Test
void serialization() throws IOException {
final Circuit circuit = new Circuit();
final Battery battery = circuit.addPart(new Battery(RST(0, 0)));
final Light light = circuit.addPart(new Light(RST(0, 1)));
final Battery battery = circuit.addPart(new Battery(circuit, RST(0, 0)));
final Light light = circuit.addPart(new Light(circuit, RST(0, 1)));
circuit.connect(battery.getPlus(), light.getB());
circuit.connect(light.getA(), battery.getMinus());
check(circuit);

View File

@ -14,9 +14,9 @@ public class BatteryLightTest {
private static final Circuit CIRCUIT = new Circuit();
private static final Battery battery = CIRCUIT.addPart(new Battery(RST(0, 0)));
private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0)));
private static final Light light = CIRCUIT.addPart(new Light(RST(0, 1)));
private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(0, 1)));
@BeforeAll
public static void setUp() {

View File

@ -15,11 +15,11 @@ public class BatterySwitcher1x1Test {
private static final Circuit CIRCUIT = new Circuit();
private static final Battery battery = CIRCUIT.addPart(new Battery(RST(0, 0)));
private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0)));
private static final Switch1x1 switcher = CIRCUIT.addPart(new Switch1x1(RST(0, 1)));
private static final Switch1x1 switcher = CIRCUIT.addPart(new Switch1x1(CIRCUIT, RST(0, 1)));
private static final Light light = CIRCUIT.addPart(new Light(RST(1, 0)));
private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 0)));
@BeforeAll
public static void setUp() {

View File

@ -15,13 +15,13 @@ public class BatterySwitcher1x2Test {
private static final Circuit CIRCUIT = new Circuit();
private static final Battery battery = CIRCUIT.addPart(new Battery(RST(0, 0)));
private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0)));
private static final Switch1x2 switcher = CIRCUIT.addPart(new Switch1x2(RST(0, 2)));
private static final Switch1x2 switcher = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(0, 2)));
private static final Light light0 = CIRCUIT.addPart(new Light(RST(1, 1)));
private static final Light light0 = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 1)));
private static final Light light1 = CIRCUIT.addPart(new Light(RST(1, 3)));
private static final Light light1 = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 3)));
@BeforeAll
public static void setUp() {

View File

@ -15,13 +15,13 @@ public class BatterySwitcher2x2Test {
private static final Circuit CIRCUIT = new Circuit();
private static final Battery battery = CIRCUIT.addPart(new Battery(RST(0, 0)));
private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0)));
private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(RST(0, 1)));
private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(0, 1)));
private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(RST(1, 1)));
private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(1, 1)));
private static final Light light = CIRCUIT.addPart(new Light(RST(1, 0)));
private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(1, 0)));
@BeforeAll
public static void setUp() {

View File

@ -15,15 +15,15 @@ public class BatterySwitcherCrossTest {
private static final Circuit CIRCUIT = new Circuit();
private static final Battery battery = CIRCUIT.addPart(new Battery(RST(0, 0)));
private static final Battery battery = CIRCUIT.addPart(new Battery(CIRCUIT, RST(0, 0)));
private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(RST(0, 1)));
private static final Switch1x2 switcher0 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(0, 1)));
private static final SwitchCross switcherX = CIRCUIT.addPart(new SwitchCross(RST(1, 1)));
private static final SwitchCross switcherX = CIRCUIT.addPart(new SwitchCross(CIRCUIT, RST(1, 1)));
private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(RST(2, 1)));
private static final Switch1x2 switcher1 = CIRCUIT.addPart(new Switch1x2(CIRCUIT, RST(2, 1)));
private static final Light light = CIRCUIT.addPart(new Light(RST(2, 0)));
private static final Light light = CIRCUIT.addPart(new Light(CIRCUIT, RST(2, 0)));
@BeforeAll
public static void setUp() {