+}
+
+
+Layout::Loader::Loader(Layout &l):
+ DataFile::BasicLoader<Layout>(l),
+ new_tracks(false)
+{
+ add("base", &Layout::base);
+ add("route", static_cast<void (Loader::*)()>(&Loader::route));
+ add("route", static_cast<void (Loader::*)(const string &)>(&Loader::route));
+ add("track", static_cast<void (Loader::*)(unsigned)>(&Loader::track));
+ add("track", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::track));
+ add("train", static_cast<void (Loader::*)(unsigned, unsigned)>(&Loader::train));
+ add("train", static_cast<void (Loader::*)(ArticleNumber, unsigned)>(&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);
+ load_sub(*rte);
+}
+
+void Layout::Loader::route(const string &n)
+{
+ Route *rte = new Route(obj);
+ rte->set_name(n);
+ load_sub(*rte);
+}
+
+void Layout::Loader::track(unsigned art_nr)
+{
+ track(ArticleNumber(art_nr));
+}
+
+void Layout::Loader::track(ArticleNumber art_nr)
+{
+ Track *trk = new Track(obj, obj.catalogue.get_track(art_nr));
+ load_sub(*trk);
+ new_tracks = true;
+ for(set<Track *>::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i)
+ if(*i!=trk)
+ trk->snap_to(**i, true);
+}
+
+void Layout::Loader::train(unsigned art_nr, unsigned addr)
+{
+ train(ArticleNumber(art_nr), addr);
+}
+
+void Layout::Loader::train(ArticleNumber art_nr, unsigned addr)
+{
+ Train *trn = new Train(obj, obj.catalogue.get_vehicle(art_nr), addr);
+ load_sub(*trn);