Ignore:
Timestamp:
2010-03-25T03:47:36+01:00 (14 years ago)
Author:
nakor
Message:

Cleanup; Disable plugin with no layer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/michigan_left/src/MichiganLeft/MichiganLeft.java

    r19452 r20662  
    11package MichiganLeft;
    22
     3import java.awt.event.ActionEvent;
     4import java.awt.event.KeyEvent;
     5import java.util.Collection;
     6import java.util.Enumeration;
     7import java.util.Hashtable;
     8import java.util.LinkedList;
     9import java.util.ArrayList;
     10
    311import javax.swing.JMenuItem;
     12import javax.swing.JOptionPane;
     13
     14import static org.openstreetmap.josm.tools.I18n.tr;
    415
    516import org.openstreetmap.josm.Main;
     17import org.openstreetmap.josm.actions.JosmAction;
     18import org.openstreetmap.josm.command.AddCommand;
     19import org.openstreetmap.josm.command.Command;
     20import org.openstreetmap.josm.command.SequenceCommand;
     21import org.openstreetmap.josm.data.osm.Node;
     22import org.openstreetmap.josm.data.osm.OsmPrimitive;
     23import org.openstreetmap.josm.data.osm.Relation;
     24import org.openstreetmap.josm.data.osm.RelationMember;
     25import org.openstreetmap.josm.data.osm.Way;
    626import org.openstreetmap.josm.gui.MainMenu;
    727import org.openstreetmap.josm.plugins.Plugin;
    828import org.openstreetmap.josm.plugins.PluginInformation;
     29import org.openstreetmap.josm.tools.Shortcut;
     30
    931
    1032public class MichiganLeft extends Plugin {
     
    1638
    1739    }
     40   
     41   
     42    private class MichiganLeftAction extends JosmAction {
     43        private LinkedList<Command> cmds = new LinkedList<Command>();
     44
     45        public MichiganLeftAction() {
     46        super(tr("Michigan Left"), "michigan_left", tr("Adds no left turn for sets of 4 or 5 ways."), Shortcut.registerShortcut("tools:michigan_left", tr("Tool: {0}", tr("Michigan Left")),
     47        KeyEvent.VK_M, Shortcut.GROUP_EDIT, KeyEvent.SHIFT_DOWN_MASK|KeyEvent.ALT_DOWN_MASK), true);
     48      }
     49
     50      public void actionPerformed(ActionEvent e) {
     51        Collection<OsmPrimitive> selection = Main.main.getCurrentDataSet().getSelected();
     52
     53        int ways = 0;
     54        for (OsmPrimitive prim : selection) {
     55          if (prim instanceof Way)  ways++;
     56        }
     57
     58        if ((ways != 4) && (ways !=5)) {
     59          JOptionPane.showMessageDialog(Main.parent, tr("Please select 4 or 5 ways to assign no left turns."));
     60          return;
     61        }
     62
     63        if (ways == 4)
     64        {
     65          // Find extremities of ways
     66          Hashtable<Node, Integer> ExtremNodes=new Hashtable<Node, Integer>();
     67          for (OsmPrimitive prim : selection)
     68          {
     69            if (prim instanceof Way)
     70            {
     71              Way way = (Way) prim;
     72              incrementHashtable(ExtremNodes, way.firstNode());
     73              incrementHashtable(ExtremNodes, way.lastNode());
     74            }
     75          }
     76          //System.out.println(tr("{0} extrem nodes.", ExtremNodes.size()));
     77          if (ExtremNodes.size() != 4)
     78          {
     79            JOptionPane.showMessageDialog(Main.parent, tr("Please select 4 ways that form a closed relation."));
     80            return;
     81          }
     82
     83          // order the ways
     84          ArrayList<Way> orderedWays=new ArrayList<Way>();
     85          Way currentWay=(Way) selection.iterator().next();
     86          orderedWays.add((Way) currentWay);
     87          selection.remove(currentWay);
     88          while (selection.size()>0)
     89          {
     90              boolean found=false;
     91              Node nextNode=currentWay.lastNode();
     92              for (OsmPrimitive prim : selection)
     93              {
     94                  Way tmpWay=(Way) prim;
     95                  if (tmpWay.firstNode() == nextNode)
     96                  {
     97                    orderedWays.add(tmpWay);
     98                    selection.remove(prim);
     99                    currentWay=tmpWay;
     100                    found=true;
     101                    break;
     102                  }
     103              }
     104              if (!found)
     105              {
     106                JOptionPane.showMessageDialog(Main.parent, tr("Unable to order the ways. Please verify their directions"));
     107                return;
     108              }
     109          }
     110
     111          // Build relations
     112          for (int index=0 ; index<4 ; index++)
     113          {
     114            Way firstWay=orderedWays.get(index);
     115            Way lastWay=orderedWays.get( (index+1) % 4);
     116            Node lastNode = firstWay.lastNode();
     117
     118            buildRelation(firstWay, lastWay, lastNode);
     119           }
     120          Command c = new SequenceCommand(tr("Create Michigan left turn restriction"), cmds);
     121          Main.main.undoRedo.add(c);
     122          cmds.clear();
     123        }
     124
     125        if (ways == 5)
     126        {
     127          // Find extremities of ways
     128          Hashtable<Node, Integer> ExtremNodes=new Hashtable<Node, Integer>();
     129          for (OsmPrimitive prim : selection) {
     130            if (prim instanceof Way)
     131            {
     132              Way way = (Way) prim;
     133              incrementHashtable(ExtremNodes, way.firstNode());
     134              incrementHashtable(ExtremNodes, way.lastNode());
     135            }
     136          }
     137          //System.out.println(tr("{0} extrem nodes.", ExtremNodes.size()));
     138
     139          ArrayList<Node> viaNodes=new ArrayList<Node>();
     140          // find via nodes (they have 3 occurences in the list)
     141          for (Enumeration enumKey = ExtremNodes.keys() ; enumKey.hasMoreElements(); )
     142          {
     143            Node extrem=(Node)enumKey.nextElement();
     144            Integer nb=(Integer) ExtremNodes.get(extrem);
     145            //System.out.println(tr("Via node {0}, {1}", extrem.getId(), nb.intValue()));
     146            if (nb.intValue() == 3)
     147            {
     148              viaNodes.add(extrem);
     149            }
     150          }
     151          //System.out.println(tr("{0} via nodes.", viaNodes.size()));
     152
     153          if (viaNodes.size() != 2) {
     154            JOptionPane.showMessageDialog(Main.parent, tr("Unable to find via nodes. Please check your selection"));
     155            return;
     156          }
     157
     158          Node viaFirst = viaNodes.get(0);
     159          Node viaLast = viaNodes.get(1);      // Find middle segment
     160
     161          Way middle = null;
     162          for (OsmPrimitive prim : selection) {
     163            if (prim instanceof Way)
     164            {
     165              Way way = (Way) prim;
     166              Node first = way.firstNode();
     167              Node last = way.lastNode();
     168
     169
     170              if ((first.equals(viaFirst) && last.equals(viaLast)) || (first.equals(viaLast) && last.equals(viaFirst)))
     171                middle=way;
     172            }
     173          }
     174          //System.out.println(tr("Middle way: {0}", middle.getId()));
     175
     176          // Build relations
     177          for (OsmPrimitive prim : selection) {
     178            if (prim instanceof Way)
     179            {
     180              Way way = (Way) prim;
     181              if (way != middle)
     182              {
     183                Node first = way.firstNode();
     184                Node last = way.lastNode();
     185
     186                if (first==viaFirst)
     187                  buildRelation(middle, way, viaNodes.get(0));
     188                else if (first==viaLast)
     189                  buildRelation(middle, way, viaNodes.get(1));
     190                else if (last==viaFirst)
     191                  buildRelation(way, middle, viaNodes.get(0));
     192                else if (last==viaLast)
     193                  buildRelation(way, middle, viaNodes.get(1));
     194              }
     195            }
     196          }
     197          Command c = new SequenceCommand(tr("Create Michigan left turn restriction"), cmds);
     198          Main.main.undoRedo.add(c);
     199          cmds.clear();
     200        }
     201      }
     202
     203      public void incrementHashtable(Hashtable<Node, Integer> hash, Node node)
     204      {
     205        //System.out.println(tr("Processing {0}", node.getId()));
     206        if (hash.containsKey(node))
     207        {
     208          Integer nb=(Integer) hash.get(node);
     209          hash.put(node, new Integer (nb.intValue()+1));
     210          //System.out.println(tr("Old value", nb.intValue()));
     211        }
     212        else
     213          hash.put(node, new Integer (1));
     214      }
     215
     216      public void buildRelation(Way fromWay, Way toWay, Node viaNode)
     217      {
     218        //System.out.println(tr("Relation: from {0} to {1} via {2}", fromWay.getId(), toWay.getId(), viaNode.getId()));
     219
     220        Relation relation = new Relation();
     221
     222        RelationMember from = new RelationMember("from", fromWay);
     223        relation.addMember(from);
     224
     225        RelationMember to = new RelationMember("to", toWay);
     226        relation.addMember(to);
     227
     228        RelationMember via = new RelationMember("via", viaNode);
     229        relation.addMember(via);
     230
     231        relation.put("type", "restriction");
     232        relation.put("restriction", "no_left_turn");
     233
     234        cmds.add(new AddCommand(relation));
     235      }
     236      @Override
     237      protected void updateEnabledState() {
     238          setEnabled(getEditLayer() != null);
     239      }
     240
     241      @Override
     242      protected void updateEnabledState(
     243              Collection<? extends OsmPrimitive> selection) {
     244          // do nothing
     245      }
     246
     247}   
    18248}
Note: See TracChangeset for help on using the changeset viewer.