diff --git a/src/main/java/de/ph87/electro/CONFIG.java b/src/main/java/de/ph87/electro/CONFIG.java index d6e79bc..1c60a17 100644 --- a/src/main/java/de/ph87/electro/CONFIG.java +++ b/src/main/java/de/ph87/electro/CONFIG.java @@ -15,6 +15,8 @@ public class CONFIG { public static final int RASTER = 200; + public static final int SUB_RASTER = RASTER / 5; + public static final int P03 = (int) round(0.03 * RASTER); public static final int P05 = (int) round(0.05 * RASTER); diff --git a/src/main/java/de/ph87/electro/Window.java b/src/main/java/de/ph87/electro/Window.java index c45045f..756d4f5 100644 --- a/src/main/java/de/ph87/electro/Window.java +++ b/src/main/java/de/ph87/electro/Window.java @@ -36,6 +36,11 @@ public class Window extends JFrame { setVisible(true); } + public static void main(String[] args) { + final Window window = new Window(); + window.setCircuit(Demos.potiAndVoltmeter()); + } + public void setCircuit(final Circuit circuit) { circuitPanel.setCircuit(circuit); } @@ -51,9 +56,4 @@ public class Window extends JFrame { setLocation(screenBounds.x, screenBounds.y); } - public static void main(String[] args) { - final Window window = new Window(); - window.setCircuit(Demos.potiAndVoltmeter()); - } - } diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java index 2098d5e..1ca0642 100644 --- a/src/main/java/de/ph87/electro/circuit/Circuit.java +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -1,46 +1,50 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.calculation.Calculation; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.Node; import de.ph87.electro.circuit.wire.Wire; import de.ph87.electro.circuit.wire.WireDto; import lombok.Getter; import lombok.NonNull; import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import java.awt.*; import java.io.File; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Stream; import static de.ph87.electro.CONFIG.ALIGN; +@Slf4j public class Circuit { - @Getter - private final String created; - - @Getter - private final List parts = new ArrayList<>(); - - private final List wires = new ArrayList<>(); - @Setter @Getter private File file = null; + @NonNull + @Getter + private final String created; + + @NonNull + @Getter + private final List parts = new ArrayList<>(); + + @NonNull + private final List wires = new ArrayList<>(); + public Circuit() { this.created = ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME); } @SuppressWarnings("unused") - public Circuit(final File file, final CircuitDto dto) { + public Circuit(@NonNull final File file, @NonNull final CircuitDto dto) { this.created = dto.getCreated(); for (PartDto partDto : dto.getParts()) { final Part part = Part.fromDto(partDto); @@ -54,13 +58,23 @@ public class Circuit { } } - public Wire connect(final Node a, final Node b) { + public void connect(@NonNull final Node a, @NonNull final Node b) { + if (a == b) { + log.warn("No Wire created: Nodes are identical: {}", a); + return; + } + final Optional duplicate = a.getWires().stream().filter(w -> w.getOpposite(a) == b).findFirst(); + if (duplicate.isPresent()) { + log.warn("No Wire created: Between these nodes, a wire already exists: {}", duplicate); + return; + } final Wire wire = new Wire(a, b); wires.add(wire); - return wire; + log.info("Wire CREATED: {}", wire); + evaluate(); } - public void disconnect(final Wire wire) { + public void disconnect(@NonNull final Wire wire) { if (!wires.contains(wire)) { throw new RuntimeException(); } @@ -69,7 +83,7 @@ public class Circuit { wire.getB().getWires().remove(wire); } - public T addPart(final T part) { + public T addPart(@NonNull final T part) { if (parts.contains(part)) { throw new RuntimeException(); } @@ -78,7 +92,21 @@ public class Circuit { return part; } - public void removePart(final Part part) { + public void removePart(@NonNull final Part part) { + for (final Node node : part.getNodes()) { + Node origin = null; + Set destinations = new HashSet<>(); + for (final Wire wire : node.getWires()) { + if (origin == null) { + origin = wire.getOpposite(node); + } else { + destinations.add(wire.getOpposite(node)); + } + } + for (final Node destination : destinations) { + connect(origin, destination); + } + } if (parts.remove(part)) { part.getNodes().stream().flatMap(node -> node.getWires().stream()).toList().forEach(this::disconnect); // jep, first toList(), then forEach (due to concurrent modification) } else { @@ -86,13 +114,13 @@ public class Circuit { } } - public void verifyFree(final Point position) { + public void verifyFree(@NonNull final Point position) { if (isOccupied(position)) { throw new RuntimeException(); } } - public boolean isOccupied(final Point position) { + public boolean isOccupied(@NonNull final Point position) { final Point aligned = ALIGN(position); return parts.stream().anyMatch(part -> part.getPosition().equals(aligned)); } @@ -109,16 +137,15 @@ public class Circuit { return parts.size(); } - public Optional findPartByPosition(final Point position) { - final Point aligned = ALIGN(position); - return streamParts().filter(p -> p.getPosition().equals(aligned)).findFirst(); + public Optional findPartByPosition(@NonNull final Point position) { + return streamParts().filter(p -> p.intersects(position)).findFirst(); } public Optional findNodeByUuid(@NonNull final String nodeUuid) { return parts.stream().map(part -> part.findNodeByUuid(nodeUuid)).filter(Optional::isPresent).map(Optional::get).findFirst(); } - public Optional findWireByPosition(final Point position) { + public Optional findWireByPosition(@NonNull final Point position) { return wires.stream().filter(wire -> wire.intersects(position)).findFirst(); } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPainter.java b/src/main/java/de/ph87/electro/circuit/CircuitPainter.java index d483a28..cbca1f6 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPainter.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPainter.java @@ -1,9 +1,8 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import java.awt.*; import java.awt.geom.AffineTransform; @@ -93,11 +92,11 @@ public class CircuitPainter { } } - public static void drawLine(final Graphics2D g, final PartNode a, final PartNode b, final Color color, final Stroke stroke) { + public static void drawLine(final Graphics2D g, final Node a, final Node b, final Color color, final Stroke stroke) { drawLine(g, a.getInside(), b.getInside(), color, stroke); } - public static void drawLine(final Graphics2D g, final PartNode a, final Point b, final Color color, final Stroke stroke) { + public static void drawLine(final Graphics2D g, final Node a, final Point b, final Color color, final Stroke stroke) { drawLine(g, a.getInside(), b, color, stroke); } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java b/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java index 41913db..2839c91 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanelDropTarget.java @@ -22,12 +22,6 @@ public class CircuitPanelDropTarget extends AbstractDropTarget { final Point aligned = ALIGN(point); if (data.equals(Battery.class.getSimpleName())) { circuitPanel.getCircuit().addPart(new Battery(aligned)); - } else if (data.equals(ConnectorCorner.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new ConnectorCorner(aligned)); - } else if (data.equals(ConnectorEdge.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new ConnectorEdge(aligned)); - } else if (data.equals(ConnectorMiddle.class.getSimpleName())) { - circuitPanel.getCircuit().addPart(new ConnectorMiddle(aligned)); } else if (data.equals(Light.class.getSimpleName())) { circuitPanel.getCircuit().addPart(new Light(aligned)); } else if (data.equals(Switch1x1.class.getSimpleName())) { diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java b/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java index 9380eae..e9553b8 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanelMouseAdapter.java @@ -1,7 +1,8 @@ package de.ph87.electro.circuit; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.node.Node; +import de.ph87.electro.circuit.part.parts.ConnectorSub; import de.ph87.electro.circuit.wire.Wire; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -26,7 +27,13 @@ class CircuitPanelMouseAdapter extends MouseAdapter { private Point dragging = null; - CircuitPanelMouseAdapter(final CircuitPanel circuitPanel) { + private Part part2 = null; + + private Node node2 = null; + + private Point draggingSub; + + CircuitPanelMouseAdapter(@NonNull final CircuitPanel circuitPanel) { this.circuitPanel = circuitPanel; circuitPanel.addMouseListener(this); circuitPanel.addMouseMotionListener(this); @@ -46,6 +53,9 @@ class CircuitPanelMouseAdapter extends MouseAdapter { node = part != null ? part.findNodeByPosition(position).orElse(null) : null; if (node != null) { part = null; + if (wire != null) { + wire.setGhost(false); + } wire = null; return; } @@ -57,11 +67,12 @@ class CircuitPanelMouseAdapter extends MouseAdapter { public void drawHovers(@NonNull final Graphics2D g) { drawPartHover(g); - drawNodeHover(g); + drawNodeHover(g, node); + drawNodeHover(g, node2); drawWireHover(g); } - private void drawPartHover(final Graphics2D g) { + private void drawPartHover(@NonNull final Graphics2D g) { if (part == null) { return; } @@ -71,14 +82,14 @@ class CircuitPanelMouseAdapter extends MouseAdapter { g.drawRect(part.getPosition().x, part.getPosition().y, RASTER, RASTER); } - private void drawNodeHover(final Graphics2D g) { - if (node == null) { + private void drawNodeHover(@NonNull final Graphics2D g, final Node n) { + if (n == null) { return; } - final Point absolute = node.getPosition(); + final Point absolute = n.getPosition(); - g.setColor(node.getColor()); + g.setColor(n.getColor()); g.fillArc(absolute.x - NODE_RADIUS_HOVER, absolute.y - NODE_RADIUS_HOVER, 2 * NODE_RADIUS_HOVER, 2 * NODE_RADIUS_HOVER, 0, 360); g.setColor(NODE_HOVER_BORDER_COLOR); @@ -86,8 +97,8 @@ class CircuitPanelMouseAdapter extends MouseAdapter { g.drawArc(absolute.x - NODE_RADIUS_HOVER, absolute.y - NODE_RADIUS_HOVER, 2 * NODE_RADIUS_HOVER, 2 * NODE_RADIUS_HOVER, 0, 360); } - private void drawWireHover(final Graphics2D g) { - if (wire == null) { + private void drawWireHover(@NonNull final Graphics2D g) { + if (wire == null || wire.isGhost()) { return; } @@ -109,8 +120,18 @@ class CircuitPanelMouseAdapter extends MouseAdapter { public void mouseDragged(@NonNull final MouseEvent event) { if (dragging == null) { findHovers(event); + if (wire != null) { + wire.setGhost(true); + } + } else { + part2 = circuitPanel.getCircuit().findPartByPosition(dragging).orElse(null); + node2 = part2 == null ? null : part2.findNodeByPosition(dragging).orElse(null); } dragging = event.getPoint(); + draggingSub = new Point( + dragging.x / SUB_RASTER * SUB_RASTER, + dragging.y / SUB_RASTER * SUB_RASTER + ); circuitPanel.repaint(); } @@ -134,23 +155,89 @@ class CircuitPanelMouseAdapter extends MouseAdapter { final Node source = node; findHovers(event); if (node != null) { - final Wire wire = circuitPanel.getCircuit().connect(source, node); - log.info("Wire CREATED: {}", wire); + circuitPanel.getCircuit().connect(source, node); circuitPanel.getCircuit().evaluate(); } else { log.info("No Wire created: No destination node found!"); } } + if (wire != null) { + wireBend(); + } + terminateMouseAction(); } + private void wireBend() { + if (node2 != null) { + wireBendToExistingNode(); + } else { + wireBendToNewConnector(); + } + } + + private void wireBendToExistingNode() { + if (wire == null) { + throw new RuntimeException(); + } + if (node2 == wire.getA() || node2 == wire.getB()) { + log.info("Wire-bending-destination node is already part of that wire: wire={}, node={}", wire, node2); + return; + } + connectIntermediate(node2); + } + + private void wireBendToNewConnector() { + final ConnectorSub newConnector = circuitPanel.getCircuit().addPart(new ConnectorSub(draggingSub)); + connectIntermediate(newConnector.getNode()); + } + + private void connectIntermediate(@NonNull final Node intermediate) { + circuitPanel.getCircuit().connect(wire.getA(), intermediate); + circuitPanel.getCircuit().connect(intermediate, wire.getB()); + circuitPanel.getCircuit().disconnect(wire); + circuitPanel.getCircuit().evaluate(); + } + public void drawDrag(@NonNull final Graphics2D g) { drawPartDrag(g); drawNodeDrag(g); + drawWireDrag(g); } - private void drawNodeDrag(final Graphics2D g) { + private void drawWireDrag(@NonNull final Graphics2D g) { + if (dragging == null || wire == null) { + return; + } + + final Point vertex; + if (part2 != null) { + if (node2 == null) { + // hovering part, but not a node + vertex = dragging; + } else { + // hovering existing node + vertex = node2.getPosition(); + } + } else { + // hovering free space (will create a new connector in sub-raster) + g.setColor(PART_HOVER_COLOR); + g.fillRect(draggingSub.x, draggingSub.y, SUB_RASTER, SUB_RASTER); + vertex = new Point( + draggingSub.x + SUB_RASTER / 2, + draggingSub.y + SUB_RASTER / 2 + ); + } + + // wire + g.setColor(wire.getA().getColor()); + g.setStroke(WIRE_STROKE); + g.drawLine(wire.getA().getPosition().x, wire.getA().getPosition().y, vertex.x, vertex.y); + g.drawLine(vertex.x, vertex.y, wire.getB().getPosition().x, wire.getB().getPosition().y); + } + + private void drawNodeDrag(@NonNull final Graphics2D g) { if (dragging == null || node == null) { return; } @@ -160,7 +247,7 @@ class CircuitPanelMouseAdapter extends MouseAdapter { g.drawLine(absolute.x, absolute.y, dragging.x, dragging.y); } - private void drawPartDrag(final Graphics2D g) { + private void drawPartDrag(@NonNull final Graphics2D g) { if (dragging == null || part == null) { return; } @@ -171,14 +258,22 @@ class CircuitPanelMouseAdapter extends MouseAdapter { /* CLICK ---------------------------------------------------------------------------------------- */ @Override - public void mouseClicked(final MouseEvent event) { + public void mouseClicked(@NonNull final MouseEvent event) { findHovers(event); if (mouseClickedAction(event)) { terminateMouseAction(); } } - private boolean mouseClickedAction(final MouseEvent event) { + private boolean mouseClickedAction(@NonNull final MouseEvent event) { + if (node != null && node.getPart() instanceof ConnectorSub) { + switch (event.getButton()) { + case BUTTON3: + circuitPanel.getCircuit().removePart(node.getPart()); + circuitPanel.getCircuit().evaluate(); + return true; + } + } if (wire != null) { switch (event.getButton()) { case BUTTON3: @@ -209,10 +304,20 @@ class CircuitPanelMouseAdapter extends MouseAdapter { /* COMMON --------------------------------------------------------------------------------------- */ private void terminateMouseAction() { + if (wire != null) { + wire.setGhost(false); + } + part = null; node = null; wire = null; + + part2 = null; + node2 = null; + dragging = null; + draggingSub = null; + circuitPanel.repaint(); } diff --git a/src/main/java/de/ph87/electro/circuit/calculation/Calculation.java b/src/main/java/de/ph87/electro/circuit/calculation/Calculation.java index e422713..bbf1816 100644 --- a/src/main/java/de/ph87/electro/circuit/calculation/Calculation.java +++ b/src/main/java/de/ph87/electro/circuit/calculation/Calculation.java @@ -2,10 +2,9 @@ package de.ph87.electro.circuit.calculation; import de.ph87.electro.CONFIG; import de.ph87.electro.circuit.Circuit; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import de.ph87.electro.circuit.part.parts.Battery; import de.ph87.electro.circuit.wire.Wire; import lombok.Getter; @@ -13,10 +12,7 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.math3.linear.*; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import static java.lang.Math.max; @@ -43,7 +39,7 @@ public class Calculation { private Calculation(final Set connectedNodes, final Battery pivot) { for (final Node node : connectedNodes) { - if (node instanceof final PartNode partNode) { + if (node instanceof final Node partNode) { parts.add(partNode.getPart()); } if (!nodes.contains(node) && node != pivot.getMinus()) { @@ -68,7 +64,7 @@ public class Calculation { final Set connectedNodes = new HashSet<>(); pivot.getPlus().collectConnectedNodes(connectedNodes); pivot.getMinus().collectConnectedNodes(connectedNodes); - connectedNodes.stream().filter(n -> n instanceof PartNode).map(n -> (PartNode) n).map(PartNode::getPart).flatMap(Battery::filterCast).forEach(batteries::remove); + connectedNodes.stream().map(Node::getPart).flatMap(Battery::filterCast).forEach(batteries::remove); calculations.add(new Calculation(connectedNodes, pivot)); } return calculations; diff --git a/src/main/java/de/ph87/electro/circuit/part/InnerConnection.java b/src/main/java/de/ph87/electro/circuit/part/InnerConnection.java index ba92df6..fe34b06 100644 --- a/src/main/java/de/ph87/electro/circuit/part/InnerConnection.java +++ b/src/main/java/de/ph87/electro/circuit/part/InnerConnection.java @@ -1,6 +1,6 @@ package de.ph87.electro.circuit.part; -import de.ph87.electro.circuit.node.Node; +import de.ph87.electro.circuit.part.node.Node; import java.util.stream.Stream; diff --git a/src/main/java/de/ph87/electro/circuit/part/Part.java b/src/main/java/de/ph87/electro/circuit/part/Part.java index a1d6796..02fc613 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Part.java +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -1,6 +1,7 @@ package de.ph87.electro.circuit.part; -import de.ph87.electro.circuit.node.NodeDto; +import de.ph87.electro.circuit.part.node.Node; +import de.ph87.electro.circuit.part.node.NodeDto; import de.ph87.electro.circuit.part.parts.*; import lombok.Getter; import lombok.NonNull; @@ -13,7 +14,8 @@ import java.awt.geom.Point2D; import java.util.List; import java.util.*; -import static de.ph87.electro.CONFIG.*; +import static de.ph87.electro.CONFIG.P50; +import static de.ph87.electro.CONFIG.PART_BACK_COLOR; import static java.lang.Math.round; @Getter @@ -25,7 +27,7 @@ public abstract class Part { private final String uuid; @NonNull - private final List nodes = new ArrayList<>(); + private final List nodes = new ArrayList<>(); @NonNull protected Orientation orientation = Orientation.R0; @@ -60,10 +62,8 @@ public abstract class Part { public static Part fromDto(@NonNull 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 ConnectorSubDto dto -> new ConnectorSub(dto); case final Switch1x1Dto dto -> new Switch1x1(dto); case final Switch1x2Dto dto -> new Switch1x2(dto); case final SwitchCrossDto dto -> new SwitchCross(dto); @@ -73,6 +73,9 @@ public abstract class Part { }; } + @NonNull + public abstract Point getSize(); + public void setPosition(@NonNull final Point position) { this.position = position; updateTransform(); @@ -88,7 +91,7 @@ public abstract class Part { transform = new AffineTransform(); transform.translate(position.x, position.y); transform.rotate(orientation.getRadians(), P50, P50); - nodes.forEach(PartNode::positionChanged); + nodes.forEach(Node::positionChanged); } @NonNull @@ -98,24 +101,24 @@ public abstract class Part { } @NonNull - protected PartNode addNode(@NonNull final String name, final int x, final int y) { - return addNode(new PartNode(this, name, new Point(x, y))); + protected Node addNode(@NonNull final String name, final int x, final int y) { + return addNode(new Node(this, name, new Point(x, y))); } @NonNull - protected PartNode addNode(@NonNull final NodeDto dto, final int x, final int y) { - return addNode(new PartNode(this, dto, new Point(x, y))); + protected Node addNode(@NonNull final NodeDto dto, final int x, final int y) { + return addNode(new Node(this, dto, new Point(x, y))); } @NonNull - private PartNode addNode(@NonNull final PartNode node) { + private Node addNode(@NonNull final Node node) { nodes.add(node); return node; } public final void draw(@NonNull final Graphics2D g) { g.setColor(PART_BACK_COLOR); - g.fillRect(0, 0, RASTER, RASTER); + g.fillRect(0, 0, getSize().x, getSize().y); _render(g); nodes.forEach(node -> node.draw(g)); _labels(g); @@ -143,13 +146,18 @@ public abstract class Part { } @NonNull - public Optional findNodeByUuid(@NonNull final String nodeUuid) { + public Optional findNodeByUuid(@NonNull final String nodeUuid) { return nodes.stream().filter(node -> node.getUuid().equals(nodeUuid)).findFirst(); } @NonNull - public Optional findNodeByPosition(@NonNull final Point position) { + public Optional findNodeByPosition(@NonNull final Point position) { return nodes.stream().filter(node -> node.intersects(position)).findFirst(); } + public boolean intersects(@NonNull final Point point) { + return this.position.x <= point.x && point.x < this.position.x + this.getSize().x + && this.position.y <= point.y && point.y < this.position.y + this.getSize().y; + } + } diff --git a/src/main/java/de/ph87/electro/circuit/part/PartDto.java b/src/main/java/de/ph87/electro/circuit/part/PartDto.java index 4d76c3f..1e53e14 100644 --- a/src/main/java/de/ph87/electro/circuit/part/PartDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/PartDto.java @@ -32,10 +32,8 @@ public abstract class PartDto { public static PartDto of(final Part abstractPart) { return switch (abstractPart) { case final Battery part -> new BatteryDto(part); - case final ConnectorCorner part -> new ConnectorCornerDto(part); - case final ConnectorEdge part -> new ConnectorEdgeDto(part); - case final ConnectorMiddle part -> new ConnectorMiddleDto(part); case final Light part -> new LightDto(part); + case final ConnectorSub part -> new ConnectorSubDto(part); case final Switch1x1 part -> new Switch1x1Dto(part); case final Switch1x2 part -> new Switch1x2Dto(part); case final SwitchCross part -> new SwitchCrossDto(part); diff --git a/src/main/java/de/ph87/electro/circuit/part/PartNode.java b/src/main/java/de/ph87/electro/circuit/part/PartNode.java deleted file mode 100644 index 5697b63..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/PartNode.java +++ /dev/null @@ -1,58 +0,0 @@ -package de.ph87.electro.circuit.part; - -import de.ph87.electro.circuit.node.Node; -import de.ph87.electro.circuit.node.NodeDto; -import lombok.Getter; -import lombok.NonNull; -import lombok.ToString; - -import java.awt.*; -import java.util.Set; - -import static de.ph87.electro.CONFIG.NODE_RADIUS; -import static de.ph87.electro.CONFIG.NODE_STROKE; - -@Getter -@ToString(onlyExplicitlyIncluded = true) -public class PartNode extends Node { - - @NonNull - private final Part part; - - @NonNull - private final Point inside; - - public PartNode(@NonNull final Part part, @NonNull final String name, @NonNull final Point inside) { - super(name, part.transform(inside)); - this.part = part; - this.inside = inside; - } - - public PartNode(@NonNull final Part part, @NonNull final NodeDto dto, @NonNull final Point inside) { - super(dto.getName(), part.transform(inside)); - this.part = part; - this.inside = inside; - } - - public void collectConnectedNodes(@NonNull final Set connected) { - if (connected.contains(this)) { - return; - } - super.collectConnectedNodes(connected); - part.getInnerConnections().stream().flatMap(innerConnection -> innerConnection.filter(this)).forEach(opposite -> opposite.collectConnectedNodes(connected)); - } - - public void positionChanged() { - position = part.transform(inside); - } - - public void draw(@NonNull final Graphics2D g) { - g.setColor(getColor()); - g.fillArc(inside.x - NODE_RADIUS, inside.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS, 0, 360); - - g.setColor(Color.BLACK); - g.setStroke(NODE_STROKE); - g.drawArc(inside.x - NODE_RADIUS, inside.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS, 0, 360); - } - -} diff --git a/src/main/java/de/ph87/electro/circuit/node/Node.java b/src/main/java/de/ph87/electro/circuit/part/node/Node.java similarity index 63% rename from src/main/java/de/ph87/electro/circuit/node/Node.java rename to src/main/java/de/ph87/electro/circuit/part/node/Node.java index bedce04..bafcc67 100644 --- a/src/main/java/de/ph87/electro/circuit/node/Node.java +++ b/src/main/java/de/ph87/electro/circuit/part/node/Node.java @@ -1,5 +1,6 @@ -package de.ph87.electro.circuit.node; +package de.ph87.electro.circuit.part.node; +import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.wire.Wire; import lombok.Getter; import lombok.NonNull; @@ -25,6 +26,12 @@ public class Node { @ToString.Include private final String name; + @NonNull + private final Part part; + + @NonNull + private final Point inside; + @NonNull private final Set wires = new HashSet<>(); @@ -38,16 +45,20 @@ public class Node { @NonNull private Color color = VOLTAGE_UNKNOWN_COLOR; - public Node(@NonNull final String name, @NonNull final Point position) { + public Node(@NonNull final Part part, @NonNull final String name, @NonNull final Point inside) { + this.part = part; + this.inside = inside; this.uuid = UUID.randomUUID().toString(); this.name = name; - this.position = position; + this.position = part.transform(inside); } - public Node(@NonNull final NodeDto dto, @NonNull final Point position) { + public Node(@NonNull final Part part, @NonNull final NodeDto dto, @NonNull final Point inside) { this.uuid = dto.getUuid(); this.name = dto.getName(); - this.position = position; + this.part = part; + this.inside = inside; + this.position = part.transform(inside); } @NonNull @@ -62,13 +73,17 @@ public class Node { this.color = Double.isNaN(voltage) ? VOLTAGE_UNKNOWN_COLOR : ((voltage >= VOLTAGE_HIGH_MIN) ? VOLTAGE_HIGH_COLOR : VOLTAGE_LOW_COLOR); } + public void positionChanged() { + position = part.transform(inside); + } + public void draw(@NonNull final Graphics2D g) { - g.setColor(color); - g.fillArc(position.x - NODE_RADIUS, position.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS, 0, 360); + g.setColor(getColor()); + g.fillArc(inside.x - NODE_RADIUS, inside.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS, 0, 360); g.setColor(Color.BLACK); g.setStroke(NODE_STROKE); - g.drawArc(position.x - NODE_RADIUS, position.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS, 0, 360); + g.drawArc(inside.x - NODE_RADIUS, inside.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS, 0, 360); } public boolean intersects(@NonNull final Point position) { @@ -81,6 +96,7 @@ public class Node { } connected.add(this); wires.forEach(wire -> wire.getOpposite(this).collectConnectedNodes(connected)); + part.getInnerConnections().stream().flatMap(innerConnection -> innerConnection.filter(this)).forEach(opposite -> opposite.collectConnectedNodes(connected)); } } diff --git a/src/main/java/de/ph87/electro/circuit/node/NodeDto.java b/src/main/java/de/ph87/electro/circuit/part/node/NodeDto.java similarity index 87% rename from src/main/java/de/ph87/electro/circuit/node/NodeDto.java rename to src/main/java/de/ph87/electro/circuit/part/node/NodeDto.java index 7af5115..d7fd72c 100644 --- a/src/main/java/de/ph87/electro/circuit/node/NodeDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/node/NodeDto.java @@ -1,4 +1,4 @@ -package de.ph87.electro.circuit.node; +package de.ph87.electro.circuit.part.node; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java b/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java index c0e4de9..467ca31 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Battery.java @@ -1,8 +1,8 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -29,6 +29,8 @@ public class Battery extends Part { private static final int PLUS_H = (int) round(0.6 * RASTER); + private final Point size = new Point(RASTER, RASTER); + private final Node minus; private final Node plus; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/BatteryDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/BatteryDto.java index d3cc0a1..391e172 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/BatteryDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/BatteryDto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java deleted file mode 100644 index ec3fcee..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCorner.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.ph87.electro.circuit.part.parts; - -import de.ph87.electro.circuit.node.Node; -import de.ph87.electro.circuit.part.Part; -import lombok.Getter; -import lombok.ToString; - -import java.awt.*; - -import static de.ph87.electro.CONFIG.P10; -import static de.ph87.electro.CONFIG.P90; - -@Getter -@ToString(callSuper = true) -public class ConnectorCorner extends Part { - - private final Node j0; - - private final Node j1; - - public ConnectorCorner(final Point position) { - super("", position); - j0 = addNode("J0", P10, P10); - j1 = addNode("J1", P90, P90); - } - - public ConnectorCorner(final ConnectorCornerDto dto) { - super(dto); - j0 = addNode(dto.getJ0(), P10, P10); - j1 = addNode(dto.getJ1(), P90, P90); - } - -} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCornerDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCornerDto.java deleted file mode 100644 index b201bd0..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorCornerDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.ph87.electro.circuit.part.parts; - -import de.ph87.electro.circuit.node.NodeDto; -import de.ph87.electro.circuit.part.PartDto; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@Getter -@ToString -@NoArgsConstructor -public class ConnectorCornerDto extends PartDto { - - private NodeDto j0; - - private NodeDto j1; - - public ConnectorCornerDto(final ConnectorCorner part) { - j0 = new NodeDto(part.getJ0()); - j1 = new NodeDto(part.getJ1()); - } - -} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java deleted file mode 100644 index c3d5e44..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdge.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.ph87.electro.circuit.part.parts; - -import de.ph87.electro.circuit.node.Node; -import de.ph87.electro.circuit.part.Part; -import lombok.Getter; -import lombok.ToString; - -import java.awt.*; - -import static de.ph87.electro.CONFIG.P10; -import static de.ph87.electro.CONFIG.P50; - -@Getter -@ToString(callSuper = true) -public class ConnectorEdge extends Part { - - private final Node j0; - - private final Node j1; - - public ConnectorEdge(final Point position) { - super("", position); - j0 = addNode("J0", P10, P50); - j1 = addNode("J1", P50, P10); - } - - public ConnectorEdge(final ConnectorEdgeDto dto) { - super(dto); - j0 = addNode(dto.getJ0(), P10, P50); - j1 = addNode(dto.getJ1(), P50, P10); - } - -} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdgeDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdgeDto.java deleted file mode 100644 index e2f78e2..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorEdgeDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.ph87.electro.circuit.part.parts; - -import de.ph87.electro.circuit.node.NodeDto; -import de.ph87.electro.circuit.part.PartDto; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; - -@Getter -@ToString -@NoArgsConstructor -public class ConnectorEdgeDto extends PartDto { - - private NodeDto j0; - - private NodeDto j1; - - public ConnectorEdgeDto(final ConnectorEdge part) { - j0 = new NodeDto(part.getJ0()); - j1 = new NodeDto(part.getJ1()); - } - -} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java deleted file mode 100644 index e62cc7c..0000000 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddle.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ph87.electro.circuit.part.parts; - -import de.ph87.electro.circuit.node.Node; -import de.ph87.electro.circuit.part.Part; -import lombok.Getter; -import lombok.ToString; - -import java.awt.*; - -import static de.ph87.electro.CONFIG.P50; - -@Getter -@ToString(callSuper = true) -public class ConnectorMiddle extends Part { - - private final Node node; - - public ConnectorMiddle(final Point position) { - super("", position); - node = addNode("J", P50, P50); - } - - public ConnectorMiddle(final ConnectorMiddleDto dto) { - super(dto); - node = addNode(dto.getNode(), P50, P50); - } - -} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorSub.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorSub.java new file mode 100644 index 0000000..1968817 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorSub.java @@ -0,0 +1,30 @@ +package de.ph87.electro.circuit.part.parts; + +import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.node.Node; +import lombok.Getter; +import lombok.ToString; + +import java.awt.*; + +import static de.ph87.electro.CONFIG.SUB_RASTER; + +@Getter +@ToString(callSuper = true) +public class ConnectorSub extends Part { + + private final Node node; + + private final Point size = new Point(SUB_RASTER, SUB_RASTER); + + public ConnectorSub(final Point position) { + super("", position); + node = addNode("", SUB_RASTER / 2, SUB_RASTER / 2); + } + + public ConnectorSub(final ConnectorSubDto dto) { + super(dto); + node = addNode(dto.getNode(), SUB_RASTER / 2, SUB_RASTER / 2); + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddleDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorSubDto.java similarity index 64% rename from src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddleDto.java rename to src/main/java/de/ph87/electro/circuit/part/parts/ConnectorSubDto.java index a0bcfc4..33a7312 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorMiddleDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/ConnectorSubDto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; @@ -9,11 +9,11 @@ import lombok.ToString; @Getter @ToString @NoArgsConstructor -public class ConnectorMiddleDto extends PartDto { +public class ConnectorSubDto extends PartDto { private NodeDto node; - public ConnectorMiddleDto(final ConnectorMiddle part) { + public ConnectorSubDto(final ConnectorSub part) { node = new NodeDto(part.getNode()); } diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Light.java b/src/main/java/de/ph87/electro/circuit/part/parts/Light.java index b2ac87e..4e88875 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Light.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Light.java @@ -3,7 +3,7 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.ToString; @@ -24,9 +24,11 @@ public class Light extends Part { private static final Color BULB_OFF_COLOR = Color.DARK_GRAY; - private final PartNode a; + private final Point size = new Point(RASTER, RASTER); - private final PartNode b; + private final Node a; + + private final Node b; private double resistance = 15; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/LightDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/LightDto.java index fcc113b..bb683f2 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/LightDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/LightDto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java b/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java index 2fb7232..f08a444 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Poti.java @@ -1,8 +1,8 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.NonNull; import lombok.Setter; @@ -28,6 +28,8 @@ public class Poti extends Part { @NonNull private final Node end; + private final Point size = new Point(RASTER, RASTER); + @Setter private double resistance = 10; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/PotiDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/PotiDto.java index 00bb533..7427c63 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/PotiDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/PotiDto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java index a46df1d..8bd2546 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1.java @@ -2,7 +2,7 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.ToString; @@ -18,9 +18,11 @@ public class Switch1x1 extends Part { private static final Point END = new Point(P90, P25); - private final PartNode common; + private final Point size = new Point(RASTER, RASTER); - private final PartNode output; + private final Node common; + + private final Node output; private boolean state = false; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1Dto.java b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1Dto.java index 8752b5a..1f34a4d 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1Dto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x1Dto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java index 117a9c3..eaccefe 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2.java @@ -2,7 +2,7 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.ToString; @@ -16,11 +16,13 @@ import static de.ph87.electro.circuit.CircuitPainter.drawLine; @ToString(callSuper = true) public class Switch1x2 extends Part { - private final PartNode common; + private final Point size = new Point(RASTER, RASTER); - private final PartNode output0; + private final Node common; - private final PartNode output1; + private final Node output0; + + private final Node output1; private boolean state = false; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2Dto.java b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2Dto.java index ffdcb27..b520f58 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2Dto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Switch1x2Dto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java b/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java index e7134b5..a1f3738 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCross.java @@ -2,7 +2,7 @@ package de.ph87.electro.circuit.part.parts; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.ToString; @@ -16,13 +16,15 @@ import static de.ph87.electro.circuit.CircuitPainter.drawLine; @ToString(callSuper = true) public class SwitchCross extends Part { - private final PartNode common0; + private final Point size = new Point(RASTER, RASTER); - private final PartNode common1; + private final Node common0; - private final PartNode output0; + private final Node common1; - private final PartNode output1; + private final Node output0; + + private final Node output1; private boolean state = false; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCrossDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCrossDto.java index 68418fd..8055163 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCrossDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/SwitchCrossDto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java b/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java index 4ba48b2..447a1a3 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/Voltmeter.java @@ -1,9 +1,9 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.Node; import de.ph87.electro.circuit.part.InnerConnection; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.Node; import de.ph87.electro.common.RotationMatrix; import lombok.Getter; import lombok.Setter; @@ -30,6 +30,8 @@ public class Voltmeter extends Part { private static final double DEGREES_RANGE = 90; + private final Point size = new Point(RASTER, RASTER); + private final Node a; private final Node b; diff --git a/src/main/java/de/ph87/electro/circuit/part/parts/VoltmeterDto.java b/src/main/java/de/ph87/electro/circuit/part/parts/VoltmeterDto.java index 942c72d..1fe7c50 100644 --- a/src/main/java/de/ph87/electro/circuit/part/parts/VoltmeterDto.java +++ b/src/main/java/de/ph87/electro/circuit/part/parts/VoltmeterDto.java @@ -1,7 +1,7 @@ package de.ph87.electro.circuit.part.parts; -import de.ph87.electro.circuit.node.NodeDto; import de.ph87.electro.circuit.part.PartDto; +import de.ph87.electro.circuit.part.node.NodeDto; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; diff --git a/src/main/java/de/ph87/electro/circuit/wire/Wire.java b/src/main/java/de/ph87/electro/circuit/wire/Wire.java index 30cbaae..d3bb87c 100644 --- a/src/main/java/de/ph87/electro/circuit/wire/Wire.java +++ b/src/main/java/de/ph87/electro/circuit/wire/Wire.java @@ -1,6 +1,6 @@ package de.ph87.electro.circuit.wire; -import de.ph87.electro.circuit.node.Node; +import de.ph87.electro.circuit.part.node.Node; import lombok.Getter; import lombok.NonNull; import lombok.Setter; @@ -12,20 +12,22 @@ import java.awt.geom.Rectangle2D; import static de.ph87.electro.CONFIG.*; import static java.lang.Math.*; +@Getter @ToString public class Wire { - @Getter @NonNull private final Node a; - @Getter @NonNull private final Node b; @Setter private double current = Double.NaN; + @Setter + private boolean ghost = false; + public Wire(@NonNull final Node a, @NonNull final Node b) { this.a = a; this.b = b; @@ -68,7 +70,9 @@ public class Wire { } public void draw(final Graphics2D g) { - g.setColor(a.getColor()); + final Color color = ghost ? new Color(a.getColor().getRed(), a.getColor().getGreen(), a.getColor().getBlue(), 64) : a.getColor(); + + g.setColor(color); g.setStroke(WIRE_STROKE); g.drawLine(a.getPosition().x, a.getPosition().y, b.getPosition().x, b.getPosition().y); diff --git a/src/main/java/de/ph87/electro/sidebar/Sidebar.java b/src/main/java/de/ph87/electro/sidebar/Sidebar.java index b547349..a37bfff 100644 --- a/src/main/java/de/ph87/electro/sidebar/Sidebar.java +++ b/src/main/java/de/ph87/electro/sidebar/Sidebar.java @@ -23,9 +23,6 @@ public class Sidebar extends JPanel { final Point ZERO = new Point(); addPart(new Battery(ZERO)); - addPart(new ConnectorCorner(ZERO)); - addPart(new ConnectorEdge(ZERO)); - addPart(new ConnectorMiddle(ZERO)); addPart(new Light(ZERO)); addPart(new Switch1x1(ZERO)); addPart(new Switch1x2(ZERO)); diff --git a/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java b/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java index 8b26cf0..a6fbdb6 100644 --- a/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java +++ b/src/test/java/de/ph87/electro/circuit/CalculationServiceTest.java @@ -1,8 +1,7 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.calculation.Calculation; -import de.ph87.electro.circuit.node.Node; -import de.ph87.electro.circuit.part.PartNode; +import de.ph87.electro.circuit.part.node.Node; import de.ph87.electro.circuit.part.parts.Battery; import de.ph87.electro.circuit.part.parts.Light; import de.ph87.electro.circuit.wire.Wire; @@ -31,7 +30,7 @@ class CalculationServiceTest { log.info(" \"%s\" = %.2f V".formatted(node.getName(), node.getVoltage())); for (final Wire wire : node.getWires()) { final Node opposite = wire.getOpposite(node); - final String partName = opposite instanceof final PartNode partNode ? partNode.getPart().getName() : ""; + final String partName = opposite instanceof final Node partNode ? partNode.getPart().getName() : ""; log.info(" -> %s.%s = %.2f A".formatted(partName, opposite.getName(), wire.getCurrent(node))); } } diff --git a/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java b/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java index 4d67fab..5d13b9f 100644 --- a/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java +++ b/src/test/java/de/ph87/electro/circuit/io/CircuitIOServiceTest.java @@ -2,9 +2,8 @@ package de.ph87.electro.circuit.io; import de.ph87.electro.circuit.Circuit; import de.ph87.electro.circuit.CircuitIOService; -import de.ph87.electro.circuit.node.Node; +import de.ph87.electro.circuit.part.node.Node; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartNode; import de.ph87.electro.circuit.part.parts.Battery; import de.ph87.electro.circuit.part.parts.Light; import org.junit.jupiter.api.Test; @@ -66,9 +65,9 @@ class CircuitIOServiceTest { System.out.printf(" - Destinations: %s\n", originalDestination.getUuid()); final Node reloadedDestination = reloadedNode.getWires().stream().map(wire -> wire.getOpposite(reloadedNode)).filter(destination -> destination.getUuid().equals(originalDestination.getUuid())).findFirst().orElseThrow(); assertEquals(originalDestination.getUuid(), reloadedDestination.getUuid()); - assertInstanceOf(PartNode.class, originalDestination); - assertInstanceOf(PartNode.class, reloadedDestination); - assertEquals(((PartNode) originalDestination).getPart().getUuid(), ((PartNode) reloadedDestination).getPart().getUuid()); + assertInstanceOf(Node.class, originalDestination); + assertInstanceOf(Node.class, reloadedDestination); + assertEquals(originalDestination.getPart().getUuid(), reloadedDestination.getPart().getUuid()); } ); }