1 #include <msp/core/refptr.h>
2 #include <msp/datafile/parser.h>
5 #include "vehicletype.h"
12 Catalogue::Catalogue():
18 Catalogue::~Catalogue()
20 for(TrackMap::iterator i=tracks.begin(); i!=tracks.end(); ++i)
22 for(VehicleMap::iterator i=vehicles.begin(); i!=vehicles.end(); ++i)
26 float Catalogue::get_rail_elevation() const
28 return ballast_profile.get_height()+rail_profile.get_height();
31 void Catalogue::add_track(TrackType &track)
33 if(tracks.count(track.get_article_number()))
34 throw Exception("Duplicate track type");
36 tracks[track.get_article_number()] = &track;
37 signal_track_added.emit(track);
40 const TrackType &Catalogue::get_track(const ArticleNumber &art_nr) const
42 TrackMap::const_iterator i=tracks.find(art_nr);
44 throw KeyError("Unknown track type");
49 void Catalogue::add_vehicle(VehicleType &veh)
51 if(vehicles.count(veh.get_article_number()))
52 throw Exception("Duplicate vehicle type");
54 vehicles[veh.get_article_number()] = &veh;
55 signal_vehicle_added.emit(veh);
58 const VehicleType &Catalogue::get_vehicle(const ArticleNumber &art_nr) const
60 VehicleMap::const_iterator i = vehicles.find(art_nr);
62 throw KeyError("Unknown vehicle type");
68 Catalogue::Loader::Loader(Catalogue &c):
69 DataFile::BasicLoader<Catalogue>(c)
71 add("ballast_profile", &Loader::ballast_profile);
72 add("gauge", &Loader::gauge);
73 add("layout", &Loader::layout);
74 add("rail_profile", &Loader::rail_profile);
75 add("scale", &Loader::scale);
76 add("track", static_cast<void (Loader::*)(unsigned)>(&Loader::track));
77 add("track", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::track));
78 add("track_technique", &Catalogue::track_technique);
79 add("vehicle", static_cast<void (Loader::*)(unsigned)>(&Loader::vehicle));
80 add("vehicle", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::vehicle));
83 void Catalogue::Loader::ballast_profile()
85 load_sub(obj.ballast_profile);
88 void Catalogue::Loader::gauge(float g)
91 obj.path_profile = Profile();
92 obj.path_profile.append_vertex(Vector(0.1*obj.gauge, 0), false);
93 obj.path_profile.append_vertex(Vector(-0.1*obj.gauge, 0), false);
96 void Catalogue::Loader::layout()
101 void Catalogue::Loader::rail_profile()
103 load_sub(obj.rail_profile);
106 void Catalogue::Loader::scale(float n, float d)
111 void Catalogue::Loader::track(unsigned art_nr)
113 track(ArticleNumber(art_nr));
116 void Catalogue::Loader::track(ArticleNumber art_nr)
118 if(obj.tracks.count(art_nr))
119 throw KeyError("Duplicate track type", art_nr.str());
121 RefPtr<TrackType> trk = new TrackType(art_nr);
123 obj.add_track(*trk.release());
126 void Catalogue::Loader::vehicle(unsigned art_nr)
128 vehicle(ArticleNumber(art_nr));
131 void Catalogue::Loader::vehicle(ArticleNumber art_nr)
133 if(obj.vehicles.count(art_nr))
134 throw KeyError("Duplicate vehicle type", art_nr.str());
136 RefPtr<VehicleType> veh = new VehicleType(art_nr);
138 obj.add_vehicle(*veh.release());