source: osm/applications/editors/josm/plugins/michigan_left/src/MichiganLeft/MichiganLeft.java@ 29435

Last change on this file since 29435 was 27852, checked in by stoecker, 14 years ago

fix shortcut deprecation

File size: 8.2 KB
Line 
1package MichiganLeft;
2
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
11import javax.swing.JMenuItem;
12import javax.swing.JOptionPane;
13
14import static org.openstreetmap.josm.tools.I18n.tr;
15
16import 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;
26import org.openstreetmap.josm.gui.MainMenu;
27import org.openstreetmap.josm.plugins.Plugin;
28import org.openstreetmap.josm.plugins.PluginInformation;
29import org.openstreetmap.josm.tools.Shortcut;
30
31public class MichiganLeft extends Plugin {
32 JMenuItem MichiganLeft;
33
34 public MichiganLeft(PluginInformation info) {
35 super(info);
36 MichiganLeft = MainMenu.add(Main.main.menu.toolsMenu,
37 new MichiganLeftAction());
38
39 }
40
41 private class MichiganLeftAction extends JosmAction {
42 /**
43 *
44 */
45 private static final long serialVersionUID = 1L;
46 private LinkedList<Command> cmds = new LinkedList<Command>();
47
48 public MichiganLeftAction() {
49 super(tr("Michigan Left"), "michigan_left",
50 tr("Adds no left turn for sets of 4 or 5 ways."),
51 Shortcut.registerShortcut("tools:michigan_left", tr("Tool: {0}",
52 tr("Michigan Left")), KeyEvent.VK_N, Shortcut.ALT_SHIFT), true);
53 }
54
55 public void actionPerformed(ActionEvent e) {
56 Collection<OsmPrimitive> mainSelection = Main.main.getCurrentDataSet()
57 .getSelected();
58
59 ArrayList<OsmPrimitive> selection = new ArrayList<OsmPrimitive>();
60
61 for (OsmPrimitive prim: mainSelection) selection.add(prim);
62
63 int ways = 0;
64 for (OsmPrimitive prim : selection) {
65 if (prim instanceof Way)
66 ways++;
67 }
68
69 if ((ways != 4) && (ways != 5)) {
70 JOptionPane.showMessageDialog(Main.parent,
71 tr("Please select 4 or 5 ways to assign no left turns."));
72 return;
73 }
74
75 if (ways == 4) {
76 // Find extremities of ways
77 Hashtable<Node, Integer> ExtremNodes = new Hashtable<Node, Integer>();
78 for (OsmPrimitive prim : selection) {
79 if (prim instanceof Way) {
80 Way way = (Way) prim;
81 incrementHashtable(ExtremNodes, way.firstNode());
82 incrementHashtable(ExtremNodes, way.lastNode());
83 }
84 }
85 // System.out.println(tr("{0} extrem nodes.", ExtremNodes.size()));
86 if (ExtremNodes.size() != 4) {
87 JOptionPane.showMessageDialog(Main.parent,
88 tr("Please select 4 ways that form a closed relation."));
89 return;
90 }
91
92 // order the ways
93 ArrayList<Way> orderedWays = new ArrayList<Way>();
94 Way currentWay = (Way) selection.iterator().next();
95 orderedWays.add((Way) currentWay);
96 selection.remove(currentWay);
97 while (selection.size() > 0) {
98 boolean found = false;
99 Node nextNode = currentWay.lastNode();
100 for (OsmPrimitive prim : selection) {
101 Way tmpWay = (Way) prim;
102 if (tmpWay.firstNode() == nextNode) {
103 orderedWays.add(tmpWay);
104 selection.remove(prim);
105 currentWay = tmpWay;
106 found = true;
107 break;
108 }
109 }
110 if (!found) {
111 JOptionPane.showMessageDialog(Main.parent,
112 tr("Unable to order the ways. Please verify their directions"));
113 return;
114 }
115 }
116
117 // Build relations
118 for (int index = 0; index < 4; index++) {
119 Way firstWay = orderedWays.get(index);
120 Way lastWay = orderedWays.get((index + 1) % 4);
121 Node lastNode = firstWay.lastNode();
122
123 buildRelation(firstWay, lastWay, lastNode);
124 }
125 Command c = new SequenceCommand(
126 tr("Create Michigan left turn restriction"), cmds);
127 Main.main.undoRedo.add(c);
128 cmds.clear();
129 }
130
131 if (ways == 5) {
132 // Find extremities of ways
133 Hashtable<Node, Integer> ExtremNodes = new Hashtable<Node, Integer>();
134 for (OsmPrimitive prim : selection) {
135 if (prim instanceof Way) {
136 Way way = (Way) prim;
137 incrementHashtable(ExtremNodes, way.firstNode());
138 incrementHashtable(ExtremNodes, way.lastNode());
139 }
140 }
141 // System.out.println(tr("{0} extrem nodes.", ExtremNodes.size()));
142
143 ArrayList<Node> viaNodes = new ArrayList<Node>();
144 // find via nodes (they have 3 occurences in the list)
145 for (Enumeration<Node> enumKey = ExtremNodes.keys(); enumKey
146 .hasMoreElements();) {
147 Node extrem = enumKey.nextElement();
148 Integer nb = (Integer) ExtremNodes.get(extrem);
149 // System.out.println(tr("Via node {0}, {1}", extrem.getId(),
150 // nb.intValue()));
151 if (nb.intValue() == 3) {
152 viaNodes.add(extrem);
153 }
154 }
155 // System.out.println(tr("{0} via nodes.", viaNodes.size()));
156
157 if (viaNodes.size() != 2) {
158 JOptionPane.showMessageDialog(Main.parent,
159 tr("Unable to find via nodes. Please check your selection"));
160 return;
161 }
162
163 Node viaFirst = viaNodes.get(0);
164 Node viaLast = viaNodes.get(1); // Find middle segment
165
166 Way middle = null;
167 for (OsmPrimitive prim : selection) {
168 if (prim instanceof Way) {
169 Way way = (Way) prim;
170 Node first = way.firstNode();
171 Node last = way.lastNode();
172
173 if ((first.equals(viaFirst) && last.equals(viaLast))
174 || (first.equals(viaLast) && last.equals(viaFirst)))
175 middle = way;
176 }
177 }
178 // System.out.println(tr("Middle way: {0}", middle.getId()));
179
180 // Build relations
181 for (OsmPrimitive prim : selection) {
182 if (prim instanceof Way) {
183 Way way = (Way) prim;
184 if (way != middle) {
185 Node first = way.firstNode();
186 Node last = way.lastNode();
187
188 if (first == viaFirst)
189 buildRelation(middle, way, viaNodes.get(0));
190 else if (first == viaLast)
191 buildRelation(middle, way, viaNodes.get(1));
192 else if (last == viaFirst)
193 buildRelation(way, middle, viaNodes.get(0));
194 else if (last == viaLast)
195 buildRelation(way, middle, viaNodes.get(1));
196 }
197 }
198 }
199 Command c = new SequenceCommand(
200 tr("Create Michigan left turn restriction"), cmds);
201 Main.main.undoRedo.add(c);
202 cmds.clear();
203 }
204 }
205
206 public void incrementHashtable(Hashtable<Node, Integer> hash, Node node) {
207 // System.out.println(tr("Processing {0}", node.getId()));
208 if (hash.containsKey(node)) {
209 Integer nb = (Integer) hash.get(node);
210 hash.put(node, new Integer(nb.intValue() + 1));
211 // System.out.println(tr("Old value", nb.intValue()));
212 } else
213 hash.put(node, new Integer(1));
214 }
215
216 public void buildRelation(Way fromWay, Way toWay, Node viaNode) {
217 // System.out.println(tr("Relation: from {0} to {1} via {2}",
218 // 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
237 @Override
238 protected void updateEnabledState() {
239 setEnabled(getEditLayer() != null);
240 }
241
242 @Override
243 protected void updateEnabledState(
244 Collection<? extends OsmPrimitive> selection) {
245 // do nothing
246 }
247
248 }
249}
Note: See TracBrowser for help on using the repository browser.