]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.cpp
Perform check_slope automatically with certain operations
[r2c2.git] / source / libr2c2 / layout.cpp
index fefa3e9b3fb4045e2d6ecf84280c0319fa2431ed..45b18e322fa6e8db5a065fb616e002b869b206a8 100644 (file)
@@ -72,6 +72,11 @@ void Layout::add_track(Track &t)
        }
 }
 
+Track *Layout::pick_track(const Vector &start, const Vector &ray)
+{
+       return pick(tracks, start, ray);
+}
+
 void Layout::remove_track(Track &t)
 {
        if(tracks.erase(&t))
@@ -81,40 +86,55 @@ void Layout::remove_track(Track &t)
        }
 }
 
+unsigned Layout::allocate_turnout_id()
+{
+       set<unsigned> used_ids;
+       for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+               if((*i)->get_turnout_id())
+                       used_ids.insert((*i)->get_turnout_id());
+
+       unsigned result = next_turnout_id;
+       while(used_ids.count(result))
+               ++result;
+       next_turnout_id = result+1;
+
+       return result;
+}
+
 void Layout::add_signal(Signal &s)
 {
        if(signals.insert(&s).second)
                signal_signal_added.emit(s);
 }
 
+Signal *Layout::pick_signal(const Vector &start, const Vector &ray)
+{
+       return pick(signals, start, ray);
+}
+
 void Layout::remove_signal(Signal &s)
 {
        if(signals.erase(&s))
                signal_signal_removed.emit(s);
 }
 
-Track *Layout::pick_track(const Vector &start, const Vector &ray)
+Object *Layout::pick_object(const Vector &start, const Vector &ray)
 {
-       for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
-               if((*i)->collide_ray(start, ray))
-                       return *i;
-
+       if(Object *obj = pick_track(start, ray))
+               return obj;
+       else if((obj = pick_signal(start, ray)))
+               return obj;
        return 0;
 }
 
-unsigned Layout::allocate_turnout_id()
+template<typename T>
+T *Layout::pick(const set<T *> &objs, const Vector &start, const Vector &ray)
 {
-       set<unsigned> used_ids;
-       for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
-               if((*i)->get_turnout_id())
-                       used_ids.insert((*i)->get_turnout_id());
-
-       unsigned result = next_turnout_id;
-       while(used_ids.count(result))
-               ++result;
-       next_turnout_id = result+1;
+       for(typename set<T *>::const_iterator i=objs.begin(); i!=objs.end(); ++i)
+               if((*i)->collide_ray(start, ray))
+                       return *i;
 
-       return result;
+       return 0;
 }
 
 void Layout::add_block(Block &b)
@@ -385,12 +405,6 @@ Layout::Loader::Loader(Layout &l):
        add("train", static_cast<void (Loader::*)(unsigned, unsigned, const std::string &)>(&Loader::train));
 }
 
-void Layout::Loader::finish()
-{
-       for(set<Track *>::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i)
-               (*i)->check_slope();
-}
-
 void Layout::Loader::route()
 {
        Route *rte = new Route(obj);
@@ -422,7 +436,7 @@ void Layout::Loader::track(ArticleNumber art_nr)
        new_tracks = true;
        for(set<Track *>::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i)
                if(*i!=trk)
-                       trk->snap_to(**i, true);
+                       trk->link_to(**i);
 }
 
 void Layout::Loader::train(unsigned art_nr, unsigned addr, const std::string &proto)