#include <cmath>
+#include <msp/core/maputils.h>
#include "block.h"
#include "catalogue.h"
#include "driver.h"
void Track::set_position(const Vector &p)
{
position = p;
- for(vector<Track *>::const_iterator i=links.begin(); i!=links.end(); ++i)
- if(*i)
- (*i)->check_slope();
+ signal_moved.emit();
+ propagate_slope();
}
void Track::set_rotation(const Angle &r)
{
rotation = wrap_positive(r);
+ signal_moved.emit();
}
-void Track::set_slope(float s)
+void Track::set_tilt(const Angle &t)
{
if(links.size()!=2)
return;
- slope = s;
+ tilt = t;
+ slope = tan(tilt)*type.get_path_length(0);
+ signal_moved.emit();
+ propagate_slope();
}
void Track::set_flex(bool f)
flex = f;
}
+void Track::propagate_slope()
+{
+ for(vector<Track *>::const_iterator i=links.begin(); i!=links.end(); ++i)
+ if(*i)
+ (*i)->check_slope();
+}
+
void Track::check_slope()
{
if(links.size()!=2)
Vector epp1 = links[1]->get_snap_node(links[1]->get_link_slot(*this)).position;
position.z = epp0.z;
slope = epp1.z-position.z;
+ tilt = Geometry::atan(slope/type.get_path_length(0));
}
else
{
position.z = epp.z-slope;
}
}
+
+ signal_moved.emit();
}
void Track::set_turnout_id(unsigned i)
p.dir += rotation;
if(type.get_endpoints().size()==2)
{
- float len = type.get_path_length(path);
- float grade = slope/len;
+ float grade = tan(tilt);
if(epi==0)
{
p.pos.z += grade*d;
return true;
}
+void Track::add_attachment(TrackAttachment &a)
+{
+ if(find(attachments.begin(), attachments.end(), &a)!=attachments.end())
+ throw key_error(&a);
+ attachments.push_back(&a);
+}
+
+void Track::remove_attachment(TrackAttachment &a)
+{
+ AttachmentList::iterator i = find(attachments.begin(), attachments.end(), &a);
+ if(i==attachments.end())
+ throw key_error(&a);
+ attachments.erase(i);
+}
+
void Track::save(list<DataFile::Statement> &st) const
{
st.push_back((DataFile::Statement("position"), position.x, position.y, position.z));
st.push_back((DataFile::Statement("rotation"), rotation.radians()));
- st.push_back((DataFile::Statement("slope"), slope));
+ st.push_back((DataFile::Statement("tilt"), tilt.radians()));
if(turnout_id)
st.push_back((DataFile::Statement("turnout_id"), turnout_id));
if(sensor_id)
{
add("position", &Loader::position);
add("rotation", &Loader::rotation);
- add("slope", &Track::slope);
+ add("tilt", &Loader::tilt);
add("turnout_id", &Loader::turnout_id);
add("sensor_id", &Loader::sensor_id);
add("flex", &Track::flex);
+
+ // deprecated
+ add("slope", &Loader::slope);
}
void Track::Loader::position(float x, float y, float z)
{
- obj.position = Vector(x, y, z);
+ obj.set_position(Vector(x, y, z));
}
void Track::Loader::rotation(float r)
{
- obj.rotation = Angle::from_radians(r);
+ obj.set_rotation(Angle::from_radians(r));
}
void Track::Loader::sensor_id(unsigned id)
obj.set_sensor_id(id);
}
+void Track::Loader::slope(float s)
+{
+ obj.set_tilt(Geometry::atan(s/obj.type.get_path_length(0)));
+}
+
+void Track::Loader::tilt(float t)
+{
+ obj.set_tilt(Angle::from_radians(t));
+}
+
void Track::Loader::turnout_id(unsigned id)
{
obj.set_turnout_id(id);