Ticket #7178: add_insideselection_search_operator.patch

File add_insideselection_search_operator.patch, 6.5 KB (added by joshdoe, 9 years ago)

adds insideselection search operator to utilsplugin2

  • utilsplugin2/src/utilsplugin2/selection/NodeWayUtils.java

     
    457457       // System.out.printf("Intersected intercount %d %s\n",interCount, point.toString());
    458458        if (interCount%2 == 1) return 1; else return 0;
    459459    }
     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);
    460464
     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
    461492}
  • utilsplugin2/src/utilsplugin2/selection/SelectAllInsideAction.java

     
    1414
    1515import org.openstreetmap.josm.Main;
    1616import 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;
     17import org.openstreetmap.josm.data.osm.*;
    2118import org.openstreetmap.josm.tools.Shortcut;
    2219
    2320/**
     
    3128                KeyEvent.VK_I, Shortcut.GROUP_EDIT ,KeyEvent.ALT_DOWN_MASK|KeyEvent.SHIFT_DOWN_MASK), true);
    3229        putValue("help", ht("/Action/SelectAllInside"));
    3330    }
    34 
     31   
     32    @Override
    3533    public void actionPerformed(ActionEvent e) {
    3634        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);
    6039        } else{
    6140        JOptionPane.showMessageDialog(Main.parent,
    6241               tr("Nothing found. Please select some closed ways or multipolygons to find all primitives inside them!"),
  • utilsplugin2/src/utilsplugin2/UtilsPlugin2.java

     
    11// License: GPL v2 or later. See LICENSE file for details.
    22package utilsplugin2;
    33
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
    46import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
    57import java.awt.event.KeyEvent;
     8import java.util.Collection;
    69import javax.swing.JMenu;
    710import javax.swing.JMenuItem;
    811import utilsplugin2.selection.*;
    912import utilsplugin2.dumbutils.*;
    1013
    1114import org.openstreetmap.josm.Main;
     15import org.openstreetmap.josm.actions.search.SearchCompiler;
     16import org.openstreetmap.josm.actions.search.SearchCompiler.PluginMatch;
     17import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1218import org.openstreetmap.josm.gui.MainMenu;
    1319import org.openstreetmap.josm.gui.MapFrame;
    1420import org.openstreetmap.josm.plugins.Plugin;
     
    8389       
    8490        selectURL = MainMenu.add(toolsMenu, new ChooseURLAction());
    8591       
    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);
    8796    }
    8897
    8998    @Override
     
    121130        return new UtilsPluginPreferences();
    122131    }
    123132
     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    }
    124159}