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

Last change on this file since 22364 was 22364, checked in by nakor, 15 years ago

Code cleanup

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