Ticket #7178: add_insideselection_search_operator.patch
| File add_insideselection_search_operator.patch, 6.5 KB (added by , 14 years ago) |
|---|
-
utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java
457 457 // System.out.printf("Intersected intercount %d %s\n",interCount, point.toString()); 458 458 if (interCount%2 == 1) return 1; else return 0; 459 459 } 460 461 public static Collection<OsmPrimitive> selectAllInside(Collection<OsmPrimitive> selected, DataSet dataset) { 462 Set<Way> selectedWays = OsmPrimitive.getFilteredSet(selected, Way.class); 463 Set<Relation> selectedRels = OsmPrimitive.getFilteredSet(selected, Relation.class); 460 464 465 for (Relation r: selectedRels) { 466 if (!r.isMultipolygon()) selectedRels.remove(r); 467 } 468 469 Set<Way> newWays = new HashSet<Way>(); 470 Set<Node> newNodes = new HashSet<Node>(); 471 // select ways attached to already selected ways 472 if (!selectedWays.isEmpty()) { 473 for (Way w: selectedWays) { 474 addAllInsideWay(dataset,w,newWays,newNodes); 475 } 476 } 477 if (!selectedRels.isEmpty()) { 478 for (Relation r: selectedRels) { 479 addAllInsideMultipolygon(dataset,r,newWays,newNodes); 480 } 481 } 482 483 Set<OsmPrimitive> insideSelection = new HashSet<OsmPrimitive>(); 484 if (!newWays.isEmpty() || !newNodes.isEmpty()) { 485 insideSelection.addAll(newWays); 486 insideSelection.addAll(newNodes); 487 } 488 return insideSelection; 489 } 490 491 461 492 } -
utilsplugin2/src/utilsplugin2/selection/SelectAllInsideAction.java
14 14 15 15 import org.openstreetmap.josm.Main; 16 16 import org.openstreetmap.josm.actions.JosmAction; 17 import org.openstreetmap.josm.data.osm.Node; 18 import org.openstreetmap.josm.data.osm.OsmPrimitive; 19 import org.openstreetmap.josm.data.osm.Relation; 20 import org.openstreetmap.josm.data.osm.Way; 17 import org.openstreetmap.josm.data.osm.*; 21 18 import org.openstreetmap.josm.tools.Shortcut; 22 19 23 20 /** … … 31 28 KeyEvent.VK_I, Shortcut.GROUP_EDIT ,KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK), true); 32 29 putValue("help", ht("/Action/SelectAllInside")); 33 30 } 34 31 32 @Override 35 33 public void actionPerformed(ActionEvent e) { 36 34 long t=System.currentTimeMillis(); 37 Set<Way> selectedWays = OsmPrimitive.getFilteredSet(getCurrentDataSet().getSelected(), Way.class); 38 Set<Relation> selectedRels = OsmPrimitive.getFilteredSet(getCurrentDataSet().getSelected(), Relation.class); 39 40 for (Relation r: selectedRels) { 41 if (!r.isMultipolygon()) selectedRels.remove(r); 42 } 43 44 Set<Way> newWays = new HashSet<Way>(); 45 Set<Node> newNodes = new HashSet<Node>(); 46 // select ways attached to already selected ways 47 if (!selectedWays.isEmpty()) { 48 for (Way w: selectedWays) { 49 NodeWayUtils.addAllInsideWay(getCurrentDataSet(),w,newWays,newNodes); 50 } 51 } 52 if (!selectedRels.isEmpty()) { 53 for (Relation r: selectedRels) { 54 NodeWayUtils.addAllInsideMultipolygon(getCurrentDataSet(),r,newWays,newNodes); 55 } 56 } 57 if (!newWays.isEmpty() || !newNodes.isEmpty()) { 58 getCurrentDataSet().addSelected(newWays); 59 getCurrentDataSet().addSelected(newNodes); 35 Collection<OsmPrimitive> insideSelected = NodeWayUtils.selectAllInside(getCurrentDataSet().getSelected(), getCurrentDataSet()); 36 37 if (!insideSelected.isEmpty()) { 38 getCurrentDataSet().addSelected(insideSelected); 60 39 } else{ 61 40 JOptionPane.showMessageDialog(Main.parent, 62 41 tr("Nothing found. Please select some closed ways or multipolygons to find all primitives inside them!"), -
utilsplugin2/src/utilsplugin2/UtilsPlugin2.java
1 1 // License: GPL v2 or later. See LICENSE file for details. 2 2 package utilsplugin2; 3 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 4 6 import org.openstreetmap.josm.gui.preferences.PreferenceSetting; 5 7 import java.awt.event.KeyEvent; 8 import java.util.Collection; 6 9 import javax.swing.JMenu; 7 10 import javax.swing.JMenuItem; 8 11 import utilsplugin2.selection.*; 9 12 import utilsplugin2.dumbutils.*; 10 13 11 14 import org.openstreetmap.josm.Main; 15 import org.openstreetmap.josm.actions.search.SearchCompiler; 16 import org.openstreetmap.josm.actions.search.SearchCompiler.PluginMatch; 17 import org.openstreetmap.josm.data.osm.OsmPrimitive; 12 18 import org.openstreetmap.josm.gui.MainMenu; 13 19 import org.openstreetmap.josm.gui.MapFrame; 14 20 import org.openstreetmap.josm.plugins.Plugin; … … 83 89 84 90 selectURL = MainMenu.add(toolsMenu, new ChooseURLAction()); 85 91 86 92 /* FIXME: how to do this? PluginMatch is abstract, so getKeyword() can't be static, 93 * move this all to core using getDeclaredMethod().invoke? */ 94 InsideSelectedMatch m = new InsideSelectedMatch(); 95 SearchCompiler.addPluginMatch(m.getKeyword(), InsideSelectedMatch.class); 87 96 } 88 97 89 98 @Override … … 121 130 return new UtilsPluginPreferences(); 122 131 } 123 132 133 public static class InsideSelectedMatch extends PluginMatch { 134 private Collection<OsmPrimitive> insideSelected = null; 135 136 private void init() { 137 insideSelected = NodeWayUtils.selectAllInside( 138 Main.main.getCurrentDataSet().getSelected(), Main.main.getCurrentDataSet()); 139 } 140 141 @Override 142 public String getKeyword() { 143 return "insideselected"; 144 } 145 146 @Override 147 public String getDescription() { 148 return tr("find all objects inside the selected areas"); 149 } 150 151 @Override 152 public boolean match(OsmPrimitive osm) { 153 if (insideSelected == null) { 154 init(); 155 } 156 return insideSelected.contains(osm); 157 } 158 } 124 159 }
