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

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/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -8,7 +8,11 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.geom.GeneralPath;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map.Entry;
@@ -16,6 +20,7 @@ import java.util.Map.Entry;
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
@@ -70,7 +75,8 @@ class Building {
     }
 
     public boolean isRectDrawing() {
-        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0;
+        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0
+                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
     }
 
     public Double getDrawingAngle() {
@@ -130,10 +136,12 @@ class Building {
             return;
         final EastNorth p1 = en[0];
         en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
-        en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
-                p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
-        en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
-                p1.north() - Math.sin(heading) * width * meter);
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
+                    p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
+            en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
+                    p1.north() - Math.sin(heading) * width * meter);
+        }
     }
 
     public void setLengthWidth(double length, double width) {
@@ -172,6 +180,17 @@ class Building {
         }
     }
 
+    public void setPlaceCircle(EastNorth p2, double width, boolean ignoreConstraints) {
+        if (en[0] == null)
+            throw new IllegalStateException("setPlace() called without the base point");
+        this.heading = en[0].heading(p2);
+        if (!ignoreConstraints)
+            this.heading = angleSnap.snapAngle(this.heading);
+        this.len = width;
+
+        updatePos();
+    }
+
     public void setPlaceRect(EastNorth p2) {
         if (en[0] == null)
             throw new IllegalStateException("SetPlaceRect() called without the base point");
@@ -198,13 +217,14 @@ class Building {
         GeneralPath b = new GeneralPath();
         Point pp1 = mv.getPoint(eastNorth2latlon(en[0]));
         Point pp2 = mv.getPoint(eastNorth2latlon(en[1]));
-        Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
-        Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
-
         b.moveTo(pp1.x, pp1.y);
         b.lineTo(pp2.x, pp2.y);
-        b.lineTo(pp3.x, pp3.y);
-        b.lineTo(pp4.x, pp4.y);
+        if(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())){
+            Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
+            Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
+            b.lineTo(pp3.x, pp3.y);
+            b.lineTo(pp4.x, pp4.y);
+        }
         b.lineTo(pp1.x, pp1.y);
         g.draw(b);
     }
@@ -233,8 +253,10 @@ class Building {
      */
     private Node getAddressNode() {
         BBox bbox = new BBox(eastNorth2latlon(en[0]), eastNorth2latlon(en[1]));
-        bbox.add(eastNorth2latlon(en[2]));
-        bbox.add(eastNorth2latlon(en[3]));
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            bbox.add(eastNorth2latlon(en[2]));
+            bbox.add(eastNorth2latlon(en[3]));
+        }
         List<Node> nodes = new LinkedList<>();
         nodesloop:
         for (Node n : MainApplication.getLayerManager().getEditDataSet().searchNodes(bbox)) {
@@ -265,7 +287,75 @@ class Building {
         return nodes.get(0);
     }
 
-    public Way create() {
+    public Way createCircle() {
+        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
+        Collection<OsmPrimitive> selectedPrimitives = ds.getAllSelected();
+        ds.clearSelection();
+
+        if (len == 0)
+            return null;
+        final boolean[] created = new boolean[2];
+        final Node[] nodes = new Node[2];
+        for (int i = 0; i < 2; i++) {
+
+            Node n = findNode(en[i]);
+            if (n == null) {
+                nodes[i] = new Node(eastNorth2latlon(en[i]));
+                created[i] = true;
+            } else {
+                nodes[i] = n;
+                created[i] = false;
+            }
+            if (nodes[i].getCoor().isOutSideWorld()) {
+                JOptionPane.showMessageDialog(Main.parent,
+                        tr("Cannot place building outside of the world."));
+                return null;
+            }
+        }
+        Way w = new Way();
+        w.addNode(nodes[0]);
+        w.addNode(nodes[1]);
+
+        Collection<Command> addNodesCmd = new LinkedList<>();
+
+        for (int i = 0; i < 2; i++) {
+            if (created[i]) {
+                AddCommand addNode = new AddCommand(ds, nodes[i]);
+                addNodesCmd.add(addNode);
+            }
+        }
+
+        if (addNodesCmd.size() > 0) {
+            Command addNodes = new SequenceCommand(tr("Add nodes for building"), addNodesCmd);
+            Main.main.undoRedo.add(addNodes);
+        }
+
+        // Nodes must be selected for create circle action
+        for (int i = 0; i < 2; i++) {
+            if (created[i]) {
+                ds.addSelected(nodes[i]);
+            }
+        }
+
+        CreateCircleAction action = new CreateCircleAction();
+        action.setEnabled(true);
+        action.actionPerformed(null);
+
+        ds.clearSelection();
+        ds.addSelected(selectedPrimitives);
+
+        // get the way with the smallest id with the assumption that it is
+        // newest way created by CreateCirclAction
+        List<Way> ways = new ArrayList(ds.getWays());
+        Collections.sort(ways);
+        w = ways.get(0);
+
+        addAddress(w);
+
+        return w;
+    }
+
+    public Way createRectangle() {
         if (len == 0)
             return null;
         final boolean[] created = new boolean[4];
@@ -306,9 +396,20 @@ class Building {
         }
         cmds.add(new AddCommand(ds, w));
 
+        addAddress(w);
+
+        Command c = new SequenceCommand(tr("Create building"), cmds);
+        Main.main.undoRedo.add(c);
+        return w;
+    }
+
+    private void addAddress(Way w) {
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
+
             Node addrNode = getAddressNode();
             if (addrNode != null) {
+                Collection<Command> addressCmds = new LinkedList<>();
+
                 for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
                     w.put(entry.getKey(), entry.getValue());
                 }
@@ -322,13 +423,12 @@ class Building {
                             rnew.addMember(i, new RelationMember(member.getRole(), w));
                         }
                     }
-                    cmds.add(new ChangeCommand(r, rnew));
+                    addressCmds.add(new ChangeCommand(r, rnew));
                 }
-                cmds.add(new DeleteCommand(addrNode));
+                addressCmds.add(new DeleteCommand(addrNode));
+                Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
+                Main.main.undoRedo.add(c);
             }
         }
