Ignore:
Timestamp:
2011-08-03T18:47:42+02:00 (13 years ago)
Author:
akks
Message:

'FastDraw: better autosimplification '

Location:
applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java

    r26309 r26440  
    3636import org.openstreetmap.josm.actions.mapmode.MapMode;
    3737import org.openstreetmap.josm.command.AddCommand;
     38import org.openstreetmap.josm.command.ChangeCommand;
     39import org.openstreetmap.josm.command.ChangeNodesCommand;
    3840import org.openstreetmap.josm.command.Command;
     41import org.openstreetmap.josm.command.DeleteCommand;
    3942import org.openstreetmap.josm.command.SequenceCommand;
    4043import org.openstreetmap.josm.data.Bounds;
     
    5356        AWTEventListener {
    5457    private static final String SIMPLIFYMODE_MESSAGE=
    55             tr("Press Enter to simplify or save, Ctrl-Enter to save with tags, Up/Down to tune simplification");
     58            tr("Q=Options, Enter=save, Ctrl-Enter=save with tags, Up/Down=tune");
    5659    private static final String DRAWINGMODE_MESSAGE=
    5760    tr("Click or Click&drag to continue, Ctrl-Click to add fixed node, Shift-Click to delete, Enter to simplify or save, Ctrl-Shift-Click to start new line");
     
    6568    private boolean ctrl;
    6669    private boolean shift;
    67     private boolean oldCtrl;
    68     private boolean oldShift;
    6970    private double eps;
    7071    private final Stroke strokeForSimplified;
     
    7576    private final Cursor cursorReady;
    7677    private final Cursor cursorNode;
     78    private final Cursor cursorDrawing;
    7779    private boolean nearpoint;
    7880    private LatLon highlighted;
     
    8082    private Stroke strokeForDelete;
    8183    private int dragNode=-1;
     84    private SequenceCommand delCmd;
     85    private List<Node> oldNodes;
    8286
    8387
     
    97101        cursorReady = ImageProvider.getCursor("crosshair", "ready");
    98102        cursorNode = ImageProvider.getCursor("crosshair", "joinnode");
     103        cursorDrawing = ImageProvider.getCursor("crosshair", "mode");
    99104        //loadPrefs();
    100105    }
     
    120125        Main.map.mapView.addTemporaryLayer(this);
    121126
    122         Main.map.mapView.setCursor(cursorDraw);
     127        updateCursor();
     128        Collection<Way> selectedWays = Main.main.getCurrentDataSet().getSelectedWays();
     129        if (selectedWays!=null // if there is a selection
     130            && selectedWays.size()==1 // and one way is selected
     131            && line.getPoints().size()==0) /* and ther is no already drawn line */ {
     132            // we can start drawing new way starting from old one
     133            Way w = selectedWays.iterator().next();
     134           
     135            if (w.isNew()) loadFromWay(w);
     136        }
    123137
    124138        try {
     
    229243            doKeyEvent((KeyEvent) event);
    230244        }
     245        if (event.getID() == KeyEvent.KEY_RELEASED) {
     246            doKeyReleaseEvent((KeyEvent) event);
     247        }
    231248        updateCursor();
    232249//        updateStatusLine();
     
    265282            return;
    266283        }
    267 
     284        startDrawing(e.getPoint());
     285    }
     286
     287    private void startDrawing(Point point) {
    268288        //if (line.isClosed()) { setStatusLine(tr(SIMPLIFYMODE_MESSAGE));return;  }
    269289        drawing = true;
    270290
    271         LatLon p = getLatLon(e);
    272         Node nd1 = getNearestNode(e.getPoint(), settings.maxDist);
     291        LatLon p = mv.getLatLon(point.x, point.y);
     292        Node nd1 = getNearestNode(point, settings.maxDist);
    273293        if (nd1!=null) {
    274294            // found node, make it fixed point of the line
     
    284304        setStatusLine(tr("Please move the mouse to draw new way"));
    285305        repaint();
    286 
    287306    }
    288307
    289308    @Override
    290309    public void mouseReleased(MouseEvent e) {
     310        if (e.getButton() != MouseEvent.BUTTON1) return;
     311        stopDrawing();
     312    }
     313   
     314    private void stopDrawing() {
    291315        if (!isEnabled()) return;
    292         if (e.getButton() != MouseEvent.BUTTON1) return;
    293316        dragNode = -1;
    294317        drawing = false;
    295318        highlighted=null;
    296319        if (!line.isClosed()) setStatusLine(DRAWINGMODE_MESSAGE);
     320        updateCursor();
    297321        repaint();
    298322    }
     
    311335
    312336        nearestIdx=line.findClosestPoint(e.getPoint(),settings.maxDist);
    313 
     337       
    314338        if (!drawing) {
    315339            if (dragNode>=0) {
     
    329353            return;
    330354        }
     355        updateCursor();
    331356        if (line.isClosed()) setStatusLine(SIMPLIFYMODE_MESSAGE);
    332357
     
    336361        Point lastP = line.getLastPoint(); // last point of line fragment being edited
    337362
    338         if (nearpoint){
     363            if (nearpoint){
    339364            if ( Math.hypot(e.getX() - lastP.x, e.getY() - lastP.y) > 1e-2) {
    340365                line.addFixed(nd1.getCoor()); // snap to node coords
     
    343368        } else {
    344369            if (Math.hypot(e.getX() - lastP.x, e.getY() - lastP.y) > settings.minPixelsBetweenPoints) {
    345                 line.addLast(getLatLon(e)); // free mouse-drawing
     370                          line.addLast(getLatLon(e)); // free mouse-drawing
    346371                repaint();
    347372            }
     
    353378    private void doKeyEvent(KeyEvent e) {
    354379        ///  System.out.println(e);
    355         if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
     380        switch(e.getKeyCode()) {
     381        case KeyEvent.VK_BACK_SPACE:
    356382            if (line.wasSimplified()) {
    357383                line.clearSimplifiedVersion();
     
    360386            }
    361387            back();
    362         }
    363         if (e.getKeyCode() == KeyEvent.VK_ENTER) {
     388        break;
     389        case KeyEvent.VK_ENTER:
    364390            // first Enter = simplify, second = save the way
    365391            if (!line.wasSimplified()) {
     
    370396                showSimplifyHint();
    371397            } else saveAsWay();
    372         }
    373         if (e.getKeyCode() == KeyEvent.VK_DOWN) {
     398        break;
     399        case KeyEvent.VK_DOWN:
    374400            // more details
    375401            e.consume();
    376402            changeEpsilon(settings.epsilonMult);
    377         }
    378         if (e.getKeyCode() == KeyEvent.VK_UP) {
     403        break;
     404        case KeyEvent.VK_UP:
    379405            // less details
    380406            e.consume();
    381407            changeEpsilon(1/settings.epsilonMult);
    382         }
    383         if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
     408        break;
     409        case KeyEvent.VK_ESCAPE:
    384410            // less details
    385411            e.consume();
    386412            line.moveToTheEnd();
    387         }
    388         if (e.getKeyCode() == KeyEvent.VK_Q) {
     413        break;
     414        case KeyEvent.VK_Q:
    389415            // less details
    390416            e.consume();
     
    398424            } catch (SecurityException ex) {  }
    399425            repaint();
    400         }
    401     }
    402 
     426        break;
     427        case KeyEvent.VK_SPACE:
     428            if (!drawing) {
     429                Point p = Main.map.mapView.getMousePosition();
     430                if (p!=null) startDrawing(p);
     431            }
     432        break;
     433        }
     434    }
     435   
     436    private void doKeyReleaseEvent(KeyEvent keyEvent) {
     437            if (keyEvent.getKeyCode()==KeyEvent.VK_SPACE) stopDrawing();
     438    }
    403439    /**
    404440     * Updates shift and ctrl key states
    405441     */
    406442    private void updateKeyModifiers(InputEvent e) {
    407         oldCtrl = ctrl;
    408         oldShift = shift;
    409443        ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
    410444        shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
     
    420454// <editor-fold defaultstate="collapsed" desc="Different action helper methods">
    421455    public void newDrawing() {
     456        delCmd=null; oldNodes=null;
    422457        eps=settings.startingEps;
    423458        line.clear();
     
    436471        for (LatLon p : pts) {
    437472            Node nd=null;
    438             if (line.isFixed(p)) {
     473            //if (line.isFixed(p)) {
    439474                // there may be a node with same ccoords!
    440475                nd = Main.map.mapView.getNearestNode(line.getPoint(p), OsmPrimitive.isUsablePredicate);
    441             }
     476            //}
    442477            if (nd==null) {
    443478                if (i>0 && p.equals(first)) nd=firstNode; else {
     
    466501            }
    467502        }
    468         cmds.add(new AddCommand(w));
     503        if (delCmd!=null) {
     504            List<Node> nodes = w.getNodes();
     505            for (Node nd: oldNodes) {
     506                // node from old way but not in new way
     507                if (!nodes.contains(nd)) {
     508                    List<OsmPrimitive> refs = nd.getReferrers();
     509                    // does someone need this node? if no-delete it.
     510                    if (refs.isEmpty()) cmds.add(new DeleteCommand(nd));                                       
     511                }
     512            }
     513            cmds.add(new AddCommand(w));
     514        } else cmds.add(new AddCommand(w));
    469515        Command c = new SequenceCommand(tr("Draw the way by mouse"), cmds);
    470516        Main.main.undoRedo.add(c);
     
    524570        if (ctrl) Main.map.mapView.setCursor(cursorCtrl); else
    525571        if (nearpoint) Main.map.mapView.setCursor(cursorCtrl); else
     572        if (drawing) Main.map.mapView.setCursor(cursorDrawing); else
    526573        Main.map.mapView.setCursor(cursorDraw);
    527574
     
    548595            +SIMPLIFYMODE_MESSAGE);
    549596    }
     597
     598    private void loadFromWay(Way w) {
     599        List<LatLon> pts=line.getPoints();
     600
     601        Collection<Command> cmds = new LinkedList<Command>();
     602       
     603        Node firstNode=null;
     604        Object[] nodes = w.getNodes().toArray();
     605        int n=nodes.length;
     606        if (w.isClosed()) n--;
     607        for (int i=0;i<n;i++) {
     608            Node nd=(Node) nodes[i];
     609            line.addLast(nd.getCoor());
     610        }
     611        if (w.isClosed()) line.closeLine();
     612        oldNodes = w.getNodes();
     613        cmds.add(new DeleteCommand(w));
     614        delCmd = new SequenceCommand(tr("Convert way to FastDraw line"), cmds);
     615        Main.main.undoRedo.add(delCmd);
     616    }
     617
    550618}
  • applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingPlugin.java

    r26081 r26440  
    55 * Licence: GPL v2 or later
    66 * Author:  Alexei Kasatkin, 2011
     7 * Ideas: Kotelnikov, Michael Barabanov (ticket #3840)
    78 */
    89
Note: See TracChangeset for help on using the changeset viewer.