1 #include <msp/core/maputils.h>
2 #include <msp/strings/format.h>
3 #include "vehicletype.h"
10 VehicleType::VehicleType(const ArticleNumber &an):
13 swap_direction(false),
19 unsigned VehicleType::get_max_function() const
23 return (--functions.end())->first;
26 const VehicleType::Axle &VehicleType::get_fixed_axle(unsigned i) const
29 throw out_of_range("VehicleType::get_fixed_axle");
33 const VehicleType::Bogie &VehicleType::get_bogie(unsigned i) const
36 throw out_of_range("VehicleType::get_bogie");
40 const VehicleType::Axle &VehicleType::get_bogie_axle(unsigned i, unsigned j) const
43 throw out_of_range("VehicleType::get_bogie_axle");
44 if(j>=bogies[i].axles.size())
45 throw out_of_range("VehicleType::get_bogie_axle");
46 return bogies[i].axles[j];
49 const VehicleType::Rod &VehicleType::get_rod(unsigned i) const
52 throw out_of_range("VehicleType::get_rod");
56 float VehicleType::get_front_axle_offset() const
58 float front = length/2;
60 front = axles.front().position;
63 const Bogie &bogie = bogies.front();
64 front = max(front, bogie.position+bogie.axles.front().position);
69 float VehicleType::get_back_axle_offset() const
71 float back = -length/2;
73 back = axles.back().position;
76 const Bogie &bogie = bogies.back();
77 back = min(back, bogie.position+bogie.axles.back().position);
83 VehicleType::Axle::Axle():
90 VehicleType::Bogie::Bogie():
96 VehicleType::Rod::Rod():
106 VehicleType::Loader::Loader(VehicleType &vt):
107 DataFile::ObjectLoader<VehicleType>(vt)
109 add("axle", &Loader::axle);
110 add("bogie", &Loader::bogie);
111 add("function", &Loader::function);
112 add("height", &Loader::height);
113 add("length", &Loader::length);
114 add("locomotive", &VehicleType::locomotive);
115 add("name", &VehicleType::name);
116 add("object", &VehicleType::object);
117 add("rod", &Loader::rod);
118 add("swap_direction", &VehicleType::swap_direction);
119 add("width", &Loader::width);
122 void VehicleType::Loader::axle()
126 obj.axles.push_back(axl);
129 void VehicleType::Loader::bogie()
133 obj.bogies.push_back(bog);
136 void VehicleType::Loader::function(unsigned i, const string &f)
138 obj.functions[i] = f;
141 void VehicleType::Loader::height(float h)
146 void VehicleType::Loader::length(float l)
151 void VehicleType::Loader::rod()
154 Rod::Loader ldr(rd, rod_tags);
156 obj.rods.push_back(rd);
157 if(!ldr.get_tag().empty())
158 rod_tags[ldr.get_tag()] = obj.rods.size()-1;
159 rod_tags["previous"] = obj.rods.size()-1;
162 void VehicleType::Loader::width(float w)
168 VehicleType::Axle::Loader::Loader(Axle &a):
169 DataFile::ObjectLoader<Axle>(a)
171 add("object", &Axle::object);
172 add("position", &Loader::position);
173 add("powered", &Axle::powered);
174 add("wheel_diameter", &Loader::wheel_diameter);
177 void VehicleType::Axle::Loader::position(float p)
179 obj.position = p/1000;
182 void VehicleType::Axle::Loader::wheel_diameter(float d)
184 obj.wheel_dia = d/1000;
188 VehicleType::Bogie::Loader::Loader(Bogie &b):
189 DataFile::ObjectLoader<Bogie>(b)
191 add("axle", &Loader::axle);
192 add("object", &Bogie::object);
193 add("position", &Loader::position);
194 add("rotate_object", &Bogie::rotate_object);
197 void VehicleType::Bogie::Loader::axle()
201 obj.axles.push_back(axl);
204 void VehicleType::Bogie::Loader::position(float p)
206 obj.position = p/1000;
210 VehicleType::Rod::Loader::Loader(Rod &r, const map<string, unsigned> &t):
211 DataFile::ObjectLoader<Rod>(r),
214 add("connect", &Loader::connect);
215 add("limit", &Rod::limit);
216 add("mirror_object", &Rod::mirror_object);
217 add("object", &Rod::object);
218 add("pivot_body", &Loader::pivot_body);
219 add("pivot_axle", &Loader::pivot_axle);
220 add("pivot_axle", &Loader::pivot_bogie_axle);
221 add("pivot_rod", &Loader::pivot_rod);
222 add("position", &Loader::position);
223 add("tag", &Loader::set_tag);
226 void VehicleType::Rod::Loader::connect(const string &t, float px, float pz, float ox, float oz)
228 obj.connect_index = get_item(tags, t);
229 obj.connect_point = Vector(px/1000, 0, pz/1000);
230 obj.connect_offset = Vector(ox/1000, 0, oz/1000);
233 void VehicleType::Rod::Loader::pivot_body()
238 void VehicleType::Rod::Loader::pivot_axle(unsigned i)
244 void VehicleType::Rod::Loader::pivot_bogie_axle(unsigned i, unsigned j)
246 obj.pivot = BOGIE_AXLE;
248 obj.pivot_index2 = j;
251 void VehicleType::Rod::Loader::pivot_rod(const string &t)
253 obj.pivot_index = get_item(tags, t);
257 void VehicleType::Rod::Loader::position(float x, float y, float z)
259 obj.pivot_point = Vector(x/1000, y/1000, z/1000);
262 void VehicleType::Rod::Loader::set_tag(const string &t)
268 void operator>>(const LexicalConverter &c, VehicleType::Rod::Limit &l)
270 const string &s = c.get();
272 l = VehicleType::Rod::FIXED;
274 l = VehicleType::Rod::ROTATE;
275 else if(s=="SLIDE_X")
276 l = VehicleType::Rod::SLIDE_X;
278 throw lexical_error(format("conversion of '%s' to Rod::Limit", s));