-        Command c = new SequenceCommand(tr("Create building"), cmds);
-        Main.main.undoRedo.add(c);
-        return w;
     }
 }
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
--- /dev/null
+++ b/buildings_tools/src/buildings_tools/BuildingCircleAction.java
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package buildings_tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+@SuppressWarnings("serial")
+public class BuildingCircleAction extends JosmAction {
+
+    public BuildingCircleAction() {
+        super(tr("Set building shape to circle"), "mapmode/building", tr("Set buildings shape to circle"),
+                Shortcut.registerShortcut("buildings_tools:circle",
+                        tr("Data: {0}", tr("Set buildings shape to circle")),
+                        KeyEvent.VK_Z, Shortcut.ALT),
+                true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent arg0) {
+        ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
+    }
+}
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
--- /dev/null
+++ b/buildings_tools/src/buildings_tools/BuildingRectangleAction.java
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package buildings_tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+@SuppressWarnings("serial")
+public class BuildingRectangleAction extends JosmAction {
+
+    public BuildingRectangleAction() {
+        super(tr("Set building shape to rectangle"), "mapmode/building", tr("Set buildings shape to rectangle"),
+                Shortcut.registerShortcut("buildings_tools:rectangle",
+                        tr("Data: {0}", tr("Set buildings shape to rectangle")),
+                        KeyEvent.VK_R, Shortcut.ALT),
+                true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent arg0) {
+        ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
+    }
+}
diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 9d70038..b6ddb09 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -5,14 +5,18 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
 import java.text.NumberFormat;
 import java.text.ParseException;
 
+import javax.swing.ButtonGroup;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JFormattedTextField;
+import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Shortcut;
 
 @SuppressWarnings("serial")
 public class BuildingSizeDialog extends MyDialog {
@@ -21,11 +25,22 @@ public class BuildingSizeDialog extends MyDialog {
     private final JCheckBox caddr = new JCheckBox(tr("Use Address dialog"));
     private final JCheckBox cAutoSelect = new JCheckBox(tr("Auto-select building"));
     private final JCheckBox cAddrNode = new JCheckBox(tr("Use address nodes under buildings"));
+    private final JRadioButton circleRadio = new JRadioButton(tr("Circle"));
+    private final JRadioButton rectangleRadio = new JRadioButton(tr("Rectangle"));
 
     public BuildingSizeDialog() {
-        super(tr("Set buildings size"));
+        super(tr("Set buildings size and shape"));
 
-        addLabelled(tr("Buildings width:"), twidth);
+        ButtonGroup shapeGroup = new ButtonGroup();
+        shapeGroup.add(circleRadio);
+        shapeGroup.add(rectangleRadio);
+        circleRadio.setSelected(ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()));
+        rectangleRadio.setSelected(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape()));
+
+        panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
+        panel.add(circleRadio, GBC.eol().fill(GBC.HORIZONTAL));
+
+        addLabelled(tr("Buildings width/diameter:"), twidth);
         addLabelled(tr("Length step:"), tlenstep);
         panel.add(caddr, GBC.eol().fill(GBC.HORIZONTAL));
         panel.add(cAutoSelect, GBC.eol().fill(GBC.HORIZONTAL));
@@ -74,6 +89,11 @@ public class BuildingSizeDialog extends MyDialog {
     }
 
     public final void saveSettings() {
+        if (circleRadio.isSelected()) {
+            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
+        } else if (rectangleRadio.isSelected()) {
+            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
+        }
         ToolSettings.setSizes(width(), lenstep());
         ToolSettings.setAddrDialog(useAddr());
         ToolSettings.setAutoSelect(cAutoSelect.isSelected());
diff --git a/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java b/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
index d74056f..1b62ceb 100644
--- a/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
+++ b/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
@@ -29,7 +29,10 @@ public class BuildingsToolsPlugin extends Plugin {
         super(info);
         JMenu dataMenu = MainApplication.getMenu().dataMenu;
         MainMenu.add(dataMenu, new BuildingSizeAction());
+        MainMenu.add(dataMenu, new BuildingCircleAction());
+        MainMenu.add(dataMenu, new BuildingRectangleAction());
         MainMenu.add(dataMenu, new MergeAddrPointsAction());
+
     }
 
     @Override
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 31ba318..8099276 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -17,6 +17,7 @@ import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
 import java.awt.geom.GeneralPath;
 import java.awt.image.BufferedImage;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Map.Entry;
@@ -77,7 +78,11 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
     private static Cursor getCursor() {
         try {
-            return ImageProvider.getCursor("crosshair", "building");
+            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+                return ImageProvider.getCursor("crosshair", "silo");
+            }else{
+                return ImageProvider.getCursor("crosshair", "building");
+            }
         } catch (Exception e) {
             Logging.error(e);
         }
@@ -190,6 +195,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
             cancelDrawing();
         }
+
     }
 
     @Override
@@ -211,14 +217,24 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     }
 
     private boolean isRectDrawing() {
-        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode());
+        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode())
+                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
     }
 
     private Mode modeDrawing() {
         EastNorth p = getEastNorth();
         if (isRectDrawing()) {
-            building.setPlaceRect(p);
-            return shift ? Mode.DrawingAngFix : Mode.None;
+                building.setPlaceRect(p);
+                return shift ? Mode.DrawingAngFix : Mode.None;
+        } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            if (ToolSettings.getWidth() != 0) {
+                building.setPlaceCircle(p, ToolSettings.getWidth(), shift);
+            } else {
+                building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+            }
+            MainApplication.getMap().statusLine.setDist(building.getLength());
+            this.nextMode = Mode.None;
+            return this.nextMode;
         } else {
             building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
             MainApplication.getMap().statusLine.setDist(building.getLength());
@@ -247,7 +263,6 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
             nextMode = Mode.None;
             return;
         }
