+void Layout::remove(TrackChain &g)
+{
+ if(track_chains.erase(g))
+ signal_track_chain_removed.emit(g);
+}
+
+void Layout::remove(Sensor &s)
+{
+ sensors.erase(s);
+}
+
+void Layout::remove(BeamGate &g)
+{
+ remove(static_cast<Object &>(g));
+ remove(static_cast<Sensor &>(g));
+}
+
+unsigned Layout::allocate_turnout_id()
+{
+ set<unsigned> used_ids;
+ const set<Track *> &tracks = objects.get<Track>();
+ 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;
+}
+