2 #include <msp/core/refptr.h>
3 #include <msp/datafile/parser.h>
13 Layout::Layout(Catalogue &c):
19 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
23 void Layout::add_track(Track &t)
25 if(tracks.insert(&t).second)
26 signal_track_added.emit(t);
29 void Layout::remove_track(Track &t)
34 signal_track_removed.emit(t);
38 void Layout::check_links()
40 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
43 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
44 for(set<Track *>::iterator j=i; j!=tracks.end(); ++j)
46 (*i)->snap_to(**j, true);
49 void Layout::load(const string &fn)
55 DataFile::Parser parser(inb, fn);
61 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
65 int Layout::save(const string &fn)
67 ofstream out(fn.c_str());
73 out<<"base \""<<base<<"\";\n";
74 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
76 out<<"track "<<(*i)->get_type().get_article_number()<<"\n{\n";
77 const Point &p=(*i)->get_position();
78 out<<"\tposition "<<p.x<<' '<<p.y<<' '<<p.z<<";\n";
79 out<<"\trotation "<<(*i)->get_rotation()<<";\n";
80 out<<"\tslope "<<(*i)->get_slope()<<";\n";
82 unsigned id=(*i)->get_turnout_id();
84 out<<"\tturnout_id "<<id<<";\n";
86 id=(*i)->get_sensor_id();
88 out<<"\tsensor_id "<<id<<";\n";
91 out<<"\tflex true;\n";
100 Layout::Loader::Loader(Layout &l):
103 add("base", &Layout::base);
104 add("track", &Loader::track);
107 void Layout::Loader::track(unsigned art_nr)
109 TrackType &type=layout.catalogue.get_track(art_nr);
111 RefPtr<Track> trk=new Track(type);
113 layout.add_track(*trk.release());
116 } // namespace Marklin