]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/track.h
Add a flag to Track to indicate that its path is changing
[r2c2.git] / source / libr2c2 / track.h
1 #ifndef LIBR2C2_TRACK_H_
2 #define LIBR2C2_TRACK_H_
3
4 #include <list>
5 #include <set>
6 #include <sigc++/trackable.h>
7 #include <msp/datafile/objectloader.h>
8 #include "geometry.h"
9
10 namespace R2C2 {
11
12 class Block;
13 class Layout;
14 class TrackType;
15
16 class Track: public sigc::trackable
17 {
18 public:
19         class Loader: public Msp::DataFile::ObjectLoader<Track>
20         {
21         public:
22                 Loader(Track &);
23         private:
24                 void position(float, float, float);
25                 void sensor_id(unsigned);
26                 void turnout_id(unsigned);
27         };
28
29         sigc::signal<void, unsigned, Track *> signal_link_changed;
30         sigc::signal<void, unsigned> signal_path_changed;
31
32 private:
33         Layout &layout;
34         const TrackType &type;
35         Block *block;
36         Vector pos;
37         float rot;
38         float slope;
39         bool flex;
40         unsigned turnout_id;
41         unsigned sensor_id;
42         std::vector<Track *> links;
43         unsigned active_path;
44         bool path_changing;
45
46         Track(const Track &);
47         Track &operator=(const Track &);
48 public:
49         Track(Layout &, const TrackType &);
50         ~Track();
51
52         Layout &get_layout() const { return layout; }
53         const TrackType &get_type() const { return type; }
54
55         void set_block(Block *);
56         Block &get_block() const;
57         void set_position(const Vector &);
58         void set_rotation(float);
59         void set_slope(float);
60         void set_flex(bool);
61         const Vector &get_position() const { return pos; }
62         float get_rotation() const { return rot; }
63         float get_slope() const { return slope; }
64         bool get_flex() const { return flex; }
65         void check_slope();
66
67         void set_turnout_id(unsigned);
68         void set_sensor_id(unsigned);
69         unsigned get_turnout_id() const { return turnout_id; }
70         unsigned get_sensor_id() const { return sensor_id; }
71         void set_active_path(unsigned);
72         unsigned get_active_path() const { return active_path; }
73         bool is_path_changing() const { return path_changing; }
74
75         int get_endpoint_by_link(Track &) const;
76         Vector get_endpoint_position(unsigned) const;
77         float get_endpoint_direction(unsigned) const;
78         bool snap_to(Track &, bool, float = 0);
79         bool snap(Vector &, float &) const;
80         void break_link(Track &);
81         void break_links();
82         const std::vector<Track *> &get_links() const { return links; }
83         Track *get_link(unsigned) const;
84         TrackPoint get_point(unsigned, unsigned, float) const;
85         TrackPoint get_point(unsigned, float) const;
86         TrackPoint get_nearest_point(const Vector &) const;
87
88         bool collide_ray(const Vector &, const Vector &);
89
90         void save(std::list<Msp::DataFile::Statement> &) const;
91 private:
92         void turnout_event(unsigned, unsigned);
93 };
94
95 } // namespace R2C2
96
97 #endif