-int Track::get_endpoint_by_link(Track &other) const
-{
- for(unsigned i=0; i<links.size(); ++i)
- if(links[i]==&other)
- return i;
-
- return -1;
-}
-
-bool Track::snap_to(Track &other, bool link, float limit)
-{
- if(!limit || link)
- {
- limit = layout.get_catalogue().get_gauge();
- if(link && !flex && !other.get_flex())
- limit /= 10;
- }
- limit *= limit;
-
- const vector<TrackType::Endpoint> &eps = type.get_endpoints();
- const vector<TrackType::Endpoint> &other_eps = other.get_type().get_endpoints();
-
- for(unsigned i=0; i<eps.size(); ++i)
- {
- Vector epp = get_snap_node(i).position;
-
- for(unsigned j=0; j<other_eps.size(); ++j)
- {
- if(other.get_link(j))
- continue;
-
- Vector epp2 = other.get_snap_node(j).position;
- float dx = epp2.x-epp.x;
- float dy = epp2.y-epp.y;
- float dz = epp2.z-epp.z;
- if(dx*dx+dy*dy<limit && dz*dz<limit)
- {
- if(!link || (!flex && !other.get_flex()))
- {
- set_rotation(other.rotation+other_eps[j].dir-eps[i].dir+M_PI);
- Vector p(epp2.x-(eps[i].pos.x*cos(rotation)-eps[i].pos.y*sin(rotation)),
- epp2.y-(eps[i].pos.y*cos(rotation)+eps[i].pos.x*sin(rotation)),
- epp2.z);
- if(eps.size()==2 && i==1)
- p.z -= slope;
- set_position(p);
- }
-
- if(link)
- {
- if(links[i])
- break_link(*links[i]);
- links[i] = &other;
- other.links[j] = this;
- layout.create_blocks(*this);
-
- signal_link_changed.emit(i, &other);
- other.signal_link_changed.emit(j, this);
- }
-
- return true;
- }
- }
- }
-
- return false;
-}
-
-void Track::break_link(Track &trk)
-{
- for(vector<Track *>::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;
- }
-}
-
-void Track::break_links()
-{
- for(vector<Track *>::iterator i=links.begin(); i!=links.end(); ++i)
- if(Track *trk=*i)
- {
- *i = 0;
- trk->break_link(*this);
- }
-}
-
-Track *Track::get_link(unsigned i) const
-{
- if(i>=links.size())
- throw out_of_range("Track::get_link");
-
- return links[i];
-}
-