3 #include <msp/parser/parser.h>
12 Layout::Layout(Catalogue &c):
16 void Layout::add_track(Track *t)
18 if(find(tracks.begin(), tracks.end(), t)==tracks.end())
21 signal_track_added.emit(t);
25 void Layout::remove_track(Track *t)
27 TrackSeq::iterator i=remove_if(tracks.begin(), tracks.end(), bind1st(equal_to<Track *>(), t));
30 tracks.erase(i, tracks.end());
31 signal_track_removed.emit(t);
35 void Layout::check_links()
37 for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i)
40 for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i)
41 for(TrackSeq::iterator j=i; j!=tracks.end(); ++j)
43 (*i)->snap_to(**j, true);
46 void Layout::load(const string &fn)
48 ifstream in(fn.c_str());
50 throw Exception("Couldn't open file");
53 Parser::Parser parser(in, fn);
59 for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i)
63 int Layout::save(const string &fn)
65 ofstream out(fn.c_str());
71 out<<"base \""<<base<<"\";\n";
72 for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i)
74 out<<"track "<<(*i)->get_article_number()<<"\n{\n";
75 const Point &p=(*i)->get_position();
76 out<<"\tposition "<<p.x<<' '<<p.y<<' '<<p.z<<";\n";
77 out<<"\trotation "<<(*i)->get_rotation()<<";\n";
78 out<<"\tslope "<<(*i)->get_slope()<<";\n";
80 unsigned id=(*i)->get_turnout_id();
82 out<<"\tturnout_id "<<id<<";\n";
84 id=(*i)->get_sensor_id();
86 out<<"\tsensor_id "<<id<<";\n";
89 out<<"\tflex true;\n";
99 for(TrackSeq::iterator i=tracks.begin(); i!=tracks.end(); ++i)
107 Layout::Loader::Loader(Layout &l):
110 add("base", &Layout::base);
111 add("track", &Loader::track);
114 void Layout::Loader::track(unsigned art_nr)
116 Track *tmpl=layout.catalogue.get_track(art_nr);
118 throw Exception("Unknown track");
120 Track *trk=tmpl->copy();
125 catch(Msp::Exception &e)
130 layout.tracks.push_back(trk);
131 layout.signal_track_added.emit(trk);
134 } // namespace Marklin