-
         if (mode == Mode.Drawing) {
             nextMode = modeDrawing();
         } else if (mode == Mode.DrawingWidth) {
@@ -277,12 +292,15 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     private void drawingStart(MouseEvent e) {
         mousePos = e.getPoint();
         drawStartPos = mousePos;
-
-        Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
-        if (n == null) {
+        if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
             building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
         } else {
-            building.setBase(n);
+            Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
+            if (n == null) {
+                building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
+            } else {
+                building.setBase(n);
+            }
         }
         mode = Mode.Drawing;
         updateStatusLine();
@@ -300,7 +318,12 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
     private void drawingFinish() {
         if (building.getLength() != 0) {
-            Way w = building.create();
+            Way w;
+            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+                w = building.createCircle();
+            } else {
+                w = building.createRectangle();
+            }
             if (w != null) {
                 if (!alt || ToolSettings.isUsingAddr())
                     for (Entry<String, String> kv : ToolSettings.getTags().entrySet()) {
@@ -371,7 +394,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
             if (customCursor != null && (!ctrl || isRectDrawing()))
                 setCursor(customCursor);
             else
-                setCursor(cursorCrosshair);
+                setCursor(getCursor());
         }
 
     }
@@ -421,7 +444,6 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
                     break;
                 }
             }
-
             building.addAngleSnap(nodes.toArray(new Node[0]));
             for (Way w : ways) {
                 building.addAngleSnap(w);
diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
index 2e14b4b..07c461a 100644
--- a/buildings_tools/src/buildings_tools/ToolSettings.java
+++ b/buildings_tools/src/buildings_tools/ToolSettings.java
@@ -21,12 +21,23 @@ public final class ToolSettings {
     }
 
     public static final BooleanProperty PROP_USE_ADDR_NODE = new BooleanProperty("buildings_tools.addrNode", false);
+
+    public enum Shape {
+            CIRCLE, RECTANGLE
+    }
+
+    private static Shape shape = loadShape();
     private static double width = 0;
     private static double lenstep = 0;
     private static boolean useAddr;
     private static final Map<String, String> TAGS = new HashMap<>();
     private static boolean autoSelect;
 
+    public static Shape getShape() {
+        loadShape();
+        return shape;
+    }
+
     public static void setAddrDialog(boolean _useAddr) {
         useAddr = _useAddr;
     }
@@ -77,6 +88,21 @@ public final class ToolSettings {
         }
     }
 
+    public static void saveShape(Shape shape) {
+        Main.pref.put("buildings_tool.shape", shape.name());
+    }
+
+    private static Shape loadShape() {
+        String shape = Main.pref.get("buildings_tool.shape");
+        if (ToolSettings.Shape.CIRCLE.name().equals(shape)) {
+            ToolSettings.shape = Shape.CIRCLE;
+            return Shape.CIRCLE;
+        } else {
+            ToolSettings.shape = Shape.RECTANGLE;
+            return (Shape.RECTANGLE);
+        }
+    }
+
     public static void setBBMode(boolean bbmode) {
         Main.pref.putBoolean("buildings_tools.bbmode", bbmode);
     }
-- 
2.7.4

