]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/manipulator.cpp
Use Objects in Manipulator::neighbors
[r2c2.git] / source / designer / manipulator.cpp
index 6aca114aa5538ecfbceebf5ab328009c4b5a675b..802adb16fd45942e95deb2ac7038b347cb909557 100644 (file)
@@ -83,12 +83,8 @@ void Manipulator::duplicate()
        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);
        }
 
@@ -120,9 +116,6 @@ void Manipulator::flatten()
                        track->set_slope(0);
        }
 
-       for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
-               (*i)->check_slope();
-
        update_objects();
 }
 
@@ -135,9 +128,8 @@ void Manipulator::even_slope(bool smooth)
                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)
@@ -147,7 +139,7 @@ void Manipulator::even_slope(bool smooth)
        float total_len = 0;
 
        list<TrackOrder> order;
-       Track *cur = *neighbors.begin();
+       Track *cur = dynamic_cast<Track *>(*neighbors.begin());
        while(tracks2.size())
        {
                bool rev = false;
@@ -172,11 +164,11 @@ void Manipulator::even_slope(bool smooth)
                total_len += cur->get_type().get_total_length();
        }
 
-       set<Track *>::iterator nb = neighbors.begin();
-       int epi = (*nb)->get_endpoint_by_link(*order.front().track);
+       set<Object *>::iterator nb = neighbors.begin();
+       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);
+       epi = (*nb)->get_link_slot(*order.back().track);
        float end_z = (*nb)->get_snap_node(epi).position.z;
 
        if(smooth)
@@ -209,9 +201,6 @@ void Manipulator::even_slope(bool smooth)
                cur_z += dz;
        }
 
-       for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
-               (*i)->check_slope();
-
        update_objects();
 }
 
@@ -294,8 +283,8 @@ void Manipulator::connect()
                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());
 }
@@ -312,9 +301,6 @@ void Manipulator::cancel()
                i->object->set_rotation(i->rot);
        }
 
-       for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
-               (*i)->check_slope();
-
        for(vector<Track *>::iterator i=extend_tracks.begin(); i!=extend_tracks.end(); ++i)
                delete *i;
        extend_tracks.clear();
@@ -339,10 +325,9 @@ void Manipulator::button_press(unsigned btn)
 
                if(m!=EXTEND)
                {
-                       for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
+                       for(set<Object *>::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 *> &ltracks = designer.get_layout().get_tracks();
@@ -354,8 +339,7 @@ void Manipulator::button_press(unsigned btn)
                        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)
@@ -404,9 +388,8 @@ void Manipulator::axis_motion(unsigned axis, float value, float)
                                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)
@@ -448,9 +431,6 @@ void Manipulator::axis_motion(unsigned axis, float value, float)
 
                for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
                        i->object->set_position(Vector(center.x+i->pos.x, center.y+i->pos.y, center.z+i->pos.z+dz));
-
-               for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
-                       (*i)->check_slope();
        }
        else if(mode==EXTEND)
        {
@@ -459,17 +439,13 @@ void Manipulator::axis_motion(unsigned axis, float value, float)
                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;
 
-                               Snap sn = track->get_snap_node(j);
+                               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;
@@ -591,24 +567,21 @@ void Manipulator::update_neighbors()
        neighbors.clear();
        for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
        {
-               Track *track = dynamic_cast<Track *>(i->object);
-               if(!track)
-                       continue;
-
-               const vector<Track *> &links = track->get_links();
-               for(vector<Track *>::const_iterator j=links.begin(); j!=links.end(); ++j)
+               unsigned nls = i->object->get_n_link_slots();
+               for(unsigned j=0; j<nls; ++j)
                {
-                       if(!*j)
+                       Object *linked = i->object->get_link(j);
+                       if(!linked)
                                continue;
-                       if(neighbors.count(*j))
+                       if(neighbors.count(linked))
                                continue;
 
                        bool ok = true;
                        for(vector<MObject>::iterator k=objects.begin(); (k!=objects.end() && ok); ++k)
-                               ok = (k->object!=*j);
+                               ok = (k->object!=linked);
 
                        if(ok)
-                               neighbors.insert(*j);
+                               neighbors.insert(linked);
                }
        }
 }
@@ -698,7 +671,7 @@ vector<Track *> Manipulator::create_straight(const R2C2::Vector &start, float di
                        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;