Ticket #15802: circular_building_tool_4.patch

File circular_building_tool_4.patch, 22.8 KB (added by abalosc1, 8 years ago)

squash commits for patch

  • new file 2001

    From 8ebbfdf7a5abe0d152d45bb10c439a1293944e58 Mon Sep 17 00:00:00 2001
    From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
    Date: Mon, 22 Jan 2018 17:03:48 -0500
    Subject: [PATCH] 90 squash commits
    
    ---
     buildings_tools/images/cursor/modifier/silo.png    | Bin 0 -> 594 bytes
     buildings_tools/src/buildings_tools/Building.java  | 136 ++++++++++++++++++---
     .../src/buildings_tools/BuildingCircleAction.java  |  27 ++++
     .../buildings_tools/BuildingRectangleAction.java   |  27 ++++
     .../src/buildings_tools/BuildingSizeDialog.java    |  24 +++-
     .../src/buildings_tools/BuildingsToolsPlugin.java  |   3 +
     .../src/buildings_tools/DrawBuildingAction.java    |  46 +++++--
     .../src/buildings_tools/ToolSettings.java          |  26 ++++
     8 files changed, 257 insertions(+), 32 deletions(-)
     create mode 100644 buildings_tools/images/cursor/modifier/silo.png
     create mode 100644 buildings_tools/src/buildings_tools/BuildingCircleAction.java
     create mode 100644 buildings_tools/src/buildings_tools/BuildingRectangleAction.java
    
    diff --git a/buildings_tools/images/cursor/modifier/silo.png b/buildings_tools/images/cursor/modifier/silo.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..7ac6200e68f75e41e2adf07053e33f500283c158
    GIT binary patch
    literal 594
    zcmV-Y0<HatP)<h;3K|Lk000e1NJLTq000pH000pP1^@s7Olo&*00004XF*Lt006O%
    z3;baP00006VoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru
    z;sFd1BmsNno>l+=0nbT9K~y-)tyH^?+CUUNGwg0`*=tNl<d_x=6j%xcMe+w!NKm^;
    zL%|pD4@CI{A|W~`B5H)_s1iXMDufWiLfX{?K~Uty+%&tZtXW5!$LZ$YbIyItXn-I(
    zoz4|P!7R(NIp=|}VHl<mf(*lW1ppiXG);Ta@At2DU4I$wIG@iqLI?tYGXQWL=Q5kk
    z9`1cO=L}CmsZ{cZ!{K$MQaSz_zi-#FEL#Y{*XuP!qftMT$=D|(0PuYuoO47X5j^Uo
    zs_I^rWk`}ljYh*$6lIUU!Q0VjB#7t$;LS<4-EPxnvmqe_wOTDY=_8#^V>}*vx~}8m
    z;=(&25D}Wq<_-WDW9-p!N2AeYu=E2$wOZYW5@cD1ZQIWPAdyI%<9{Fy;6pN*`~=`V
    zfaiZAmh1KU7sqj~dcEFmu~>L?i(0Mr8GsxVoCO1>X{IDedR-_KZiEn#!C*kDs$#WT
    z9pdqL-ZagW>$+b<H+K6-P%IYF?RL+n(<u~1`BpBMF_}z|%jIq~O~Y^3{vg3Q^7;Ia
    zr_3K}LPXeZxAe~@%jMF)JA0mY4E->IH^UhFm`bG#*LBG-4Dvkh7>mUsj4`&`?J%3o
    g)<pCU!1p`RPr2N%D=;mnzW@LL07*qoM6N<$g2~(a9{>OV
  • buildings_tools/src/buildings_tools/Building.java

    literal 0
    HcmV?d00001
    
    diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
    index 939db54..eff21d1 100644
    a b import static org.openstreetmap.josm.tools.I18n.tr;  
    88import java.awt.Graphics2D;
    99import java.awt.Point;
    1010import java.awt.geom.GeneralPath;
     11import java.util.ArrayList;
     12import java.util.Arrays;
    1113import java.util.Collection;
     14import java.util.Collections;
     15import java.util.Comparator;
    1216import java.util.LinkedList;
    1317import java.util.List;
    1418import java.util.Map.Entry;
    import java.util.Map.Entry;  
    1620import javax.swing.JOptionPane;
    1721
    1822import org.openstreetmap.josm.Main;
     23import org.openstreetmap.josm.actions.CreateCircleAction;
    1924import org.openstreetmap.josm.command.AddCommand;
    2025import org.openstreetmap.josm.command.ChangeCommand;
    2126import org.openstreetmap.josm.command.Command;
    class Building {  
    7075    }
    7176
    7277    public boolean isRectDrawing() {
    73         return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0;
     78        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0
     79                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
    7480    }
    7581
    7682    public Double getDrawingAngle() {
    class Building {  
    130136            return;
    131137        final EastNorth p1 = en[0];
    132138        en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
    133         en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
    134                 p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
    135         en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
    136                 p1.north() - Math.sin(heading) * width * meter);
     139        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
     140            en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
     141                    p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
     142            en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
     143                    p1.north() - Math.sin(heading) * width * meter);
     144        }
    137145    }
    138146
    139147    public void setLengthWidth(double length, double width) {
    class Building {  
    172180        }
    173181    }
    174182
     183    public void setPlaceCircle(EastNorth p2, double width, boolean ignoreConstraints) {
     184        if (en[0] == null)
     185            throw new IllegalStateException("setPlace() called without the base point");
     186        this.heading = en[0].heading(p2);
     187        if (!ignoreConstraints)
     188            this.heading = angleSnap.snapAngle(this.heading);
     189        this.len = width;
     190
     191        updatePos();
     192    }
     193
    175194    public void setPlaceRect(EastNorth p2) {
    176195        if (en[0] == null)
    177196            throw new IllegalStateException("SetPlaceRect() called without the base point");
    class Building {  
    198217        GeneralPath b = new GeneralPath();
    199218        Point pp1 = mv.getPoint(eastNorth2latlon(en[0]));
    200219        Point pp2 = mv.getPoint(eastNorth2latlon(en[1]));
    201         Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
    202         Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
    203 
    204220        b.moveTo(pp1.x, pp1.y);
    205221        b.lineTo(pp2.x, pp2.y);
    206         b.lineTo(pp3.x, pp3.y);
    207         b.lineTo(pp4.x, pp4.y);
     222        if(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())){
     223            Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
     224            Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
     225            b.lineTo(pp3.x, pp3.y);
     226            b.lineTo(pp4.x, pp4.y);
     227        }
    208228        b.lineTo(pp1.x, pp1.y);
    209229        g.draw(b);
    210230    }
    class Building {  
    233253     */
    234254    private Node getAddressNode() {
    235255        BBox bbox = new BBox(eastNorth2latlon(en[0]), eastNorth2latlon(en[1]));
    236         bbox.add(eastNorth2latlon(en[2]));
    237         bbox.add(eastNorth2latlon(en[3]));
     256        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
     257            bbox.add(eastNorth2latlon(en[2]));
     258            bbox.add(eastNorth2latlon(en[3]));
     259        }
    238260        List<Node> nodes = new LinkedList<>();
    239261        nodesloop:
    240262        for (Node n : MainApplication.getLayerManager().getEditDataSet().searchNodes(bbox)) {
    class Building {  
    265287        return nodes.get(0);
    266288    }
    267289
    268     public Way create() {
     290    public Way createCircle() {
     291        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
     292        Collection<OsmPrimitive> selectedPrimitives = ds.getAllSelected();
     293        ds.clearSelection();
     294
     295        if (len == 0)
     296            return null;
     297        final boolean[] created = new boolean[2];
     298        final Node[] nodes = new Node[2];
     299        for (int i = 0; i < 2; i++) {
     300
     301            Node n = findNode(en[i]);
     302            if (n == null) {
     303                nodes[i] = new Node(eastNorth2latlon(en[i]));
     304                created[i] = true;
     305            } else {
     306                nodes[i] = n;
     307                created[i] = false;
     308            }
     309            if (nodes[i].getCoor().isOutSideWorld()) {
     310                JOptionPane.showMessageDialog(Main.parent,
     311                        tr("Cannot place building outside of the world."));
     312                return null;
     313            }
     314        }
     315        Way w = new Way();
     316        w.addNode(nodes[0]);
     317        w.addNode(nodes[1]);
     318
     319        Collection<Command> addNodesCmd = new LinkedList<>();
     320
     321        for (int i = 0; i < 2; i++) {
     322            if (created[i]) {
     323                AddCommand addNode = new AddCommand(ds, nodes[i]);
     324                addNodesCmd.add(addNode);
     325            }
     326        }
     327
     328        if (addNodesCmd.size() > 0) {
     329            Command addNodes = new SequenceCommand(tr("Add nodes for building"), addNodesCmd);
     330            Main.main.undoRedo.add(addNodes);
     331        }
     332
     333        // Nodes must be selected for create circle action
     334        for (int i = 0; i < 2; i++) {
     335            if (created[i]) {
     336                ds.addSelected(nodes[i]);
     337            }
     338        }
     339
     340        CreateCircleAction action = new CreateCircleAction();
     341        action.setEnabled(true);
     342        action.actionPerformed(null);
     343
     344        ds.clearSelection();
     345        ds.addSelected(selectedPrimitives);
     346
     347        // get the way with the smallest id with the assumption that it is
     348        // newest way created by CreateCirclAction
     349        List<Way> ways = new ArrayList(ds.getWays());
     350        Collections.sort(ways);
     351        w = ways.get(0);
     352
     353        addAddress(w);
     354
     355        return w;
     356    }
     357
     358    public Way createRectangle() {
    269359        if (len == 0)
    270360            return null;
    271361        final boolean[] created = new boolean[4];
    class Building {  
    306396        }
    307397        cmds.add(new AddCommand(ds, w));
    308398
     399        addAddress(w);
     400
     401        Command c = new SequenceCommand(tr("Create building"), cmds);
     402        Main.main.undoRedo.add(c);
     403        return w;
     404    }
     405
     406    private void addAddress(Way w) {
    309407        if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
     408
    310409            Node addrNode = getAddressNode();
    311410            if (addrNode != null) {
     411                Collection<Command> addressCmds = new LinkedList<>();
     412
    312413                for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
    313414                    w.put(entry.getKey(), entry.getValue());
    314415                }
    class Building {  
    322423                            rnew.addMember(i, new RelationMember(member.getRole(), w));
    323424                        }
    324425                    }
    325                     cmds.add(new ChangeCommand(r, rnew));
     426                    addressCmds.add(new ChangeCommand(r, rnew));
    326427                }
    327                 cmds.add(new DeleteCommand(addrNode));
     428                addressCmds.add(new DeleteCommand(addrNode));
     429                Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
     430                Main.main.undoRedo.add(c);
    328431            }
    329432        }
    330         Command c = new SequenceCommand(tr("Create building"), cmds);
    331         Main.main.undoRedo.add(c);
    332         return w;
    333433    }
    334434}
  • new file uildings_tools/src/buildings_tools/BuildingCircleAction.java

    diff --git a/buildings_tools/src/buildings_tools/BuildingCircleAction.java b/buildings_tools/src/buildings_tools/BuildingCircleAction.java
    new file mode 100644
    index 0000000..2216890
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package buildings_tools;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.event.ActionEvent;
     7import java.awt.event.KeyEvent;
     8
     9import org.openstreetmap.josm.actions.JosmAction;
     10import org.openstreetmap.josm.tools.Shortcut;
     11
     12@SuppressWarnings("serial")
     13public class BuildingCircleAction extends JosmAction {
     14
     15    public BuildingCircleAction() {
     16        super(tr("Set building shape to circle"), "mapmode/building", tr("Set buildings shape to circle"),
     17                Shortcut.registerShortcut("buildings_tools:circle",
     18                        tr("Data: {0}", tr("Set buildings shape to circle")),
     19                        KeyEvent.VK_Z, Shortcut.ALT),
     20                true);
     21    }
     22
     23    @Override
     24    public void actionPerformed(ActionEvent arg0) {
     25        ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
     26    }
     27}
  • new file uildings_tools/src/buildings_tools/BuildingRectangleAction.java

    diff --git a/buildings_tools/src/buildings_tools/BuildingRectangleAction.java b/buildings_tools/src/buildings_tools/BuildingRectangleAction.java
    new file mode 100644
    index 0000000..aa23f4a
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package buildings_tools;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.event.ActionEvent;
     7import java.awt.event.KeyEvent;
     8
     9import org.openstreetmap.josm.actions.JosmAction;
     10import org.openstreetmap.josm.tools.Shortcut;
     11
     12@SuppressWarnings("serial")
     13public class BuildingRectangleAction extends JosmAction {
     14
     15    public BuildingRectangleAction() {
     16        super(tr("Set building shape to rectangle"), "mapmode/building", tr("Set buildings shape to rectangle"),
     17                Shortcut.registerShortcut("buildings_tools:rectangle",
     18                        tr("Data: {0}", tr("Set buildings shape to rectangle")),
     19                        KeyEvent.VK_R, Shortcut.ALT),
     20                true);
     21    }
     22
     23    @Override
     24    public void actionPerformed(ActionEvent arg0) {
     25        ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
     26    }
     27}
  • buildings_tools/src/buildings_tools/BuildingSizeDialog.java

    diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
    index 9d70038..b6ddb09 100644
    a b import static org.openstreetmap.josm.tools.I18n.tr;  
    55
    66import java.awt.event.ActionEvent;
    77import java.awt.event.ActionListener;
     8import java.awt.event.KeyEvent;
    89import java.text.NumberFormat;
    910import java.text.ParseException;
    1011
     12import javax.swing.ButtonGroup;
    1113import javax.swing.JButton;
    1214import javax.swing.JCheckBox;
    1315import javax.swing.JFormattedTextField;
     16import javax.swing.JRadioButton;
    1417
    1518import org.openstreetmap.josm.tools.GBC;
     19import org.openstreetmap.josm.tools.Shortcut;
    1620
    1721@SuppressWarnings("serial")
    1822public class BuildingSizeDialog extends MyDialog {
    public class BuildingSizeDialog extends MyDialog {  
    2125    private final JCheckBox caddr = new JCheckBox(tr("Use Address dialog"));
    2226    private final JCheckBox cAutoSelect = new JCheckBox(tr("Auto-select building"));
    2327    private final JCheckBox cAddrNode = new JCheckBox(tr("Use address nodes under buildings"));
     28    private final JRadioButton circleRadio = new JRadioButton(tr("Circle"));
     29    private final JRadioButton rectangleRadio = new JRadioButton(tr("Rectangle"));
    2430
    2531    public BuildingSizeDialog() {
    26         super(tr("Set buildings size"));
     32        super(tr("Set buildings size and shape"));
    2733
    28         addLabelled(tr("Buildings width:"), twidth);
     34        ButtonGroup shapeGroup = new ButtonGroup();
     35        shapeGroup.add(circleRadio);
     36        shapeGroup.add(rectangleRadio);
     37        circleRadio.setSelected(ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()));
     38        rectangleRadio.setSelected(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape()));
     39
     40        panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
     41        panel.add(circleRadio, GBC.eol().fill(GBC.HORIZONTAL));
     42
     43        addLabelled(tr("Buildings width/diameter:"), twidth);
    2944        addLabelled(tr("Length step:"), tlenstep);
    3045        panel.add(caddr, GBC.eol().fill(GBC.HORIZONTAL));
    3146        panel.add(cAutoSelect, GBC.eol().fill(GBC.HORIZONTAL));
    public class BuildingSizeDialog extends MyDialog {  
    7489    }
    7590
    7691    public final void saveSettings() {
     92        if (circleRadio.isSelected()) {
     93            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
     94        } else if (rectangleRadio.isSelected()) {
     95            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
     96        }
    7797        ToolSettings.setSizes(width(), lenstep());
    7898        ToolSettings.setAddrDialog(useAddr());
    7999        ToolSettings.setAutoSelect(cAutoSelect.isSelected());
  • buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java

    diff --git a/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java b/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
    index d74056f..1b62ceb 100644
    a b public class BuildingsToolsPlugin extends Plugin {  
    2929        super(info);
    3030        JMenu dataMenu = MainApplication.getMenu().dataMenu;
    3131        MainMenu.add(dataMenu, new BuildingSizeAction());
     32        MainMenu.add(dataMenu, new BuildingCircleAction());
     33        MainMenu.add(dataMenu, new BuildingRectangleAction());
    3234        MainMenu.add(dataMenu, new MergeAddrPointsAction());
     35
    3336    }
    3437
    3538    @Override
  • buildings_tools/src/buildings_tools/DrawBuildingAction.java

    diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
    index 31ba318..8099276 100644
    a b import java.awt.event.KeyEvent;  
    1717import java.awt.event.MouseEvent;
    1818import java.awt.geom.GeneralPath;
    1919import java.awt.image.BufferedImage;
     20import java.util.Arrays;
    2021import java.util.Collection;
    2122import java.util.LinkedList;
    2223import java.util.Map.Entry;
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    7778
    7879    private static Cursor getCursor() {
    7980        try {
    80             return ImageProvider.getCursor("crosshair", "building");
     81            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
     82                return ImageProvider.getCursor("crosshair", "silo");
     83            }else{
     84                return ImageProvider.getCursor("crosshair", "building");
     85            }
    8186        } catch (Exception e) {
    8287            Logging.error(e);
    8388        }
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    190195
    191196            cancelDrawing();
    192197        }
     198
    193199    }
    194200
    195201    @Override
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    211217    }
    212218
    213219    private boolean isRectDrawing() {
    214         return building.isRectDrawing() && (!shift || ToolSettings.isBBMode());
     220        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode())
     221                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
    215222    }
    216223
    217224    private Mode modeDrawing() {
    218225        EastNorth p = getEastNorth();
    219226        if (isRectDrawing()) {
    220             building.setPlaceRect(p);
    221             return shift ? Mode.DrawingAngFix : Mode.None;
     227                building.setPlaceRect(p);
     228                return shift ? Mode.DrawingAngFix : Mode.None;
     229        } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
     230            if (ToolSettings.getWidth() != 0) {
     231                building.setPlaceCircle(p, ToolSettings.getWidth(), shift);
     232            } else {
     233                building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
     234            }
     235            MainApplication.getMap().statusLine.setDist(building.getLength());
     236            this.nextMode = Mode.None;
     237            return this.nextMode;
    222238        } else {
    223239            building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
    224240            MainApplication.getMap().statusLine.setDist(building.getLength());
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    247263            nextMode = Mode.None;
    248264            return;
    249265        }
    250 
    251266        if (mode == Mode.Drawing) {
    252267            nextMode = modeDrawing();
    253268        } else if (mode == Mode.DrawingWidth) {
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    277292    private void drawingStart(MouseEvent e) {
    278293        mousePos = e.getPoint();
    279294        drawStartPos = mousePos;
    280 
    281         Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
    282         if (n == null) {
     295        if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
    283296            building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
    284297        } else {
    285             building.setBase(n);
     298            Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
     299            if (n == null) {
     300                building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
     301            } else {
     302                building.setBase(n);
     303            }
    286304        }
    287305        mode = Mode.Drawing;
    288306        updateStatusLine();
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    300318
    301319    private void drawingFinish() {
    302320        if (building.getLength() != 0) {
    303             Way w = building.create();
     321            Way w;
     322            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
     323                w = building.createCircle();
     324            } else {
     325                w = building.createRectangle();
     326            }
    304327            if (w != null) {
    305328                if (!alt || ToolSettings.isUsingAddr())
    306329                    for (Entry<String, String> kv : ToolSettings.getTags().entrySet()) {
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    371394            if (customCursor != null && (!ctrl || isRectDrawing()))
    372395                setCursor(customCursor);
    373396            else
    374                 setCursor(cursorCrosshair);
     397                setCursor(getCursor());
    375398        }
    376399
    377400    }
    public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel  
    421444                    break;
    422445                }
    423446            }
    424 
    425447            building.addAngleSnap(nodes.toArray(new Node[0]));
    426448            for (Way w : ways) {
    427449                building.addAngleSnap(w);
  • buildings_tools/src/buildings_tools/ToolSettings.java

    diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
    index 2e14b4b..07c461a 100644
    a b public final class ToolSettings {  
    2121    }
    2222
    2323    public static final BooleanProperty PROP_USE_ADDR_NODE = new BooleanProperty("buildings_tools.addrNode", false);
     24
     25    public enum Shape {
     26            CIRCLE, RECTANGLE
     27    }
     28
     29    private static Shape shape = loadShape();
    2430    private static double width = 0;
    2531    private static double lenstep = 0;
    2632    private static boolean useAddr;
    2733    private static final Map<String, String> TAGS = new HashMap<>();
    2834    private static boolean autoSelect;
    2935
     36    public static Shape getShape() {
     37        loadShape();
     38        return shape;
     39    }
     40
    3041    public static void setAddrDialog(boolean _useAddr) {
    3142        useAddr = _useAddr;
    3243    }
    public final class ToolSettings {  
    7788        }
    7889    }
    7990
     91    public static void saveShape(Shape shape) {
     92        Main.pref.put("buildings_tool.shape", shape.name());
     93    }
     94
     95    private static Shape loadShape() {
     96        String shape = Main.pref.get("buildings_tool.shape");
     97        if (ToolSettings.Shape.CIRCLE.name().equals(shape)) {
     98            ToolSettings.shape = Shape.CIRCLE;
     99            return Shape.CIRCLE;
     100        } else {
     101            ToolSettings.shape = Shape.RECTANGLE;
     102            return (Shape.RECTANGLE);
     103        }
     104    }
     105
    80106    public static void setBBMode(boolean bbmode) {
    81107        Main.pref.putBoolean("buildings_tools.bbmode", bbmode);
    82108    }