Changes between Version 6 and Version 7 of Help/Plugin/Scripting/Python


Ignore:
Timestamp:
2011-09-15T20:03:04+02:00 (14 years ago)
Author:
Polyglot
Comment:

I had been changing properties behind JOSM's back, thus the modified flag didn't get set for those route relations and they were not uploaded properly

Legend:

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

    v6 v7  
    206206
    207207
    208 {{{#!python
     208{{{
    209209#!/bin/jython
    210210'''
     
    224224This code illustrates how to use Jython to:
    225225* loop over all members of a route relation
    226 * find out whether member is node, way or relation
     226* find out whether the member is a node, a way or a relation
    227227* add/change properties of a relation
    228228* remove properties of a relation
     
    236236from javax.swing import JOptionPane
    237237from org.openstreetmap.josm import Main
     238import org.openstreetmap.josm.command as Command
    238239import org.openstreetmap.josm.data.osm.Node as Node
    239240import org.openstreetmap.josm.data.osm.Way as Way
     
    242243import org.openstreetmap.josm.data.osm.DataSet as DataSet
    243244import org.openstreetmap.josm.data.osm.RelationMember as RelationMember
    244 
     245import re
     246
     247commandsList = []
     248reNumberDashNumber = re.compile(r'\d+-\d+')
    245249def getMapView():
    246250    if Main.main and Main.main.map:
     
    251255mv = getMapView()
    252256if mv and mv.editLayer and mv.editLayer.data:
     257    dummy_relation = Relation()
    253258    selectedRelations = mv.editLayer.data.getSelectedRelations()
    254259
     
    258263        print
    259264        for route in selectedRelations:
    260             Main.main.getCurrentDataSet().setSelected(route.getMember(0).getWay())
     265            newRelation = Relation(route)
     266            relationChanged = False
    261267            name = route.get('name')
    262             if name and name == route.get('note'):
    263                 print 'removing name when it is the same as note'
    264                 route.remove('name')
    265             rcn_refs=[]
    266             memberslist = []
    267             continuous = True
     268            if name:
     269                if reNumberDashNumber.match(name):
     270                    print 'removing name when it is of the form ##-##'
     271                    newRelation.remove('name')
     272                    relationChanged = True
     273            else:
     274                name = ''
     275            ref = route.get('ref')
     276            if ref:
     277                if reNumberDashNumber.match(ref):
     278                    print 'removing ref when it is of the form ##-##'
     279                    newRelation.remove('ref')
     280                    relationChanged = True
     281            else:
     282                ref = ''
     283            if relationChanged:
     284                commandsList.append(Command.ChangeCommand(route, newRelation))
     285               
     286                Main.main.undoRedo.add(Command.SequenceCommand("Removing name and/or ref " + name + '/' + ref, commandsList))
     287                commandsList = []
     288
     289            rcn_refs = []; route_relation_names = []; memberslist = []
     290            endnodes = []; prev_endnodes = []
     291            continuous_forward = True; continuous_backward = True
     292            prev_role = None; prev_endnodes_before_forward = None; last_endnodes_before_backward = None
    268293            for member in route.getMembers():
    269294                if member.isWay():
     295                    role = member.getRole()
    270296                    memberslist.append(member)
    271297                    way = member.getWay()
    272298                    #JOptionPane.showMessageDialog(Main.parent, 'way is selected')
    273299                    endnodes = [way.getNode(0), way.getNode(way.nodesCount-1)]
     300                    notfoundyet = True
    274301                    for endnode in endnodes:
     302                        # inventorizing of rcn_ref on end nodes
    275303                        rcn_ref = endnode.get('rcn_ref')
    276304                        if rcn_ref:
    277305                            rcn_refs.append(int(rcn_ref))
     306                            for referrer in endnode.getReferrers():
     307                                if referrer.getType() is dummy_relation.getType():
     308                                    if referrer.get('type')=='network' and referrer.get('network')=='rcn':
     309                                        relname=referrer.get('name')
     310                                        if relname:
     311                                            route_relation_names.append(relname)
     312                                       
     313                                    elif referrer.get('type')=='collection':
     314                                        route_relation_names.append('Node not assigned to network yet')
     315                        # checking for continuity on ways
     316                        if notfoundyet:
     317                            if role:
     318                                if prev_role:
     319                                    if role=='forward' and prev_role=='forward' and endnode in prev_endnodes:
     320                                        notfoundyet = False
     321                                    elif role=='forward' and prev_role=='backward' and endnode in last_endnodes_before_backward:
     322                                        notfoundyet = False
     323                                    elif role=='backward' and prev_role=='forward' and endnode in prev_endnodes:
     324                                        notfoundyet = False
     325                                    elif role=='backward' and prev_role=='backward' and endnode in prev_endnodes:
     326                                        notfoundyet = False
     327                                else:
     328                                    if role=='forward' and endnode in prev_endnodes:
     329                                        notfoundyet = False
     330                                    elif role=='backward' and endnode in prev_endnodes:
     331                                        notfoundyet = False
     332                            else:
     333                                if prev_role:
     334                                    if prev_role=='forward' and endnode in prev_endnodes:
     335                                        notfoundyet = False
     336                                    elif prev_role=='backward' and endnode in last_endnodes_before_backward:
     337                                        notfoundyet = False
     338                                else:
     339                                    if endnode in prev_endnodes:
     340                                        notfoundyet = False
     341                    # Analysis of continuity of ways
     342                    if prev_endnodes and notfoundyet:
     343                        if role:
     344                            if role == 'forward':
     345                                continuous_forward = False
     346                            elif role == 'backward':
     347                                continuous_backward = False
     348                        else:
     349                            continuous_forward = False
     350                            continuous_backward = False
     351                    if role=='forward':
     352                        if not(prev_endnodes_before_forward):
     353                            prev_endnodes_before_forward  = prev_endnodes
     354                    elif prev_role=='forward' and role=='backward':
     355                        if not(last_endnodes_before_backward):
     356                            last_endnodes_before_backward = prev_endnodes
     357                    elif not(role) and prev_role=='backward':
     358                        prev_endnodes_before_forward = None
     359                    prev_role = role
     360                    prev_endnodes = endnodes
     361            # Drawing conclusions about continuity of ways
     362            if continuous_forward:
     363                print 'route is continous in the forward direction'
     364            else:
     365                print 'route is NOT CONTINUOUS in the forward direction'
     366            if continuous_backward:
     367                print 'route is continous in the backward direction'
     368            else:
     369                print 'route is NOT CONTINUOUS in the backward direction'
     370
     371            # Drawing conclusions about rcn_refs
    278372            print rcn_refs
    279373            if len(rcn_refs) > 1:
     374                newRelation = Relation(route)
     375                relationChanged = False
     376
    280377                if rcn_refs[0] > rcn_refs[1]:
    281378                    rcn_refs.sort()
    282                     print 'flipping members order'
     379                    print 'Flipping members order'
    283380                    for member in reversed(memberslist):
    284                         route.addMember( route.getMembersCount(), member)
    285                         route.removeMember (0)
    286                 route.put('note', str(rcn_refs[0]).zfill(2) + '-' + str(rcn_refs[1]).zfill(2))
     381                        newRelation.addMember( newRelation.getMembersCount(), member)
     382                        newRelation.removeMember (0)
     383                    commandsList.append(Command.ChangeCommand(route, newRelation))
     384                    Main.main.undoRedo.add(Command.SequenceCommand("Flipping order of members", commandsList))
     385                    commandsList = []
     386                note = route.get('note')
     387                newNote = str(rcn_refs[0]).zfill(2) + '-' + str(rcn_refs[1]).zfill(2)
     388                if not(note) or note != newNote:
     389                    if not(note): note = 'nothing'
     390                    newRelation.put('note', newNote)
     391                    relationChanged = True
     392                    commandsList.append(Command.ChangeCommand(route, newRelation))
     393               
     394                    Main.main.undoRedo.add(Command.SequenceCommand("Changing note from " + note + ' to ' + newNote, commandsList))
     395                    commandsList = []
     396
     397                if len(route_relation_names) > 1 and route_relation_names[0] != route_relation_names[1]:
     398                    print
     399                    print 'This is probably a CONNECTION to another network'
     400                    print route_relation_names
    287401            else:
    288402                print 'less than 2 end nodes with rcn_ref found'