namespace R2C2 {
TrackAttachment::TrackAttachment(Layout &l):
- Object(l),
- offset(0)
+ Object(l)
{
layout.signal_object_removed.connect(sigc::mem_fun(this, &TrackAttachment::object_removed));
}
track->remove_attachment(*this);
}
-void TrackAttachment::attach_to(const TrackIter &t, float o)
+float TrackAttachment::get_offset_from_endpoint(unsigned epi) const
+{
+ if(epi==track.entry())
+ return track.offset();
+ else
+ return track->get_type().get_path_length(0)-track.offset();
+}
+
+void TrackAttachment::attach_to(const TrackOffsetIter &t)
{
if(track)
track->remove_attachment(*this);
track = t;
- offset = o;
if(track)
track->add_attachment(*this);
if(adiff<Angle::quarter_turn())
{
TrackIter iter(trk, i);
- attach_to(iter, find_offset(iter, closest));
+ attach_to(TrackOffsetIter(iter, find_offset(iter, closest)));
break;
}
}
}
else
- attach_to(TrackIter(), 0);
+ attach_to(TrackOffsetIter());
}
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);
- float diff = dist-distance(epp, tp.pos);
+ OrientedPoint p = trk->get_point(trk.entry(), offs);
+ float diff = dist-distance(epp, p.position);
if(abs(diff)<margin)
break;
offs += diff;