Changeset 32855 in osm for applications/editors


Ignore:
Timestamp:
2016-08-20T18:26:00+02:00 (8 years ago)
Author:
darya
Message:

fix #13388 and Repeat last fix function

Location:
applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/PTAssistantPlugin.java

    r32823 r32855  
    22package org.openstreetmap.josm.plugins.pt_assistant;
    33
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
    46import javax.swing.JMenuItem;
     7import javax.swing.SwingUtilities;
    58
    69import org.openstreetmap.josm.Main;
     
    811import org.openstreetmap.josm.gui.MainMenu;
    912import org.openstreetmap.josm.gui.MapFrame;
     13import org.openstreetmap.josm.gui.Notification;
    1014import org.openstreetmap.josm.plugins.Plugin;
    1115import org.openstreetmap.josm.plugins.PluginInformation;
    1216import org.openstreetmap.josm.plugins.pt_assistant.actions.AddStopPositionAction;
    1317import org.openstreetmap.josm.plugins.pt_assistant.actions.RepeatLastFixAction;
     18import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteSegment;
    1419import org.openstreetmap.josm.plugins.pt_assistant.validation.PTAssistantValidatorTest;
    1520
     
    2227public class PTAssistantPlugin extends Plugin {
    2328
     29        /*
     30         * last fix that was can be re-applied to all similar route segments, can be
     31         * null if unavailable
     32         */
     33        private static PTRouteSegment lastFix;
     34
    2435        private JMenuItem addStopPositionMenu;
    25         private JMenuItem repeatLastFixMenu;
     36        private static JMenuItem repeatLastFixMenu;
    2637
    2738        /**
     
    3647
    3748                OsmValidator.addTest(PTAssistantValidatorTest.class);
    38                
     49
    3950                AddStopPositionAction addStopPositionAction = new AddStopPositionAction();
    4051                addStopPositionMenu = MainMenu.add(Main.main.menu.toolsMenu, addStopPositionAction, false);
    4152                RepeatLastFixAction repeatLastFixAction = new RepeatLastFixAction();
    4253                repeatLastFixMenu = MainMenu.add(Main.main.menu.toolsMenu, repeatLastFixAction, false);
    43                
     54
    4455        }
    4556
     
    5162                if (oldFrame == null && newFrame != null) {
    5263                        addStopPositionMenu.setEnabled(true);
     64                        repeatLastFixMenu.setEnabled(false);
    5365                } else if (oldFrame != null && newFrame == null) {
    5466                        addStopPositionMenu.setEnabled(false);
     67                        repeatLastFixMenu.setEnabled(false);
    5568                }
     69        }
     70       
     71        public static PTRouteSegment getLastFix() {
     72                return lastFix;
     73        }
     74
     75        /**
     76         * Remembers the last fix and enables/disables the Repeat last fix menu
     77         *
     78         * @param segment
     79         *            The last fix, call be null to disable the Repeat last fix menu
     80         */
     81        public static void setLastFix(PTRouteSegment segment) {
     82                lastFix = segment;
     83               
     84                SwingUtilities.invokeLater(new Runnable() {
     85                        @Override
     86                        public void run() {
     87                                repeatLastFixMenu.setEnabled(segment != null);
     88                        }
     89                });
    5690        }
    5791
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/AddStopPositionAction.java

    r32763 r32855  
    3737                                false, "addStopPosition", false);
    3838
    39                 this.setEnabled(true);
    4039        }
    4140
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/RepeatLastFixAction.java

    r32823 r32855  
    11package org.openstreetmap.josm.plugins.pt_assistant.actions;
    22
     3import static org.openstreetmap.josm.tools.I18n.tr;
     4
    35import java.awt.event.ActionEvent;
     6import java.awt.event.KeyEvent;
    47
     8import org.openstreetmap.josm.Main;
    59import org.openstreetmap.josm.actions.JosmAction;
     10import org.openstreetmap.josm.plugins.pt_assistant.PTAssistantPlugin;
     11import org.openstreetmap.josm.plugins.pt_assistant.validation.SegmentChecker;
     12import org.openstreetmap.josm.tools.ImageProvider;
     13import org.openstreetmap.josm.tools.Shortcut;
    614
    715public class RepeatLastFixAction extends JosmAction {
    816
    917        private static final long serialVersionUID = 2681464946469047054L;
     18       
     19        public RepeatLastFixAction() {
     20                super(tr("Repeat last fix"), new ImageProvider("presets/transport", "bus.svg"), tr("Repeat last fix"),
     21                                Shortcut.registerShortcut("Repeat last fix", tr("Repeat last fix"), KeyEvent.VK_E, Shortcut.NONE),
     22                                false, "repeatLastFix", false);
     23
     24        }
    1025
    1126        @Override
    1227        public void actionPerformed(ActionEvent e) {
    13                 // TODO Auto-generated method stub
     28               
     29                System.out.println("in actionPerformed");
     30               
     31                if (!isEnabled() || !Main.isDisplayingMapView()) {
     32                        return;
     33                }
     34               
     35                System.out.println("performing action");
     36               
     37                SegmentChecker.carryOutRepeatLastFix(PTAssistantPlugin.getLastFix());
     38               
     39                PTAssistantPlugin.setLastFix(null);
    1440               
    1541        }
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/data/PTRouteSegment.java

    r32801 r32855  
    44import java.util.List;
    55
     6import org.openstreetmap.josm.data.osm.Relation;
    67import org.openstreetmap.josm.data.osm.Way;
    78
     
    2223        private List<PTWay> ptways;
    2324        private List<List<PTWay>> fixVariants;
     25        private Relation relation;
    2426
    25         public PTRouteSegment(PTStop firstStop, PTStop lastStop, List<PTWay> ways) {
     27        public PTRouteSegment(PTStop firstStop, PTStop lastStop, List<PTWay> ways, Relation relation) {
    2628                this.firstStop = firstStop;
    2729                this.lastStop = lastStop;
     
    2931                ptways.addAll(ways);
    3032                fixVariants = new ArrayList<>();
     33                this.relation = relation;
    3134        }
    3235
     
    114117                return this.fixVariants;
    115118        }
     119       
     120        public Relation getRelation() {
     121                return this.relation;
     122        }
    116123
    117124        /**
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/NodeChecker.java

    r32822 r32855  
    55import java.lang.reflect.InvocationTargetException;
    66import java.util.ArrayList;
     7import java.util.Collection;
    78import java.util.List;
    89
     
    1011import javax.swing.SwingUtilities;
    1112
    12 import org.openstreetmap.josm.Main;
     13import org.openstreetmap.josm.actions.AutoScaleAction;
    1314import org.openstreetmap.josm.command.ChangeCommand;
    1415import org.openstreetmap.josm.command.Command;
    15 import org.openstreetmap.josm.command.SelectCommand;
    1616import org.openstreetmap.josm.data.osm.Node;
    1717import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1818import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    19 import org.openstreetmap.josm.data.osm.Relation;
    20 import org.openstreetmap.josm.data.osm.RelationMember;
    2119import org.openstreetmap.josm.data.osm.Way;
    2220import org.openstreetmap.josm.data.validation.Severity;
     
    103101        }
    104102
    105 
    106103        /**
    107104         * Fixes errors: solitary stop position and platform which is part of a way.
     
    119116
    120117                Node problematicNode = (Node) testError.getPrimitives().iterator().next();
    121                 ArrayList<OsmPrimitive> primitivesToSelect = new ArrayList<>(1);
    122                 primitivesToSelect.add(problematicNode);
    123                 SelectCommand selectCommand = new SelectCommand(primitivesToSelect);
    124                 selectCommand.executeCommand();
    125118
    126119                final int[] userSelection = { JOptionPane.YES_OPTION };
     
    165158        private static int showFixNodeTagDialog(TestError e) {
    166159                Node problematicNode = (Node) e.getPrimitives().iterator().next();
    167                 Main.map.mapView.zoomTo(problematicNode.getCoor());
     160                // Main.map.mapView.zoomTo(problematicNode.getCoor());
     161                // zoom to problem:
     162                Collection<OsmPrimitive> primitives = new ArrayList<>(1);
     163                primitives.add(problematicNode);
     164                AutoScaleAction.zoomTo(primitives);
    168165
    169166                String[] options = { tr("Yes"), tr("No") };
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/PTAssistantValidatorTest.java

    r32822 r32855  
    55import java.lang.reflect.InvocationTargetException;
    66import java.util.ArrayList;
     7import java.util.Collection;
    78import java.util.List;
    89
     
    1112
    1213import org.openstreetmap.josm.command.Command;
     14import org.openstreetmap.josm.command.SelectCommand;
    1315import org.openstreetmap.josm.command.SequenceCommand;
    1416import org.openstreetmap.josm.data.osm.DataSet;
    1517import org.openstreetmap.josm.data.osm.Node;
     18import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1619import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1720import org.openstreetmap.josm.data.osm.Relation;
     
    2023import org.openstreetmap.josm.data.validation.Test;
    2124import org.openstreetmap.josm.data.validation.TestError;
     25import org.openstreetmap.josm.gui.Notification;
     26import org.openstreetmap.josm.plugins.pt_assistant.PTAssistantPlugin;
    2227import org.openstreetmap.josm.plugins.pt_assistant.actions.FixTask;
    2328import org.openstreetmap.josm.plugins.pt_assistant.actions.IncompleteMembersDownloadThread;
     
    5156        public static final int ERROR_CODE_STOP_AREA_COMPARE_RELATIONS = 3764;
    5257
    53 
    54 
    5558        private PTAssistantLayer layer;
    5659
     
    7578                // select only stop_positions
    7679                if (n.hasTag("public_transport", "stop_position")) {
    77                        
     80
    7881                        // check if stop positions are on a way:
    7982                        nodeChecker.performSolitaryStopPositionTest();
    80                        
     83
    8184                        // check if stop positions are in any stop_area relation:
    8285                        nodeChecker.performNodePartOfStopAreaTest();
     
    8689                // select only platforms
    8790                if (n.hasTag("public_transport", "platform")) {
    88                        
     91
    8992                        // check that platforms are not part of any way:
    9093                        nodeChecker.performPlatformPartOfWayTest();
    91                        
     94
    9295                        // check if platforms are in any stop_area relation:
    9396                        nodeChecker.performNodePartOfStopAreaTest();
    9497                }
    95                
     98
    9699                this.errors.addAll(nodeChecker.getErrors());
    97100
     
    100103        @Override
    101104        public void visit(Relation r) {
    102                                
     105
    103106                // Do some testing on stop area relations
    104107                if (StopUtils.isStopArea(r)) {
    105108
    106109                        StopChecker stopChecker = new StopChecker(r, this);
    107                        
    108                         // Check if stop area relation has one stop position. 
     110
     111                        // Check if stop area relation has one stop position.
    109112                        stopChecker.performStopAreaStopPositionTest();
    110113
    111                         // Check if stop area relation has one platform. 
     114                        // Check if stop area relation has one platform.
    112115                        stopChecker.performStopAreaPlatformTest();
    113                        
    114                         // Check if stop position(s) belong the same route relation as related platform(s)
     116
     117                        // Check if stop position(s) belong the same route relation as
     118                        // related platform(s)
    115119                        stopChecker.performStopAreaRelationsTest();
    116120
     
    381385                                Way segmentEndWay = assigner.get(segmentEndStop);
    382386                                List<PTWay> waysBetweenStops = manager.getPTWaysBetween(segmentStartWay, segmentEndWay);
    383                                 PTRouteSegment routeSegment = new PTRouteSegment(segmentStartStop, segmentEndStop, waysBetweenStops);
     387                                PTRouteSegment routeSegment = new PTRouteSegment(segmentStartStop, segmentEndStop, waysBetweenStops, r);
    384388                                SegmentChecker.addCorrectSegment(routeSegment);
    385389                        }
     
    408412        @Override
    409413        public Command fixError(TestError testError) {
    410                
     414
    411415                // repaint the relation in the pt_assistant layer:
    412416                if (testError.getPrimitives().iterator().next().getType().equals(OsmPrimitiveType.RELATION)) {
     
    415419                }
    416420
     421                // reset the last fix:
     422                PTAssistantPlugin.setLastFix(null);
     423
    417424                List<Command> commands = new ArrayList<>();
    418425
     
    437444                if (testError.getCode() == ERROR_CODE_STOP_BY_STOP) {
    438445                        commands.add(SegmentChecker.fixError(testError));
     446                        // make sure the primitives of this testError are selected:
     447                        Collection<OsmPrimitive> primitivesToSelect = new ArrayList<>();
     448                        for (Object obj : testError.getPrimitives()) {
     449                                primitivesToSelect.add((OsmPrimitive) obj);
     450                        }
     451                        SelectCommand selectCommand = new SelectCommand(primitivesToSelect);
     452                        SwingUtilities.invokeLater(new Runnable() {
     453                                @Override
     454                                public void run() {
     455                                        selectCommand.executeCommand();
     456                                }
     457                        });
    439458                }
    440459
     
    474493
    475494        }
    476        
     495
    477496        public void addFixVariants(List<List<PTWay>> fixVariants) {
    478497                layer.addFixVariants(fixVariants);
    479498        }
    480        
     499
    481500        public void clearFixVariants() {
    482501                layer.clearFixVariants();
    483502        }
    484        
     503
    485504        public List<PTWay> getFixVariant(Character c) {
    486505                return layer.getFixVariant(c);
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/SegmentChecker.java

    r32819 r32855  
    2929import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
    3030import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     31import org.openstreetmap.josm.plugins.pt_assistant.PTAssistantPlugin;
    3132import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteDataManager;
    3233import org.openstreetmap.josm.plugins.pt_assistant.data.PTRouteSegment;
     
    5758        private StopToWayAssigner assigner;
    5859
    59         private List<PTWay> unusedWays = new ArrayList<>();
    60 
    61         private HashMap<TestError, PTWay> erroneousPTWays = new HashMap<>();
    62 
    63         private HashMap<TestError, Node> firstNodeOfErroneousPTWay = new HashMap<>();
    64 
    6560        public SegmentChecker(Relation relation, Test test) {
    6661
     
    8075
    8176                this.assigner = new StopToWayAssigner(manager.getPTWays());
    82 
    83                 unusedWays.addAll(manager.getPTWays());
    8477
    8578        }
     
    284277                                                        PTAssistantValidatorTest.ERROR_CODE_STOP_BY_STOP, primitives, highlighted);
    285278                                        this.errors.add(e);
    286                                         PTRouteSegment routeSegment = new PTRouteSegment(startStop, endStop, segmentWays);
     279                                        PTRouteSegment routeSegment = new PTRouteSegment(startStop, endStop, segmentWays, relation);
    287280                                        wrongSegments.put(e, routeSegment);
    288                                         erroneousPTWays.put(e, manager.getPTWay(startWay));
    289                                         firstNodeOfErroneousPTWay.put(e, null);
    290281                                }
    291282                                continue;
     
    295286                                        segmentWays.get(segmentWays.size() - 1));
    296287                        if (sortingCorrect) {
    297                                 PTRouteSegment routeSegment = new PTRouteSegment(startStop, endStop, segmentWays);
     288                                PTRouteSegment routeSegment = new PTRouteSegment(startStop, endStop, segmentWays, relation);
    298289                                addCorrectSegment(routeSegment);
    299                                 unusedWays.removeAll(segmentWays);
    300290                        } else {
    301                                 PTRouteSegment routeSegment = new PTRouteSegment(startStop, endStop, segmentWays);
     291                                PTRouteSegment routeSegment = new PTRouteSegment(startStop, endStop, segmentWays, relation);
    302292                                TestError error = this.errors.get(this.errors.size() - 1);
    303293                                wrongSegments.put(error, routeSegment);
     
    452442                                                        PTAssistantValidatorTest.ERROR_CODE_STOP_BY_STOP, primitives, highlighted);
    453443                                        this.errors.add(e);
    454                                         erroneousPTWays.put(e, current);
    455444                                        return false;
    456445                                }
     
    649638                        } else {
    650639                                error.setMessage("PT: Problem in the route segment with several automatic fixes");
    651                         }
     640                        } 
    652641                }
    653642
     
    789778                        }
    790779
     780                        PTAssistantPlugin.setLastFix(correctSegmentsForThisError.get(0));
    791781                        return carryOutSingleFix(testError, correctSegmentsForThisError.get(0).getPTWays());
    792782
     
    799789                        }
    800790
     791                        PTAssistantPlugin.setLastFix(new PTRouteSegment(wrongSegment.getFirstStop(),
     792                                        wrongSegment.getLastStop(), wrongSegment.getFixVariants().get(0), (Relation) testError.getPrimitives().iterator().next()));
    801793                        return carryOutSingleFix(testError, wrongSegment.getFixVariants().get(0));
    802794                }
     
    904896         *            the fix variant to be adopted
    905897         */
    906         private static void carryOutSelectedFix(TestError testError, List<PTWay> fix) {
     898        private static void carryOutSelectedFix(TestError testError, List<PTWay> fix){
    907899                // modify the route:
    908                 Relation route = (Relation) testError.getPrimitives().iterator().next();
    909                 route.setMembers(getModifiedRelationMembers(testError, fix));
     900                Relation originalRelation = (Relation) testError.getPrimitives().iterator().next();
     901                Relation modifiedRelation = new Relation(originalRelation);
     902                modifiedRelation.setMembers(getModifiedRelationMembers(testError, fix));
     903                ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation);
     904                Main.main.undoRedo.addNoRedraw(changeCommand);
     905                Main.main.undoRedo.afterAdd();
    910906                PTRouteSegment wrongSegment = wrongSegments.get(testError);
    911907                wrongSegments.remove(testError);
    912908                wrongSegment.setPTWays(fix);
    913909                addCorrectSegment(wrongSegment);
     910                PTAssistantPlugin.setLastFix(wrongSegment);
    914911
    915912                // get ways for the fix:
     
    923920                List<OsmDataLayer> listOfLayers = Main.getLayerManager().getLayersOfType(OsmDataLayer.class);
    924921                for (OsmDataLayer osmDataLayer : listOfLayers) {
    925                         if (osmDataLayer.data == route.getDataSet()) {
     922                        if (osmDataLayer.data == originalRelation.getDataSet()) {
    926923                                layer = osmDataLayer;
    927924                                break;
     
    930927
    931928                // create editor:
    932                 GenericRelationEditor editor = (GenericRelationEditor) RelationEditor.getEditor(layer, route,
    933                                 route.getMembersFor(primitives));
     929                GenericRelationEditor editor = (GenericRelationEditor) RelationEditor.getEditor(layer, originalRelation,
     930                                originalRelation.getMembersFor(primitives));
    934931
    935932                // open editor:
     
    977974                modifiedRelation.setMembers(getModifiedRelationMembers(testError, fix));
    978975                wrongSegments.remove(testError);
    979                 return new ChangeCommand(originalRelation, modifiedRelation);
    980 
     976                ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation);
     977                return changeCommand;
    981978        }
    982979
     
    10141011                return modifiedRelationMembers;
    10151012        }
     1013       
     1014        public static void carryOutRepeatLastFix(PTRouteSegment segment) {
     1015               
     1016                System.out.println("last fix relation: " + segment.getRelation().getId());
     1017                List<TestError> wrongSegmentsToRemove = new ArrayList<>();
     1018               
     1019                int counter = 0;
     1020                // find all wrong ways that have the same segment:
     1021                for (TestError testError: wrongSegments.keySet()) {
     1022                        PTRouteSegment wrongSegment = wrongSegments.get(testError);
     1023                        if (wrongSegment.getFirstWay() == segment.getFirstWay() && wrongSegment.getLastWay() == segment.getLastWay()) {
     1024                                counter++;
     1025                                System.out.println("wrong segment: " + wrongSegment.getRelation().getId());
     1026                                // modify the route:
     1027                                Relation originalRelation = wrongSegment.getRelation();
     1028                                Relation modifiedRelation = new Relation(originalRelation);
     1029                                modifiedRelation.setMembers(getModifiedRelationMembers(testError, segment.getPTWays()));
     1030                                ChangeCommand changeCommand = new ChangeCommand(originalRelation, modifiedRelation);
     1031                                Main.main.undoRedo.addNoRedraw(changeCommand);
     1032                                Main.main.undoRedo.afterAdd();
     1033                                wrongSegmentsToRemove.add(testError);
     1034                        }
     1035                }
     1036               
     1037                // update the errors displayed in the validator dialog:
     1038                List<TestError> modifiedValidatorTestErrors = new ArrayList<>();
     1039                for (TestError validatorTestError: Main.map.validatorDialog.tree.getErrors()) {
     1040                        if (!wrongSegmentsToRemove.contains(validatorTestError)) {
     1041                                modifiedValidatorTestErrors.add(validatorTestError);
     1042                        }
     1043                }
     1044                Main.map.validatorDialog.tree.setErrors(modifiedValidatorTestErrors);
     1045               
     1046                // update wrong segments:
     1047                for (TestError testError: wrongSegmentsToRemove) {
     1048                        wrongSegments.remove(testError);
     1049                }
     1050               
     1051                System.out.println("wrong segments found: " + counter);
     1052                System.out.println();
     1053               
     1054               
     1055               
     1056               
     1057        }
    10161058
    10171059}
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/validation/StopChecker.java

    r32822 r32855  
    44
    55import java.util.ArrayList;
     6import java.util.HashMap;
    67import java.util.List;
    78import java.util.Set;
    8 import java.util.HashMap;
    99
    1010import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1111import org.openstreetmap.josm.data.osm.Relation;
    12 import org.openstreetmap.josm.data.osm.RelationMember;
    1312import org.openstreetmap.josm.data.validation.Severity;
    1413import org.openstreetmap.josm.data.validation.Test;
     
    129128                primitives.add(relation);
    130129                TestError e = new TestError(this.test, Severity.WARNING,
    131                                 tr("PT: Route relations of stop position(s) and platform(s) of stop area memebrs diverge"),
     130                                tr("PT: Route relations of stop position(s) and platform(s) of stop area members diverge"),
    132131                                PTAssistantValidatorTest.ERROR_CODE_STOP_AREA_COMPARE_RELATIONS, primitives);
    133132                errors.add(e);
Note: See TracChangeset for help on using the changeset viewer.