implemented bridge

This commit is contained in:
Stephan Richter
2020-11-30 19:57:59 +01:00
parent 1bfcc3da5f
commit aaeddd0a82
13 changed files with 225 additions and 3 deletions

View File

@@ -40,6 +40,11 @@ import de.srsoftware.web4rail.tags.Table;
import de.srsoftware.web4rail.tiles.Block;
import de.srsoftware.web4rail.tiles.BlockH;
import de.srsoftware.web4rail.tiles.BlockV;
import de.srsoftware.web4rail.tiles.Bridge;
import de.srsoftware.web4rail.tiles.BridgeE;
import de.srsoftware.web4rail.tiles.BridgeN;
import de.srsoftware.web4rail.tiles.BridgeS;
import de.srsoftware.web4rail.tiles.BridgeW;
import de.srsoftware.web4rail.tiles.Contact;
import de.srsoftware.web4rail.tiles.ContactH;
import de.srsoftware.web4rail.tiles.ContactV;
@@ -171,6 +176,10 @@ public class Plan extends BaseClass{
return analyze();
case ACTION_CLICK:
return click(get(params.get(ID),true));
case ACTION_CONNECT:
Tile tile = get(params.get(ID), false);
if (tile instanceof Bridge) return ((Bridge)tile).requestConnect();
break;
case ACTION_MOVE:
return moveTile(params.get(DIRECTION),params.get(ID));
case ACTION_PROPS:
@@ -248,6 +257,9 @@ public class Plan extends BaseClass{
private String analyze() {
Vector<Route> routes = new Vector<Route>();
for (Block block : blocks) {
if (block.name.equals("Huhu")) {
System.err.println("Here we go!");
}
for (Connector con : block.startPoints()) {
routes.addAll(follow(new Route().begin(block,con.from.inverse()),con));
}
@@ -859,6 +871,10 @@ public class Plan extends BaseClass{
new CrossV().tag(null).addTo(tiles);
new CrossH().tag(null).addTo(tiles);
new CrossPlus().tag(null).addTo(tiles);
new BridgeE().tag(null).addTo(tiles);
new BridgeN().tag(null).addTo(tiles);
new BridgeS().tag(null).addTo(tiles);
new BridgeW().tag(null).addTo(tiles);
new StraightH().tag(null).addTo(tiles);
new StraightV().tag(null).addTo(tiles);
new ContactH().tag(null).addTo(tiles);

View File

@@ -367,14 +367,14 @@ public class Route extends BaseClass implements Comparable<Route>{
return true;
}
public Route begin(Block block,Direction from) {
public Route begin(Block block,Direction to) {
// add those fields to clone, too!
contacts = new Vector<Contact>();
signals = new Vector<Signal>();
path = new Vector<Tile>();
turnouts = new HashMap<>();
startBlock = block;
startDirection = from;
startDirection = to;
path.add(block);
return this;
}

View File

@@ -0,0 +1,59 @@
package de.srsoftware.web4rail.tiles;
import java.io.IOException;
import java.util.Map;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tiles.Turnout.State;
public abstract class Bridge extends Tile {
private static Bridge pendingConnection = null;
protected Bridge counterpart = null;
@Override
public Object click() throws IOException {
if (pendingConnection != null) return connect();
return super.click();
}
private Object connect() {
if (this == pendingConnection) return t("Cannot connect {} to itself!",this);
if (isSet(counterpart)) {
counterpart.counterpart = null; // drop other connection
plan.place(counterpart);
}
counterpart = pendingConnection;
counterpart.counterpart = this;
pendingConnection = null;
plan.place(this);
plan.place(counterpart);
return t("Connected {} and {}.",this,counterpart);
}
protected abstract Connector connector();
@Override
public Window propMenu() {
Window win = super.propMenu();
Map<String, String> props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_CONNECT);
new Tag("h4").content("Counterpart").addTo(win);
new Tag("p").content(isSet(counterpart) ? t("Connected to {}.",counterpart) : t("Not connected to other bridge part!")).addTo(win);
new Button(t("Select counterpart"), props).addTo(win);
return win;
}
public Object requestConnect() {
pendingConnection = this;
return t("Click other bridge to connect to!");
}
@Override
public Tag tag(Map<String, Object> replacements) throws IOException {
Tag tag = super.tag(replacements);
if (isNull(counterpart)) tag.clazz(tag.get("class")+" disconnected");
return tag;
}
}

View File

@@ -0,0 +1,30 @@
package de.srsoftware.web4rail.tiles;
import java.util.List;
import java.util.Map;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.tiles.Turnout.State;
public class BridgeE extends Bridge {
@Override
public List<Direction> possibleDirections() {
return List.of(Direction.EAST);
}
@Override
public Map<Connector, State> connections(Direction from) {
if (isSet(counterpart)) switch (from) {
case EAST:
return Map.of(counterpart.connector(),State.UNDEF);
default:
}
return super.connections(from);
}
@Override
protected Connector connector() {
return new Connector(x+1, y, Direction.WEST);
}
}

View File

@@ -0,0 +1,30 @@
package de.srsoftware.web4rail.tiles;
import java.util.List;
import java.util.Map;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.tiles.Turnout.State;
public class BridgeN extends Bridge {
@Override
public List<Direction> possibleDirections() {
return List.of(Direction.NORTH);
}
@Override
public Map<Connector, State> connections(Direction from) {
if (isSet(counterpart)) switch (from) {
case NORTH:
return Map.of(counterpart.connector(),State.UNDEF);
default:
}
return super.connections(from);
}
@Override
protected Connector connector() {
return new Connector(x, y-1, Direction.SOUTH);
}
}

View File

@@ -0,0 +1,30 @@
package de.srsoftware.web4rail.tiles;
import java.util.List;
import java.util.Map;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.tiles.Turnout.State;
public class BridgeS extends Bridge {
@Override
public List<Direction> possibleDirections() {
return List.of(Direction.SOUTH);
}
@Override
public Map<Connector, State> connections(Direction from) {
if (isSet(counterpart)) switch (from) {
case SOUTH:
return Map.of(counterpart.connector(),State.UNDEF);
default:
}
return super.connections(from);
}
@Override
protected Connector connector() {
return new Connector(x, y+1, Direction.NORTH);
}
}

View File

@@ -0,0 +1,31 @@
package de.srsoftware.web4rail.tiles;
import java.util.List;
import java.util.Map;
import de.srsoftware.web4rail.Connector;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.tiles.Turnout.State;
public class BridgeW extends Bridge {
@Override
public List<Direction> possibleDirections() {
return List.of(Direction.WEST);
}
@Override
public Map<Connector, State> connections(Direction from) {
if (isSet(counterpart))
switch (from) {
case WEST:
return Map.of(counterpart.connector(), State.UNDEF);
default:
}
return super.connections(from);
}
@Override
protected Connector connector() {
return new Connector(x - 1, y, Direction.EAST);
}
}