Changes between Version 5 and Version 6 of Help/Plugin/Scripting/Python/RCN_Route_Validator


Ignore:
Timestamp:
2014-10-22T20:44:08+02:00 (9 years ago)
Author:
Polyglot
Comment:

latest version

Legend:

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

    v5 v6  
    55'''
    66CheckRouteOrNetworkOrCollectionOfRoutes.jy
    7 - Validation of a rXn route relation
     7- Validation of a rcn route relation
    88
    99This code is released under the GNU General
     
    4343import org.openstreetmap.josm.actions.AutoScaleAction as AutoScaleAction
    4444import re, time
    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 '''
    8245
    8346def getMapView():
     
    8851
    8952def sortRouteRelation(route, nodesDict, beginAndEndnodes):
    90     # TODO This can still be improved a lot. Now it aborts at the first sign of probable failure.
    91     # TODO It sorts the simple cases though (i.e. the ones with no forward/backward roles which actually are continuous)
    9253    nextNode = None
    9354    routeToReturn = Relation(route)
    94     # Which node has the lower rXn_ref?
     55    ##print dir (routeToReturn)
     56    #routeToReturn.clearOsmId()
    9557    lowestNodeInt = 10000; lowPos = 0
    9658    for nodeTuple in beginAndEndnodes:
     
    9961    if not(nextNode):
    10062        return route
    101 
    102     '''
    103     node1: way1
    104     node2: way1,way2
    105     node3: way2,way3,way4
    106     node4: way3,way5
    107     node5: way5,way6
    108     node6:
    109     node8: way8, way9
    110     node9: way7,way9,way10
    111     node10: way10, way11
    112     w1,w2,w3,w5,w6,w7,w4,w8,w9,w10'''
    113     # At this point nextNode contains the unique ID of the node with the lower rXn_ref
    11463    members=nodesDict[nextNode]
    115     processedMembers = {}; inBranch = False
     64    processedMembers = {}
    11665    #print len(nodesDict)
    11766    #print dir(route)
     
    12069        if len(members) == 1:
    12170            member = members[0]
    122         elif len(members) == 3:
    123             # road is splitting or recombining
    124             if inBranch:
    125                 inBranch = False
    126             else:
    127                 inBranch = True
    128                 # road is splitting, which is the member we need next?
    129                 # probably the one not going against a oneway restriction
    130                 for member in members:
    131                     if member in processedMembers: continue
    132                     way = member.getWay()
    133                     oneway = way.get('oneway')
    134                     if oneway:
    135                         oneway = oneway.lower()
    136                     else:
    137                         oneway = ''
    138                     if oneway and not(oneway == 'no'):
    139                         ob=way.get('oneway:bicycle')
    140                         if ob:
    141                             ob = ob.lower()
    142                         else:
    143                             ob = ''
    144                         bo=way.get('bicycle:oneway')
    145                         if bo:
    146                             bo = bo.lower()
    147                         else:
    148                             bo = ''
    149                         co=way.get('cycleway_opposite')
    150                         if co:
    151                             co = co.lower()
    152                         else:
    153                             co = ''
    154                         onewayForBicycle = oneway in ['yes', '1', 'true', '-1'] and not(ob in ['yes', '1', 'true'] or
    155                                                                                         bo in ['yes', '1', 'true'] or
    156                                                                                         co in ['yes', '1', 'true'])
    157                         if oneway == '-1': pass # TODO this also needs to be taken in consideration
    158                     if way.getNode(0).getUniqueId() == nextNode:
    159                         break
    16071        else:
    16172            member = members[1]
     
    16475        way = member.getWay()
    16576        routeToReturn.removeMembersFor(way)
    166         print 'lowPos',lowPos
    16777        routeToReturn.addMember(lowPos,member)
    16878        #routeToReturn.setModified(True)
    16979        currentNode = nextNode
    170         nextNode = way.getNode(way.nodesCount-1).getUniqueId()
     80        nextNode = way.getNode(way.nodesCount-1).getId()
    17181        if currentNode == nextNode:
    172             nextNode = way.getNode(0).getUniqueId()
     82            nextNode = way.getNode(0).getId()           
    17383        if nextNode in nodesDict:
    17484            members=nodesDict[nextNode]
     
    17989        if len(nodesDict)<3: break
    18090        lowPos += 1
    181     print 'before return', routeToReturn
     91    #print 'before return', routeToReturn
    18292    return routeToReturn
    18393
     
    18898            way = member.getWay()
    18999            #print dir(way)
    190             if logVerbosity > 49:
    191                 print way.getKeys()
    192                 print way.get('name')
    193                 print way.nodesCount-1, way
     100            #print way.getKeys()
     101            #print way.get('name')
     102            #print way.nodesCount-1, way
    194103            if way.get('junction') == 'roundabout':
    195104                endnodes = way.getNodes()
     
    201110            foundTheNode = False
    202111            for endnode in endnodes:
    203                 if logVerbosity > 49: print endnode, prev_endnodes
     112                #print endnode, prev_endnodes
    204113                if endnode in prev_endnodes:
    205114                    foundTheNode = True
    206115            if prev_endnodes and not(foundTheNode):
    207116                listIsContinuous = False
    208                 if logVerbosity > 49:
    209                     print way
    210                     print endnodes
    211                     print prev_endnodes
     117                #print way
     118                #print endnodes
     119                #print prev_endnodes
    212120                break
    213121            prev_endnodes = endnodes
     122    #print listIsContinuous
    214123    return listIsContinuous
    215124
    216 def checkRxNroute(route, networklevel, aDownloadWasNeeded):
    217     if aDownloadWasNeeded:
    218         return None, False, ''
    219     if 'removeNameRefKey_xx-yyAndcreated_by' in sideEffects:
    220         commandsList = []
    221         reNumberDashNumber = re.compile(r'\d+\s-\s\d+')
    222         newRelation = Relation(route)
    223         relationChanged = False
    224         created_by = route.get('created_by')
    225         if created_by:
    226             print 'removing created_by'
    227             newRelation.remove('created_by')
    228             relationChanged = True
    229         name = route.get('name')
    230         if name:
    231             #if reNumberDashNumber.match(name):
    232             print 'removing name'
     125def checkRCNroute(route):
     126    commandsList = []
     127    reNumberDashNumber = re.compile(r'\d+-\d+')
     128    newRelation = Relation(route)
     129    relationChanged = False
     130    created_by = route.get('created_by')
     131    if created_by:
     132        print 'removing created_by'
     133        newRelation.remove('created_by')
     134        relationChanged = True
     135    name = route.get('name')
     136    if name:
     137        if reNumberDashNumber.match(name):
     138            print 'removing name when it is of the form ##-##'
    233139            newRelation.remove('name')
    234140            relationChanged = True
    235         else:
    236             name = ''
    237         ref = route.get('ref')
    238         if ref:
    239             if reNumberDashNumber.match(ref):
    240                 print 'removing ref when it is of the form ##-##'
    241                 newRelation.remove('ref')
    242                 relationChanged = True
    243         else:
    244             ref = ''
    245         if relationChanged:
    246             commandsList.append(Command.ChangeCommand(route, newRelation))
    247            
    248             Main.main.undoRedo.add(Command.SequenceCommand("Removing name and/or ref and/or created_by" + name + '/' + ref, commandsList))
    249             commandsList = []
    250 
    251     fixme = route.get('fixme')
    252     rXn_refs = []; actual_rXn_refs = []; route_relation_names = []
    253     memberslist = []; waymembersinlist = 0; roleInNetwork = ''
     141    else:
     142        name = ''
     143    ref = route.get('ref')
     144    if ref:
     145        if reNumberDashNumber.match(ref):
     146            print 'removing ref when it is of the form ##-##'
     147            newRelation.remove('ref')
     148            relationChanged = True
     149    else:
     150        ref = ''
     151    if relationChanged:
     152        commandsList.append(Command.ChangeCommand(route, newRelation))
     153       
     154        Main.main.undoRedo.add(Command.SequenceCommand("Removing name and/or ref and/or created_by" + name + '/' + ref, commandsList))
     155        commandsList = []
     156
     157    fixme = route.get('fixme') == 'incomplete'
     158    rcn_refs = []; route_relation_names = []; memberslist = []; roleInNetwork = ''
    254159    sameNodeNumberRepeated = False
     160    continuous_forward = True; continuous_backward = True
    255161    allWaysgoingFromLowerToHigher = []; allWaysgoingFromHigherToLower = []; branch = None
    256     allWaysgoingFromLowerToHigherBeyondEndOfRoute = []; allWaysgoingFromHigherToLowerBeyondEndOfRoute = []
    257     nodesWithrXn_ref = {}; likelyCandidateNodesForActualStartOfRoute = {}
    258     tentacle = 0; tentacles = {}; routeHasStarted = False; high_rXn_refEncountered = 0
    259     rXn_refAsInt = None
    260     # tentacles is a nested list of all the segments of ways wich are present before the actual start of the route
    261     # sequence, UID of node with rXn_ref, list with ways, reference to next tentacle sequence
    262     # 1st level: rXn_refs
    263     # 2nd level: rXn_ref, tentacle sequence, ways, next tentacle
    264     # {40: [[1, [5n], 2],
    265     #       [2, [3n], 3],
    266     #       [3, [3n, 5n, 7n, 8n], 0],
    267     #       [4, [4n], 0]
    268     #      ],
    269     #  58: [[1, [2n], 0],
    270     #       [2, [7n], 1]
    271     #      ]
    272     # }
    273     newRelation = Relation(route); commandslist = []; i=0; roundabout = []
    274 
    275     if 'sortRouteRelations' in sideEffects: nodesForSorting = {}; beginAndEndNodes = []
    276     routeMembers = route.getMembers()
    277     modified = False
    278 
    279     for member in routeMembers:
    280         memberslist.append(member)
     162    nodesForSorting = {}; beginAndEndNodes = []
     163    newRelation = Relation(route); commandslist = []; modified = False; i=0; roundabout = []
     164
     165    for member in route.getMembers():
    281166        if member.isWay():
    282             waymembersinlist += 1
    283             if high_rXn_refEncountered: high_rXn_refEncountered += 1
    284167            role = member.getRole()
    285             # make a Python list out of the members, in case we want to simply flip all of them
    286             # this would happen if we encounter the high rXn_ref before the low rXn_ref
     168            memberslist.append(member)
    287169            way = member.getWay()
    288             if logVerbosity > 49: print way.get('name')
     170            #JOptionPane.showMessageDialog(Main.parent, 'way is selected')
    289171            wayNodes = way.getNodes()
     172            #if len(wayNodes):
     173                #if way.get('junction') != 'roundabout':
     174                    #wayNodes = [way.getNode(0), way.getNode(way.nodesCount-1)]
     175            #else:
     176                #newRelation.removeMember(i)
     177                #modified = True
    290178
    291179            notfoundyet = True
    292             if logVerbosity > 49: print wayNodes
    293             if role in ['forward']:
    294                 lastNode=wayNodes[-1]
    295             else:
    296                 lastNode=wayNodes[0]
    297             lastNodeUid = lastNode.getUniqueId()
    298             if lastNodeUid in likelyCandidateNodesForActualStartOfRoute:
    299                 likelyCandidateNodesForActualStartOfRoute[lastNodeUid] += 1
    300             else:
    301                 likelyCandidateNodesForActualStartOfRoute[lastNodeUid] = 1
    302            
    303180            for endnode in wayNodes:
    304                 endnodeId = endnode.getUniqueId()
    305                 if 'sortRouteRelations' in sideEffects:
    306                     if not(endnodeId in nodesForSorting):
    307                         nodesForSorting[endnodeId] = []
    308                     nodesForSorting[endnodeId].append(member)
    309 
    310                 rXn_ref = endnode.get(networklevel + '_ref')
    311                 if rXn_ref:
    312                     rXn_ref_digits = ''
    313                     for character in rXn_ref:
    314                         try:
    315                             int(character)
    316                             rXn_ref_digits += character
    317                         except: pass
    318                     if rXn_ref_digits and rXn_ref_digits==rXn_ref:
    319                         rXn_refAsInt = int(rXn_ref_digits)
    320                     else:
    321                         rXn_refAsInt = -1
    322 
    323                         print rXn_ref
    324                     if 'sortRouteRelations' in sideEffects: beginAndEndNodes.append([rXn_refAsInt, endnodeId])
    325                     # keep track of distinct rXn_ref numbers in a list
    326                     if not(rXn_refAsInt in rXn_refs):
    327                         if len(rXn_refs): high_rXn_refEncountered += 1; tentacle = 0
    328                         rXn_refs.append(rXn_refAsInt)
    329                         if rXn_refAsInt == -1:
    330                             actual_rXn_refs.append(rXn_ref)
    331                         else:
    332                             actual_rXn_refs.append(str(rXn_refAsInt).zfill(2))
     181                endnodeId = endnode.getId()
     182                if not(endnodeId in nodesForSorting):
     183                    nodesForSorting[endnodeId] = []
     184                nodesForSorting[endnodeId].append(member)
     185
     186                rcn_ref = endnode.get('rcn_ref')
     187                if rcn_ref:
     188                    rcn_refAsInt = int(rcn_ref)
     189                    beginAndEndNodes.append([rcn_refAsInt, endnodeId])
     190                    if not(rcn_refAsInt in rcn_refs):
     191                        rcn_refs.append(rcn_refAsInt)
    333192                    else:
    334193                        sameNodeNumberRepeated = True
    335                     # keep track of node IDs with an rXn_ref on them
    336                     if not(rXn_refAsInt in nodesWithrXn_ref):
    337                         nodesWithrXn_ref[rXn_refAsInt] = []
    338                     nodesWithrXn_ref[rXn_refAsInt].append(endnode)
    339194                    referrersForNode = endnode.getReferrers(); networkNotFoundForNode = True
    340195                    for referrer in referrersForNode:
    341196                        if referrer.getType() is dummy_relation.getType():
    342                             # This node belongs to a relation
    343                             if referrer.get('type') in ['network'] and referrer.get('network') in [networklevel]:
    344                                 # and we have a winner
     197                            if referrer.get('type') in ['network'] and referrer.get('network') in ['rcn']:
    345198                                networkNotFoundForNode = False
     199                                break
     200                    if networkNotFoundForNode:
     201                         Main.main.getCurrentDataSet().setSelected(endnode)
     202                         AutoScaleAction.zoomToSelection()
     203                         #selectedNode = mv.editLayer.data.getSelected()
     204                         print "Would download referrers for ", endnode.get('rcn_ref'), ' ', wayNodes
     205                         # DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes)
     206                         referrersForNode = endnode.getReferrers()
     207                    for referrer in referrersForNode:
     208                        if referrer.getType() is dummy_relation.getType():
     209                            networkOrRouteType = referrer.get('type') in ['network'] #, 'route']
     210                            if referrer.get('network')=='rcn' and networkOrRouteType:
    346211                                relname=referrer.get('name')
    347212                                if relname:
    348213                                    route_relation_names.append(relname)
    349                                 break
    350                     if networkNotFoundForNode:
    351                         route_relation_names.append('Node not assigned to network yet')
    352                         if 'selectObjects' in sideEffects: Main.main.getCurrentDataSet().setSelected(endnode)
    353                         if 'zoomToSelection' in sideEffects: AutoScaleAction.zoomToSelection()
    354                         if 'downloadReferrersForNodes' in sideEffects:
    355                             aDownloadWasNeeded = True
    356                             print "Downloading referrers for ", endnode.get(networklevel + '_ref'), ' ', wayNodes
    357                             DownloadReferrersAction.downloadReferrers(mv.editLayer, wayNodes)
    358                             return None, False, ''
    359                         else:
    360                             print "Would download referrers for ", endnode.get(networklevel + '_ref'), ' ', wayNodes
    361                            
    362             # *** Now let's process the ways ***
    363             # build at least 2 structures to help check for continuity on ways
    364             # possibly there are 'tentacles' before the start or after the end when there are split network nodes
    365             if logVerbosity > 49:
    366                 print 'L2H', allWaysgoingFromLowerToHigher
    367                 print 'H2L', allWaysgoingFromHigherToLower
    368                 print 'L2H', allWaysgoingFromLowerToHigherBeyondEndOfRoute
    369                 print 'H2L', allWaysgoingFromHigherToLowerBeyondEndOfRoute
    370            
     214                            elif not(referrer.get('type') in ['route']):
     215                                route_relation_names.append('Node not assigned to network yet')
     216            # build 2 structures to help check for continuity on ways
    371217            if i==0:
    372218                lastNodesBeforeSplit = [wayNodes]
    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]]
    416223                    else:
    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
    472230                if role in ['forward'] and (wayNodes[-1] in lastNodesBeforeSplit or wayNodes[-1] in roundabout):
    473231                    branch = 'HigherToLower'
    474232                elif role in ['backward'] and wayNodes[0] in lastNodesBeforeSplit:
    475233                    branch = 'HigherToLower'
    476                    
    477                 elif branch == 'LowerToHigher' and not(allWaysgoingFromHigherToLower) and wayNodes[-1].get(networklevel + '_ref') and not(member.getUniqueId() == routeMembers[-1].getUniqueId()):
    478                     # 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
     234                elif not(allWaysgoingFromHigherToLower) and wayNodes[-1].get('rcn_ref'):
    479235                    branch = 'HigherToLower'
    480236                elif not(branch == 'HigherToLower'):
    481237                    branch = 'LowerToHigher'
    482238                print branch
    483                 if high_rXn_refEncountered < 2:
    484                     if branch == 'LowerToHigher':
    485                         allWaysgoingFromLowerToHigher.append(member)
    486                     elif branch == 'HigherToLower':
    487                         allWaysgoingFromHigherToLower.append(member)
    488                 else:
    489                     if branch == 'LowerToHigher':
    490                         allWaysgoingFromLowerToHigherBeyondEndOfRoute.append(member)
    491                     elif branch == 'HigherToLower':
    492                         allWaysgoingFromHigherToLowerBeyondEndOfRoute.append(member)
     239                if branch == 'LowerToHigher':
     240                    allWaysgoingFromLowerToHigher.append(member)
     241                elif branch == 'HigherToLower':
     242                    allWaysgoingFromHigherToLower.append(member)
    493243            else:
    494244                branch = None; roundabout = []
    495                 routeHasStarted = True
    496                 if high_rXn_refEncountered < 2:
    497                     allWaysgoingFromLowerToHigher.append(member)
    498                     allWaysgoingFromHigherToLower.append(member)
    499                 else:
    500                     allWaysgoingFromLowerToHigherBeyondEndOfRoute.append(member)
    501                     allWaysgoingFromHigherToLowerBeyondEndOfRoute.append(member)
     245                allWaysgoingFromLowerToHigher.append(member)
     246                allWaysgoingFromHigherToLower.append(member)
    502247            if way.get('junction') == 'roundabout':
    503248                roundabout = way.getNodes()
    504249        i+=1
    505     modified = False
    506     if 'removeNodesFromRoutes' in sideEffects:
    507         newRelation = Relation(route)
    508         for member in routeMembers:
    509             if member.isNode():
    510                 node = member.getNode()
    511                 newRelation.removeMembersFor(node)
    512                 modified = True
    513250    if modified:
    514251        commandsList.append(Command.ChangeCommand(route, newRelation))
    515         Main.main.undoRedo.add(Command.SequenceCommand("Removing nodes with rXn_ref", commandsList))
     252        Main.main.undoRedo.add(Command.SequenceCommand("Removing way which has no nodes", commandsList))
    516253        commandsList = []
    517     modified = False
    518     if 'addNodes2Routes' in sideEffects:
    519         newRelation = Relation(route)
    520         # (re)add nodes to route
    521         lowrXn_ref2BDone = True; lowPos = 0
    522         for nodeNumber in sorted(nodesWithrXn_ref.keys()):
    523             for node in nodesWithrXn_ref[nodeNumber]:
    524                newRelation.removeMembersFor(node)
    525                newMember = RelationMember("",node)
    526                if lowrXn_ref2BDone:
    527                    newRelation.addMember(lowPos, newMember)
    528                    lowPos += 1
    529                else:
    530                    newRelation.addMember(newRelation.getMembersCount(), newMember)
    531             lowrXn_ref2BDone = False; modified = True
    532 
    533     if modified:
    534         commandsList.append(Command.ChangeCommand(route, newRelation))
    535         Main.main.undoRedo.add(Command.SequenceCommand("Adding nodes with rXn_ref", commandsList))
    536         commandsList = []
    537 
    538     continuous_forward = True; continuous_backward = True
     254    #print allWaysgoingFromLowerToHigher
    539255    if len(allWaysgoingFromLowerToHigher) > 1:
    540256        continuous_forward = checkForContinuity(allWaysgoingFromLowerToHigher)
    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:
    595280        continuous_forward = True
    596281    if len(allWaysgoingFromHigherToLower) > 1:
    597282        continuous_backward = checkForContinuity(reversed(allWaysgoingFromHigherToLower))
    598283    else:
    599         # a route relation with only one way member
    600284        continuous_backward = True
    601     print continuous_forward, continuous_backward
    602 
    603     for rXn_nodeTentacles in tentacles:
    604         for seq, tentacleMember, next in tentacles[rXn_nodeTentacles]:
    605             print rXn_nodeTentacles, ' ', seq, ' ', next, ' ', checkForContinuity(tentacleMember)
    606            
    607     # Drawing conclusions about rXn_refs
    608     fixmetodo = ''
    609     if logVerbosity > 39: print rXn_refs
     285    # Drawing conclusions about rcn_refs
     286    print rcn_refs
    610287    if sameNodeNumberRepeated:
    611         rXn_refs.append(rXn_refs[0])
    612     newNote = note = repr(rXn_refs)
     288        rcn_refs.append(rcn_refs[0])
     289    newNote = note = repr(rcn_refs)
    613290    sortedRelation = route
    614     if len(rXn_refs) > 1:
     291    if len(rcn_refs) > 1:
     292        #newRelation = Relation(route)
    615293        relationChanged = False
    616294
    617         if rXn_refs[0] > rXn_refs[1]:
    618             rXn_refs.sort()
    619             if waymembersinlist>1 and 'flipOrderOfMembers' in sideEffects:
     295        if rcn_refs[0] > rcn_refs[1]:
     296            rcn_refs.sort()
     297            if len(memberslist)>1:
     298                print 'Flipping members order'
    620299                for member in reversed(memberslist):
    621300                    sortedRelation.addMember( sortedRelation.getMembersCount(), member)
     
    625304                commandsList = []
    626305        note = route.get('note')
    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)
    663311            relationChanged = True
    664312            commandsList.append(Command.ChangeCommand(route, newRelation))
    665313       
    666             Main.main.undoRedo.add(Command.SequenceCommand("report that only one '+networklevel+'_ref was found " + note + ' to ' + newNote, commandsList))
     314            Main.main.undoRedo.add(Command.SequenceCommand("Changing note from " + note + ' to ' + newNote, commandsList))
    667315            commandsList = []
     316
     317        if len(route_relation_names) > 1 and route_relation_names[0] != route_relation_names[1]:
     318            # print 'This is probably a CONNECTION to another network'
     319            print route_relation_names
     320            roleInNetwork = 'connection'
     321    else:
     322        print 'less than 2 end nodes with rcn_ref found'
    668323    if fixme and not(continuous_forward or continuous_backward):
    669         if logVerbosity > 9: print 'FIXME flag is INCOMPLETE for route', newNote
     324        print 'FIXME flag is INCOMPLETE'
    670325    if continuous_forward:
    671326        wikiCF = 'align="right" | continuous'
    672         if logVerbosity > 29: print 'route is continous in the forward direction'
     327        #print 'route is continous in the forward direction'
    673328    else:
    674329        wikiCF = 'align="right" style="color:red" | NOT continuous'
    675         if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS going from xx to yy; xx<yy'
    676         if logVerbosity > 49: print 'L2H:', allWaysgoingFromLowerToHigher
    677         if not(fixme) and 'addFixmeTODOtags' in sideEffects:
    678             newRelation = Relation(route)
    679             #print newRelation.getUniqueId()
    680             #print route.getUniqueId()
    681             fixmetodo += ' ' + newNote + 'is not continuous going from xx to yy; xx<yy'
    682             newRelation.put('fixmetodo', fixmetodo)
    683             relationChanged = True
    684             commandsList.append(Command.ChangeCommand(route, newRelation))
    685             Main.main.undoRedo.add(Command.SequenceCommand("report that  " + note + ' is not continuous going from xx to yy; xx<yy' , commandsList))
    686             commandsList = []
     330        print 'route ',newNote,' is NOT CONTINUOUS in the forward direction'
     331        #print allWaysgoingFromLowerToHigher
    687332    if continuous_backward:
    688333        wikiCB = 'align="right" | continuous'
    689         if logVerbosity > 29: print 'route is continous in the backward direction'
     334        #print 'route is continous in the backward direction'
    690335    else:
    691336        wikiCB = 'align="right" style="color:red" | NOT continuous'
    692         if logVerbosity > 9: print 'route ',newNote,' is NOT CONTINUOUS coming back from yy to xx; xx<yy'
    693         if logVerbosity > 49: print 'H2L: ', allWaysgoingFromHigherToLower
    694         if not(fixme) and 'addFixmeTODOtags' in sideEffects:
    695             newRelation = Relation(route)
    696             #print newRelation.getUniqueId()
    697             #print route.getUniqueId()
    698             fixmetodo += ' ' + newNote + 'is not continuous coming back from yy to xx; xx<yy'
    699             newRelation.put('fixmetodo', fixmetodo)
    700             relationChanged = True
    701             commandsList.append(Command.ChangeCommand(route, newRelation))
    702        
    703             Main.main.undoRedo.add(Command.SequenceCommand("report that  " + note + ' is not continuous coming back from yy to xx; xx<yy' , commandsList))
    704             commandsList = []
     337        print 'route ',newNote,' is NOT CONTINUOUS in the backward direction'
     338        #print allWaysgoingFromHigherToLower
    705339    print
    706340    if fixme:
    707         wikiFM = 'style="color:red" | ' + fixme
     341        wikiFM = 'style="color:red" | fixme'
    708342    else:
    709343        wikiFM = ' | '
    710     if fixme or not(continuous_forward) or not(continuous_backward) or (len(rXn_refs)<2 and not(route.get(networklevel+':external_connection'))):
    711         problem = 'yes'
    712     else:
    713         problem = ''
    714 
    715     print 'PROBLEM:', problem
    716     return str(roleInNetwork), problem, '|align="right" | ' + str(note) + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + str(wikiFM) + ' ||' + str(wikiCF) + ' ||' + str(wikiCB)  + ' ||' + str(wikiEN) + '\n'
    717 
    718 def sortNetwork(network):
    719     # While making a list of all the nodes in the relation with an rXn_ref, find the node with the lowest rXn_ref in the network, not necessarily 01 and bring it to the first position
    720     # Look at the ways connecting to this node and their parent route relations with network=rXn
    721     # For all these relations, make a list of all the rXn_ref numbers, they lead to and remember the UIDs of these nodes and keep a ref to the relations
    722     # Split this list in two, one for internal routes, another for route relations connecting to a foreign network (so the ones with a connection role)
    723     # Sort both lists and bring the relations in positions following the first node
    724     # Do the same for all the relations in the second list
    725     # Then add the lowest rXn_ref number and remove it from the general todo list of rXn_ref nodes that were encountered in internal route relations
     344    if fixme or not(continuous_forward) or not(continuous_backward):
     345        problem = True
     346    else:
     347        problem = False
     348    return roleInNetwork, problem, '|align="right" | ' + note + '||align="right" | {{BrowseRoute|' + str(route.getId()) + '}}||align="right" ' + wikiFM + ' ||' + wikiCF + ' ||' + wikiCB + '\n'
     349
     350def checkNetwork(network):
    726351    name = network.get('name')
    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
    752388                referrersForNode = node.getReferrers()
     389                networkNotFoundForNode = True
     390                for referrer in referrersForNode:
     391                    if referrer.getType() is dummy_relation.getType():
     392                        if referrer.get('type') in ['network'] and referrer.get('network') in ['rcn']:
     393                            networkNotFoundForNode = False
     394                            break
     395                if networkNotFoundForNode:
     396                    #Main.main.getCurrentDataSet().setSelected(node)
     397                    #AutoScaleAction.zoomToSelection()
     398                    #selectedNode = mv.editLayer.data.getSelected()
     399                    #DownloadReferrersAction.downloadReferrers(mv.editLayer, selectedNode)
     400                    referrersForNode = node.getReferrers()
     401
     402                rcnNetworkCountForNode = roads = 0
    753403                for referrer in referrersForNode:
    754404                    if referrer.getType() is dummy_way.getType():
     405                        if referrer.get('highway'): roads += 1
    755406                        referrersForWay = referrer.getReferrers()
    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'
    788432                                        newRelation = Relation(network)
    789                                         newmember = RelationMember(roleFromRouteCheck, aRelation)
    790                                         if logVerbosity > 9: print newRelation.getMembersCount(), ' ',i, ' ', newmember
     433                                        newmember = RelationMember(roleFromRouteCheck, wayreferrer)
     434                                        print newRelation.getMembersCount(), ' ',i, ' ', newmember
     435                                        ##if i>newRelation.getMembersCount()
    791436                                        newRelation.addMember( i, newmember)
    792437                                        commandsList = []
    793438                                        commandsList.append(Command.ChangeCommand(network, newRelation))
    794                                         note = aRelation.get('note')
     439                                        note = wayreferrer.get('note')
    795440                                        if not(note):
    796441                                            note = ''
    797442                                        Main.main.undoRedo.add(Command.SequenceCommand("Adding " + note + " to network", commandsList))
    798443                                        commandsList = []
    799                                         if logVerbosity > 9: print 'Added newly found RCN route relation to network: ', note
     444                                        print 'Added newly found RCN route relation to network: ', note
    800445                                        i+=1
    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'
    934449
    935450        i+=1
    936     if logVerbosity > 19: print
    937     if 'createWikiReport' in sideEffects:
    938         fh = codecs.open(wikiReportFN, 'a', encoding="UTF-8")
    939         wikiReportOnNodes += ('|-\n|}\n')
    940         wikiReportOnRelations += ('|-\n|}\n<br style="clear:left;" />\n')
    941         fh.write(wikiReportOnNodes)
    942         fh.write(wikiReportOnRelations)
    943         fh.close()
    944 
    945 
    946 aDownloadWasNeeded = False
    947 '''
    948 Since Downloading referrers or missing members happens asynchronously in a separate worker thread
    949 the script can run in three modes
    950 
    951 1. No downloads allowed/offline run; output mentions that data was incomplete in its reports.
    952 2. 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.
    953    All hierarchies are still checked, looking for more incomplete data for which more downloads need to be scheduled.
    954 3. Normal run; All data is available and proper reporting can be performed.
    955 '''
     451    print
     452    wikiReportOnNodes += ('|-\n|}\n')
     453    wikiReportOnRelations += ('|-\n|}\n<br style="clear:left;" />\n')
     454    fh = open('C:/wikiReport.txt', 'a')
     455    fh.write(wikiReportOnNodes)
     456    fh.write(wikiReportOnRelations)
     457    fh.close()
     458
    956459
    957460dummy_way = Way()
     
    960463mv = getMapView()
    961464if mv and mv.editLayer and mv.editLayer.data:
     465    fh = open('C:/wikiReport.txt', 'w')
     466    fh.close()
     467    dummy_relation = Relation()
    962468    selectedRelations = mv.editLayer.data.getSelectedRelations()
    963469
     
    965471        JOptionPane.showMessageDialog(Main.parent, "Please select a route, network or collection relation")
    966472    else:
    967         if 'createWikiReport' in sideEffects:
    968             fh = codecs.open(wikiReportFN, 'w', encoding="UTF-8")
    969             fh.close()
    970473        for relation in selectedRelations:
    971             if logVerbosity> 49: print relation
     474            #print relation
     475            #print relation.hasIncompleteMembers()
    972476            if relation.hasIncompleteMembers():
    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)
    1008493
    1009494