]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackattachment.cpp
Support inverted sensors that give low output when active
[r2c2.git] / source / libr2c2 / trackattachment.cpp
index bed7db86c79ba47b3cd25b1ec82871eb83bb64c8..eb2d563561c6fcf7864d00c1a8a170f943c7e624 100644 (file)
@@ -10,7 +10,9 @@ namespace R2C2 {
 TrackAttachment::TrackAttachment(Layout &l):
        Object(l),
        offset(0)
-{ }
+{
+       layout.signal_object_removed.connect(sigc::mem_fun(this, &TrackAttachment::object_removed));
+}
 
 TrackAttachment::~TrackAttachment()
 {
@@ -18,6 +20,14 @@ TrackAttachment::~TrackAttachment()
                track->remove_attachment(*this);
 }
 
+float TrackAttachment::get_offset_from_endpoint(unsigned epi) const
+{
+       if(epi==track.entry())
+               return offset;
+       else
+               return track->get_type().get_path_length(0)-offset;
+}
+
 void TrackAttachment::attach_to(const TrackIter &t, float o)
 {
        if(track)
@@ -79,7 +89,7 @@ float TrackAttachment::find_offset(const TrackIter &trk, const Vector &point)
        Vector epp = trk->get_snap_node(trk.entry()).position;
 
        float dist = distance(epp, point);
-       float offs = dist;
+       float offs = min(dist, trk->get_type().get_path_length(0));
        while(1)
        {
                TrackPoint tp = trk->get_point(trk.entry(), offs);
@@ -92,4 +102,10 @@ float TrackAttachment::find_offset(const TrackIter &trk, const Vector &point)
        return offs;
 }
 
+void TrackAttachment::object_removed(Object &o)
+{
+       if(&o==track.track())
+               track = TrackIter();
+}
+
 } // namespace R2C"