Circuit.dirty

This commit is contained in:
Patrick Haßel 2024-05-22 15:19:33 +02:00
parent 857d7252a6
commit 3ddb117696
11 changed files with 83 additions and 96 deletions

View File

@ -7,27 +7,42 @@ import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.junction.Junction;
import de.ph87.electro.circuit.wire.Wire;
import de.ph87.electro.circuit.wire.WireDto;
import lombok.NoArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
@NoArgsConstructor
import static de.ph87.electro.circuit.CircuitIOService.write;
@Slf4j
public class Circuit {
@Getter
private final ZonedDateTime created;
private final List<Part> parts = new ArrayList<>();
private final List<Wire> wires = new ArrayList<>();
private boolean dirty = false;
public Circuit() {
this.created = ZonedDateTime.now();
}
public Circuit(final CircuitDto dto) {
created = dto.getCreated();
for (PartDto partDto : dto.getParts()) {
final Part part = Part.of(partDto);
if (!isFree(part.getPosition())) {
throw new RuntimeException();
}
verifyFree(part.getPosition());
parts.add(part);
}
for (final WireDto wire : dto.getWires()) {
@ -35,26 +50,32 @@ public class Circuit {
final Junction b = findJunctionByUuid(wire.getB()).orElseThrow();
wires.add(new Wire(a, b));
}
evaluate();
}
public void connect(final Junction a, final Junction b) {
wires.add(new Wire(a, b));
setDirty();
}
public void evaluate() {
Calculation.calculate(this);
parts.forEach(Part::render);
public void disconnect(final Wire wire) {
if (!wires.contains(wire)) {
throw new RuntimeException();
}
wires.remove(wire);
wire.getA().getWires().remove(wire);
wire.getB().getWires().remove(wire);
setDirty();
}
public <T extends Part> T addPart(final T part) {
if (parts.contains(part)) {
throw new RuntimeException();
}
if (!isFree(part.getPosition())) {
throw new RuntimeException();
}
verifyFree(part.getPosition());
parts.add(part);
part.render();
setDirty();
return part;
}
@ -62,13 +83,41 @@ public class Circuit {
if (!parts.contains(part)) {
throw new RuntimeException();
}
if (isFree(position)) {
verifyFree(position);
part.setPosition(position);
setDirty();
}
private void setDirty() {
evaluate();
dirty = true;
}
private void evaluate() {
Calculation.calculate(this);
parts.forEach(Part::render);
}
public void save() {
if (!dirty) {
return;
}
try {
final File file = new File("./data/circuit.json");
if (file.getParentFile().mkdirs()) {
log.info("Directory created: {}", file.getParent());
}
write(this, new FileOutputStream(file));
dirty = false;
} catch (IOException e) {
log.error(e.toString());
}
}
public boolean isFree(final Position position) {
return parts.stream().noneMatch(part -> part.getPosition().equals(position));
private void verifyFree(final Position position) {
if (parts.stream().anyMatch(part -> part.getPosition().equals(position))) {
throw new RuntimeException();
}
}
public Stream<Part> streamParts() {
@ -99,13 +148,4 @@ public class Circuit {
return wires.stream().filter(wire -> wire.intersects(position)).findFirst();
}
public void removeWire(final Wire wire) {
if (!wires.contains(wire)) {
throw new RuntimeException();
}
wires.remove(wire);
wire.getA().getWires().remove(wire);
wire.getB().getWires().remove(wire);
}
}

View File

@ -6,6 +6,7 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.time.ZonedDateTime;
import java.util.List;
@Getter
@ -13,11 +14,14 @@ import java.util.List;
@NoArgsConstructor
public class CircuitDto {
private ZonedDateTime created;
private List<PartDto> parts;
private List<WireDto> wires;
public CircuitDto(final Circuit circuit) {
this.created = circuit.getCreated();
this.parts = circuit.streamParts().map(PartDto::of).toList();
this.wires = circuit.streamWires().map(WireDto::new).toList();
}

View File

@ -6,12 +6,8 @@ import lombok.extern.slf4j.Slf4j;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import static de.ph87.electro.CONFIG.*;
import static de.ph87.electro.circuit.CircuitIOService.write;
import static de.ph87.electro.circuit.part.Position.RST;
@Slf4j
@ -27,7 +23,6 @@ public class CircuitPanel extends JPanel {
final PartLight light = circuit.addPart(new PartLight(RST(0, 1)));
circuit.connect(battery.getMinus(), light.getA());
circuit.connect(light.getB(), battery.getPlus());
circuit.evaluate();
}
@Override
@ -67,23 +62,4 @@ public class CircuitPanel extends JPanel {
circuit.streamWires().forEach(wire -> wire.draw(g));
}
public void evaluate() {
circuit.evaluate();
save();
}
public void save() {
// TODO make async
try {
final File file = new File("./data/circuit.json");
if (file.getParentFile().mkdirs()) {
log.info("Directory created: {}", file.getParent());
}
write(circuit, new FileOutputStream(file));
} catch (IOException e) {
log.error(e.toString());
}
repaint();
}
}

View File

@ -1,6 +1,5 @@
package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.parts.*;
import de.ph87.electro.common.AbstractDropTarget;
@ -24,21 +23,21 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
protected boolean drop(final Point point, final String data) {
final Position position = new Position(point);
if (data.equals(PartBattery.class.getSimpleName())) {
addPart(new PartBattery(position));
circuit.addPart(new PartBattery(position));
} else if (data.equals(PartJunctionCorner.class.getSimpleName())) {
addPart(new PartJunctionCorner(position));
circuit.addPart(new PartJunctionCorner(position));
} else if (data.equals(PartJunctionEdge.class.getSimpleName())) {
addPart(new PartJunctionEdge(position));
circuit.addPart(new PartJunctionEdge(position));
} else if (data.equals(PartJunctionMiddle.class.getSimpleName())) {
addPart(new PartJunctionMiddle(position));
circuit.addPart(new PartJunctionMiddle(position));
} else if (data.equals(PartLight.class.getSimpleName())) {
addPart(new PartLight(position));
circuit.addPart(new PartLight(position));
} else if (data.equals(PartSwitch1x1.class.getSimpleName())) {
addPart(new PartSwitch1x1(position));
circuit.addPart(new PartSwitch1x1(position));
} else if (data.equals(PartSwitch1x2.class.getSimpleName())) {
addPart(new PartSwitch1x2(position));
circuit.addPart(new PartSwitch1x2(position));
} else if (data.equals(PartSwitchCross.class.getSimpleName())) {
addPart(new PartSwitchCross(position));
circuit.addPart(new PartSwitchCross(position));
} else {
throw new RuntimeException();
}
@ -46,9 +45,4 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
return true;
}
public void addPart(final Part part) {
circuit.addPart(part);
circuitPanel.evaluate();
}
}

View File

@ -46,8 +46,8 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
if (event.getButton() == BUTTON3) {
final Optional<Wire> wireOptional = circuit.findWireByPosition(position);
if (wireOptional.isPresent()) {
circuit.removeWire(wireOptional.get());
circuitPanel.evaluate();
circuit.disconnect(wireOptional.get());
circuitPanel.repaint();
return;
}
}
@ -56,11 +56,11 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
switch (event.getButton()) {
case BUTTON1:
partOptional.ifPresent(Part::action);
circuitPanel.evaluate();
circuitPanel.repaint();
break;
case BUTTON3:
partOptional.ifPresent(Part::clockwise);
circuitPanel.save();
circuitPanel.repaint();
break;
}
}
@ -116,14 +116,10 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
final Position position = new Position(event);
if (partDrag != null) {
circuit.movePart(partDrag, position);
circuitPanel.save();
}
if (junctionDrag != null) {
circuit.findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> {
circuit.connect(junctionDrag, destination);
circuitPanel.evaluate();
});
circuit.findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuit.connect(junctionDrag, destination));
}
partDrag = null;
@ -149,21 +145,11 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
if (wireHover != null) {
g.setColor(WIRE_HOVER_COLOR_BACK);
g.setStroke(WIRE_HOVER_STROKE_BACK);
g.drawLine(
wireHover.getA().getPosition().absolute.x,
wireHover.getA().getPosition().absolute.y,
wireHover.getB().getPosition().absolute.x,
wireHover.getB().getPosition().absolute.y
);
g.drawLine(wireHover.getA().getPosition().absolute.x, wireHover.getA().getPosition().absolute.y, wireHover.getB().getPosition().absolute.x, wireHover.getB().getPosition().absolute.y);
g.setColor(wireHover.getA().getColor());
g.setStroke(WIRE_HOVER_STROKE);
g.drawLine(
wireHover.getA().getPosition().absolute.x,
wireHover.getA().getPosition().absolute.y,
wireHover.getB().getPosition().absolute.x,
wireHover.getB().getPosition().absolute.y
);
g.drawLine(wireHover.getA().getPosition().absolute.x, wireHover.getA().getPosition().absolute.y, wireHover.getB().getPosition().absolute.x, wireHover.getB().getPosition().absolute.y);
}
}

