Subversion Repositories display

Rev

Rev 409 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2014 Steve Ratcliffe
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 or
 * version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

package test.files;

import java.util.ArrayList;
import java.util.List;

import uk.me.parabola.imgfmt.app.Label;
import uk.me.parabola.imgfmt.app.lbl.City;
import uk.me.parabola.imgfmt.app.lbl.Zip;

import test.elements.Line;

/**
 * Data on a road from the NET file.
 *
 * @author Steve Ratcliffe
 */

public class RoadData {
        /** This is the offset of the road in NET */
        private int offset;
        private List<Label> labels = new ArrayList<>();
        private Zip zip;
        private City city;
        private int length;
        private final List<Segment> segments = new ArrayList<>();
        private int offsetNod2 = -1;
        private Nod2Record nod2;
        private List<NodeLocator> nodeLocations = new ArrayList<>();
        private boolean oneway;

        public void setOffset(int offset) {
                this.offset = offset;
        }

        public int getOffset() {
                return offset;
        }

        public void addLabel(Label label) {
                labels.add(label);
        }

        public void setZip(Zip zip) {
                this.zip = zip;
        }

        public Zip getZip() {
                return zip;
        }

        public void setCity(City city) {
                this.city = city;
        }

        public City getCity() {
                return city;
        }

        public Label getLabel(int n) {
                return labels.get(n);
        }

        public void setLength(int length) {
                this.length = length;
        }

        public int getLength() {
                return length;
        }

        public List<Segment> getSegments() {
                return segments;
        }

        public List<Line> getLines() {
                List<Line> lines = new ArrayList<>();
                for (Segment seg : segments)
                        lines.add(seg.getLine());
                return lines;
        }

        public void addSegment(Segment seg) {
                segments.add(seg);
        }

        public void setOffsetNod2(int offsetNod2) {
                this.offsetNod2 = offsetNod2;
        }

        public int getOffsetNod2() {
                return offsetNod2;
        }

        public void setNod2(Nod2Record nod2) {
                this.nod2 = nod2;
        }

        public Nod2Record getNod2() {
                return nod2;
        }

        public void addNodeLocation(NodeLocator nodeLocator) {
                nodeLocations.add(nodeLocator);
        }

        public NodeLocator locateNode(RouteNode node) {
                for (NodeLocator loc : nodeLocations) {
                        if (node.getOffset() == loc.getOffset())
                                return loc;
                }
                return null;
        }

    public List<NodeLocator> getNodeLocations() {
        return nodeLocations;
    }

    public CoordLocator nextCoord(CoordLocator loc, boolean sign) {
                int snum = loc.getSegmentNumber();
                Segment segment = segments.get(snum);

                int cnum = loc.getCoordNumber();
                if (sign) {
                        if (++cnum >= segment.getNumPoints()) {
                                if (++snum >= segments.size())
                                        return null;
                                segment = segments.get(snum);
                                cnum = 1;
                        }
                } else {

                        cnum--;
                        if (cnum < 0)
                                return null;
                }

                CoordLocator ret = new CoordLocator();
                ret.setSegmentNumber(snum);
                ret.setCoordNumber(cnum);
                ret.setCoord(segment.getLine().getCoords().get(cnum));

                return ret;
        }

        public void setOneway(boolean oneway) {
                this.oneway = oneway;
        }

        public boolean isOneway() {
                return oneway;
        }

        public int getRoadClass() {
                return nod2.getRoadClass();
        }
}