package maps.gml.editor; import javax.swing.JOptionPane; import java.util.Set; import java.util.HashSet; import maps.gml.GMLNode; import rescuecore2.log.Logger; /** A function for fixing nearby nodes. */ public class FixNearbyNodesFunction extends ProgressFunction { private static final double DEFAULT_TOLERANCE = 0.001; private double tolerance; /** Construct a FixNearbyNodesFunction. @param editor The editor instance. */ public FixNearbyNodesFunction(GMLEditor editor) { super(editor); } @Override public String getName() { return "Fix nearby nodes"; } @Override protected String getTitle() { return "Fixing nearby nodes"; } @Override public void execute() { String s = JOptionPane.showInputDialog(editor.getViewer(), "Enter the desired tolerance (in m)", DEFAULT_TOLERANCE); if (s == null) { return; } tolerance = Double.parseDouble(s); super.execute(); } @Override protected void executeImpl() { // Go through all nodes and replace any nearby ones. final Set<GMLNode> remaining = new HashSet<GMLNode>(editor.getMap().getNodes()); setProgressLimit(remaining.size()); int count = 0; while (!remaining.isEmpty()) { GMLNode next = remaining.iterator().next(); remaining.remove(next); double x = next.getX(); double y = next.getY(); // Logger.debug("Next node: " + next); // Logger.debug("Finding nodes near " + x + ", " + y); bumpProgress(); for (GMLNode replaced : editor.getMap().getNodesInRegion(x - tolerance, y - tolerance, x + tolerance, y + tolerance)) { if (replaced == next) { continue; } // Logger.debug("Found " + replaced); editor.getMap().replaceNode(replaced, next); remaining.remove(replaced); editor.getMap().removeNode(replaced); ++count; bumpProgress(); } } if (count != 0) { editor.setChanged(); editor.getViewer().repaint(); } Logger.debug("Removed " + count + " nodes"); } }