45 | | import codecs |
46 | | |
47 | | |
48 | | # the file name where the report for the wiki goes, needs to be configurable |
49 | | wikiReportFN = 'C:/wikiReport.txt' |
50 | | # comment to disable side effect |
51 | | sideEffects = { |
52 | | 'addRouteToNetwork': None, |
53 | | #'removeNameRefKey_xx-yyAndcreated_by': None, |
54 | | #'modifyNoteTo_xx-yy': None, |
55 | | #'flipOrderOfMembers': None, # such that ways go from lower rXn_ref to higher rXn_ref |
56 | | #'sortRouteRelations': None, |
57 | | #'sortNetworkRelations': None, # not implemented yet |
58 | | #'removeNodesFromRoutes': None, |
59 | | #'addNodes2Routes': None, |
60 | | #'selectObjects': None, |
61 | | #'zoomToSelection': None, |
62 | | #'downloadReferrersForNodes': None, # This will download all ways and relations for nodes with an rXn_ref |
63 | | #'downloadReferrersForWays': None, # This will download all relations for ways that have an endnode with an rXn_ref |
64 | | #'downloadIncompleteMembers': None, |
65 | | 'createWikiReport': None, |
66 | | #'reportWhenWaysAreUsedInAnotherRelationToo': None, # not implemented yet |
67 | | #'addFixmeTODOtags': None, # This will add todo tags to the data containing problems, |
68 | | # the intention is that these tags are removed before uploading, |
69 | | # once the reported problems are resolved |
70 | | #'createGarminGPX': None, # not implemented yet |
71 | | #'checkOneWays = False, # not implemented yet |
72 | | } |
73 | | |
74 | | logVerbosity = 20 |
75 | | ''' |
76 | | 10: only report problems that require attention |
77 | | 20: report on collection |
78 | | 30: report on network nodes |
79 | | 40: report on which routes are being checked |
80 | | 50: report everything |
81 | | ''' |
373 | | else: |
374 | | if not(routeHasStarted): |
375 | | if role: |
376 | | if role in ['forward']: |
377 | | firstNode=wayNodes[0] |
378 | | else: |
379 | | firstNode=wayNodes[-1] |
380 | | firstNodeUid = firstNode.getUniqueId() |
381 | | print firstNodeUid, firstNodeUid in likelyCandidateNodesForActualStartOfRoute |
382 | | if firstNodeUid in likelyCandidateNodesForActualStartOfRoute: print likelyCandidateNodesForActualStartOfRoute[firstNodeUid] |
383 | | print likelyCandidateNodesForActualStartOfRoute |
384 | | if firstNodeUid in likelyCandidateNodesForActualStartOfRoute and likelyCandidateNodesForActualStartOfRoute[firstNodeUid]>1: |
385 | | routeHasStarted = True |
386 | | if firstNode.get(networklevel + '_ref'): |
387 | | if logVerbosity > 49: print 'rXn_ref', firstNode.get(networklevel + '_ref'), 'found in ', firstNode.getUniqueId() |
388 | | # This is not the first member anymore and the first node has an rXn_ref and the member has a role, |
389 | | # so we have to assign what we thought was the start of the route to one of our tentacles |
390 | | tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = [] |
391 | | if allWaysgoingFromLowerToHigher: |
392 | | prevRole = allWaysgoingFromLowerToHigher[-1].getRole() |
393 | | if logVerbosity > 49: print 'prevRoleL2H', prevRole |
394 | | if prevRole in ['forward']: |
395 | | interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[-1].getUniqueId() |
396 | | elif prevRole in ['backward']: |
397 | | interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[0].getUniqueId() |
398 | | elif allWaysgoingFromHigherToLower: |
399 | | prevRole = allWaysgoingFromHigherToLower[-1].getRole() |
400 | | if logVerbosity > 49: print 'prevRoleH2L', prevRole |
401 | | if prevRole in ['forward']: |
402 | | interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[0].getUniqueId() |
403 | | elif prevRole in ['backward']: |
404 | | interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[-1].getUniqueId() |
405 | | if interestingNodeId and firstNode.getUniqueId() == interestingNodeId: |
406 | | reference = tentacle+1 |
407 | | if allWaysgoingFromLowerToHigher: |
408 | | tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, reference] |
409 | | elif allWaysgoingFromHigherToLower: |
410 | | tentacledescription = [tentacle, allWaysgoingFromHigherToLower, reference] |
411 | | allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None |
412 | | if tentacledescription: |
413 | | if rXn_refAsInt and not(rXn_refAsInt in tentacles): |
414 | | tentacles[rXn_refAsInt] = [] |
415 | | tentacles[rXn_refAsInt].append(tentacledescription) |
| 219 | if role and role in ['forward', 'backward']: |
| 220 | if not(branch): |
| 221 | if role in ['forward']: |
| 222 | lastNodesBeforeSplit = [wayNodes[0]] |
417 | | # no role on way means this is the actual start of our route |
418 | | # so, all that went into allWaysgoingFromLowerToHigher etc has to go to the last tentacle |
419 | | routeHasStarted = True |
420 | | if allWaysgoingFromLowerToHigher or allWaysgoingFromHigherToLower: |
421 | | tentacle +=1 |
422 | | if allWaysgoingFromHigherToLower: |
423 | | allWaysgoingFromLowerToHigher # .append(allWaysgoingFromHigherToLower) |
424 | | tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, 0] |
425 | | # allWaysgoingFromHigherToLower was assigned the start of the route in mistake in this case |
426 | | # it should have gone to both 'branches', so we create a shallow copy |
427 | | allWaysgoingFromLowerToHigher = allWaysgoingFromHigherToLower[:]; branch = None |
428 | | if not(rXn_refAsInt in tentacles): |
429 | | tentacles[rXn_refAsInt] = [] |
430 | | tentacles[rXn_refAsInt].append(tentacledescription) |
431 | | if high_rXn_refEncountered > 1: |
432 | | # We're past the first high rXn_ref, time to disover more tentacles |
433 | | if role: |
434 | | if role in ['forward']: |
435 | | lastNode=wayNodes[-1] |
436 | | else: |
437 | | lastNode=wayNodes[0] |
438 | | if lastNode.get(networklevel + '_ref'): |
439 | | print 'rXn_ref', lastNode.get(networklevel + '_ref'), 'found in ', lastNode.getUniqueId() |
440 | | tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = [] |
441 | | if interestingNodeId and lastNode.getUniqueId() == interestingNodeId: |
442 | | reference = tentacle+1 |
443 | | if allWaysgoingFromLowerToHigher: |
444 | | tentacledescription = [tentacle, allWaysgoingFromLowerToHigherBeyondEndOfRoute, reference] |
445 | | elif allWaysgoingFromHigherToLower: |
446 | | tentacledescription = [tentacle, allWaysgoingFromHigherToLowerBeyondEndOfRoute, reference] |
447 | | allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = []; branch = None |
448 | | if tentacledescription: |
449 | | if rXn_refAsInt and not(rXn_refAsInt in tentacles): |
450 | | tentacles[rXn_refAsInt] = [] |
451 | | tentacles[rXn_refAsInt].append(tentacledescription) |
452 | | if logVerbosity > 49: print tentacle, repr(tentacles) |
453 | | |
454 | | if role and role in ['forward', 'backward']: |
455 | | # if there is a role, it might be part of the route proper when it starts or ends in a fork |
456 | | # this is what we suppose, if we encounter another node with a low rXn_ref, we add what we already had |
457 | | # to the tentacles structure and clear fromLowToHigh |
458 | | if not(branch): |
459 | | if wayNodes: |
460 | | if role in ['forward']: |
461 | | lastNodesBeforeSplit = [wayNodes[0]] |
462 | | else: |
463 | | lastNodesBeforeSplit = [wayNodes[-1]] |
464 | | else: |
465 | | return '', True, '|align="right" | way has no nodes||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" needs to be downloaded first\n' |
466 | | if logVerbosity > 49: print waynodes |
467 | | if logVerbosity > 29: |
468 | | print 'lastNodesBeforeSplit', lastNodesBeforeSplit |
469 | | print way.getNodesCount(), 'startnode', wayNodes[0], 'endnode', wayNodes[-1] |
470 | | print 'roundabout', roundabout |
471 | | print wayNodes[-1].get(networklevel + '_ref'),not(member.getUniqueId() == routeMembers[-1].getUniqueId()) |
| 224 | lastNodesBeforeSplit = [wayNodes[-1]] |
| 225 | print 'wayNodes', wayNodes |
| 226 | print 'lastNodesBeforeSplit', lastNodesBeforeSplit |
| 227 | print way.getNodesCount(), 'startnode', wayNodes[0], 'endnode', wayNodes[-1] |
| 228 | print 'roundabout', roundabout |
| 229 | |
541 | | if 'sortRouteRelations' in sideEffects and not(continuous_forward) and not(fixme): |
542 | | sortedRelation = sortRouteRelation(route, nodesForSorting, beginAndEndNodes) |
543 | | |
544 | | if logVerbosity>49: |
545 | | print route |
546 | | print sortedRelation |
547 | | |
548 | | allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = [] |
549 | | routeMembers = sortedRelation.getMembers(); i=0 |
550 | | for member in routeMembers: |
551 | | if member.isWay(): |
552 | | role = member.getRole() |
553 | | if i==0: |
554 | | lastNodesBeforeSplit = [wayNodes] # why nodes in plural? situations occur where the branch starts on a roundabout |
555 | | if role and role in ['forward', 'backward']: |
556 | | if not(branch): |
557 | | if role in ['forward']: |
558 | | lastNodesBeforeSplit = [wayNodes[0]] |
559 | | else: |
560 | | lastNodesBeforeSplit = [wayNodes[-1]] |
561 | | if logVerbosity > 29: |
562 | | print 'wayNodes', wayNodes |
563 | | print 'lastNodesBeforeSplit', lastNodesBeforeSplit |
564 | | print way.getNodesCount(), 'startnode', wayNodes[0], 'endnode', wayNodes[-1] |
565 | | print 'roundabout', roundabout |
566 | | |
567 | | if role in ['forward'] and (wayNodes[-1] in lastNodesBeforeSplit or wayNodes[-1] in roundabout): |
568 | | branch = 'HigherToLower' |
569 | | elif role in ['backward'] and wayNodes[0] in lastNodesBeforeSplit: |
570 | | branch = 'HigherToLower' |
571 | | elif wayNodes[-1].get(networklevel + '_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()): # not(allWaysgoingFromHigherToLower) and ## this last part is probably not necessary anymore |
572 | | # This is for when the route starts forked from a different rXn node (split node situation), we don't want it to kick in for the last member of the route |
573 | | branch = 'HigherToLower' |
574 | | elif not(branch == 'HigherToLower'): |
575 | | branch = 'LowerToHigher' |
576 | | print branch |
577 | | if branch == 'LowerToHigher': |
578 | | allWaysgoingFromLowerToHigher.append(member) |
579 | | elif branch == 'HigherToLower': |
580 | | allWaysgoingFromHigherToLower.append(member) |
581 | | else: |
582 | | branch = None; roundabout = [] |
583 | | allWaysgoingFromLowerToHigher.append(member) |
584 | | allWaysgoingFromHigherToLower.append(member) |
585 | | if way.get('junction') == 'roundabout': |
586 | | roundabout = way.getNodes() |
587 | | i+=1 |
588 | | continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher) |
589 | | if continuous_forward: |
590 | | # we only want to store the sorted relation, when sorting actually succeeded in getting it continuous |
591 | | commandsList.append(Command.ChangeCommand(route, sortedRelation)) |
592 | | Main.main.undoRedo.add(Command.SequenceCommand("Sorted route relation", commandsList)) |
593 | | else: |
594 | | # a route relation with only one way member |
| 257 | #if not(continuous_forward) and not(fixme): |
| 258 | #sortedRelation = sortRouteRelation(route, nodesForSorting, beginAndEndNodes) |
| 259 | |
| 260 | #print route |
| 261 | #print sortedRelation |
| 262 | #commandsList.append(Command.ChangeCommand(route, sortedRelation)) |
| 263 | #Main.main.undoRedo.add(Command.SequenceCommand("Sorted route relation", commandsList)) |
| 264 | #allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = [] |
| 265 | #for member in route.getMembers(): |
| 266 | #if member.isWay(): |
| 267 | #role = member.getRole() |
| 268 | #way = member.getWay() |
| 269 | #if role=='forward': |
| 270 | #allWaysgoingFromLowerToHigher.append(member) |
| 271 | #elif role=='backward': |
| 272 | #allWaysgoingFromHigherToLower.append(member) |
| 273 | #else: |
| 274 | #allWaysgoingFromLowerToHigher.append(member) |
| 275 | #allWaysgoingFromHigherToLower.append(member) |
| 276 | #print allWaysgoingFromLowerToHigher |
| 277 | #continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher) |
| 278 | #else: |
| 279 | else: |
627 | | if not(-1 in rXn_refs): |
628 | | rXn_refs.sort() |
629 | | newNote = str(rXn_refs[0]).zfill(2) + '-' + str(rXn_refs[-1]).zfill(2) |
630 | | else: |
631 | | newNote = '' |
632 | | for ref in actual_rXn_refs: |
633 | | newNote+=ref + '-' |
634 | | newNote = newNote[:-1] |
635 | | if logVerbosity > 49: print note, newNote |
636 | | if 'modifyNoteTo_xx-yy' in sideEffects: |
637 | | if (not(note) or note != newNote) and rXn_refs[0] != rXn_refs[-1]: |
638 | | newRelation = Relation(route) |
639 | | #print newRelation.getUniqueId() |
640 | | #print route.getUniqueId() |
641 | | if not(note): note = 'nothing' |
642 | | newRelation.put('note', newNote) |
643 | | relationChanged = True |
644 | | commandsList.append(Command.ChangeCommand(route, newRelation)) |
645 | | |
646 | | Main.main.undoRedo.add(Command.SequenceCommand("Changing note from " + note + ' to ' + newNote, commandsList)) |
647 | | commandsList = [] |
648 | | |
649 | | if len(route_relation_names) > 1 and route_relation_names[0] != route_relation_names[1]: |
650 | | # print 'This is probably a CONNECTION to another network' |
651 | | if logVerbosity > 9: print newNote, route_relation_names |
652 | | roleInNetwork = 'connection' |
653 | | wikiEN = '' |
654 | | else: |
655 | | if logVerbosity > 9: print 'less than 2 end nodes with '+networklevel+'_ref found for route', newNote |
656 | | wikiEN = 'style="color:red" | ' + repr(rXn_refs) + ' - ?' |
657 | | if 'addFixmeTODOtags' in sideEffects and not(route.get(networklevel+':external_connection')) and not(route.get('roundtrip')): |
658 | | newRelation = Relation(route) |
659 | | #print newRelation.getUniqueId() |
660 | | #print route.getUniqueId() |
661 | | fixmetodo = 'less than 2 end nodes with '+networklevel+'_ref found for route' + newNote + ' ' + repr(rXn_refs) + ' ' + note |
662 | | newRelation.put('fixmetodo', fixmetodo) |
| 306 | newNote = str(rcn_refs[0]).zfill(2) + '-' + str(rcn_refs[1]).zfill(2) |
| 307 | #print note, newNote |
| 308 | if not(note) or note != newNote: |
| 309 | if not(note): note = 'nothing' |
| 310 | newRelation.put('note', newNote) |
727 | | if logVerbosity>19: |
728 | | print '********************************************' |
729 | | print name |
730 | | print '********************************************' |
731 | | lowestrXn_refInNetwork=9999; listOfNodeMembersSeen = [] |
732 | | dictionaryWithAllNodesBelongingToThisNetwork = {}; dictionaryWithAllNodesBelongingToNeighbouringNetworks = {} |
733 | | ListOfInternalRoutesSeen = []; ListOfExternalRoutesSeen = []; dictionaryLinkingRoutesToNotes = {} |
734 | | members = network.getMembers() |
735 | | # Find a member node with the lowestrXn_refInNetwork and bring it to the front if such node is not there yet |
736 | | firstMember = members[0] |
737 | | if firstMember.isRelation() or firstMember.isNode() and int(firstMember.getNode().get(networklevel + '_ref')) != lowestrXn_refInNetwork: |
738 | | memberNode = None |
739 | | for networkMember in members: |
740 | | if networkMember.isNode(): |
741 | | memberNode = networkMember.getNode() |
742 | | if int(memberNode.get(networklevel + '_ref')) == 1: break |
743 | | if memberNode: |
744 | | network.removeMembersFor(memberNode) |
745 | | network.addMember(0, networkMember) |
746 | | |
747 | | for networkMember in network.getMembers(): |
748 | | if networkMember.isNode(): |
749 | | node = networkMember.getNode() |
750 | | rXn_ref = node.get(networklevel + '_ref') |
751 | | if int(rXn_ref) == 1: |
| 352 | print '********************************************' |
| 353 | print name |
| 354 | print '********************************************' |
| 355 | #'===' + name + '===\n' + |
| 356 | wikiReportOnNodes = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
| 357 | '\n|-\n!style="width:2.5em" | Node\n!Link\n! # Roads\n! # Relations\n|-\n') |
| 358 | |
| 359 | wikiReportOnRelations = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
| 360 | '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n|-\n') |
| 361 | i=1 |
| 362 | for networkmember in network.getMembers(): |
| 363 | if networkmember.isRelation(): |
| 364 | subrelation = networkmember.getRelation() |
| 365 | if subrelation.hasIncompleteMembers(): |
| 366 | #JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the route relations first') |
| 367 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(subrelation, subrelation.getIncompleteMembers(), mv.editLayer )) |
| 368 | break |
| 369 | roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(subrelation) |
| 370 | if problemReported: |
| 371 | wikiReportOnRelations += wikiReport + '\n|-\n' |
| 372 | #if roleFromRouteCheck: |
| 373 | role = networkmember.getRole() |
| 374 | if role != roleFromRouteCheck: |
| 375 | print |
| 376 | print 'Role in network is ', role |
| 377 | print 'Maybe this should be: ', roleFromRouteCheck |
| 378 | if networkmember.isNode(): |
| 379 | node = networkmember.getNode() |
| 380 | rcn_ref = node.get('rcn_ref') |
| 381 | expected_rcn_route_relations = node.get('expected_rcn_route_relations') |
| 382 | if expected_rcn_route_relations: |
| 383 | expected_rcn_route_relations = int(expected_rcn_route_relations) |
| 384 | else: |
| 385 | expected_rcn_route_relations = 3 |
| 386 | if rcn_ref: |
| 387 | #print rcn_ref |
756 | | for wayReferrer in referrersForWay: |
757 | | if wayReferrer.getType() is dummy_relation.getType(): |
758 | | aRelation = wayReferrer |
759 | | if aRelation.get('type') == 'route' and aRelation.get('network') ==networklevel and not(aRelation.get('ref')): |
760 | | rXnNetworkCountForNode+=1 |
761 | | if aRelation.hasIncompleteMembers(): |
762 | | name = aRelation.get('name') |
763 | | if not(name): name = '' |
764 | | note = aRelation.get('note') |
765 | | if not(note): note = '' |
766 | | networkname = aRelation.get('network') |
767 | | if not(networkname): networkname = '' |
768 | | if 'downloadIncompleteMembers' in sideEffects: |
769 | | aDownloadWasNeeded = True |
770 | | print 'Downloading incomplete members for', note |
771 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(aRelation, aRelation.getIncompleteMembers(), mv.editLayer )) |
772 | | time.sleep(1) |
773 | | continue |
774 | | else: |
775 | | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + networkname + ' ' + note + ' ' + name) |
776 | | break |
777 | | networkMembersList = [] |
778 | | for subMember in network.getMembers(): |
779 | | if subMember.isRelation(): |
780 | | routeRelation = subMember.getRelation() |
781 | | networkMembersList.append(routeRelation.getUniqueId()) |
782 | | routeId = aRelation.getUniqueId() |
783 | | if rXnRelationWeWantToProcess and not(routeId in networkMembersList): |
784 | | roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(aRelation, aDownloadWasNeeded) |
785 | | if problemReported and 'createWikiReport' in sideEffects: |
786 | | wikiReportOnRelations += wikiReport + '\n|-\n' |
787 | | if 'addRouteToNetwork' in sideEffects and not(aDownloadWasNeeded): |
| 407 | if len(referrersForWay) < 1: |
| 408 | Main.main.getCurrentDataSet().setSelected(referrer) |
| 409 | AutoScaleAction.zoomToSelection() |
| 410 | ##selectedWay = mv.editLayer.data.getSelected() |
| 411 | #DownloadReferrersAction.downloadReferrers(mv.editLayer, referrersForNode) |
| 412 | referrersForWay = referrer.getReferrers() |
| 413 | for wayreferrer in referrersForWay: |
| 414 | if wayreferrer.getType() is dummy_relation.getType(): |
| 415 | memberslist = [] |
| 416 | if wayreferrer.get('type') == 'route' and wayreferrer.get('network') == 'rcn': |
| 417 | rcnNetworkCountForNode+=1 |
| 418 | for submember in network.getMembers(): |
| 419 | if submember.isRelation(): |
| 420 | subrelation = submember.getRelation() |
| 421 | memberslist.append(subrelation.getId()) |
| 422 | if not(wayreferrer.getId()): |
| 423 | print dir(wayreferrer) |
| 424 | break |
| 425 | routeId = wayreferrer.getId() |
| 426 | if not(routeId) or not(routeId in memberslist): |
| 427 | if wayreferrer.get('network') == 'rcn': |
| 428 | roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(wayreferrer) |
| 429 | print wikiReport |
| 430 | if problemReported: |
| 431 | wikiReportOnRelations += wikiReport + '\n|-\n' |
801 | | |
802 | | |
803 | | def checkNetwork(network, networklevel, aDownloadWasNeeded): |
804 | | name = network.get('name') |
805 | | if logVerbosity>19: |
806 | | print '********************************************' |
807 | | print name |
808 | | print '********************************************' |
809 | | if 'createWikiReport' in sideEffects: |
810 | | wikiReportOnNodes = ('\n==' + name + '==\n{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
811 | | '\n|-\n!style="width:2.5em" | Node\n!Link\n! # Roads\n! # Relations\n|-\n') |
812 | | wikiReportOnRelations = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name + |
813 | | '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n! end nodes\n|-\n') |
814 | | i=1 |
815 | | for networkMember in network.getMembers(): |
816 | | if networkMember.isRelation(): |
817 | | routeRelation = networkMember.getRelation() |
818 | | if routeRelation.get('network') ==networklevel: |
819 | | if routeRelation.hasIncompleteMembers(): |
820 | | name = routeRelation.get('name') |
821 | | if not(name): name = '' |
822 | | note = routeRelation.get('note') |
823 | | if not(note): note = '' |
824 | | kindOfNetwork = routeRelation.get('network') |
825 | | if not(kindOfNetwork): kindOfNetwork = '' |
826 | | if 'downloadIncompleteMembers' in sideEffects: |
827 | | aDownloadWasNeeded = True |
828 | | print 'Downloading incomplete members for', note |
829 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(routeRelation, routeRelation.getIncompleteMembers(), mv.editLayer )) |
830 | | time.sleep(1) |
831 | | continue |
832 | | else: |
833 | | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + kindOfNetwork + ' ' + note + ' ' + name) |
834 | | break |
835 | | roleFromRouteCheck, problemReported, wikiReport = checkRxNroute(routeRelation, networklevel, aDownloadWasNeeded) |
836 | | if problemReported and 'createWikiReport' in sideEffects: |
837 | | wikiReportOnRelations += wikiReport + '\n|-\n' |
838 | | role = networkMember.getRole() |
839 | | if logVerbosity > 29 and role != roleFromRouteCheck: |
840 | | print |
841 | | print 'Role in network is ', role |
842 | | print 'Maybe this should be: ', roleFromRouteCheck |
843 | | if networkMember.isNode(): |
844 | | node = networkMember.getNode() |
845 | | rXn_ref = node.get(networklevel + '_ref') |
846 | | expected_rXn_route_relations = node.get('expected_' + networklevel + '_route_relations') |
847 | | if expected_rXn_route_relations: |
848 | | expected_rXn_route_relations = int(expected_rXn_route_relations) |
849 | | else: |
850 | | expected_rXn_route_relations = 3 |
851 | | if rXn_ref: |
852 | | if logVerbosity > 39: print rXn_ref |
853 | | referrersForNode = node.getReferrers() |
854 | | networkNotFoundForNode = True |
855 | | for referrer in referrersForNode: |
856 | | if referrer.getType() is dummy_relation.getType(): |
857 | | if referrer.get('type') in ['network'] and referrer.get('network') in ['rcn','rwn','rhn']: |
858 | | networkNotFoundForNode = False |
859 | | break |
860 | | if networkNotFoundForNode and 'downloadReferrersNodes' in sideEffects: |
861 | | aDownloadWasNeeded = True |
862 | | if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(node) |
863 | | if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() |
864 | | #selectedNode = mv.editLayer.data.getSelected() |
865 | | print 'Downloading referrers for ', node.get(networklevel + '_ref') |
866 | | DownloadReferrersAction.downloadReferrers(mv.editLayer, node) |
867 | | |
868 | | rXnNetworkCountForNode = roads = 0 |
869 | | for referrer in referrersForNode: |
870 | | if referrer.getType() is dummy_way.getType(): |
871 | | if referrer.get('highway'): roads += 1 |
872 | | referrersForWay = referrer.getReferrers() |
873 | | if len(referrersForWay) < 1 and 'downloadReferrersForWays' in sideEffects: |
874 | | aDownloadWasNeeded = True |
875 | | if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(referrer) |
876 | | if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection() |
877 | | print 'Downloading referrers for ', referrer.get('name') , ' ', rXn_ref |
878 | | DownloadReferrersAction.downloadReferrers(mv.editLayer, referrer) |
879 | | |
880 | | for wayReferrer in referrersForWay: |
881 | | if wayReferrer.getType() is dummy_relation.getType(): |
882 | | aRelation = wayReferrer |
883 | | rXnRelationWeWantToProcess = False # We need this again further on, when deciding whether or not to add this relation to the network |
884 | | if aRelation.get('type') == 'route' and aRelation.get('network') ==networklevel and not(aRelation.get('ref')): # in ['RUR','NRR','NRW','2LR','3LR','KAI','EHR','DFR','WBR','Nk']): |
885 | | # The check on the ref is for Germany, where many rXn networks run crisscross through another. |
886 | | # We wouldn't want to get entangled in that mess. |
887 | | # The list is continuously getting longer, of course. But it's the best we can do here |
888 | | rXnRelationWeWantToProcess = True |
889 | | rXnNetworkCountForNode+=1 |
890 | | if aRelation.hasIncompleteMembers(): |
891 | | name = aRelation.get('name') |
892 | | if not(name): name = '' |
893 | | note = aRelation.get('note') |
894 | | if not(note): note = '' |
895 | | kindOfNetwork = aRelation.get('network') |
896 | | if not(kindOfNetwork): kindOfNetwork = '' |
897 | | if 'downloadIncompleteMembers' in sideEffects: |
898 | | aDownloadWasNeeded = True |
899 | | print 'Downloading incomplete members for', note |
900 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(aRelation, aRelation.getIncompleteMembers(), mv.editLayer )) |
901 | | time.sleep(1) |
902 | | continue |
903 | | else: |
904 | | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + kindOfNetwork + ' ' + note + ' ' + name) |
905 | | break |
906 | | networkMembersList = [] |
907 | | # print network |
908 | | for subMember in network.getMembers(): |
909 | | if subMember.isRelation(): |
910 | | routeRelation = subMember.getRelation() |
911 | | networkMembersList.append(routeRelation.getUniqueId()) |
912 | | routeId = aRelation.getUniqueId() |
913 | | if rXnRelationWeWantToProcess and not(routeId in networkMembersList): |
914 | | roleFromRouteCheck, problemReported, wikiReport = checkRxNroute(aRelation, networklevel, aDownloadWasNeeded) |
915 | | if problemReported and 'createWikiReport' in sideEffects: |
916 | | wikiReportOnRelations += wikiReport + '\n|-\n' |
917 | | if 'addRouteToNetwork' in sideEffects and not(aDownloadWasNeeded): |
918 | | newRelation = Relation(network) |
919 | | newmember = RelationMember(roleFromRouteCheck, aRelation) |
920 | | if logVerbosity > 9: print newRelation.getMembersCount(), ' ',i, ' ', newmember |
921 | | newRelation.addMember( i, newmember) |
922 | | commandsList = [] |
923 | | commandsList.append(Command.ChangeCommand(network, newRelation)) |
924 | | note = aRelation.get('note') |
925 | | if not(note): |
926 | | note = '' |
927 | | Main.main.undoRedo.add(Command.SequenceCommand("Adding " + note + " to network", commandsList)) |
928 | | commandsList = [] |
929 | | if logVerbosity > 9: print 'Added newly found RCN route relation to network: ', note |
930 | | i+=1 |
931 | | if rXnNetworkCountForNode < expected_rXn_route_relations: |
932 | | if logVerbosity > 9: print 'Node ', rXn_ref, ' only has ', rXnNetworkCountForNode, ' rXn routes connected to it' |
933 | | if 'createWikiReport' in sideEffects: wikiReportOnNodes += '|align="right" | ' + rXn_ref + '||align="right" | {{Node|' + str(node.getId()) + '}}||align="right" |' + str(roads) + ' ||align="right" style="color:red" | ' + str(rXnNetworkCountForNode) + '\n|-\n' |
| 446 | if rcnNetworkCountForNode < expected_rcn_route_relations: |
| 447 | print 'Node ', rcn_ref, ' only has ', rcnNetworkCountForNode, ' rcn routes connected to it' |
| 448 | wikiReportOnNodes += '|align="right" | ' + rcn_ref + '||align="right" | {{Node|' + str(node.getId()) + '}}||align="right" |' + str(roads) + ' ||align="right" style="color:red" | ' + str(rcnNetworkCountForNode) + '\n|-\n' |
973 | | if 'downloadIncompleteMembers' in sideEffects: |
974 | | aDownloadWasNeeded = True |
975 | | print 'Downloading referrers for ', str(relation.get('name')), ' ', str(relation.get('note')) |
976 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(relation, relation.getIncompleteMembers(), mv.editLayer )) |
977 | | continue |
978 | | else: |
979 | | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the relations first') |
980 | | exit() |
981 | | networklevel=relation.get('network') |
982 | | if networklevel in ('rcn','rwn','rhn'): |
983 | | relationType = relation.get('type') |
984 | | if relationType == 'route': |
985 | | checkRxNroute(relation, networklevel, aDownloadWasNeeded) |
986 | | elif relationType == 'network': |
987 | | checkNetwork(relation, networklevel, aDownloadWasNeeded) |
988 | | elif relationType == 'collection': |
989 | | for collectionMember in relation.getMembers(): |
990 | | if collectionMember.isRelation(): |
991 | | networkRelation = collectionMember.getRelation() |
992 | | if networkRelation.hasIncompleteMembers(): |
993 | | name = networkRelation.get('name') |
994 | | if not(name): name = '' |
995 | | networkname = networkRelation.get('network') |
996 | | if not(networkname): networkname = '' |
997 | | if 'downloadIncompleteMembers' in sideEffects: |
998 | | aDownloadWasNeeded = True |
999 | | print 'Downloading referrers for ', name |
1000 | | DownloadRelationMemberTask.run(DownloadRelationMemberTask(networkRelation, networkRelation.getIncompleteMembers(), mv.editLayer )) |
1001 | | continue |
1002 | | else: |
1003 | | JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the network relations first:' + networkname + ' ' + name) |
1004 | | break |
1005 | | checkNetwork(networkRelation, networklevel, aDownloadWasNeeded) |
1006 | | if aDownloadWasNeeded: |
1007 | | JOptionPane.showMessageDialog(Main.parent, 'There was incomplete data and downloading mode was initiated,\nNo further quality checks were performed.\nPlease run the script again when all downloads have completed') |
| 477 | #JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the relations first') |
| 478 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(relation, relation.getIncompleteMembers(), mv.editLayer )) |
| 479 | break |
| 480 | if relation.get('type') == 'route' and relation.get('network') == 'rcn': |
| 481 | checkRCNroute(relation) |
| 482 | if relation.get('type') == 'network' and relation.get('network') == 'rcn': |
| 483 | checkNetwork(relation) |
| 484 | if relation.get('type') == 'collection' and relation.get('network') == 'rcn': |
| 485 | for networkmember in relation.getMembers(): |
| 486 | if networkmember.isRelation(): |
| 487 | subrelation = networkmember.getRelation() |
| 488 | if subrelation.hasIncompleteMembers(): |
| 489 | #JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the network relations first') |
| 490 | DownloadRelationMemberTask.run(DownloadRelationMemberTask(subrelation, subrelation.getIncompleteMembers(), mv.editLayer )) |
| 491 | #break |
| 492 | checkNetwork(subrelation) |