X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrack.cpp;h=7b9a4a2d70b30febaf96ebf917cb284153ba44ac;hb=0b75458245997b9df6da47cc4534341c8426084b;hp=4d8a8fc2210371cc4d96746e77991ed05bef0891;hpb=64340dad429ba4040538fc06b6882aabdb489925;p=r2c2.git
diff --git a/source/libr2c2/track.cpp b/source/libr2c2/track.cpp
index 4d8a8fc..7b9a4a2 100644
--- a/source/libr2c2/track.cpp
+++ b/source/libr2c2/track.cpp
@@ -12,16 +12,16 @@ using namespace Msp;
namespace R2C2 {
Track::Track(Layout &l, const TrackType &t):
- layout(l),
+ Object(l),
type(t),
block(0),
- rot(0),
slope(0),
flex(false),
turnout_id(0),
sensor_id(0),
links(type.get_endpoints().size()),
- active_path(0)
+ active_path(0),
+ path_changing(false)
{
if(type.is_turnout())
turnout_id = layout.allocate_turnout_id();
@@ -40,6 +40,14 @@ Track::~Track()
layout.remove_track(*this);
}
+Track *Track::clone(Layout *to_layout) const
+{
+ Track *track = new Track((to_layout ? *to_layout : layout), type);
+ track->set_position(position);
+ track->set_rotation(rotation);
+ return track;
+}
+
void Track::set_block(Block *b)
{
if(b && !b->has_track(*this))
@@ -60,16 +68,16 @@ Block &Track::get_block() const
void Track::set_position(const Vector &p)
{
- pos = p;
+ position = p;
}
void Track::set_rotation(float r)
{
- rot = r;
- while(rot<0)
- rot += M_PI*2;
- while(rot>M_PI*2)
- rot -= M_PI*2;
+ rotation = r;
+ while(rotation<0)
+ rotation += M_PI*2;
+ while(rotation>M_PI*2)
+ rotation -= M_PI*2;
}
void Track::set_slope(float s)
@@ -92,23 +100,23 @@ void Track::check_slope()
if(links[0] && links[1])
{
- Vector epp0 = links[0]->get_endpoint_position(links[0]->get_endpoint_by_link(*this));
- Vector epp1 = links[1]->get_endpoint_position(links[1]->get_endpoint_by_link(*this));
- pos.z = epp0.z;
- slope = epp1.z-pos.z;
+ Vector epp0 = links[0]->get_snap_node(links[0]->get_link_slot(*this)).position;
+ Vector epp1 = links[1]->get_snap_node(links[1]->get_link_slot(*this)).position;
+ position.z = epp0.z;
+ slope = epp1.z-position.z;
}
else
{
slope = 0;
if(links[0])
{
- Vector epp = links[0]->get_endpoint_position(links[0]->get_endpoint_by_link(*this));
- pos.z = epp.z;
+ Vector epp = links[0]->get_snap_node(links[0]->get_link_slot(*this)).position;
+ position.z = epp.z;
}
else if(links[1])
{
- Vector epp = links[1]->get_endpoint_position(links[1]->get_endpoint_by_link(*this));
- pos.z = epp.z;
+ Vector epp = links[1]->get_snap_node(links[1]->get_link_slot(*this)).position;
+ position.z = epp.z;
}
}
}
@@ -143,118 +151,86 @@ void Track::set_active_path(unsigned p)
if(!(type.get_paths()&(1<
&eps = type.get_endpoints();
- if(epi>=eps.size())
- throw out_of_range("Track::get_endpoint_position");
-
- const TrackType::Endpoint &ep = eps[epi];
+ TrackPoint p = type.get_point(epi, path, d);
+ float c = cos(rotation);
+ float s = sin(rotation);
- float c = cos(rot);
- float s = sin(rot);
+ p.pos = Vector(position.x+c*p.pos.x-s*p.pos.y, position.y+s*p.pos.x+c*p.pos.y, position.z);
+ p.dir += rotation;
+ if(type.get_endpoints().size()==2)
+ {
+ float len = type.get_path_length(path);
+ float grade = slope/len;
+ if(epi==0)
+ {
+ p.pos.z += grade*d;
+ p.grade = grade;
+ }
+ else
+ {
+ p.pos.z += slope-grade*d;
+ p.grade = -grade;
+ }
+ }
- Vector p(pos.x+c*ep.pos.x-s*ep.pos.y, pos.y+s*ep.pos.x+c*ep.pos.y, pos.z);
- if(eps.size()==2 && epi==1)
- p.z += slope;
return p;
}
-float Track::get_endpoint_direction(unsigned epi) const
+TrackPoint Track::get_point(unsigned epi, float d) const
{
- const vector &eps = type.get_endpoints();
- if(epi>=eps.size())
- throw out_of_range("Track::get_endpoint_direction");
-
- const TrackType::Endpoint &ep = eps[epi];
-
- return rot+ep.dir;
+ return get_point(epi, active_path, d);
}
-bool Track::snap_to(Track &other, bool link, float limit)
+unsigned Track::get_n_snap_nodes() const
{
- if(!limit || link)
- {
- limit = layout.get_catalogue().get_gauge();
- if(link && !flex && !other.get_flex())
- limit /= 10;
- }
- limit *= limit;
+ return type.get_endpoints().size();
+}
+Snap Track::get_snap_node(unsigned i) const
+{
const vector &eps = type.get_endpoints();
- const vector &other_eps = other.get_type().get_endpoints();
+ if(i>=eps.size())
+ throw out_of_range("Track::get_snap_node");
- for(unsigned i=0; i &eps = type.get_endpoints();
+ if(Object::snap(sn, limit, what))
+ return true;
- for(unsigned i=0; i::iterator i=links.begin(); i!=links.end(); ++i)
- if(*i==&trk)
- {
- *i = 0;
- trk.break_link(*this);
- // XXX Creates the blocks twice
- layout.create_blocks(*this);
- signal_link_changed.emit(i-links.begin(), 0);
- return;
- }
+ if(dynamic_cast(&other))
+ return SNAP_NODE;
+
+ return NO_SNAP;
}
-void Track::break_links()
+unsigned Track::get_n_link_slots() const
{
- for(vector