View File

@ -38,9 +38,6 @@ class CircuitIOServiceTest {
final ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
final Circuit reloaded = read(input);
original.evaluate();
reloaded.evaluate();
assertEquals(original.getPartCount(), reloaded.getPartCount());
original.streamParts().forEach(originalPart -> {
System.out.printf("Part: %s\n", originalPart.getUuid());

View File

@ -26,8 +26,6 @@ public class BatteryLightTest {
@Test
void test() {
CIRCUIT.evaluate();
assertVoltage(VOLTAGE, battery.getPlus().getVoltage());
assertVoltage(VOLTAGE, light.getB().getVoltage());
assertVoltage(VOLTAGE, light.getPotentialDifference());

View File

@ -43,8 +43,6 @@ public class BatterySwitcher1x1Test {
switcher.setState(state);
CIRCUIT.evaluate();
assertEquals(state, switcher.isState());
assertVoltage(VOLTAGE, battery.getPlus().getVoltage());

View File

@ -48,8 +48,6 @@ public class BatterySwitcher1x2Test {
switcher.setState(state);
CIRCUIT.evaluate();
assertEquals(state, switcher.isState());
assertVoltage(VOLTAGE, battery.getPlus().getVoltage());

View File

@ -60,8 +60,6 @@ public class BatterySwitcher2x2Test {
switcher0.setState(state0);
switcher1.setState(state1);
CIRCUIT.evaluate();
assertEquals(state0, switcher0.isState());
assertEquals(state1, switcher1.isState());

View File

@ -87,8 +87,6 @@ public class BatterySwitcherCrossTest {
switcherX.setState(stateX);
switcher1.setState(state1);
CIRCUIT.evaluate();
assertEquals(state0, switcher0.isState());
assertEquals(stateX, switcherX.isState());
assertEquals(state1, switcher1.isState());