- Timestamp:
- 2011-12-04T00:30:57+01:00 (13 years ago)
- Location:
- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
r4629 r4630 10 10 import java.util.Collection; 11 11 import java.util.Collections; 12 import java.util.HashSet; 13 import java.util.Iterator; 12 14 import java.util.List; 15 import java.util.Set; 13 16 14 17 import org.openstreetmap.josm.Main; 15 18 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent; 16 19 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener; 20 import org.openstreetmap.josm.data.osm.DataSet; 17 21 import org.openstreetmap.josm.data.osm.Node; 22 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 18 23 import org.openstreetmap.josm.data.osm.Relation; 19 24 import org.openstreetmap.josm.data.osm.RelationMember; 20 25 import org.openstreetmap.josm.data.osm.Way; 21 26 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; 27 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 22 28 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData.Intersection; 23 29 … … 150 156 public static class JoinedWay { 151 157 private final List<Node> nodes; 158 private final Collection<Long> wayIds; 152 159 private final boolean selected; 153 160 154 public JoinedWay(List<Node> nodes, boolean selected) {161 public JoinedWay(List<Node> nodes, Collection<Long> wayIds, boolean selected) { 155 162 this.nodes = nodes; 163 this.wayIds = wayIds; 156 164 this.selected = selected; 157 165 } … … 161 169 } 162 170 171 public Collection<Long> getWayIds() { 172 return wayIds; 173 } 174 163 175 public boolean isSelected() { 164 176 return selected; … … 173 185 public enum Intersection {INSIDE, OUTSIDE, CROSSING} 174 186 175 p ublicfinal Path2D.Double poly;187 private final Path2D.Double poly; 176 188 public boolean selected; 177 189 private Rectangle2D bounds; 178 private final Collection< Way> ways;190 private final Collection<Long> wayIds; 179 191 private final List<Node> nodes; 180 192 private final List<PolyData> inners; 181 193 182 public PolyData(JoinedWay joinedWay, Collection<Way> refWays) { 183 this(joinedWay.getNodes(), joinedWay.isSelected(), refWays); 184 } 185 186 public PolyData(List<Node> nodes, boolean selected, Collection<Way> refWays) { 187 this.ways = Collections.unmodifiableCollection(refWays); 188 this.nodes = Collections.unmodifiableList(nodes); 194 public PolyData(Way closedWay) { 195 this(closedWay.getNodes(), closedWay.isSelected(), Collections.singleton(closedWay.getId())); 196 } 197 198 public PolyData(JoinedWay joinedWay) { 199 this(joinedWay.getNodes(), joinedWay.isSelected(), joinedWay.getWayIds()); 200 } 201 202 private PolyData(List<Node> nodes, boolean selected, Collection<Long> wayIds) { 203 this.wayIds = Collections.unmodifiableCollection(wayIds); 204 this.nodes = nodes; 189 205 this.selected = selected; 190 206 this.inners = new ArrayList<Multipolygon.PolyData>(); … … 196 212 private void buildPoly() { 197 213 boolean initial = true; 198 for (Node n : nodes) 199 { 214 for (Node n : nodes) { 200 215 Point2D p = n.getEastNorth(); 201 216 if (initial) { … … 215 230 this.selected = copy.selected; 216 231 this.poly = (Double) copy.poly.clone(); 217 this.way s = Collections.unmodifiableCollection(copy.ways);218 this.nodes = Collections.unmodifiableList(copy.nodes);232 this.wayIds = Collections.unmodifiableCollection(copy.wayIds); 233 this.nodes = new ArrayList<Node>(copy.nodes); 219 234 this.inners = new ArrayList<Multipolygon.PolyData>(copy.inners); 220 235 } … … 259 274 } 260 275 261 public Collection<Way> getWays() { 262 return ways; 276 public Collection<Long> getWayIds() { 277 return wayIds; 278 } 279 280 private void resetNodes() { 281 if (!nodes.isEmpty()) { 282 DataSet ds = nodes.get(0).getDataSet(); 283 nodes.clear(); 284 if (wayIds.size() == 1) { 285 Way w = (Way) ds.getPrimitiveById(wayIds.iterator().next(), OsmPrimitiveType.WAY); 286 nodes.addAll(w.getNodes()); 287 } else { 288 List<Way> waysToJoin = new ArrayList<Way>(); 289 for (Iterator<Long> it = wayIds.iterator(); it.hasNext(); ) { 290 waysToJoin.add((Way) ds.getPrimitiveById(it.next(), OsmPrimitiveType.WAY)); 291 } 292 nodes.addAll(joinWays(waysToJoin).iterator().next().getNodes()); 293 } 294 resetPoly(); 295 } 263 296 } 264 297 … … 280 313 if (nodes.contains(n) || innerChanged) { 281 314 resetPoly(); 315 } 316 } 317 318 public void wayNodesChanged(WayNodesChangedEvent event) { 319 final Long wayId = event.getChangedWay().getId(); 320 boolean innerChanged = false; 321 for (PolyData inner : inners) { 322 if (inner.wayIds.contains(wayId)) { 323 inner.resetNodes(); 324 innerChanged = true; 325 } 326 } 327 if (wayIds.contains(wayId) || innerChanged) { 328 resetNodes(); 282 329 } 283 330 } … … 329 376 for (Way way: ways) { 330 377 if (way.isClosed()) { 331 result.add(new PolyData(way .getNodes(), way.isSelected(), Collections.singleton(way)));378 result.add(new PolyData(way)); 332 379 } else { 333 380 waysToJoin.add(way); … … 336 383 337 384 for (JoinedWay jw: joinWays(waysToJoin)) { 338 result.add(new PolyData(jw , waysToJoin));339 } 340 } 341 342 public static Collection<JoinedWay> joinWays(Collection<Way> join)385 result.add(new PolyData(jw)); 386 } 387 } 388 389 public static Collection<JoinedWay> joinWays(Collection<Way> waysToJoin) 343 390 { 344 Collection<JoinedWay> res = new ArrayList<JoinedWay>(); 345 Way[] joinArray = join.toArray(new Way[join.size()]); 346 int left = join.size(); 347 while(left != 0) 348 { 391 final Collection<JoinedWay> result = new ArrayList<JoinedWay>(); 392 final Way[] joinArray = waysToJoin.toArray(new Way[waysToJoin.size()]); 393 int left = waysToJoin.size(); 394 while (left > 0) { 349 395 Way w = null; 350 396 boolean selected = false; 351 List<Node> n = null; 397 List<Node> nodes = null; 398 Set<Long> wayIds = new HashSet<Long>(); 352 399 boolean joined = true; 353 while(joined && left != 0) 354 { 400 while (joined && left > 0) { 355 401 joined = false; 356 for(int i = 0; i < joinArray.length && left != 0; ++i) 357 { 358 if(joinArray[i] != null) 359 { 402 for (int i = 0; i < joinArray.length && left != 0; ++i) { 403 if (joinArray[i] != null) { 360 404 Way c = joinArray[i]; 361 if(w == null) 362 { w = c; selected = w.isSelected(); joinArray[i] = null; --left; } 363 else 364 { 405 if (w == null) { 406 w = c; 407 selected = w.isSelected(); 408 joinArray[i] = null; 409 --left; 410 } else { 365 411 int mode = 0; 366 412 int cl = c.getNodesCount()-1; 367 413 int nl; 368 if(n == null) 369 { 414 if (nodes == null) { 370 415 nl = w.getNodesCount()-1; 371 if (w.getNode(nl) == c.getNode(0)) {416 if (w.getNode(nl) == c.getNode(0)) { 372 417 mode = 21; 373 } else if (w.getNode(nl) == c.getNode(cl)) {418 } else if (w.getNode(nl) == c.getNode(cl)) { 374 419 mode = 22; 375 } else if (w.getNode(0) == c.getNode(0)) {420 } else if (w.getNode(0) == c.getNode(0)) { 376 421 mode = 11; 377 } else if (w.getNode(0) == c.getNode(cl)) {422 } else if (w.getNode(0) == c.getNode(cl)) { 378 423 mode = 12; 379 424 } 380 } 381 else 382 { 383 nl = n.size()-1; 384 if(n.get(nl) == c.getNode(0)) { 425 } else { 426 nl = nodes.size()-1; 427 if (nodes.get(nl) == c.getNode(0)) { 385 428 mode = 21; 386 } else if (n.get(0) == c.getNode(cl)) {429 } else if (nodes.get(0) == c.getNode(cl)) { 387 430 mode = 12; 388 } else if (n.get(0) == c.getNode(0)) {431 } else if (nodes.get(0) == c.getNode(0)) { 389 432 mode = 11; 390 } else if (n.get(nl) == c.getNode(cl)) {433 } else if (nodes.get(nl) == c.getNode(cl)) { 391 434 mode = 22; 392 435 } 393 436 } 394 if(mode != 0) 395 { 437 if (mode != 0) { 396 438 joinArray[i] = null; 397 439 joined = true; 398 if (c.isSelected()) {440 if (c.isSelected()) { 399 441 selected = true; 400 442 } 401 443 --left; 402 if(n == null) { 403 n = w.getNodes(); 444 if (nodes == null) { 445 nodes = w.getNodes(); 446 wayIds.add(w.getId()); 404 447 } 405 n.remove((mode == 21 || mode == 22) ? nl : 0); 406 if(mode == 21) { 407 n.addAll(c.getNodes()); 408 } else if(mode == 12) { 409 n.addAll(0, c.getNodes()); 410 } else if(mode == 22) 411 { 412 for(Node node : c.getNodes()) { 413 n.add(nl, node); 448 nodes.remove((mode == 21 || mode == 22) ? nl : 0); 449 if (mode == 21) { 450 nodes.addAll(c.getNodes()); 451 } else if (mode == 12) { 452 nodes.addAll(0, c.getNodes()); 453 } else if (mode == 22) { 454 for (Node node : c.getNodes()) { 455 nodes.add(nl, node); 456 } 457 } else /* mode == 11 */ { 458 for (Node node : c.getNodes()) { 459 nodes.add(0, node); 414 460 } 415 461 } 416 else /* mode == 11 */ 417 { 418 for(Node node : c.getNodes()) { 419 n.add(0, node); 420 } 421 } 462 wayIds.add(c.getId()); 422 463 } 423 464 } … … 426 467 } /* while(joined) */ 427 468 428 if (n == null) { 429 n = w.getNodes(); 430 } 431 432 res.add(new JoinedWay(n, selected)); 469 if (nodes == null) { 470 nodes = w.getNodes(); 471 wayIds.add(w.getId()); 472 } 473 474 result.add(new JoinedWay(nodes, wayIds, selected)); 433 475 } /* while(left != 0) */ 434 476 435 return res ;477 return result; 436 478 } 437 479 … … 521 563 return combinedPolygons; 522 564 } 523 524 565 } -
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
r4629 r4630 120 120 } 121 121 122 private final void updateMultipolygonsReferringTo( finalAbstractDatasetChangedEvent event) {122 private final void updateMultipolygonsReferringTo(AbstractDatasetChangedEvent event) { 123 123 updateMultipolygonsReferringTo(event, event.getPrimitives(), event.getDataset()); 124 124 } 125 125 126 126 private final void updateMultipolygonsReferringTo( 127 final AbstractDatasetChangedEvent event, final Collection<? extends OsmPrimitive> primitives, finalDataSet ds) {127 final AbstractDatasetChangedEvent event, Collection<? extends OsmPrimitive> primitives, DataSet ds) { 128 128 updateMultipolygonsReferringTo(event, primitives, ds, null); 129 129 } 130 130 131 131 private final Collection<Map<Relation, Multipolygon>> updateMultipolygonsReferringTo( 132 final AbstractDatasetChangedEvent event, finalCollection<? extends OsmPrimitive> primitives,133 final DataSet ds, finalCollection<Map<Relation, Multipolygon>> initialMaps) {132 AbstractDatasetChangedEvent event, Collection<? extends OsmPrimitive> primitives, 133 DataSet ds, Collection<Map<Relation, Multipolygon>> initialMaps) { 134 134 Collection<Map<Relation, Multipolygon>> maps = initialMaps; 135 135 if (primitives != null) { … … 158 158 } 159 159 160 private final void processEvent(final AbstractDatasetChangedEvent event, final Relation r, final Collection<Map<Relation, Multipolygon>> maps) { 161 if (event instanceof NodeMovedEvent) { 162 for (Map<Relation, Multipolygon> map : maps) { 163 Multipolygon m = map.get(r); 164 for (PolyData pd : m.getCombinedPolygons()) { 165 pd.nodeMoved((NodeMovedEvent) event); 166 } 160 private final void processEvent(AbstractDatasetChangedEvent event, Relation r, Collection<Map<Relation, Multipolygon>> maps) { 161 if (event instanceof NodeMovedEvent || event instanceof WayNodesChangedEvent) { 162 dispatchEvent(event, r, maps); 163 } else if (event instanceof PrimitivesRemovedEvent) { 164 if (event.getPrimitives().contains(r)) { 165 removeMultipolygonFrom(r, maps); 167 166 } 168 167 } else { 169 168 // Default (non-optimal) action: remove multipolygon from cache 170 for (Map<Relation, Multipolygon> map : maps) { 171 map.remove(r); 172 } 169 removeMultipolygonFrom(r, maps); 170 } 171 } 172 173 private final void dispatchEvent(AbstractDatasetChangedEvent event, Relation r, Collection<Map<Relation, Multipolygon>> maps) { 174 for (Map<Relation, Multipolygon> map : maps) { 175 Multipolygon m = map.get(r); 176 for (PolyData pd : m.getCombinedPolygons()) { 177 if (event instanceof NodeMovedEvent) { 178 pd.nodeMoved((NodeMovedEvent) event); 179 } else if (event instanceof WayNodesChangedEvent) { 180 pd.wayNodesChanged((WayNodesChangedEvent)event); 181 } 182 } 183 } 184 } 185 186 private final void removeMultipolygonFrom(Relation r, Collection<Map<Relation, Multipolygon>> maps) { 187 for (Map<Relation, Multipolygon> map : maps) { 188 map.remove(r); 173 189 } 174 190 } … … 181 197 @Override 182 198 public void primitivesRemoved(PrimitivesRemovedEvent event) { 183 updateMultipolygonsReferringTo(event); // FIXME: See if it is possible to update only concerned PolyData199 updateMultipolygonsReferringTo(event); 184 200 } 185 201 186 202 @Override 187 203 public void tagsChanged(TagsChangedEvent event) { 188 // removeMultipolygonsReferringTo(event);204 // Do nothing 189 205 } 190 206 … … 196 212 @Override 197 213 public void wayNodesChanged(WayNodesChangedEvent event) { 198 updateMultipolygonsReferringTo(event); // FIXME: See if it is possible to update only concerned PolyData214 updateMultipolygonsReferringTo(event); 199 215 } 200 216 201 217 @Override 202 218 public void relationMembersChanged(RelationMembersChangedEvent event) { 203 updateMultipolygonsReferringTo(event); // FIXME: See if it is possible to update only concerned PolyData219 updateMultipolygonsReferringTo(event); 204 220 } 205 221 206 222 @Override 207 223 public void otherDatasetChange(AbstractDatasetChangedEvent event) { 208 updateMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData224 // Do nothing 209 225 } 210 226 211 227 @Override 212 228 public void dataChanged(DataChangedEvent event) { 213 updateMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData229 // Do nothing 214 230 } 215 231 … … 260 276 if (multipolygon != null) { 261 277 for (PolyData pd : multipolygon.getCombinedPolygons()) { 262 if (pd.getWay s().contains(p)) {278 if (pd.getWayIds().contains(p.getId())) { 263 279 pd.selected = true; 264 280 selectedPolyData.add(pd);
Note:
See TracChangeset
for help on using the changeset viewer.