]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/catalogue.cpp
Add editable terrain objects
[r2c2.git] / source / libr2c2 / catalogue.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/core/refptr.h>
3 #include <msp/datafile/parser.h>
4 #include "catalogue.h"
5 #include "signaltype.h"
6 #include "terraintype.h"
7 #include "tracktype.h"
8 #include "vehicletype.h"
9
10 using namespace std;
11 using namespace Msp;
12
13 namespace R2C2 {
14
15 Catalogue::Catalogue():
16         scale(1),
17         gauge(1.524),
18         layout(*this)
19 { }
20
21 Catalogue::~Catalogue()
22 {
23         for(ObjectMap::iterator i=objects.begin(); i!=objects.end(); ++i)
24                 delete i->second;
25 }
26
27 float Catalogue::get_rail_elevation() const
28 {
29         return ballast_profile.get_height()+rail_profile.get_height();
30 }
31
32 void Catalogue::add(ObjectType &object)
33 {
34         insert_unique(objects, object.get_article_number(), &object);
35         signal_object_added.emit(object);
36 }
37
38 const ObjectType &Catalogue::get(const ArticleNumber &art_nr) const
39 {
40         return *get_item(objects, art_nr);
41 }
42
43
44 Catalogue::Loader::Loader(Catalogue &c):
45         DataFile::ObjectLoader<Catalogue>(c)
46 {
47         add("ballast_profile", &Loader::ballast_profile);
48         add("gauge", &Loader::gauge);
49         add("layout", &Loader::layout);
50         add("rail_profile", &Loader::rail_profile);
51         add("scale", &Loader::scale);
52         add("signal", &Loader::signal);
53         add("terrain", &Loader::terrain);
54         add("track", &Loader::track);
55         add("track_technique", &Catalogue::track_technique);
56         add("vehicle", &Loader::vehicle);
57 }
58
59 void Catalogue::Loader::ballast_profile()
60 {
61         load_sub(obj.ballast_profile);
62 }
63
64 void Catalogue::Loader::gauge(float g)
65 {
66         obj.gauge = g/1000;
67 }
68
69 void Catalogue::Loader::layout()
70 {
71         load_sub(obj.layout);
72 }
73
74 void Catalogue::Loader::rail_profile()
75 {
76         load_sub(obj.rail_profile);
77 }
78
79 void Catalogue::Loader::scale(float n, float d)
80 {
81         obj.scale = n/d;
82 }
83
84 void Catalogue::Loader::signal(ArticleNumber art_nr)
85 {
86         if(obj.objects.count(art_nr))
87                 throw key_error(art_nr);
88
89         RefPtr<SignalType> sig = new SignalType(art_nr);
90         load_sub(*sig);
91         obj.add(*sig.release());
92 }
93
94 void Catalogue::Loader::terrain(ArticleNumber art_nr)
95 {
96         if(obj.objects.count(art_nr))
97                 throw key_error(art_nr);
98
99         RefPtr<TerrainType> ter = new TerrainType(art_nr);
100         load_sub(*ter);
101         obj.add(*ter.release());
102 }
103
104 void Catalogue::Loader::track(ArticleNumber art_nr)
105 {
106         if(obj.objects.count(art_nr))
107                 throw key_error(art_nr);
108
109         RefPtr<TrackType> trk = new TrackType(art_nr);
110         load_sub(*trk);
111         obj.add(*trk.release());
112 }
113
114 void Catalogue::Loader::vehicle(ArticleNumber art_nr)
115 {
116         if(obj.objects.count(art_nr))
117                 throw key_error(art_nr);
118
119         RefPtr<VehicleType> veh = new VehicleType(art_nr);
120         load_sub(*veh);
121         obj.add(*veh.release());
122 }
123
124 } // namespace R2C2