kopia lustrzana https://github.com/JOSM/MapWithAI
Move dupe/conn commands out to make it easier to add new commands
Signed-off-by: Taylor Smock <taylor.smock@kaart.com>pull/1/head
rodzic
0292641b3f
commit
4e8d4f929f
|
@ -0,0 +1,134 @@
|
||||||
|
// License: GPL. For details, see LICENSE file.
|
||||||
|
package org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation;
|
||||||
|
|
||||||
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.openstreetmap.josm.command.Command;
|
||||||
|
import org.openstreetmap.josm.data.osm.DataSet;
|
||||||
|
import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
||||||
|
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
|
||||||
|
import org.openstreetmap.josm.data.osm.PrimitiveId;
|
||||||
|
import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
|
||||||
|
import org.openstreetmap.josm.gui.MainApplication;
|
||||||
|
import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
|
||||||
|
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
||||||
|
import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
||||||
|
import org.openstreetmap.josm.tools.Pair;
|
||||||
|
|
||||||
|
public abstract class AbstractConflationCommand extends Command {
|
||||||
|
Collection<OsmPrimitive> possiblyAffectedPrimitives;
|
||||||
|
public AbstractConflationCommand(DataSet data) {
|
||||||
|
super(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
|
||||||
|
Collection<OsmPrimitive> added) {
|
||||||
|
// Do nothing -- the sequence commands should take care of it.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The types of primitive that the command is interested in
|
||||||
|
*/
|
||||||
|
public abstract Collection<Class<? extends OsmPrimitive>> getInterestedTypes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The key that the command is interested in
|
||||||
|
*/
|
||||||
|
public abstract String getKey();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param primitives The primitives to run the command on
|
||||||
|
* @return The command that will be run
|
||||||
|
*/
|
||||||
|
public Command getCommand(List<OsmPrimitive> primitives) {
|
||||||
|
possiblyAffectedPrimitives = primitives.stream().distinct().collect(Collectors.toList());
|
||||||
|
return getRealCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The command to do whatever is required for the result
|
||||||
|
*/
|
||||||
|
public abstract Command getRealCommand();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the primitives from a dataset with specified ids
|
||||||
|
*
|
||||||
|
* @param dataSet The dataset holding the primitives (hopefully)
|
||||||
|
* @param ids The ids formated like
|
||||||
|
* n<NUMBER>,r<NUMBER>,w<NUMBER>
|
||||||
|
* @return The primitives that the ids point to, if in the dataset.
|
||||||
|
*/
|
||||||
|
public static OsmPrimitive[] getPrimitives(DataSet dataSet, String ids) {
|
||||||
|
final Map<Integer, Pair<Long, OsmPrimitiveType>> missingPrimitives = new TreeMap<>();
|
||||||
|
final String[] connections = ids.split(",", -1);
|
||||||
|
final OsmPrimitive[] primitiveConnections = new OsmPrimitive[connections.length];
|
||||||
|
for (int i = 0; i < connections.length; i++) {
|
||||||
|
final String member = connections[i];
|
||||||
|
final long id = Long.parseLong(member.substring(1));
|
||||||
|
final char firstChar = member.charAt(0);
|
||||||
|
OsmPrimitiveType type = null;
|
||||||
|
if (firstChar == 'w') {
|
||||||
|
type = OsmPrimitiveType.WAY;
|
||||||
|
} else if (firstChar == 'n') {
|
||||||
|
type = OsmPrimitiveType.NODE;
|
||||||
|
} else if (firstChar == 'r') {
|
||||||
|
type = OsmPrimitiveType.RELATION;
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
tr("{0}: We don't know how to handle {1} types", MapWithAIPlugin.NAME, firstChar));
|
||||||
|
}
|
||||||
|
primitiveConnections[i] = dataSet.getPrimitiveById(id, type);
|
||||||
|
if (primitiveConnections[i] == null) {
|
||||||
|
missingPrimitives.put(i, new Pair<>(id, type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
obtainMissingPrimitives(dataSet, primitiveConnections, missingPrimitives);
|
||||||
|
return primitiveConnections;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void obtainMissingPrimitives(DataSet dataSet, OsmPrimitive[] primitiveConnections,
|
||||||
|
Map<Integer, Pair<Long, OsmPrimitiveType>> missingPrimitives) {
|
||||||
|
if (!missingPrimitives.isEmpty()) {
|
||||||
|
final Map<PrimitiveId, Integer> ids = missingPrimitives.entrySet().stream().collect(Collectors
|
||||||
|
.toMap(entry -> new SimplePrimitiveId(entry.getValue().a, entry.getValue().b), Entry::getKey));
|
||||||
|
final List<PrimitiveId> toFetch = new ArrayList<>(ids.keySet());
|
||||||
|
final Optional<OsmDataLayer> optionalLayer = MainApplication.getLayerManager()
|
||||||
|
.getLayersOfType(OsmDataLayer.class).parallelStream()
|
||||||
|
.filter(layer -> layer.getDataSet().equals(dataSet)).findFirst();
|
||||||
|
|
||||||
|
OsmDataLayer layer;
|
||||||
|
final String generatedLayerName = "EvKlVarShAiAllsM generated layer";
|
||||||
|
if (optionalLayer.isPresent()) {
|
||||||
|
layer = optionalLayer.get();
|
||||||
|
} else {
|
||||||
|
layer = new OsmDataLayer(dataSet, generatedLayerName, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(
|
||||||
|
tr("Downloading additional OsmPrimitives"));
|
||||||
|
final DownloadPrimitivesTask downloadPrimitivesTask = new DownloadPrimitivesTask(layer, toFetch, true,
|
||||||
|
monitor);
|
||||||
|
downloadPrimitivesTask.run();
|
||||||
|
for (final Entry<PrimitiveId, Integer> entry : ids.entrySet()) {
|
||||||
|
final int index = entry.getValue().intValue();
|
||||||
|
final OsmPrimitive primitive = dataSet.getPrimitiveById(entry.getKey());
|
||||||
|
primitiveConnections[index] = primitive;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (generatedLayerName.equals(layer.getName())) {
|
||||||
|
layer.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
// License: GPL. For details, see LICENSE file.
|
||||||
|
package org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation;
|
||||||
|
|
||||||
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.openstreetmap.josm.command.ChangePropertyCommand;
|
||||||
|
import org.openstreetmap.josm.command.Command;
|
||||||
|
import org.openstreetmap.josm.command.SequenceCommand;
|
||||||
|
import org.openstreetmap.josm.data.osm.DataSet;
|
||||||
|
import org.openstreetmap.josm.data.osm.Node;
|
||||||
|
import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
||||||
|
import org.openstreetmap.josm.data.osm.Way;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.commands.AddNodeToWayCommand;
|
||||||
|
import org.openstreetmap.josm.tools.Geometry;
|
||||||
|
import org.openstreetmap.josm.tools.Logging;
|
||||||
|
|
||||||
|
public class ConnectedCommand extends AbstractConflationCommand {
|
||||||
|
public static final String CONN_KEY = "conn";
|
||||||
|
|
||||||
|
public ConnectedCommand(DataSet data) {
|
||||||
|
super(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescriptionText() {
|
||||||
|
return tr("Connect nodes to ways");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a node to a way
|
||||||
|
*
|
||||||
|
* @param toAddNode The node to add
|
||||||
|
* @param way The way to add the node to
|
||||||
|
* @param first The first node in a waysegment (the node is between this and
|
||||||
|
* the second node)
|
||||||
|
* @param second The second node in a waysegment
|
||||||
|
* @return Command to add a node to a way, or null if it won't be done
|
||||||
|
*/
|
||||||
|
public static Command addNodesToWay(Node toAddNode, Way way, Node first, Node second) {
|
||||||
|
Command tCommand = null;
|
||||||
|
final Way tWay = new Way();
|
||||||
|
tWay.addNode(first);
|
||||||
|
tWay.addNode(second);
|
||||||
|
final double distance = Geometry.getDistanceWayNode(tWay, toAddNode);
|
||||||
|
if (distance < 5) {
|
||||||
|
tCommand = new AddNodeToWayCommand(toAddNode, way, first, second);
|
||||||
|
}
|
||||||
|
return tCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Command> connectedCommand(DataSet dataSet, Node node) {
|
||||||
|
final List<Command> commands = new ArrayList<>();
|
||||||
|
final OsmPrimitive[] primitiveConnections = getPrimitives(dataSet, node.get(CONN_KEY));
|
||||||
|
for (int i = 0; i < primitiveConnections.length / 3; i++) {
|
||||||
|
if (primitiveConnections[i] instanceof Way && primitiveConnections[i + 1] instanceof Node
|
||||||
|
&& primitiveConnections[i + 2] instanceof Node) {
|
||||||
|
final Command addNodesToWayCommand = addNodesToWay(node, (Way) primitiveConnections[i],
|
||||||
|
(Node) primitiveConnections[i + 1], (Node) primitiveConnections[i + 2]);
|
||||||
|
if (addNodesToWayCommand != null) {
|
||||||
|
commands.add(addNodesToWayCommand);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Logging.error("{0}: {1}, {2}: {3}, {4}: {5}", i, primitiveConnections[i].getClass(), i + 1,
|
||||||
|
primitiveConnections[i + 1].getClass(), i + 2, primitiveConnections[i + 2].getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
commands.add(new ChangePropertyCommand(node, CONN_KEY, null));
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Class<? extends OsmPrimitive>> getInterestedTypes() {
|
||||||
|
return Arrays.asList(Node.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return CONN_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Command getRealCommand() {
|
||||||
|
List<Command> commands = new ArrayList<>();
|
||||||
|
possiblyAffectedPrimitives.stream().filter(Node.class::isInstance).map(Node.class::cast)
|
||||||
|
.forEach(node -> commands.addAll(connectedCommand(getAffectedDataSet(), node)));
|
||||||
|
Command returnCommand;
|
||||||
|
if (!commands.isEmpty()) {
|
||||||
|
returnCommand = new SequenceCommand(getDescriptionText(), commands);
|
||||||
|
} else {
|
||||||
|
returnCommand = null;
|
||||||
|
}
|
||||||
|
return returnCommand;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
// License: GPL. For details, see LICENSE file.
|
||||||
|
package org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation;
|
||||||
|
|
||||||
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.openstreetmap.josm.actions.MergeNodesAction;
|
||||||
|
import org.openstreetmap.josm.command.ChangePropertyCommand;
|
||||||
|
import org.openstreetmap.josm.command.Command;
|
||||||
|
import org.openstreetmap.josm.command.SequenceCommand;
|
||||||
|
import org.openstreetmap.josm.data.osm.DataSet;
|
||||||
|
import org.openstreetmap.josm.data.osm.Node;
|
||||||
|
import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
||||||
|
import org.openstreetmap.josm.tools.Logging;
|
||||||
|
|
||||||
|
public class DuplicateCommand extends AbstractConflationCommand {
|
||||||
|
public static final String DUPE_KEY = "dupe";
|
||||||
|
|
||||||
|
public DuplicateCommand(DataSet data) {
|
||||||
|
super(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Command> duplicateNode(DataSet dataSet, Node node) {
|
||||||
|
final OsmPrimitive[] primitiveConnections = getPrimitives(dataSet, node.get(DUPE_KEY));
|
||||||
|
if (primitiveConnections.length != 1) {
|
||||||
|
Logging.error("{0}: {3} connection connected to more than one node? ({3}={1})", MapWithAIPlugin.NAME,
|
||||||
|
node.get(DUPE_KEY), DUPE_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<Command> commands = new ArrayList<>();
|
||||||
|
if (primitiveConnections[0] instanceof Node) {
|
||||||
|
final Node replaceNode = (Node) primitiveConnections[0];
|
||||||
|
final Command tCommand = replaceNode(node, replaceNode);
|
||||||
|
if (tCommand != null) {
|
||||||
|
commands.add(tCommand);
|
||||||
|
if (replaceNode.hasKey(DUPE_KEY)) {
|
||||||
|
final String key = replaceNode.get(DUPE_KEY);
|
||||||
|
commands.add(new ChangePropertyCommand(replaceNode, DUPE_KEY, key));
|
||||||
|
} else {
|
||||||
|
replaceNode.put(DUPE_KEY, "empty_value"); // This is needed to actually have a command.
|
||||||
|
commands.add(new ChangePropertyCommand(replaceNode, DUPE_KEY, null));
|
||||||
|
replaceNode.remove(DUPE_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace nodes that are in the same location
|
||||||
|
*
|
||||||
|
* @param original The original node (the one to replace)
|
||||||
|
* @param newNode The node that is replacing the original node
|
||||||
|
* @return A command that replaces the node, or null if they are not at the same
|
||||||
|
* location.
|
||||||
|
*/
|
||||||
|
public static Command replaceNode(Node original, Node newNode) {
|
||||||
|
Command tCommand = null;
|
||||||
|
if (original.getCoor().equalsEpsilon(newNode.getCoor())) {
|
||||||
|
tCommand = MergeNodesAction.mergeNodes(Arrays.asList(original), newNode, newNode);
|
||||||
|
}
|
||||||
|
return tCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDescriptionText() {
|
||||||
|
return tr("Remove duplicated nodes");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Class<? extends OsmPrimitive>> getInterestedTypes() {
|
||||||
|
return Arrays.asList(Node.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return DUPE_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Command getRealCommand() {
|
||||||
|
List<Command> commands = new ArrayList<>();
|
||||||
|
possiblyAffectedPrimitives.stream().filter(Node.class::isInstance).map(Node.class::cast)
|
||||||
|
.filter(node -> node.hasKey(DUPE_KEY))
|
||||||
|
.forEach(node -> commands.addAll(duplicateNode(getAffectedDataSet(), node)));
|
||||||
|
Command returnCommand;
|
||||||
|
if (!commands.isEmpty()) {
|
||||||
|
returnCommand = new SequenceCommand(getDescriptionText(), commands);
|
||||||
|
} else {
|
||||||
|
returnCommand = null;
|
||||||
|
}
|
||||||
|
return returnCommand;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,43 +3,34 @@ package org.openstreetmap.josm.plugins.mapwithai.commands;
|
||||||
|
|
||||||
import static org.openstreetmap.josm.tools.I18n.tr;
|
import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.TreeSet;
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.openstreetmap.josm.actions.MergeNodesAction;
|
|
||||||
import org.openstreetmap.josm.command.ChangePropertyCommand;
|
|
||||||
import org.openstreetmap.josm.command.Command;
|
import org.openstreetmap.josm.command.Command;
|
||||||
import org.openstreetmap.josm.command.SequenceCommand;
|
import org.openstreetmap.josm.command.SequenceCommand;
|
||||||
import org.openstreetmap.josm.data.osm.DataSet;
|
import org.openstreetmap.josm.data.osm.DataSet;
|
||||||
import org.openstreetmap.josm.data.osm.Node;
|
|
||||||
import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
||||||
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
|
|
||||||
import org.openstreetmap.josm.data.osm.PrimitiveId;
|
|
||||||
import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
|
|
||||||
import org.openstreetmap.josm.data.osm.Way;
|
|
||||||
import org.openstreetmap.josm.gui.MainApplication;
|
|
||||||
import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
|
|
||||||
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
|
||||||
import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
|
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
||||||
import org.openstreetmap.josm.tools.Geometry;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.AbstractConflationCommand;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.ConnectedCommand;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.DuplicateCommand;
|
||||||
import org.openstreetmap.josm.tools.Logging;
|
import org.openstreetmap.josm.tools.Logging;
|
||||||
import org.openstreetmap.josm.tools.Pair;
|
|
||||||
import org.openstreetmap.josm.tools.Utils;
|
import org.openstreetmap.josm.tools.Utils;
|
||||||
|
|
||||||
public class CreateConnectionsCommand extends Command {
|
public class CreateConnectionsCommand extends Command {
|
||||||
private final Collection<OsmPrimitive> primitives;
|
private final Collection<OsmPrimitive> primitives;
|
||||||
public static final String DUPE_KEY = "dupe";
|
|
||||||
public static final String CONN_KEY = "conn";
|
|
||||||
private Command command = null;
|
private Command command = null;
|
||||||
|
private static final List<Class<? extends AbstractConflationCommand>> conflationCommands = new ArrayList<>();
|
||||||
|
static {
|
||||||
|
conflationCommands.add(ConnectedCommand.class);
|
||||||
|
conflationCommands.add(DuplicateCommand.class);
|
||||||
|
}
|
||||||
|
|
||||||
public CreateConnectionsCommand(DataSet data, Collection<OsmPrimitive> primitives) {
|
public CreateConnectionsCommand(DataSet data, Collection<OsmPrimitive> primitives) {
|
||||||
super(data);
|
super(data);
|
||||||
|
@ -48,7 +39,9 @@ public class CreateConnectionsCommand extends Command {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean executeCommand() {
|
public boolean executeCommand() {
|
||||||
command = createConnections(getAffectedDataSet(), primitives);
|
if (command == null) {
|
||||||
|
command = createConnections(getAffectedDataSet(), primitives);
|
||||||
|
}
|
||||||
if (command != null) {
|
if (command != null) {
|
||||||
command.executeCommand();
|
command.executeCommand();
|
||||||
}
|
}
|
||||||
|
@ -72,17 +65,27 @@ public class CreateConnectionsCommand extends Command {
|
||||||
* @return A {@link SequenceCommand} to create connections with
|
* @return A {@link SequenceCommand} to create connections with
|
||||||
*/
|
*/
|
||||||
public static SequenceCommand createConnections(DataSet dataSet, Collection<OsmPrimitive> collection) {
|
public static SequenceCommand createConnections(DataSet dataSet, Collection<OsmPrimitive> collection) {
|
||||||
final Collection<Node> nodes = Utils.filteredCollection(collection, Node.class).stream()
|
|
||||||
.map(dataSet::getPrimitiveById).map(Node.class::cast).filter(Objects::nonNull)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
final List<Command> changedKeyList = new ArrayList<>();
|
final List<Command> changedKeyList = new ArrayList<>();
|
||||||
SequenceCommand returnSequence = null;
|
SequenceCommand returnSequence = null;
|
||||||
for (final Node node : nodes) {
|
final Collection<OsmPrimitive> realPrimitives = collection.stream().map(dataSet::getPrimitiveById)
|
||||||
if (node.hasKey(CONN_KEY)) {
|
.filter(Objects::nonNull).collect(Collectors.toList());
|
||||||
changedKeyList.addAll(connectedCommand(dataSet, node));
|
for (Class<? extends AbstractConflationCommand> abstractCommandClass : getConflationCommands()) {
|
||||||
|
AbstractConflationCommand abstractCommand;
|
||||||
|
try {
|
||||||
|
abstractCommand = abstractCommandClass.getConstructor(DataSet.class).newInstance(dataSet);
|
||||||
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
|
||||||
|
| InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
||||||
|
Logging.debug(e);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (node.hasKey(DUPE_KEY)) {
|
Collection<OsmPrimitive> tPrimitives = new TreeSet<>();
|
||||||
changedKeyList.addAll(duplicateNode(dataSet, node));
|
abstractCommand.getInterestedTypes()
|
||||||
|
.forEach(clazz -> tPrimitives.addAll(Utils.filteredCollection(realPrimitives, clazz)));
|
||||||
|
|
||||||
|
Command actualCommand = abstractCommand.getCommand(tPrimitives.stream()
|
||||||
|
.filter(prim -> prim.hasKey(abstractCommand.getKey())).collect(Collectors.toList()));
|
||||||
|
if (Objects.nonNull(actualCommand)) {
|
||||||
|
changedKeyList.add(actualCommand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!changedKeyList.isEmpty()) {
|
if (!changedKeyList.isEmpty()) {
|
||||||
|
@ -91,160 +94,6 @@ public class CreateConnectionsCommand extends Command {
|
||||||
return returnSequence;
|
return returnSequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Command> connectedCommand(DataSet dataSet, Node node) {
|
|
||||||
final List<Command> commands = new ArrayList<>();
|
|
||||||
final OsmPrimitive[] primitiveConnections = getPrimitives(dataSet, node.get(CONN_KEY));
|
|
||||||
for (int i = 0; i < primitiveConnections.length / 3; i++) {
|
|
||||||
if (primitiveConnections[i] instanceof Way && primitiveConnections[i + 1] instanceof Node
|
|
||||||
&& primitiveConnections[i + 2] instanceof Node) {
|
|
||||||
final Command addNodesToWayCommand = addNodesToWay(node, (Way) primitiveConnections[i],
|
|
||||||
(Node) primitiveConnections[i + 1], (Node) primitiveConnections[i + 2]);
|
|
||||||
if (addNodesToWayCommand != null) {
|
|
||||||
commands.add(addNodesToWayCommand);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Logging.error("{0}: {1}, {2}: {3}, {4}: {5}", i, primitiveConnections[i].getClass(), i + 1,
|
|
||||||
primitiveConnections[i + 1].getClass(), i + 2, primitiveConnections[i + 2].getClass());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
commands.add(new ChangePropertyCommand(node, CONN_KEY, null));
|
|
||||||
return commands;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<Command> duplicateNode(DataSet dataSet, Node node) {
|
|
||||||
final OsmPrimitive[] primitiveConnections = getPrimitives(dataSet, node.get(DUPE_KEY));
|
|
||||||
if (primitiveConnections.length != 1) {
|
|
||||||
Logging.error("{0}: {3} connection connected to more than one node? ({3}={1})", MapWithAIPlugin.NAME,
|
|
||||||
node.get(DUPE_KEY), DUPE_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
final List<Command> commands = new ArrayList<>();
|
|
||||||
if (primitiveConnections[0] instanceof Node) {
|
|
||||||
final Node replaceNode = (Node) primitiveConnections[0];
|
|
||||||
final Command tCommand = replaceNode(node, replaceNode);
|
|
||||||
if (tCommand != null) {
|
|
||||||
commands.add(tCommand);
|
|
||||||
if (replaceNode.hasKey(DUPE_KEY)) {
|
|
||||||
final String key = replaceNode.get(DUPE_KEY);
|
|
||||||
commands.add(new ChangePropertyCommand(replaceNode, DUPE_KEY, key));
|
|
||||||
} else {
|
|
||||||
replaceNode.put(DUPE_KEY, "empty_value"); // This is needed to actually have a command.
|
|
||||||
commands.add(new ChangePropertyCommand(replaceNode, DUPE_KEY, null));
|
|
||||||
replaceNode.remove(DUPE_KEY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return commands;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the primitives from a dataset with specified ids
|
|
||||||
*
|
|
||||||
* @param dataSet The dataset holding the primitives (hopefully)
|
|
||||||
* @param ids The ids formated like
|
|
||||||
* n<NUMBER>,r<NUMBER>,w<NUMBER>
|
|
||||||
* @return The primitives that the ids point to, if in the dataset.
|
|
||||||
*/
|
|
||||||
private static OsmPrimitive[] getPrimitives(DataSet dataSet, String ids) {
|
|
||||||
final Map<Integer, Pair<Long, OsmPrimitiveType>> missingPrimitives = new TreeMap<>();
|
|
||||||
final String[] connections = ids.split(",", -1);
|
|
||||||
final OsmPrimitive[] primitiveConnections = new OsmPrimitive[connections.length];
|
|
||||||
for (int i = 0; i < connections.length; i++) {
|
|
||||||
final String member = connections[i];
|
|
||||||
final long id = Long.parseLong(member.substring(1));
|
|
||||||
final char firstChar = member.charAt(0);
|
|
||||||
OsmPrimitiveType type = null;
|
|
||||||
if (firstChar == 'w') {
|
|
||||||
type = OsmPrimitiveType.WAY;
|
|
||||||
} else if (firstChar == 'n') {
|
|
||||||
type = OsmPrimitiveType.NODE;
|
|
||||||
} else if (firstChar == 'r') {
|
|
||||||
type = OsmPrimitiveType.RELATION;
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
tr("{0}: We don't know how to handle {1} types", MapWithAIPlugin.NAME, firstChar));
|
|
||||||
}
|
|
||||||
primitiveConnections[i] = dataSet.getPrimitiveById(id, type);
|
|
||||||
if (primitiveConnections[i] == null) {
|
|
||||||
missingPrimitives.put(i, new Pair<>(id, type));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
obtainMissingPrimitives(dataSet, primitiveConnections, missingPrimitives);
|
|
||||||
return primitiveConnections;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void obtainMissingPrimitives(DataSet dataSet, OsmPrimitive[] primitiveConnections,
|
|
||||||
Map<Integer, Pair<Long, OsmPrimitiveType>> missingPrimitives) {
|
|
||||||
if (!missingPrimitives.isEmpty()) {
|
|
||||||
final Map<PrimitiveId, Integer> ids = missingPrimitives.entrySet().stream().collect(Collectors
|
|
||||||
.toMap(entry -> new SimplePrimitiveId(entry.getValue().a, entry.getValue().b), Entry::getKey));
|
|
||||||
final List<PrimitiveId> toFetch = new ArrayList<>(ids.keySet());
|
|
||||||
final Optional<OsmDataLayer> optionalLayer = MainApplication.getLayerManager()
|
|
||||||
.getLayersOfType(OsmDataLayer.class).parallelStream()
|
|
||||||
.filter(layer -> layer.getDataSet().equals(dataSet)).findFirst();
|
|
||||||
|
|
||||||
OsmDataLayer layer;
|
|
||||||
final String generatedLayerName = "EvKlVarShAiAllsM generated layer";
|
|
||||||
if (optionalLayer.isPresent()) {
|
|
||||||
layer = optionalLayer.get();
|
|
||||||
} else {
|
|
||||||
layer = new OsmDataLayer(dataSet, generatedLayerName, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(
|
|
||||||
tr("Downloading additional OsmPrimitives"));
|
|
||||||
final DownloadPrimitivesTask downloadPrimitivesTask = new DownloadPrimitivesTask(layer, toFetch, true, monitor);
|
|
||||||
downloadPrimitivesTask.run();
|
|
||||||
for (final Entry<PrimitiveId, Integer> entry : ids.entrySet()) {
|
|
||||||
final int index = entry.getValue().intValue();
|
|
||||||
final OsmPrimitive primitive = dataSet.getPrimitiveById(entry.getKey());
|
|
||||||
primitiveConnections[index] = primitive;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (generatedLayerName.equals(layer.getName())) {
|
|
||||||
layer.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a node to a way
|
|
||||||
*
|
|
||||||
* @param toAddNode The node to add
|
|
||||||
* @param way The way to add the node to
|
|
||||||
* @param first The first node in a waysegment (the node is between this and
|
|
||||||
* the second node)
|
|
||||||
* @param second The second node in a waysegment
|
|
||||||
* @return Command to add a node to a way, or null if it won't be done
|
|
||||||
*/
|
|
||||||
public static Command addNodesToWay(Node toAddNode, Way way, Node first, Node second) {
|
|
||||||
Command tCommand = null;
|
|
||||||
final Way tWay = new Way();
|
|
||||||
tWay.addNode(first);
|
|
||||||
tWay.addNode(second);
|
|
||||||
final double distance = Geometry.getDistanceWayNode(tWay, toAddNode);
|
|
||||||
if (distance < 5) {
|
|
||||||
tCommand = new AddNodeToWayCommand(toAddNode, way, first, second);
|
|
||||||
}
|
|
||||||
return tCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace nodes that are in the same location
|
|
||||||
*
|
|
||||||
* @param original The original node (the one to replace)
|
|
||||||
* @param newNode The node that is replacing the original node
|
|
||||||
* @return A command that replaces the node, or null if they are not at the same
|
|
||||||
* location.
|
|
||||||
*/
|
|
||||||
public static Command replaceNode(Node original, Node newNode) {
|
|
||||||
Command tCommand = null;
|
|
||||||
if (original.getCoor().equalsEpsilon(newNode.getCoor())) {
|
|
||||||
tCommand = MergeNodesAction.mergeNodes(Arrays.asList(original), newNode, newNode);
|
|
||||||
}
|
|
||||||
return tCommand;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescriptionText() {
|
public String getDescriptionText() {
|
||||||
return getRealDescriptionText();
|
return getRealDescriptionText();
|
||||||
|
@ -259,4 +108,18 @@ public class CreateConnectionsCommand extends Command {
|
||||||
Collection<OsmPrimitive> added) {
|
Collection<OsmPrimitive> added) {
|
||||||
command.fillModifiedData(modified, deleted, added);
|
command.fillModifiedData(modified, deleted, added);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param command A command to run when copying data from the MapWithAI layer
|
||||||
|
*/
|
||||||
|
public static void addConflationCommand(Class<? extends AbstractConflationCommand> command) {
|
||||||
|
conflationCommands.add(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A set of commands to run when copying data from the MapWithAI layer
|
||||||
|
*/
|
||||||
|
public static List<Class<? extends AbstractConflationCommand>> getConflationCommands() {
|
||||||
|
return Collections.unmodifiableList(conflationCommands);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,8 @@ import org.openstreetmap.josm.data.osm.Node;
|
||||||
import org.openstreetmap.josm.data.osm.Way;
|
import org.openstreetmap.josm.data.osm.Way;
|
||||||
import org.openstreetmap.josm.gui.MainApplication;
|
import org.openstreetmap.josm.gui.MainApplication;
|
||||||
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.commands.CreateConnectionsCommand;
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.ConnectedCommand;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.DuplicateCommand;
|
||||||
import org.openstreetmap.josm.testutils.JOSMTestRules;
|
import org.openstreetmap.josm.testutils.JOSMTestRules;
|
||||||
|
|
||||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
|
@ -64,37 +65,39 @@ public class MapWithAIMoveActionTest {
|
||||||
@Test
|
@Test
|
||||||
public void testConflationDupeKeyRemoval() {
|
public void testConflationDupeKeyRemoval() {
|
||||||
mapWithAIData.unlock();
|
mapWithAIData.unlock();
|
||||||
way1.lastNode().put(CreateConnectionsCommand.DUPE_KEY, "n" + Long.toString(way2.lastNode().getUniqueId()));
|
way1.lastNode().put(DuplicateCommand.DUPE_KEY, "n" + Long.toString(way2.lastNode().getUniqueId()));
|
||||||
mapWithAIData.lock();
|
mapWithAIData.lock();
|
||||||
mapWithAIData.addSelected(way1);
|
mapWithAIData.addSelected(way1);
|
||||||
final DataSet ds = osmLayer.getDataSet();
|
final DataSet ds = osmLayer.getDataSet();
|
||||||
|
|
||||||
moveAction.actionPerformed(null);
|
moveAction.actionPerformed(null);
|
||||||
Assert.assertFalse(((Way) ds.getPrimitiveById(way2)).lastNode().hasKey(CreateConnectionsCommand.DUPE_KEY));
|
Assert.assertTrue(
|
||||||
Assert.assertFalse(((Way) ds.getPrimitiveById(way1)).lastNode().hasKey(CreateConnectionsCommand.DUPE_KEY));
|
((Way) ds.getPrimitiveById(way1)).lastNode().equals(((Way) ds.getPrimitiveById(way2)).lastNode()));
|
||||||
|
Assert.assertFalse(((Way) ds.getPrimitiveById(way2)).lastNode().hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
|
Assert.assertFalse(((Way) ds.getPrimitiveById(way1)).lastNode().hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
|
|
||||||
UndoRedoHandler.getInstance().undo();
|
UndoRedoHandler.getInstance().undo();
|
||||||
Assert.assertFalse(way2.lastNode().hasKey(CreateConnectionsCommand.DUPE_KEY));
|
Assert.assertFalse(way2.lastNode().hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
Assert.assertTrue(way1.lastNode().hasKey(CreateConnectionsCommand.DUPE_KEY));
|
Assert.assertTrue(way1.lastNode().hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testConflationConnKeyRemoval() {
|
public void testConflationConnKeyRemoval() {
|
||||||
mapWithAIData.unlock();
|
mapWithAIData.unlock();
|
||||||
way1.lastNode().put(CreateConnectionsCommand.CONN_KEY, "w" + Long.toString(way2.getUniqueId()) + ",n"
|
way1.lastNode().put(ConnectedCommand.CONN_KEY, "w" + Long.toString(way2.getUniqueId()) + ",n"
|
||||||
+ Long.toString(way2.lastNode().getUniqueId()) + ",n" + Long.toString(way2.firstNode().getUniqueId()));
|
+ Long.toString(way2.lastNode().getUniqueId()) + ",n" + Long.toString(way2.firstNode().getUniqueId()));
|
||||||
mapWithAIData.lock();
|
mapWithAIData.lock();
|
||||||
mapWithAIData.addSelected(way1);
|
mapWithAIData.addSelected(way1);
|
||||||
|
|
||||||
moveAction.actionPerformed(null);
|
moveAction.actionPerformed(null);
|
||||||
Assert.assertFalse(way2.lastNode().hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertFalse(way2.lastNode().hasKey(ConnectedCommand.CONN_KEY));
|
||||||
Assert.assertFalse(way2.firstNode().hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertFalse(way2.firstNode().hasKey(ConnectedCommand.CONN_KEY));
|
||||||
Assert.assertFalse(way2.getNode(1).hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertFalse(way2.getNode(1).hasKey(ConnectedCommand.CONN_KEY));
|
||||||
Assert.assertTrue(way1.lastNode().isDeleted());
|
Assert.assertTrue(way1.lastNode().isDeleted());
|
||||||
|
|
||||||
UndoRedoHandler.getInstance().undo();
|
UndoRedoHandler.getInstance().undo();
|
||||||
Assert.assertFalse(way2.lastNode().hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertFalse(way2.lastNode().hasKey(ConnectedCommand.CONN_KEY));
|
||||||
Assert.assertTrue(way1.lastNode().hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertTrue(way1.lastNode().hasKey(ConnectedCommand.CONN_KEY));
|
||||||
Assert.assertFalse(way1.lastNode().isDeleted());
|
Assert.assertFalse(way1.lastNode().isDeleted());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
|
||||||
import org.openstreetmap.josm.data.osm.Way;
|
import org.openstreetmap.josm.data.osm.Way;
|
||||||
import org.openstreetmap.josm.gui.MainApplication;
|
import org.openstreetmap.josm.gui.MainApplication;
|
||||||
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.ConnectedCommand;
|
||||||
|
import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.DuplicateCommand;
|
||||||
import org.openstreetmap.josm.spi.preferences.Config;
|
import org.openstreetmap.josm.spi.preferences.Config;
|
||||||
import org.openstreetmap.josm.testutils.JOSMTestRules;
|
import org.openstreetmap.josm.testutils.JOSMTestRules;
|
||||||
|
|
||||||
|
@ -70,13 +72,13 @@ public class CreateConnectionsCommandTest {
|
||||||
createConnections.undoCommand();
|
createConnections.undoCommand();
|
||||||
Assert.assertFalse(dataSet.isModified());
|
Assert.assertFalse(dataSet.isModified());
|
||||||
|
|
||||||
node3.put(CreateConnectionsCommand.CONN_KEY,
|
node3.put(ConnectedCommand.CONN_KEY,
|
||||||
"w" + way.getUniqueId() + ",n" + node1.getUniqueId() + ",n" + node2.getUniqueId());
|
"w" + way.getUniqueId() + ",n" + node1.getUniqueId() + ",n" + node2.getUniqueId());
|
||||||
createConnections = new CreateConnectionsCommand(dataSet, Collections.singleton(node3));
|
createConnections = new CreateConnectionsCommand(dataSet, Collections.singleton(node3));
|
||||||
createConnections.executeCommand();
|
createConnections.executeCommand();
|
||||||
Assert.assertTrue(dataSet.isModified());
|
Assert.assertTrue(dataSet.isModified());
|
||||||
Assert.assertEquals(3, way.getNodesCount());
|
Assert.assertEquals(3, way.getNodesCount());
|
||||||
Assert.assertFalse(node3.hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertFalse(node3.hasKey(ConnectedCommand.CONN_KEY));
|
||||||
createConnections.fillModifiedData(modified, deleted, added);
|
createConnections.fillModifiedData(modified, deleted, added);
|
||||||
Assert.assertEquals(3, modified.size()); // 3 since we remove the key from the node
|
Assert.assertEquals(3, modified.size()); // 3 since we remove the key from the node
|
||||||
Assert.assertTrue(deleted.isEmpty());
|
Assert.assertTrue(deleted.isEmpty());
|
||||||
|
@ -84,22 +86,22 @@ public class CreateConnectionsCommandTest {
|
||||||
createConnections.undoCommand();
|
createConnections.undoCommand();
|
||||||
Assert.assertFalse(dataSet.isModified());
|
Assert.assertFalse(dataSet.isModified());
|
||||||
Assert.assertEquals(2, way.getNodesCount());
|
Assert.assertEquals(2, way.getNodesCount());
|
||||||
Assert.assertTrue(node3.hasKey(CreateConnectionsCommand.CONN_KEY));
|
Assert.assertTrue(node3.hasKey(ConnectedCommand.CONN_KEY));
|
||||||
|
|
||||||
dupe.put(CreateConnectionsCommand.DUPE_KEY, "n" + node1.getUniqueId());
|
dupe.put(DuplicateCommand.DUPE_KEY, "n" + node1.getUniqueId());
|
||||||
createConnections = new CreateConnectionsCommand(dataSet, Collections.singleton(dupe));
|
createConnections = new CreateConnectionsCommand(dataSet, Collections.singleton(dupe));
|
||||||
createConnections.executeCommand();
|
createConnections.executeCommand();
|
||||||
Assert.assertTrue(dataSet.isModified());
|
Assert.assertTrue(dataSet.isModified());
|
||||||
Assert.assertEquals(2, way.getNodesCount());
|
Assert.assertEquals(2, way.getNodesCount());
|
||||||
Assert.assertFalse(node1.hasKey(CreateConnectionsCommand.DUPE_KEY));
|
Assert.assertFalse(node1.hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
modified.clear();
|
modified.clear();
|
||||||
createConnections.fillModifiedData(modified, deleted, added);
|
createConnections.fillModifiedData(modified, deleted, added);
|
||||||
Assert.assertEquals(2, modified.size());
|
Assert.assertEquals(2, modified.size());
|
||||||
Assert.assertTrue(deleted.isEmpty());
|
Assert.assertTrue(deleted.isEmpty());
|
||||||
Assert.assertTrue(added.isEmpty());
|
Assert.assertTrue(added.isEmpty());
|
||||||
createConnections.undoCommand();
|
createConnections.undoCommand();
|
||||||
Assert.assertFalse(node1.hasKey(CreateConnectionsCommand.DUPE_KEY));
|
Assert.assertFalse(node1.hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
Assert.assertTrue(dupe.hasKey(CreateConnectionsCommand.DUPE_KEY));
|
Assert.assertTrue(dupe.hasKey(DuplicateCommand.DUPE_KEY));
|
||||||
Assert.assertFalse(dataSet.isModified());
|
Assert.assertFalse(dataSet.isModified());
|
||||||
Assert.assertEquals(2, way.getNodesCount());
|
Assert.assertEquals(2, way.getNodesCount());
|
||||||
}
|
}
|
||||||
|
@ -115,7 +117,7 @@ public class CreateConnectionsCommandTest {
|
||||||
final Node node3 = new Node(new LatLon(0.5, 0));
|
final Node node3 = new Node(new LatLon(0.5, 0));
|
||||||
final Way way = TestUtils.newWay("highway=residential", node1, node2);
|
final Way way = TestUtils.newWay("highway=residential", node1, node2);
|
||||||
new DataSet(node1, node2, node3, way);
|
new DataSet(node1, node2, node3, way);
|
||||||
Command addNodeToWayCommand = CreateConnectionsCommand.addNodesToWay(node3, way, node1, node2);
|
Command addNodeToWayCommand = ConnectedCommand.addNodesToWay(node3, way, node1, node2);
|
||||||
Assert.assertEquals(2, way.getNodesCount());
|
Assert.assertEquals(2, way.getNodesCount());
|
||||||
addNodeToWayCommand.executeCommand();
|
addNodeToWayCommand.executeCommand();
|
||||||
Assert.assertEquals(3, way.getNodesCount());
|
Assert.assertEquals(3, way.getNodesCount());
|
||||||
|
@ -123,15 +125,15 @@ public class CreateConnectionsCommandTest {
|
||||||
Assert.assertEquals(2, way.getNodesCount());
|
Assert.assertEquals(2, way.getNodesCount());
|
||||||
|
|
||||||
node2.setCoor(new LatLon(1, 0.1));
|
node2.setCoor(new LatLon(1, 0.1));
|
||||||
addNodeToWayCommand = CreateConnectionsCommand.addNodesToWay(node3, way, node1, node2);
|
addNodeToWayCommand = ConnectedCommand.addNodesToWay(node3, way, node1, node2);
|
||||||
Assert.assertNull(addNodeToWayCommand);
|
Assert.assertNull(addNodeToWayCommand);
|
||||||
|
|
||||||
node2.setCoor(new LatLon(1, 0.01));
|
node2.setCoor(new LatLon(1, 0.01));
|
||||||
addNodeToWayCommand = CreateConnectionsCommand.addNodesToWay(node3, way, node1, node2);
|
addNodeToWayCommand = ConnectedCommand.addNodesToWay(node3, way, node1, node2);
|
||||||
Assert.assertNull(addNodeToWayCommand);
|
Assert.assertNull(addNodeToWayCommand);
|
||||||
|
|
||||||
node2.setCoor(new LatLon(1, 0.00008));
|
node2.setCoor(new LatLon(1, 0.00008));
|
||||||
addNodeToWayCommand = CreateConnectionsCommand.addNodesToWay(node3, way, node1, node2);
|
addNodeToWayCommand = ConnectedCommand.addNodesToWay(node3, way, node1, node2);
|
||||||
addNodeToWayCommand.executeCommand();
|
addNodeToWayCommand.executeCommand();
|
||||||
Assert.assertEquals(3, way.getNodesCount());
|
Assert.assertEquals(3, way.getNodesCount());
|
||||||
addNodeToWayCommand.undoCommand();
|
addNodeToWayCommand.undoCommand();
|
||||||
|
@ -146,14 +148,14 @@ public class CreateConnectionsCommandTest {
|
||||||
final Node node1 = new Node(new LatLon(0, 0));
|
final Node node1 = new Node(new LatLon(0, 0));
|
||||||
final Node node2 = new Node(new LatLon(0, 0));
|
final Node node2 = new Node(new LatLon(0, 0));
|
||||||
new DataSet(node1, node2);
|
new DataSet(node1, node2);
|
||||||
final Command replaceNodeCommand = CreateConnectionsCommand.replaceNode(node1, node2);
|
final Command replaceNodeCommand = DuplicateCommand.replaceNode(node1, node2);
|
||||||
replaceNodeCommand.executeCommand();
|
replaceNodeCommand.executeCommand();
|
||||||
Assert.assertTrue(node1.isDeleted());
|
Assert.assertTrue(node1.isDeleted());
|
||||||
replaceNodeCommand.undoCommand();
|
replaceNodeCommand.undoCommand();
|
||||||
Assert.assertFalse(node1.isDeleted());
|
Assert.assertFalse(node1.isDeleted());
|
||||||
|
|
||||||
node2.setCoor(new LatLon(0.1, 0.1));
|
node2.setCoor(new LatLon(0.1, 0.1));
|
||||||
Assert.assertNull(CreateConnectionsCommand.replaceNode(node1, node2));
|
Assert.assertNull(DuplicateCommand.replaceNode(node1, node2));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,9 +165,8 @@ public class CreateConnectionsCommandTest {
|
||||||
public void testGetMissingPrimitives() {
|
public void testGetMissingPrimitives() {
|
||||||
final Node node1 = new Node(new LatLon(39.0674124, -108.5592645));
|
final Node node1 = new Node(new LatLon(39.0674124, -108.5592645));
|
||||||
final DataSet dataSet = new DataSet(node1);
|
final DataSet dataSet = new DataSet(node1);
|
||||||
node1.put(CreateConnectionsCommand.DUPE_KEY, "n6146500887");
|
node1.put(DuplicateCommand.DUPE_KEY, "n6146500887");
|
||||||
Command replaceNodeCommand = CreateConnectionsCommand.createConnections(dataSet,
|
Command replaceNodeCommand = CreateConnectionsCommand.createConnections(dataSet, Collections.singleton(node1));
|
||||||
Collections.singleton(node1));
|
|
||||||
|
|
||||||
replaceNodeCommand.executeCommand();
|
replaceNodeCommand.executeCommand();
|
||||||
Assert.assertEquals(1, dataSet.allNonDeletedPrimitives().size());
|
Assert.assertEquals(1, dataSet.allNonDeletedPrimitives().size());
|
||||||
|
@ -176,7 +177,7 @@ public class CreateConnectionsCommandTest {
|
||||||
Assert.assertNotNull(dataSet.getPrimitiveById(6146500887L, OsmPrimitiveType.NODE));
|
Assert.assertNotNull(dataSet.getPrimitiveById(6146500887L, OsmPrimitiveType.NODE));
|
||||||
|
|
||||||
node1.setCoor(new LatLon(39.067399, -108.5608433));
|
node1.setCoor(new LatLon(39.067399, -108.5608433));
|
||||||
node1.put(CreateConnectionsCommand.DUPE_KEY, "n6151680832");
|
node1.put(DuplicateCommand.DUPE_KEY, "n6151680832");
|
||||||
final OsmDataLayer layer = new OsmDataLayer(dataSet, "temp layer", null);
|
final OsmDataLayer layer = new OsmDataLayer(dataSet, "temp layer", null);
|
||||||
MainApplication.getLayerManager().addLayer(layer);
|
MainApplication.getLayerManager().addLayer(layer);
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue