diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 6a11e0e..2d61ccc 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -92,24 +92,22 @@ public class Plan { private String analyze() { Vector routes = new Vector(); for (Block block : blocks) { - LOG.debug("searching routes from {}",block); - for (Connector con : block.startPoints()) { - routes.addAll(follow(new Route().start(block),con)); - } + for (Connector con : block.startPoints()) routes.addAll(follow(new Route().start(block),con)); } + for (Route r : routes) LOG.debug("found route: {}",r); return "analyze() not implemented, yet!"; } - private Collection follow(Route route, Connector con) { - LOG.debug("follow({}, {})",route,con); + private Collection follow(Route route, Connector con) { Tile tile = get(con.x(),con.y()); - Vector result = new Vector<>(); - if (tile == null) return result; - route.add(tile); + Vector results = new Vector<>(); + if (tile == null) return results; + Tile added = route.add(tile instanceof Shadow ? ((Shadow)tile).overlay() : tile); + if (added instanceof Block) return List.of(route); List connectors = tile.connections(con.from()); Listroutes = route.multiply(connectors.size()); - for (int i=0; i path; - public void add(Tile tile) { + public Tile add(Tile tile) { path.add(tile); + return tile; } protected Route clone() { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Cross.java b/src/main/java/de/srsoftware/web4rail/tiles/Cross.java new file mode 100644 index 0000000..567f081 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/tiles/Cross.java @@ -0,0 +1,9 @@ +package de.srsoftware.web4rail.tiles; + +import java.util.List; + +import de.srsoftware.web4rail.Connector; + +public abstract class Cross extends Tile { + public abstract List offsetConnections(String from); +} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java b/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java index 1351ca2..4a42768 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/CrossH.java @@ -1,17 +1,43 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; +import java.util.List; import java.util.Map; +import java.util.Vector; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; -public class CrossH extends Tile{ +public class CrossH extends Cross{ + + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x+1,y+1,Plan.NORTH)); + case Plan.SOUTH: + return List.of(new Connector(x+1,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } @Override public int len() { return 2; } + @Override + public List offsetConnections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x,y+1,Plan.NORTH)); + case Plan.SOUTH: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); +} + @Override public Tag tag(Map replacements) throws IOException { return super.tag(replacements).size(200,100).attr("viewbox", "0 0 200 100"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java b/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java index 3d09f1b..5691e42 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/CrossV.java @@ -1,17 +1,24 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; +import java.util.List; import java.util.Map; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Connector; -public class CrossV extends Tile{ +public class CrossV extends Cross{ @Override public int height() { return 2; } + @Override + public List offsetConnections(String from) { + return null; + } + @Override public Tag tag(Map replacements) throws IOException { return super.tag(replacements).size(100,200).attr("viewbox", "0 0 100 200"); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java index 26b6c2d..351c0af 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagNE.java @@ -1,5 +1,21 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class DiagNE extends Tile{ + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x+1,y,Plan.WEST)); + case Plan.EAST: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java b/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java index 6ed33f6..7fc8450 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/DiagSW.java @@ -1,5 +1,20 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class DiagSW extends Tile{ - + @Override + public List connections(String from) { + switch (from) { + case Plan.SOUTH: + return List.of(new Connector(x-1,y,Plan.EAST)); + case Plan.WEST: + return List.of(new Connector(x,y+1,Plan.NORTH)); + } + return new Vector<>(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java index a11b540..4f32cca 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Shadow.java @@ -1,8 +1,19 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; + +import de.srsoftware.web4rail.Connector; + public class Shadow extends Tile{ private Tile overlay; + + @Override + public List connections(String from) { + if (overlay instanceof StretchableTile) return overlay.connections(from); + if (overlay instanceof Cross) return ((Cross)overlay).offsetConnections(from); + return super.connections(from); + } public Shadow(Tile overlay) { this.overlay = overlay; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java index 947e7cc..60bf19c 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java @@ -1,7 +1,24 @@ package de.srsoftware.web4rail.tiles; +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; + public class StraightV extends StretchableTile{ + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x,y+height(),from)); + case Plan.SOUTH: + return List.of(new Connector(x,y-1,from)); + } + return new Vector<>(); + } + @Override public int height() { return length; diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java index 95ba0bf..e8cd1a2 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutNW.java @@ -1,6 +1,22 @@ package de.srsoftware.web4rail.tiles; -public class TurnoutNW extends Turnout{ +import java.util.List; +import java.util.Vector; + +import de.srsoftware.web4rail.Connector; +import de.srsoftware.web4rail.Plan; +public class TurnoutNW extends Turnout{ + @Override + public List connections(String from) { + switch (from) { + case Plan.NORTH: + return List.of(new Connector(x-1,y,Plan.EAST),new Connector(x, y+1, Plan.NORTH)); + case Plan.WEST: + case Plan.SOUTH: + return List.of(new Connector(x,y-1,Plan.SOUTH)); + } + return new Vector<>(); + } }