Changes between Version 1 and Version 2 of Help/Plugin/Scripting/Python/RCN_Route_Validator


Ignore:
Timestamp:
2011-10-30T21:04:16+01:00 (14 years ago)
Author:
Polyglot
Comment:

major improvements and corrections

Legend:

Unmodified
Added
Removed
Modified
  • Help/Plugin/Scripting/Python/RCN_Route_Validator

    v1 v2  
    11
    22{{{
     3#!python
    34#!/bin/jython
    45'''
    56CheckRouteOrNetworkOrCollectionOfRoutes.jy
    6 - Validation of a rcn route, network or collection of networks relation
    7 - Depending on what is selected in JOSM when invoked
     7- Validation of a rcn route relation
    88
    99This code is released under the GNU General
     
    5555    #'downloadReferrersForNodes': None, # This will download all ways and relations for nodes with an rcn_ref
    5656    #'downloadReferrersForWays': None, # This will download all relations for ways that have an endnode with an rcn_ref
    57     'downloadIncompleteMembers': None,
     57    #'downloadIncompleteMembers': None,
    5858    'createWikiReport': None,
    59     'createGarminGPX': None,
     59    #'createGarminGPX': None, # not implemented yet
    6060    #'checkOneWays = False, # not implemented yet
    6161    }
     
    6363logVerbosity = 10
    6464'''
    65 10: only report problems that need fixing
     6510: only report problems that require attention
    666620: report on collection
    676730: report on network nodes
     
    696950: report everything
    7070'''
     71
    7172def getMapView():
    7273    if Main.main and Main.main.map:
     
    8081    nextNode = None
    8182    routeToReturn = Relation(route)
    82     ##print dir (routeToReturn)
    83     #routeToReturn.clearOsmId()
     83    # Which node has the lower rcn_ref?
    8484    lowestNodeInt = 10000; lowPos = 0
    8585    for nodeTuple in beginAndEndnodes:
     
    8888    if not(nextNode):
    8989        return route
     90
     91    '''
     92    node1: way1
     93    node2: way1,way2
     94    node3: way2,way3,way4
     95    node4: way3,way5
     96    node5: way5,way6
     97    node6:
     98    node8: way8, way9
     99    node9: way7,way9,way10
     100    node10: way10, way11
     101    w1,w2,w3,w5,w6,w7,w4,w8,w9,w10'''
     102    # At this point nextNode contains the unique ID of the node with the lower rcn_ref
    90103    members=nodesDict[nextNode]
    91     processedMembers = {}
     104    processedMembers = {}; inBranch = False
    92105    #print len(nodesDict)
    93106    #print dir(route)
     
    96109        if len(members) == 1:
    97110            member = members[0]
     111        elif len(members) == 3:
     112            # road is splitting or recombining
     113            if inBranch:
     114                inBranch = False
     115            else:
     116                inBranch = True
     117                # road is splitting, which is the member we need next?
     118                # probably the one not going against a oneway restriction
     119                for member in members:
     120                    if member in processedMembers: continue
     121                    way = member.getWay()
     122                    oneway = way.get('oneway')
     123                    if oneway:
     124                        oneway = oneway.lower()
     125                    else:
     126                        oneway = ''
     127                    if oneway and not(oneway == 'no'):
     128                        ob=way.get('oneway:bicycle')
     129                        if ob:
     130                            ob = ob.lower()
     131                        else:
     132                            ob = ''
     133                        bo=way.get('bicycle:oneway')
     134                        if bo:
     135                            bo = bo.lower()
     136                        else:
     137                            bo = ''
     138                        co=way.get('cycleway_opposite')
     139                        if co:
     140                            co = co.lower()
     141                        else:
     142                            co = ''
     143                        onewayForBicycle = oneway in ['yes', '1', 'true', '-1'] and not(ob in ['yes', '1', 'true'] or
     144                                                                                        bo in ['yes', '1', 'true'] or
     145                                                                                        co in ['yes', '1', 'true'])
     146                        if oneway == '-1': pass # TODO this needs to be taken in consideration
     147                    if way.getNode(0).getUniqueId() == nextNode:
     148                        break
    98149        else:
    99150            member = members[1]
     
    102153        way = member.getWay()
    103154        routeToReturn.removeMembersFor(way)
     155        print 'lowPos',lowPos
    104156        routeToReturn.addMember(lowPos,member)
    105157        #routeToReturn.setModified(True)
     
    107159        nextNode = way.getNode(way.nodesCount-1).getUniqueId()
    108160        if currentNode == nextNode:
    109             nextNode = way.getNode(0).getUniqueId()           
     161            nextNode = way.getNode(0).getUniqueId()
    110162        if nextNode in nodesDict:
    111163            members=nodesDict[nextNode]
     
    124176        if member.isWay():
    125177            way = member.getWay()
    126             if logVerbosity > 50: print dir(way)
    127178            if logVerbosity > 49:
    128179                print way.getKeys()
     
    151202    return listIsContinuous
    152203
    153 def checkRCNroute(route):
     204def checkRCNroute(route, aDownloadWasNeeded):
     205    if aDownloadWasNeeded:
     206        return None, False, ''
    154207    if 'removeNameRefKey_xx-yyAndcreated_by' in sideEffects:
    155208        commandsList = []
     
    184237            commandsList = []
    185238
    186     fixme = route.get('fixme') == 'incomplete'
     239    fixme = route.get('fixme')
    187240    rcn_refs = []; route_relation_names = []; memberslist = []; roleInNetwork = ''
    188241    sameNodeNumberRepeated = False
    189242    allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None
     243    allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = []
     244    nodesWithrcn_ref = {}; likelyCandidateNodesForActualStartOfRoute = {}
     245    tentacle = 0; tentacles = {}; routeHasStarted = False; high_rcn_refEncountered = 0
     246    rcn_refAsInt = None
     247    # tentacles is a nested list of all the segments of ways wich are present before the actual start of the route
     248    # sequence, UID of node with rcn_ref, list with ways, reference to next tentacle sequence
     249    # 1st level: rcn_refs
     250    # 2nd level: rcn_ref, tentacle sequence, ways, next tentacle
     251    # {40: [[1, [5n], 2],
     252    #       [2, [3n], 3],
     253    #       [3, [3n, 5n, 7n, 8n], 0],
     254    #       [4, [4n], 0]
     255    #      ],
     256    #  58: [[1, [2n], 0],
     257    #       [2, [7n], 1]
     258    #      ]
     259    # }
    190260    newRelation = Relation(route); commandslist = []; i=0; roundabout = []
    191261
     
    194264    for member in routeMembers:
    195265        if member.isWay():
     266            if high_rcn_refEncountered: high_rcn_refEncountered += 1
    196267            role = member.getRole()
     268            # make a Python list out of the members, in case we want to simply flip all of them
     269            # this would happen if we encounter the high rcn_ref before the low rcn_ref
    197270            memberslist.append(member)
    198271            way = member.getWay()
    199             # print way.get('name')
     272            if logVerbosity > 49: print way.get('name')
    200273            wayNodes = way.getNodes()
    201274
    202275            notfoundyet = True
     276            if logVerbosity > 49: print wayNodes
     277            if role in ['forward']:
     278                lastNode=wayNodes[-1]
     279            else:
     280                lastNode=wayNodes[0]
     281            lastNodeUid = lastNode.getUniqueId()
     282            if lastNodeUid in likelyCandidateNodesForActualStartOfRoute:
     283                likelyCandidateNodesForActualStartOfRoute[lastNodeUid] += 1
     284            else:
     285                likelyCandidateNodesForActualStartOfRoute[lastNodeUid] = 1
     286           
    203287            for endnode in wayNodes:
     288                endnodeId = endnode.getUniqueId()
    204289                if 'sortRouteRelations' in sideEffects:
    205                     endnodeId = endnode.getUniqueId()
    206290                    if not(endnodeId in nodesForSorting):
    207291                        nodesForSorting[endnodeId] = []
     
    210294                rcn_ref = endnode.get('rcn_ref')
    211295                if rcn_ref:
    212                     rcn_refAsInt = int(rcn_ref)
     296                    rcn_refAsInt = int(rcn_ref.replace("(","").replace(")",""))
    213297                    if 'sortRouteRelations' in sideEffects: beginAndEndNodes.append([rcn_refAsInt, endnodeId])
     298                    # keep track of distinct rcn_ref numbers in a list
    214299                    if not(rcn_refAsInt in rcn_refs):
     300                        if len(rcn_refs): high_rcn_refEncountered += 1; tentacle = 0
    215301                        rcn_refs.append(rcn_refAsInt)
    216302                    else:
    217303                        sameNodeNumberRepeated = True
     304                    # keep track of node IDs with an rcn_ref on them
     305                    if not(rcn_refAsInt in nodesWithrcn_ref):
     306                        nodesWithrcn_ref[rcn_refAsInt] = []
     307                    nodesWithrcn_ref[rcn_refAsInt].append(endnodeId)
    218308                    referrersForNode = endnode.getReferrers(); networkNotFoundForNode = True
    219309                    for referrer in referrersForNode:
    220310                        if referrer.getType() is dummy_relation.getType():
     311                            # This node belongs to a relation
    221312                            if referrer.get('type') in ['network'] and referrer.get('network') in ['rcn']:
     313                                # and we have a winner
    222314                                networkNotFoundForNode = False
    223                                 break
    224                     if networkNotFoundForNode:
    225                         # node is not assigned to a network yet
    226                         Main.main.getCurrentDataSet().setSelected(endnode)
    227                         AutoScaleAction.zoomToSelection()
    228                         selectedNode = mv.editLayer.data.getSelected()
    229                         if 'downloadReferrersForNodes' in sideEffects:
    230                             print "Downloading referrers for ", endnode.get('rcn_ref'), ' ', wayNodes
    231                             DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes)
    232                         else:
    233                             print "Would download referrers for ", endnode.get('rcn_ref'), ' ', wayNodes
    234                         referrersForNode = endnode.getReferrers()
    235                     for referrer in referrersForNode:
    236                         if referrer.getType() is dummy_relation.getType():
    237                             networkOrRouteType = referrer.get('type') in ['network'] #, 'route']
    238                             if referrer.get('network')=='rcn' and networkOrRouteType:
    239315                                relname=referrer.get('name')
    240316                                if relname:
    241317                                    route_relation_names.append(relname)
    242                             elif not(referrer.get('type') in ['route']):
    243                                 route_relation_names.append('Node not assigned to network yet')
    244                                 # FIXME This is still buggy
    245             # build 2 structures to help check for continuity on ways
     318                                break
     319                    if networkNotFoundForNode:
     320                        route_relation_names.append('Node not assigned to network yet')
     321                        if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(endnode)
     322                        if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection()
     323                        if 'downloadReferrersForNodes' in sideEffects:
     324                            aDownloadWasNeeded = True
     325                            print "Downloading referrers for ", endnode.get('rcn_ref'), ' ', wayNodes
     326                            DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes)
     327                            return None, False, ''
     328                        else:
     329                            print "Would download referrers for ", endnode.get('rcn_ref'), ' ', wayNodes
     330                           
     331            # *** Now let's process the ways ***
     332            # build at least 2 structures to help check for continuity on ways
     333            # possibly there are 'tentacles' before the start or after the end when there are split network nodes
     334            if logVerbosity > 49:
     335                print 'L2H', allWaysgoingFromLowerToHigher
     336                print 'H2L', allWaysgoingFromHigherToLower
     337                print 'L2H', allWaysgoingFromLowerToHigherBeyondEndOfRoute
     338                print 'H2L', allWaysgoingFromHigherToLowerBeyondEndOfRoute
     339           
    246340            if i==0:
    247341                lastNodesBeforeSplit = [wayNodes]
     342            else:
     343                if not(routeHasStarted):
     344                    if role:
     345                        if role in ['forward']:
     346                            firstNode=wayNodes[0]
     347                        else:
     348                            firstNode=wayNodes[-1]
     349                        firstNodeUid = firstNode.getUniqueId()
     350                        print firstNodeUid, firstNodeUid in likelyCandidateNodesForActualStartOfRoute
     351                        if firstNodeUid in likelyCandidateNodesForActualStartOfRoute: print likelyCandidateNodesForActualStartOfRoute[firstNodeUid]
     352                        print likelyCandidateNodesForActualStartOfRoute
     353                        if firstNodeUid in likelyCandidateNodesForActualStartOfRoute and likelyCandidateNodesForActualStartOfRoute[firstNodeUid]>1:
     354                            routeHasStarted = True
     355                        if firstNode.get('rcn_ref'):
     356                            if logVerbosity > 49: print 'rcn_ref', firstNode.get('rcn_ref'), 'found in ', firstNode.getUniqueId()
     357                            # This is not the first member anymore and the first node has an rcn_ref and the member has a role,
     358                            # so we have to assign what we thought was the start of the route to one of our tentacles
     359                            tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = []
     360                            if allWaysgoingFromLowerToHigher:
     361                                prevRole = allWaysgoingFromLowerToHigher[-1].getRole()
     362                                if logVerbosity > 49: print 'prevRoleL2H', prevRole
     363                                if prevRole in ['forward']:
     364                                    interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[-1].getUniqueId()
     365                                elif prevRole in ['backward']:
     366                                    interestingNodeId = allWaysgoingFromLowerToHigher[-1].getWay().getNodes()[0].getUniqueId()
     367                            elif allWaysgoingFromHigherToLower:
     368                                prevRole = allWaysgoingFromHigherToLower[-1].getRole()
     369                                if logVerbosity > 49: print 'prevRoleH2L', prevRole
     370                                if prevRole in ['forward']:
     371                                    interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[0].getUniqueId()
     372                                elif prevRole in ['backward']:
     373                                    interestingNodeId = allWaysgoingFromHigherToLower[-1].getWay().getNodes()[-1].getUniqueId()
     374                            if interestingNodeId and firstNode.getUniqueId() == interestingNodeId:
     375                                reference = tentacle+1
     376                            if allWaysgoingFromLowerToHigher:
     377                                tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, reference]
     378                            elif allWaysgoingFromHigherToLower:
     379                                tentacledescription = [tentacle, allWaysgoingFromHigherToLower, reference]
     380                            allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None
     381                            if tentacledescription:
     382                                if rcn_refAsInt and not(rcn_refAsInt in tentacles):
     383                                    tentacles[rcn_refAsInt] = []
     384                                tentacles[rcn_refAsInt].append(tentacledescription)
     385                    else:
     386                        # no role on way means this is the actual start of our route
     387                        # so, all that went into allWaysgoingFromLowerToHigher etc has to go to the last tentacle
     388                        routeHasStarted = True
     389                        if allWaysgoingFromLowerToHigher or allWaysgoingFromHigherToLower:
     390                            tentacle +=1
     391                            if allWaysgoingFromHigherToLower:
     392                                allWaysgoingFromLowerToHigher # .append(allWaysgoingFromHigherToLower)
     393                            tentacledescription = [tentacle, allWaysgoingFromLowerToHigher, 0]
     394                            # allWaysgoingFromHigherToLower was assigned the start of the route in mistake in this case
     395                            # it should have gone to both 'branches', so we create a shallow copy
     396                            allWaysgoingFromLowerToHigher = allWaysgoingFromHigherToLower[:]; branch = None
     397                            if not(rcn_refAsInt in tentacles):
     398                                tentacles[rcn_refAsInt] = []
     399                            tentacles[rcn_refAsInt].append(tentacledescription)
     400                if high_rcn_refEncountered > 1:
     401                    # We're past the first high rcn_ref
     402                    if role:
     403                        if role in ['forward']:
     404                            lastNode=wayNodes[-1]
     405                        else:
     406                            lastNode=wayNodes[0]
     407                        if lastNode.get('rcn_ref'):
     408                            print 'rcn_ref', lastNode.get('rcn_ref'), 'found in ', lastNode.getUniqueId()
     409                            tentacle +=1; reference = 0; interestingNodeId = None; tentacledescription = []
     410                            if interestingNodeId and lastNode.getUniqueId() == interestingNodeId:
     411                                reference = tentacle+1
     412                            if allWaysgoingFromLowerToHigher:
     413                                tentacledescription = [tentacle, allWaysgoingFromLowerToHigherBeyondEndOfRoute, reference]
     414                            elif allWaysgoingFromHigherToLower:
     415                                tentacledescription = [tentacle, allWaysgoingFromHigherToLowerBeyondEndOfRoute, reference]
     416                            allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = []; branch = None
     417                            if tentacledescription:
     418                                if rcn_refAsInt and not(rcn_refAsInt in tentacles):
     419                                    tentacles[rcn_refAsInt] = []
     420                                tentacles[rcn_refAsInt].append(tentacledescription)
     421            if logVerbosity > 49: print tentacle, repr(tentacles)
     422                           
    248423            if role and role in ['forward', 'backward']:
    249                 if not(branch):
    250                     print 'wayNodes', wayNodes
    251                    
     424                # if there is a role, it might be part of the route proper when it branches
     425                # this is what we suppose, if we encounter another node with a low rcn_ref, we add what we already had
     426                # to the tentacles structure and clear fromLowToHigh
     427                if not(branch):                   
    252428                    if wayNodes:
    253429                        if role in ['forward']:
     
    257433                    else:
    258434                        return '', True, '|align="right" | way has no nodes||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" needs to be downloaded first\n'
     435                        if logVerbosity > 49: print waynodes
    259436                if logVerbosity > 29:
    260437                    print 'lastNodesBeforeSplit', lastNodesBeforeSplit
     
    267444                    branch = 'HigherToLower'
    268445                   
    269                 elif not(allWaysgoingFromHigherToLower) and wayNodes[-1].get('rcn_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()):
     446                elif branch == 'LowerToHigher' and not(allWaysgoingFromHigherToLower) and wayNodes[-1].get('rcn_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()):
    270447                    # This is for when the route starts forked from a different rcn node (split node situation), we don't want it to kick in for the last member of the route
    271448                    branch = 'HigherToLower'
     
    273450                    branch = 'LowerToHigher'
    274451                print branch
    275                 if branch == 'LowerToHigher':
    276                     allWaysgoingFromLowerToHigher.append(member)
    277                 elif branch == 'HigherToLower':
    278                     allWaysgoingFromHigherToLower.append(member)
     452                if high_rcn_refEncountered < 2:
     453                    if branch == 'LowerToHigher':
     454                        allWaysgoingFromLowerToHigher.append(member)
     455                    elif branch == 'HigherToLower':
     456                        allWaysgoingFromHigherToLower.append(member)
     457                else:
     458                    if branch == 'LowerToHigher':
     459                        allWaysgoingFromLowerToHigherBeyondEndOfRoute.append(member)
     460                    elif branch == 'HigherToLower':
     461                        allWaysgoingFromHigherToLowerBeyondEndOfRoute.append(member)
    279462            else:
    280463                branch = None; roundabout = []
    281                 allWaysgoingFromLowerToHigher.append(member)
    282                 allWaysgoingFromHigherToLower.append(member)
     464                routeHasStarted = True
     465                if high_rcn_refEncountered < 2:
     466                    allWaysgoingFromLowerToHigher.append(member)
     467                    allWaysgoingFromHigherToLower.append(member)
     468                else:
     469                    allWaysgoingFromLowerToHigherBeyondEndOfRoute.append(member)
     470                    allWaysgoingFromHigherToLowerBeyondEndOfRoute.append(member)
    283471            if way.get('junction') == 'roundabout':
    284472                roundabout = way.getNodes()
     473        elif member.isNode():
     474            node = member.getNode()
     475            #commandsList.append(Command.ChangeCommand(route, sortedRelation))
     476            #Main.main.undoRedo.add(Command.SequenceCommand("Sorted route relation", commandsList))           
    285477        i+=1
    286478    #if modified:
     
    292484    if len(allWaysgoingFromLowerToHigher) > 1:
    293485        continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher)
    294         if not(continuous_forward) and not(fixme) and 'sortRouteRelations' in sideEffects:
     486        if 'sortRouteRelations' in sideEffects and not(continuous_forward) and not(fixme):
    295487            sortedRelation = sortRouteRelation(route, nodesForSorting, beginAndEndNodes)
    296488
     
    351543        # a route relation with only one way member
    352544        continuous_backward = True
    353 
     545    print continuous_forward, continuous_backward
     546
     547    for rcn_nodeTentacles in tentacles:
     548        for seq, tentacleMember, next in tentacles[rcn_nodeTentacles]:
     549            print rcn_nodeTentacles, ' ', seq, ' ', next, ' ', checkForContinuity(tentacleMember)
    354550    # Drawing conclusions about rcn_refs
    355551    if logVerbosity > 39: print rcn_refs
     
    373569        note = route.get('note')
    374570        newNote = str(rcn_refs[0]).zfill(2) + '-' + str(rcn_refs[1]).zfill(2)
    375         #print note, newNote
     571        if logVerbosity > 49: print note, newNote
    376572        if 'modifyNoteTo_xx-yy' in sideEffects:
    377573            if not(note) or note != newNote:
     
    387583        if len(route_relation_names) > 1 and route_relation_names[0] != route_relation_names[1]:
    388584            # print 'This is probably a CONNECTION to another network'
    389             if logVerbosity > 9: print route_relation_names
     585            if logVerbosity > 9: print newNote, route_relation_names
    390586            roleInNetwork = 'connection'
     587        wikiEN = ''
    391588    else:
    392         print 'less than 2 end nodes with rcn_ref found'
     589        if logVerbosity > 9: print 'less than 2 end nodes with rcn_ref found for route', newNote
     590        wikiEN = 'style="color:red" | ' + repr(rcn_refs) + ' - ?'
    393591    if fixme and not(continuous_forward or continuous_backward):
    394         if logVerbosity > 1: print 'FIXME flag is INCOMPLETE'
     592        if logVerbosity > 9: print 'FIXME flag is INCOMPLETE for route', newNote
    395593    if continuous_forward:
    396594        wikiCF = 'align="right" | continuous'
     
    399597        wikiCF = 'align="right" style="color:red" | NOT continuous'
    400598        if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS in the forward direction'
    401         if logVerbosity > 49: print allWaysgoingFromLowerToHigher
     599        if logVerbosity > 49: print 'L2H:', allWaysgoingFromLowerToHigher
    402600    if continuous_backward:
    403601        wikiCB = 'align="right" | continuous'
     
    406604        wikiCB = 'align="right" style="color:red" | NOT continuous'
    407605        if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS in the backward direction'
    408         if logVerbosity > 49: print allWaysgoingFromHigherToLower
     606        if logVerbosity > 49: print 'H2L: ', allWaysgoingFromHigherToLower
    409607    print
    410608    if fixme:
    411         wikiFM = 'style="color:red" | fixme'
     609        wikiFM = 'style="color:red" | ' + fixme
    412610    else:
    413611        wikiFM = ' | '
    414     if fixme or not(continuous_forward) or not(continuous_backward):
     612    if fixme or not(continuous_forward) or not(continuous_backward) or (len(rcn_refs)<2 and not(route.get('rcn:external_connection'))):
    415613        problem = True
    416614    else:
    417615        problem = False
    418     return roleInNetwork, problem, '|align="right" | ' + note + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + wikiFM + ' ||' + wikiCF + ' ||' + wikiCB + '\n'
    419 
    420 def checkNetwork(network):
     616
     617    return roleInNetwork, problem, '|align="right" | ' + note + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + wikiFM + ' ||' + wikiCF + ' ||' + wikiCB  + ' ||' + wikiEN + '\n'
     618
     619def checkNetwork(network, aDownloadWasNeeded):
    421620    name = network.get('name')
    422621    if logVerbosity>19:
     
    428627                             '\n|-\n!style="width:2.5em" | Node\n!Link\n! # Roads\n! # Relations\n|-\n')
    429628        wikiReportOnRelations = ('{| class="wikitable" align="left" style="margin:0 0 2em 2em;"\n|-\n|+' + name +
    430                                  '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n|-\n')
     629                                 '\n|-\n!style="width:2.5em" | note\n!link\n!fixme\n! forward\n! backward\n! end nodes\n|-\n')
    431630    i=1
    432631    for networkMember in network.getMembers():
    433632        if networkMember.isRelation():
    434633            routeRelation = networkMember.getRelation()
    435             if routeRelation.hasIncompleteMembers():
    436                 if 'downloadIncompleteMembers' in sideEffects:
    437                     print 'Downloading incomplete members for', routeRelation.get('note')
    438                     DownloadRelationMemberTask.run(DownloadRelationMemberTask(routeRelation, routeRelation.getIncompleteMembers(), mv.editLayer ))
    439                     continue
    440                 else:
    441                     JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the route relations first')
    442                     break
    443             roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(routeRelation)
    444             if problemReported and 'createWikiReport' in sideEffects:
    445                 wikiReportOnRelations += wikiReport + '\n|-\n'
    446             role = networkMember.getRole()
    447             if logVerbosity > 29 and role != roleFromRouteCheck:
    448                 print
    449                 print 'Role in network is ', role
    450                 print 'Maybe this should be: ', roleFromRouteCheck
     634            if routeRelation.get('network') == 'rcn':
     635                if routeRelation.hasIncompleteMembers():
     636                    name = aRelation.get('name')
     637                    if not(name): name = ''
     638                    note = aRelation.get('note')
     639                    if not(note): note = ''
     640                    network = aRelation.get('network')
     641                    if not(network): network = ''
     642                    if 'downloadIncompleteMembers' in sideEffects:
     643                        aDownloadWasNeeded = True
     644                        print 'Downloading incomplete members for', note
     645                        DownloadRelationMemberTask.run(DownloadRelationMemberTask(routeRelation, routeRelation.getIncompleteMembers(), mv.editLayer ))
     646                        time.sleep(1)
     647                        continue
     648                    else:
     649                        JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + network + ' ' + note + ' ' + name)
     650                        break
     651                roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(routeRelation, aDownloadWasNeeded)
     652                if problemReported and 'createWikiReport' in sideEffects:
     653                    wikiReportOnRelations += wikiReport + '\n|-\n'
     654                role = networkMember.getRole()
     655                if logVerbosity > 29 and role != roleFromRouteCheck:
     656                    print
     657                    print 'Role in network is ', role
     658                    print 'Maybe this should be: ', roleFromRouteCheck
    451659        if networkMember.isNode():
    452660            node = networkMember.getNode()
     
    467675                            break
    468676                if networkNotFoundForNode and 'downloadReferrersNodes' in sideEffects:
    469                     Main.main.getCurrentDataSet().setSelected(node)
    470                     AutoScaleAction.zoomToSelection()
    471                     selectedNode = mv.editLayer.data.getSelected()
    472                     print 'Downloading referrers for ', selectedNode.get('rcn_ref')
    473                     DownloadReferrersAction.downloadReferrers(mv.editLayer, selectedNode)
    474                     referrersForNode = node.getReferrers()
     677                    aDownloadWasNeeded = True
     678                    if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(node)
     679                    if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection()
     680                    #selectedNode = mv.editLayer.data.getSelected()
     681                    print 'Downloading referrers for ', node.get('rcn_ref')
     682                    DownloadReferrersAction.downloadReferrers(mv.editLayer, node)
    475683
    476684                rcnNetworkCountForNode = roads = 0
     
    480688                        referrersForWay = referrer.getReferrers()
    481689                        if len(referrersForWay) < 1 and 'downloadReferrersForWays' in sideEffects:
    482                             Main.main.getCurrentDataSet().setSelected(referrer)
    483                             AutoScaleAction.zoomToSelection()
    484                             selectedWay = mv.editLayer.data.getSelected()
     690                            aDownloadWasNeeded = True
     691                            if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(referrer)
     692                            if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection()
    485693                            print 'Downloading referrers for ', referrer.get('name') , ' ', rcn_ref
    486                             DownloadReferrersAction.downloadReferrers(mv.editLayer, selectedWay)
    487                             referrersForWay = referrer.getReferrers()
     694                            DownloadReferrersAction.downloadReferrers(mv.editLayer, referrer)
     695
    488696                        for wayReferrer in referrersForWay:
    489697                            if wayReferrer.getType() is dummy_relation.getType():
     
    491699                                if aRelation.get('type') == 'route' and aRelation.get('network') == 'rcn':
    492700                                    rcnNetworkCountForNode+=1
     701                                    if aRelation.hasIncompleteMembers():
     702                                        name = aRelation.get('name')
     703                                        if not(name): name = ''
     704                                        note = aRelation.get('note')
     705                                        if not(note): note = ''
     706                                        networkname = aRelation.get('network')
     707                                        if not(networkname): networkname = ''
     708                                        if 'downloadIncompleteMembers' in sideEffects:
     709                                            aDownloadWasNeeded = True
     710                                            print 'Downloading incomplete members for', note
     711                                            DownloadRelationMemberTask.run(DownloadRelationMemberTask(aRelation, aRelation.getIncompleteMembers(), mv.editLayer ))
     712                                            time.sleep(1)
     713                                            continue
     714                                        else:
     715                                            JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the route relations first: ' + networkname + ' ' + note + ' ' + name)
     716                                            break
    493717                                networkMembersList = []
    494718                                for subMember in network.getMembers():
     
    499723                                if not(routeId in networkMembersList):
    500724                                    if aRelation.get('network') == 'rcn':
    501                                         roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(aRelation)
     725                                        roleFromRouteCheck, problemReported, wikiReport = checkRCNroute(aRelation, aDownloadWasNeeded)
    502726                                        if problemReported and 'createWikiReport' in sideEffects:
    503727                                            wikiReportOnRelations += wikiReport + '\n|-\n'
    504                                         if 'addRouteToNetwork' in sideEffects:
     728                                        if 'addRouteToNetwork' in sideEffects and not(aDownloadWasNeeded):
    505729                                            newRelation = Relation(network)
    506730                                            newmember = RelationMember(roleFromRouteCheck, aRelation)
     
    531755
    532756
     757aDownloadWasNeeded = False
     758'''
     759Since Downloading referrers or missing members happens asynchronously in a separate worker thread
     760the script can run in three modes
     761
     7621. No downloads allowed/offline run; output mentions that data was incomplete in its reports.
     7632. Download run; When incomplete items are encountered, they are scheduled to be downloaded. From then on, no more quality checks are performed on the data.
     764   All hierarchies are still checked, looking for more incomplete data for which more downloads need to be scheduled.
     7653. Normal run; All data is available and proper reporting can be performed.
     766'''
     767
    533768dummy_way = Way()
    534769dummy_relation = Relation()
     
    536771mv = getMapView()
    537772if mv and mv.editLayer and mv.editLayer.data:
    538     if 'createWikiReport' in sideEffects:
    539         fh = open('C:/wikiReport.txt', 'w')
    540         fh.close()
    541773    selectedRelations = mv.editLayer.data.getSelectedRelations()
    542774
     
    544776        JOptionPane.showMessageDialog(Main.parent, "Please select a route, network or collection relation")
    545777    else:
     778        if 'createWikiReport' in sideEffects:
     779            fh = open('C:/wikiReport.txt', 'w')
     780            fh.close()
    546781        for relation in selectedRelations:
    547782            if logVerbosity> 49: print relation
    548783            if relation.hasIncompleteMembers():
    549784                if 'downloadIncompleteMembers' in sideEffects:
     785                    aDownloadWasNeeded = True
    550786                    print 'Downloading referrers for ', str(relation.get('name')), ' ', str(relation.get('note'))
    551787                    DownloadRelationMemberTask.run(DownloadRelationMemberTask(relation, relation.getIncompleteMembers(), mv.editLayer ))
     
    553789                else:
    554790                    JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the relations first')
    555                     break
     791                    exit()
    556792            if relation.get('network') == 'rcn':
    557793                relationType = relation.get('type')
    558794                if relationType == 'route':
    559                     checkRCNroute(relation)
     795                    checkRCNroute(relation, aDownloadWasNeeded)
    560796                elif relationType == 'network':
    561                     checkNetwork(relation)
     797                    checkNetwork(relation, aDownloadWasNeeded)
    562798                elif relationType == 'collection':
    563799                    for collectionMember in relation.getMembers():
     
    565801                            networkRelation = collectionMember.getRelation()
    566802                            if networkRelation.hasIncompleteMembers():
     803                                name = networkRelation.get('name')
     804                                if not(name): name = ''
     805                                networkname = networkRelation.get('network')
     806                                if not(networkname): networkname = ''
    567807                                if 'downloadIncompleteMembers' in sideEffects:
    568                                     print 'Downloading referrers for ', relation.get('name')
     808                                    aDownloadWasNeeded = True
     809                                    print 'Downloading referrers for ', name
    569810                                    DownloadRelationMemberTask.run(DownloadRelationMemberTask(networkRelation, networkRelation.getIncompleteMembers(), mv.editLayer ))
    570811                                    continue
    571812                                else:
    572                                     JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete member of the network relations first')
     813                                    JOptionPane.showMessageDialog(Main.parent, 'Please download all incomplete members of the network relations first:' + networkname + ' ' + name)
    573814                                    break
    574                             checkNetwork(networkRelation)
     815                            checkNetwork(networkRelation, aDownloadWasNeeded)
     816        if aDownloadWasNeeded:
     817            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')
    575818
    576819}}}