Changeset 21804 in osm for applications


Ignore:
Timestamp:
2010-06-19T21:01:59+02:00 (15 years ago)
Author:
upliner
Message:

weld all nodes in buildings_tools

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/buildings_tools/src/buildings_tools/Building.java

    r21801 r21804  
    1111import java.util.Collection;
    1212import java.util.LinkedList;
     13import java.util.List;
    1314
    1415import javax.swing.JOptionPane;
     
    1920import org.openstreetmap.josm.command.SequenceCommand;
    2021import org.openstreetmap.josm.data.coor.*;
     22import org.openstreetmap.josm.data.osm.BBox;
     23import org.openstreetmap.josm.data.osm.DataSet;
    2124import org.openstreetmap.josm.data.osm.Node;
     25import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2226import org.openstreetmap.josm.data.osm.Way;
    2327import org.openstreetmap.josm.gui.MapView;
     
    2529class Building {
    2630        private static final double eqlen = 40075004; // length of equator in metres
    27         private EastNorth en1;
    28         private EastNorth en2;
    29         private EastNorth en3;
    30         private EastNorth en4;
    31 
    32         private EastNorth p1;
    33         private Node node;
     31        private final EastNorth[] en = new EastNorth[4];
     32
    3433        double meter = 0;
    3534
     
    6362        public void reset() {
    6463                len = 0;
    65                 en1 = null;
    66                 en2 = null;
    67                 en3 = null;
    68                 en4 = null;
    69         }
    70 
    71         public EastNorth point1() {
    72                 return en1;
    73         }
    74 
    75         public EastNorth point2() {
    76                 return en2;
    77         }
    78 
    79         public EastNorth point3() {
    80                 return en3;
    81         }
    82 
    83         public EastNorth point4() {
    84                 return en4;
     64
     65                for (int i = 0; i < 4; i++)
     66                        en[i] = null;
     67        }
     68
     69        public EastNorth getPoint(int num) {
     70                return en[num];
    8571        }
    8672
    8773        private void updMetrics() {
    88                 meter = 2 * Math.PI / (Math.cos(Math.toRadians(eastNorth2latlon(p1).lat())) * eqlen);
     74                meter = 2 * Math.PI / (Math.cos(Math.toRadians(eastNorth2latlon(en[0]).lat())) * eqlen);
    8975                reset();
    9076        }
    9177
    9278        public void setBase(EastNorth base) {
    93                 node = null;
    94                 p1 = base;
     79                en[0] = base;
    9580                updMetrics();
    9681        }
    9782
    9883        public void setBase(Node base) {
    99                 node = base;
    100                 p1 = latlon2eastNorth(base.getCoor());
     84                en[0] = latlon2eastNorth(base.getCoor());
    10185                updMetrics();
    10286        }
     
    10690         */
    10791        private double projection1(EastNorth p) {
    108                 final EastNorth vec = p1.sub(p);
     92                final EastNorth vec = en[0].sub(p);
    10993                return (Math.sin(heading) * vec.east() + Math.cos(heading) * vec.north()) / meter;
    11094        }
     
    11599         */
    116100        private double projection2(EastNorth p) {
    117                 final EastNorth vec = p1.sub(p);
     101                final EastNorth vec = en[0].sub(p);
    118102                return (Math.cos(heading) * vec.east() - Math.sin(heading) * vec.north()) / meter;
    119103        }
     
    122106                if (len == 0)
    123107                        return;
    124                 en1 = p1;
    125                 en2 = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
    126                 en3 = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter, p1.north()
     108                final EastNorth p1 = en[0];
     109                en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
     110                en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter, p1
     111                                .north()
    127112                                + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
    128                 en4 = new EastNorth(p1.east() + Math.cos(heading) * width * meter, p1.north() - Math.sin(heading) * width
     113                en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter, p1.north() - Math.sin(heading) * width
    129114                                * meter);
    130115        }
     
    142127
    143128        public void setPlace(EastNorth p2, double width, double lenstep, boolean ignoreConstraints) {
    144                 this.heading = p1.heading(p2);
     129                if (en[0] == null)
     130                        en[0] = p2;
     131                this.heading = en[0].heading(p2);
    145132                double hdang = 0;
    146133                if (angConstrained && !ignoreConstraints) {
     
    174161
    175162        public void angFix(EastNorth point) {
    176                 EastNorth en3 = this.en3;
    177                 heading = p1.heading(point);
     163                EastNorth en3 = this.en[2];
     164                heading = en[0].heading(point);
    178165                setLengthWidth(projection1(en3), projection2(en3));
    179                 this.en3 = en3;
     166                this.en[2] = en3;
    180167        }
    181168
     
    184171                        return;
    185172                GeneralPath b = new GeneralPath();
    186                 Point pp1 = mv.getPoint(eastNorth2latlon(en1));
    187                 Point pp2 = mv.getPoint(eastNorth2latlon(en2));
    188                 Point pp3 = mv.getPoint(eastNorth2latlon(en4));
    189                 Point pp4 = mv.getPoint(eastNorth2latlon(en3));
     173                Point pp1 = mv.getPoint(eastNorth2latlon(en[0]));
     174                Point pp2 = mv.getPoint(eastNorth2latlon(en[1]));
     175                Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
     176                Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
    190177
    191178                b.moveTo(pp1.x, pp1.y);
     179                b.lineTo(pp2.x, pp2.y);
    192180                b.lineTo(pp3.x, pp3.y);
    193181                b.lineTo(pp4.x, pp4.y);
    194                 b.lineTo(pp2.x, pp2.y);
    195182                b.lineTo(pp1.x, pp1.y);
    196183                g.draw(b);
     184        }
     185
     186        private Node findNode(EastNorth en) {
     187                DataSet ds = Main.main.getCurrentDataSet();
     188                LatLon l = eastNorth2latlon(en);
     189                List<Node> nodes = ds.searchNodes(new BBox(l.lon() - 0.00001, l.lat() - 0.00001,
     190                                l.lon() + 0.00001, l.lat() + 0.00001));
     191                for (Node n : nodes) {
     192                        if (OsmPrimitive.isUsablePredicate.evaluate(n))
     193                                return n;
     194                }
     195                return null;
    197196        }
    198197
     
    200199                if (len == 0)
    201200                        return null;
    202                 Node n1;
    203                 if (node == null)
    204                         n1 = new Node(eastNorth2latlon(en1));
    205                 else
    206                         n1 = node;
    207                 Node n2 = new Node(eastNorth2latlon(en2));
    208                 Node n3 = new Node(eastNorth2latlon(en3));
    209                 Node n4 = new Node(eastNorth2latlon(en4));
    210                 if (n1.getCoor().isOutSideWorld() || n2.getCoor().isOutSideWorld() ||
    211                                 n3.getCoor().isOutSideWorld() || n4.getCoor().isOutSideWorld()) {
    212                         JOptionPane.showMessageDialog(Main.parent,
    213                                         tr("Cannot place building outside of the world."));
    214                         return null;
     201                final boolean[] created = new boolean[4];
     202                final Node[] nodes = new Node[4];
     203                for (int i = 0; i < 4; i++) {
     204                        Node n = findNode(en[i]);
     205                        if (n == null) {
     206                                nodes[i] = new Node(eastNorth2latlon(en[i]));
     207                                created[i] = true;
     208                        } else {
     209                                nodes[i] = n;
     210                                created[i] = false;
     211                        }
     212                        if (nodes[i].getCoor().isOutSideWorld()) {
     213                                JOptionPane.showMessageDialog(Main.parent,
     214                                                tr("Cannot place building outside of the world."));
     215                                return null;
     216                        }
    215217                }
    216218                Way w = new Way();
    217                 w.addNode(n1);
    218                 if (projection1(en3) > 0) {
    219                         w.addNode(n2);
    220                         w.addNode(n3);
    221                         w.addNode(n4);
     219                w.addNode(nodes[0]);
     220                if (projection1(latlon2eastNorth(nodes[2].getCoor())) > 0) {
     221                        w.addNode(nodes[1]);
     222                        w.addNode(nodes[2]);
     223                        w.addNode(nodes[3]);
    222224                } else {
    223                         w.addNode(n4);
    224                         w.addNode(n3);
    225                         w.addNode(n2);
    226                 }
    227                 w.addNode(n1);
     225                        w.addNode(nodes[3]);
     226                        w.addNode(nodes[2]);
     227                        w.addNode(nodes[1]);
     228                }
     229                w.addNode(nodes[0]);
    228230                w.put("building", ToolSettings.getTag());
    229231                Collection<Command> cmds = new LinkedList<Command>();
    230                 if (node == null)
    231                         cmds.add(new AddCommand(n1));
    232                 cmds.add(new AddCommand(n2));
    233                 cmds.add(new AddCommand(n3));
    234                 cmds.add(new AddCommand(n4));
     232                for (int i = 0; i < 4; i++) {
     233                        if (created[i])
     234                                cmds.add(new AddCommand(nodes[i]));
     235                }
    235236                cmds.add(new AddCommand(w));
    236237                Command c = new SequenceCommand(tr("Create building"), cmds);
Note: See TracChangeset for help on using the changeset viewer.