Changeset 21804 in osm for applications
- Timestamp:
- 2010-06-19T21:01:59+02:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java
r21801 r21804 11 11 import java.util.Collection; 12 12 import java.util.LinkedList; 13 import java.util.List; 13 14 14 15 import javax.swing.JOptionPane; … … 19 20 import org.openstreetmap.josm.command.SequenceCommand; 20 21 import org.openstreetmap.josm.data.coor.*; 22 import org.openstreetmap.josm.data.osm.BBox; 23 import org.openstreetmap.josm.data.osm.DataSet; 21 24 import org.openstreetmap.josm.data.osm.Node; 25 import org.openstreetmap.josm.data.osm.OsmPrimitive; 22 26 import org.openstreetmap.josm.data.osm.Way; 23 27 import org.openstreetmap.josm.gui.MapView; … … 25 29 class Building { 26 30 private static final double eqlen = 40075004; // length of equator in metres 27 private EastNorth en1; 28 private EastNorth en2; 29 private EastNorth en3; 30 private EastNorth en4; 31 32 private EastNorth p1; 33 private Node node; 31 private final EastNorth[] en = new EastNorth[4]; 32 34 33 double meter = 0; 35 34 … … 63 62 public void reset() { 64 63 len = 0; 65 en1 = null; 66 en2 = null; 67 en3 = null; 68 en4 = null; 69 } 70 71 public EastNorth point1() { 72 return en1; 73 } 74 75 public EastNorth point2() { 76 return en2; 77 } 78 79 public EastNorth point3() { 80 return en3; 81 } 82 83 public EastNorth point4() { 84 return en4; 64 65 for (int i = 0; i < 4; i++) 66 en[i] = null; 67 } 68 69 public EastNorth getPoint(int num) { 70 return en[num]; 85 71 } 86 72 87 73 private void updMetrics() { 88 meter = 2 * Math.PI / (Math.cos(Math.toRadians(eastNorth2latlon( p1).lat())) * eqlen);74 meter = 2 * Math.PI / (Math.cos(Math.toRadians(eastNorth2latlon(en[0]).lat())) * eqlen); 89 75 reset(); 90 76 } 91 77 92 78 public void setBase(EastNorth base) { 93 node = null; 94 p1 = base; 79 en[0] = base; 95 80 updMetrics(); 96 81 } 97 82 98 83 public void setBase(Node base) { 99 node = base; 100 p1 = latlon2eastNorth(base.getCoor()); 84 en[0] = latlon2eastNorth(base.getCoor()); 101 85 updMetrics(); 102 86 } … … 106 90 */ 107 91 private double projection1(EastNorth p) { 108 final EastNorth vec = p1.sub(p);92 final EastNorth vec = en[0].sub(p); 109 93 return (Math.sin(heading) * vec.east() + Math.cos(heading) * vec.north()) / meter; 110 94 } … … 115 99 */ 116 100 private double projection2(EastNorth p) { 117 final EastNorth vec = p1.sub(p);101 final EastNorth vec = en[0].sub(p); 118 102 return (Math.cos(heading) * vec.east() - Math.sin(heading) * vec.north()) / meter; 119 103 } … … 122 106 if (len == 0) 123 107 return; 124 en1 = p1; 125 en2 = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter); 126 en3 = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter, p1.north() 108 final EastNorth p1 = en[0]; 109 en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter); 110 en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter, p1 111 .north() 127 112 + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter); 128 en 4= new EastNorth(p1.east() + Math.cos(heading) * width * meter, p1.north() - Math.sin(heading) * width113 en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter, p1.north() - Math.sin(heading) * width 129 114 * meter); 130 115 } … … 142 127 143 128 public void setPlace(EastNorth p2, double width, double lenstep, boolean ignoreConstraints) { 144 this.heading = p1.heading(p2); 129 if (en[0] == null) 130 en[0] = p2; 131 this.heading = en[0].heading(p2); 145 132 double hdang = 0; 146 133 if (angConstrained && !ignoreConstraints) { … … 174 161 175 162 public void angFix(EastNorth point) { 176 EastNorth en3 = this.en 3;177 heading = p1.heading(point);163 EastNorth en3 = this.en[2]; 164 heading = en[0].heading(point); 178 165 setLengthWidth(projection1(en3), projection2(en3)); 179 this.en 3= en3;166 this.en[2] = en3; 180 167 } 181 168 … … 184 171 return; 185 172 GeneralPath b = new GeneralPath(); 186 Point pp1 = mv.getPoint(eastNorth2latlon(en 1));187 Point pp2 = mv.getPoint(eastNorth2latlon(en 2));188 Point pp3 = mv.getPoint(eastNorth2latlon(en 4));189 Point pp4 = mv.getPoint(eastNorth2latlon(en 3));173 Point pp1 = mv.getPoint(eastNorth2latlon(en[0])); 174 Point pp2 = mv.getPoint(eastNorth2latlon(en[1])); 175 Point pp3 = mv.getPoint(eastNorth2latlon(en[2])); 176 Point pp4 = mv.getPoint(eastNorth2latlon(en[3])); 190 177 191 178 b.moveTo(pp1.x, pp1.y); 179 b.lineTo(pp2.x, pp2.y); 192 180 b.lineTo(pp3.x, pp3.y); 193 181 b.lineTo(pp4.x, pp4.y); 194 b.lineTo(pp2.x, pp2.y);195 182 b.lineTo(pp1.x, pp1.y); 196 183 g.draw(b); 184 } 185 186 private Node findNode(EastNorth en) { 187 DataSet ds = Main.main.getCurrentDataSet(); 188 LatLon l = eastNorth2latlon(en); 189 List<Node> nodes = ds.searchNodes(new BBox(l.lon() - 0.00001, l.lat() - 0.00001, 190 l.lon() + 0.00001, l.lat() + 0.00001)); 191 for (Node n : nodes) { 192 if (OsmPrimitive.isUsablePredicate.evaluate(n)) 193 return n; 194 } 195 return null; 197 196 } 198 197 … … 200 199 if (len == 0) 201 200 return null; 202 Node n1; 203 if (node == null) 204 n1 = new Node(eastNorth2latlon(en1)); 205 else 206 n1 = node; 207 Node n2 = new Node(eastNorth2latlon(en2)); 208 Node n3 = new Node(eastNorth2latlon(en3)); 209 Node n4 = new Node(eastNorth2latlon(en4)); 210 if (n1.getCoor().isOutSideWorld() || n2.getCoor().isOutSideWorld() || 211 n3.getCoor().isOutSideWorld() || n4.getCoor().isOutSideWorld()) { 212 JOptionPane.showMessageDialog(Main.parent, 213 tr("Cannot place building outside of the world.")); 214 return null; 201 final boolean[] created = new boolean[4]; 202 final Node[] nodes = new Node[4]; 203 for (int i = 0; i < 4; i++) { 204 Node n = findNode(en[i]); 205 if (n == null) { 206 nodes[i] = new Node(eastNorth2latlon(en[i])); 207 created[i] = true; 208 } else { 209 nodes[i] = n; 210 created[i] = false; 211 } 212 if (nodes[i].getCoor().isOutSideWorld()) { 213 JOptionPane.showMessageDialog(Main.parent, 214 tr("Cannot place building outside of the world.")); 215 return null; 216 } 215 217 } 216 218 Way w = new Way(); 217 w.addNode(n 1);218 if (projection1( en3) > 0) {219 w.addNode(n 2);220 w.addNode(n 3);221 w.addNode(n 4);219 w.addNode(nodes[0]); 220 if (projection1(latlon2eastNorth(nodes[2].getCoor())) > 0) { 221 w.addNode(nodes[1]); 222 w.addNode(nodes[2]); 223 w.addNode(nodes[3]); 222 224 } else { 223 w.addNode(n 4);224 w.addNode(n 3);225 w.addNode(n 2);226 } 227 w.addNode(n 1);225 w.addNode(nodes[3]); 226 w.addNode(nodes[2]); 227 w.addNode(nodes[1]); 228 } 229 w.addNode(nodes[0]); 228 230 w.put("building", ToolSettings.getTag()); 229 231 Collection<Command> cmds = new LinkedList<Command>(); 230 if (node == null) 231 cmds.add(new AddCommand(n1)); 232 cmds.add(new AddCommand(n2)); 233 cmds.add(new AddCommand(n3)); 234 cmds.add(new AddCommand(n4)); 232 for (int i = 0; i < 4; i++) { 233 if (created[i]) 234 cmds.add(new AddCommand(nodes[i])); 235 } 235 236 cmds.add(new AddCommand(w)); 236 237 Command c = new SequenceCommand(tr("Create building"), cmds);
Note:
See TracChangeset
for help on using the changeset viewer.