for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
{
Object *obj = i->object->clone(&designer.get_layout());
- if(Track *track = dynamic_cast<Track *>(obj))
- {
- for(list<Object *>::iterator j=new_objs.begin(); j!=new_objs.end(); ++j)
- if(Track *track2 = dynamic_cast<Track *>(*j))
- track->snap_to(*track2, true);
- }
+ for(list<Object *>::iterator j=new_objs.begin(); j!=new_objs.end(); ++j)
+ obj->link_to(**j);
new_objs.push_back(obj);
}
return;
for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
- if(Track *track = dynamic_cast<Track *>(i->object))
- if(track->get_type().get_endpoints().size()!=2)
- return;
+ if(i->object->get_n_link_slots()!=2)
+ return;
list<Track *> tracks2;
for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
}
set<Track *>::iterator nb = neighbors.begin();
- int epi = (*nb)->get_endpoint_by_link(*order.front().track);
- float start_z = (*nb)->get_endpoint_position(epi).z;
+ int epi = (*nb)->get_link_slot(*order.front().track);
+ float start_z = (*nb)->get_snap_node(epi).position.z;
++nb;
- epi = (*nb)->get_endpoint_by_link(*order.back().track);
- float end_z = (*nb)->get_endpoint_position(epi).z;
+ epi = (*nb)->get_link_slot(*order.back().track);
+ float end_z = (*nb)->get_snap_node(epi).position.z;
if(smooth)
{
float limit = designer.get_layout().get_catalogue().get_gauge()/10;
- Vector pos1;
- float dir1;
+ Snap sn1;
bool ok = false;
float gap = 0;
for(unsigned i=0; i<track1->get_type().get_endpoints().size(); ++i)
if(track1->get_link(i))
continue;
- pos1 = track1->get_endpoint_position(i);
- dir1 = track1->get_endpoint_direction(i);
+ sn1 = track1->get_snap_node(i);
for(unsigned j=0; j<track2->get_type().get_endpoints().size(); ++j)
{
if(track2->get_link(j))
continue;
- Vector pos2 = track2->get_endpoint_position(j);
- float dir2 = track2->get_endpoint_direction(j);
+ Snap sn2 = track2->get_snap_node(j);
- float dz = pos2.z-pos1.z;
+ float dz = sn2.position.z-sn1.position.z;
if(abs(dz)>0.02)
continue;
- float adiff = dir1+M_PI-dir2;
+ float adiff = sn1.rotation+M_PI-sn2.rotation;
while(adiff<-M_PI)
adiff += M_PI*2;
while(adiff>M_PI)
if(abs(adiff)>0.01)
continue;
- float c = cos(dir1);
- float s = sin(dir1);
- float dx = pos2.x-pos1.x;
- float dy = pos2.y-pos1.y;
+ float c = cos(sn1.rotation);
+ float s = sin(sn1.rotation);
+ float dx = sn2.position.x-sn1.position.x;
+ float dy = sn2.position.y-sn1.position.y;
if(abs(dx*s-dy*c)>limit)
continue;
return;
}
- vector<Track *> trks = create_straight(pos1, dir1, gap, limit);
+ vector<Track *> trks = create_straight(sn1.position, sn1.rotation, gap, limit);
if(trks.empty())
{
return;
}
- trks.front()->snap_to(*track1, true);
- trks.back()->snap_to(*track2, true);
+ trks.front()->link_to(*track1);
+ trks.back()->link_to(*track2);
selection.replace(trks.begin(), trks.end());
}
{
for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
for(vector<MObject>::iterator j=objects.begin(); j!=objects.end(); ++j)
- if(Track *track = dynamic_cast<Track *>(j->object))
- track->break_link(**i);
+ j->object->break_link(**i);
}
const set<Track *> <racks = designer.get_layout().get_tracks();
if(!ok) continue;
for(vector<MObject>::iterator j=objects.begin(); j!=objects.end(); ++j)
- if(Track *track = dynamic_cast<Track *>(j->object))
- track->snap_to(**i, true);
+ j->object->link_to(**i);
}
if(m==EXTEND)
continue;
for(vector<MObject>::iterator j=objects.begin(); (j!=objects.end() && !snapped); ++j)
- if(Track *track = dynamic_cast<Track *>(j->object))
- if(track->snap_to(**i, false, limit))
- snapped = &*j;
+ if(j->object->snap_to(**i, limit))
+ snapped = &*j;
}
if(snapped)
float length = 0;
for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
{
- Track *track = dynamic_cast<Track *>(i->object);
- if(!track)
- continue;
-
- unsigned n_endpoints = track->get_type().get_endpoints().size();
- for(unsigned j=0; j<n_endpoints; ++j)
+ unsigned nls = i->object->get_n_link_slots();
+ for(unsigned j=0; j<nls; ++j)
{
- if(track->get_link(j))
+ if(i->object->get_link(j))
continue;
- Vector ep_pos = track->get_endpoint_position(j);
- float ep_dir = track->get_endpoint_direction(j);
- float c = cos(ep_dir);
- float s = sin(ep_dir);
- float dx = gpointer.x-ep_pos.x;
- float dy = gpointer.y-ep_pos.y;
+ Snap sn = i->object->get_snap_node(j);
+ float c = cos(sn.rotation);
+ float s = sin(sn.rotation);
+ float dx = gpointer.x-sn.position.x;
+ float dy = gpointer.y-sn.position.y;
float len = dx*c+dy*s;
if(len<length)
continue;
- pos = ep_pos;
- dir = ep_dir;
+ pos = sn.position;
+ dir = sn.rotation;
length = len;
}
}
unsigned n_endpoints = track->get_type().get_endpoints().size();
for(unsigned j=0; j<n_endpoints; ++j)
{
- Vector p = track->get_endpoint_position(j);
+ Vector p = track->get_snap_node(j).position;
if(i==objects.begin() && j==0)
minp = maxp = p;
else
track->set_rotation(dir);
if(!trks.empty())
- track->snap_to(*trks.back(), true);
+ track->link_to(*trks.back());
trks.push_back(track);
pos.x += c**i;