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

Last change on this file since 22290 was 22290, checked in by nakor, 16 years ago

Code cleanup

File size: 8.5 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
31
32public class MichiganLeft extends Plugin {
33 JMenuItem MichiganLeft;
34
35 public MichiganLeft(PluginInformation info) {
36 super(info);
37 MichiganLeft = MainMenu.add(Main.main.menu.toolsMenu, new MichiganLeftAction());
38
39 }
40
41
42 private class MichiganLeftAction extends JosmAction {
43 /**
44 *
45 */
46 private static final long serialVersionUID = 1L;
47 private LinkedList<Command> cmds = new LinkedList<Command>();
48
49 public MichiganLeftAction() {
50 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")),
51 KeyEvent.VK_M, Shortcut.GROUP_EDIT, KeyEvent.SHIFT_DOWN_MASK|KeyEvent.ALT_DOWN_MASK), true);
52 }
53
54 public void actionPerformed(ActionEvent e) {
55 Collection<OsmPrimitive> selection = Main.main.getCurrentDataSet().getSelected();
56
57 int ways = 0;
58 for (OsmPrimitive prim : selection) {
59 if (prim instanceof Way) ways++;
60 }
61
62 if ((ways != 4) && (ways !=5)) {
63 JOptionPane.showMessageDialog(Main.parent, tr("Please select 4 or 5 ways to assign no left turns."));
64 return;
65 }
66
67 if (ways == 4)
68 {
69 // Find extremities of ways
70 Hashtable<Node, Integer> ExtremNodes=new Hashtable<Node, Integer>();
71 for (OsmPrimitive prim : selection)
72 {
73 if (prim instanceof Way)
74 {
75 Way way = (Way) prim;
76 incrementHashtable(ExtremNodes, way.firstNode());
77 incrementHashtable(ExtremNodes, way.lastNode());
78 }
79 }
80 //System.out.println(tr("{0} extrem nodes.", ExtremNodes.size()));
81 if (ExtremNodes.size() != 4)
82 {
83 JOptionPane.showMessageDialog(Main.parent, tr("Please select 4 ways that form a closed relation."));
84 return;
85 }
86
87 // order the ways
88 ArrayList<Way> orderedWays=new ArrayList<Way>();
89 Way currentWay=(Way) selection.iterator().next();
90 orderedWays.add((Way) currentWay);
91 selection.remove(currentWay);
92 while (selection.size()>0)
93 {
94 boolean found=false;
95 Node nextNode=currentWay.lastNode();
96 for (OsmPrimitive prim : selection)
97 {
98 Way tmpWay=(Way) prim;
99 if (tmpWay.firstNode() == nextNode)
100 {
101 orderedWays.add(tmpWay);
102 selection.remove(prim);
103 currentWay=tmpWay;
104 found=true;
105 break;
106 }
107 }
108 if (!found)
109 {
110 JOptionPane.showMessageDialog(Main.parent, tr("Unable to order the ways. Please verify their directions"));
111 return;
112 }
113 }
114
115 // Build relations
116 for (int index=0 ; index<4 ; index++)
117 {
118 Way firstWay=orderedWays.get(index);
119 Way lastWay=orderedWays.get( (index+1) % 4);
120 Node lastNode = firstWay.lastNode();
121
122 buildRelation(firstWay, lastWay, lastNode);
123 }
124 Command c = new SequenceCommand(tr("Create Michigan left turn restriction"), cmds);
125 Main.main.undoRedo.add(c);
126 cmds.clear();
127 }
128
129 if (ways == 5)
130 {
131 // Find extremities of ways
132 Hashtable<Node, Integer> ExtremNodes=new Hashtable<Node, Integer>();
133 for (OsmPrimitive prim : selection) {
134 if (prim instanceof Way)
135 {
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.hasMoreElements(); )
146 {
147 Node extrem=enumKey.nextElement();
148 Integer nb=(Integer) ExtremNodes.get(extrem);
149 //System.out.println(tr("Via node {0}, {1}", extrem.getId(), nb.intValue()));
150 if (nb.intValue() == 3)
151 {
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, tr("Unable to find via nodes. Please check your selection"));
159 return;
160 }
161
162 Node viaFirst = viaNodes.get(0);
163 Node viaLast = viaNodes.get(1); // Find middle segment
164
165 Way middle = null;
166 for (OsmPrimitive prim : selection) {
167 if (prim instanceof Way)
168 {
169 Way way = (Way) prim;
170 Node first = way.firstNode();
171 Node last = way.lastNode();
172
173
174 if ((first.equals(viaFirst) && last.equals(viaLast)) || (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 {
184 Way way = (Way) prim;
185 if (way != middle)
186 {
187 Node first = way.firstNode();
188 Node last = way.lastNode();
189
190 if (first==viaFirst)
191 buildRelation(middle, way, viaNodes.get(0));
192 else if (first==viaLast)
193 buildRelation(middle, way, viaNodes.get(1));
194 else if (last==viaFirst)
195 buildRelation(way, middle, viaNodes.get(0));
196 else if (last==viaLast)
197 buildRelation(way, middle, viaNodes.get(1));
198 }
199 }
200 }
201 Command c = new SequenceCommand(tr("Create Michigan left turn restriction"), cmds);
202 Main.main.undoRedo.add(c);
203 cmds.clear();
204 }
205 }
206
207 public void incrementHashtable(Hashtable<Node, Integer> hash, Node node)
208 {
209 //System.out.println(tr("Processing {0}", node.getId()));
210 if (hash.containsKey(node))
211 {
212 Integer nb=(Integer) hash.get(node);
213 hash.put(node, new Integer (nb.intValue()+1));
214 //System.out.println(tr("Old value", nb.intValue()));
215 }
216 else
217 hash.put(node, new Integer (1));
218 }
219
220 public void buildRelation(Way fromWay, Way toWay, Node viaNode)
221 {
222 //System.out.println(tr("Relation: from {0} to {1} via {2}", fromWay.getId(), toWay.getId(), viaNode.getId()));
223
224 Relation relation = new Relation();
225
226 RelationMember from = new RelationMember("from", fromWay);
227 relation.addMember(from);
228
229 RelationMember to = new RelationMember("to", toWay);
230 relation.addMember(to);
231
232 RelationMember via = new RelationMember("via", viaNode);
233 relation.addMember(via);
234
235 relation.put("type", "restriction");
236 relation.put("restriction", "no_left_turn");
237
238 cmds.add(new AddCommand(relation));
239 }
240 @Override
241 protected void updateEnabledState() {
242 setEnabled(getEditLayer() != null);
243 }
244
245 @Override
246 protected void updateEnabledState(
247 Collection<? extends OsmPrimitive> selection) {
248 // do nothing
249 }
250
251}
252}
Note: See TracBrowser for help on using the repository browser.