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


Ignore:
Timestamp:
2011-09-15T20:03:04+02:00 (15 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'