Ignore:
Timestamp:
2010-08-24T17:26:10+02:00 (14 years ago)
Author:
tilusnet
Message:
  • Connected segments can be aligned if the pivot is on their common node
  • Fixed AlignWays command shortcut consistency in status bar
  • Minor improvements in the Rotate Command class
Location:
applications/editors/josm/plugins/alignways/src/org/openstreetmap/josm/plugins/alignways
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/alignways/src/org/openstreetmap/josm/plugins/alignways/AlignWaysAction.java

    r21619 r22758  
    5656                                if (!(c instanceof AlignWaysRotateCommand &&
    5757                                                affectedNodes.equals(((AlignWaysRotateCommand) c).getRotatedNodes()))) {
    58                                         Main.main.undoRedo.add(c = new AlignWaysRotateCommand());
    59                                 }
    60 
    61                                 // Warn user if reference and alignee segment nodes are common:
    62                                 // We cannot align two connected segment
    63                                 if (((AlignWaysRotateCommand) c).areSegsConnected()) {
    64                                         // Revert move
    65                                         ((AlignWaysRotateCommand) c).undoCommand();
    66                                         JOptionPane.showMessageDialog(Main.parent,
    67                                                         tr("You cannot align connected segments.\n"
    68                                                                         + "Please select two segments that don''t share any nodes."),
    69                                                                         tr("AlignWayS message"), JOptionPane.WARNING_MESSAGE);
    70                                         return;
    71                                 }
    72 
    73                                 for (Node n : affectedNodes) {
    74                                         if (n.getCoor().isOutSideWorld()) {
    75                                                 // Revert move
    76                                                 ((AlignWaysRotateCommand) c).undoCommand();
    77                                                 JOptionPane.showMessageDialog(Main.parent,
    78                                                                 tr("Aligning would result nodes outside the world.\n" +
    79                                                                 "Your action is being reverted."),
    80                                                                 tr("AlignWayS message"), JOptionPane.WARNING_MESSAGE);
    81                                                 return;
     58                                        c = new AlignWaysRotateCommand();
     59                                        if (actionValid((AlignWaysRotateCommand)c, affectedNodes)) {
     60                                                Main.main.undoRedo.add(c);
    8261                                        }
    83 
    8462                                }
    8563
     
    8967        }
    9068
     69
     70        /**
     71         * Validates the circumstances of the alignment (rotation) command to be executed.
     72         * @param c Command to be verified.
     73         * @param affectedNodes Nodes to be affected by the action.
     74         * @return true if the aligning action can be done, false otherwise.
     75         */
     76        private boolean actionValid(AlignWaysRotateCommand c, Collection<Node> affectedNodes) {
     77                // Deny action if reference and alignee segment cannot be aligned
     78                if (!c.areSegsAlignable()) {
     79                        JOptionPane.showMessageDialog(Main.parent,
     80                                        tr("Please select two segments that don''t share any nodes or put the pivot on their common node.\n" +
     81                                        "Your action is being igonred."),
     82                                        tr("AlignWayS: Alignment not possible"), JOptionPane.WARNING_MESSAGE);
     83                        return false;
     84                }
     85
     86                // Deny action if the nodes would end up outside world
     87                for (Node n : affectedNodes) {
     88                        if (n.getCoor().isOutSideWorld()) {
     89                                // Revert move
     90                                (c).undoCommand();
     91                                JOptionPane.showMessageDialog(Main.parent,
     92                                                tr("Aligning would result nodes outside the world.\n" +
     93                                                "Your action is being ignored."),
     94                                                tr("AlignWayS: Alignment denied"), JOptionPane.WARNING_MESSAGE);
     95                                return false;
     96                        }
     97
     98                }
     99
     100                // Action valid
     101                return true;
     102        }
     103
    91104}
  • applications/editors/josm/plugins/alignways/src/org/openstreetmap/josm/plugins/alignways/AlignWaysRotateCommand.java

    r22050 r22758  
    8181                this.nodes = algnSeg.getSegmentEndPoints();
    8282
    83                 for (Node n : this.nodes) {
    84                         OldState os = new OldState();
    85                         os.latlon = new LatLon(n.getCoor());
    86                         os.eastNorth = n.getEastNorth();
    87                         os.ws = algnWS;
    88                         os.modified = n.isModified();
    89                         oldState.put(n, os);
    90                 }
    91                 oldWS.push(algnWS);
    92 
    9383                EastNorth enRefNode1 = refWS.way.getNode(refWS.lowerIndex)
    9484                .getEastNorth();
     
    119109                 */
    120110
    121                 rotateNodes(true);
     111                // rotateNodes(true);
    122112
    123113        }
     
    130120         */
    131121        private void rotateNodes(boolean setModified) {
     122
     123                // "Backup" state
     124                WaySegment algnWS = algnSeg.getSegment();
     125                for (Node n : this.nodes) {
     126                        OldState os = new OldState();
     127                        os.latlon = new LatLon(n.getCoor());
     128                        os.eastNorth = n.getEastNorth();
     129                        os.ws = algnWS;
     130                        os.modified = n.isModified();
     131                        oldState.put(n, os);
     132                }
     133                oldWS.push(algnWS);
     134
     135                // Rotate
    132136                for (Node n : nodes) {
    133137                        double cosPhi = Math.cos(rotationAngle);
     
    168172        public JLabel getDescription() {
    169173                return new JLabel(tr("Align way segment"), ImageProvider.get(
    170                                         "", "alignways"), SwingConstants.HORIZONTAL);
     174                                "", "alignways"), SwingConstants.HORIZONTAL);
    171175        }
    172176
     
    216220        }
    217221
    218         public boolean areSegsConnected() {
     222        /** Returns true if the two selected segments are alignable.
     223         *  They are not if they are connected *and* the pivot is not the connection node.
     224         */
     225        public boolean areSegsAlignable() {
    219226                Collection<Node> algnNodes = nodes;
    220227                Collection<Node> refNodes = AlignWaysSegmentMgr.getInstance(Main.map.mapView)
    221228                .getRefSeg().getSegmentEndPoints();
     229
     230                // First check if the pivot node of the alignee exists in the reference:
     231                // in this case the pivot is the shared node and alignment is possible
     232                for (Node nR : refNodes) {
     233                        if (nR.getEastNorth().equals(pivot))
     234                                return true;
     235                }
     236
     237                // Otherwise if the segments are connected, alignment is not possible
    222238                for (Node nA : algnNodes) {
    223239                        for (Node nR : refNodes) {
    224240                                if (nA.equals(nR))
    225                                         return true;
     241                                        return false;
    226242                        }
    227243                }
    228244
    229                 return false;
    230         }
    231 
     245                // In all other cases alignment is possible
     246                return true;
     247        }
    232248
    233249}
  • applications/editors/josm/plugins/alignways/src/org/openstreetmap/josm/plugins/alignways/AlignWaysSelBothState.java

    r21613 r22758  
    2525        public void setHelpText() {
    2626                Main.map.statusLine
    27                                 .setHelpText("Shift-A: Align segments; Alt-click: Clear selection");
     27                .setHelpText(AlignWaysPlugin.getAwAction().getShortcut().getKeyText() +
     28                                ": Align segments; Alt-click: Clear selection");
    2829        }
    2930
Note: See TracChangeset for help on using the changeset viewer.