3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
8 #include <msp/core/refptr.h>
9 #include <msp/datafile/parser.h>
10 #include <msp/datafile/writer.h>
11 #include "catalogue.h"
13 #include "tracktype.h"
20 Layout::Layout(const Catalogue &c):
26 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
30 void Layout::add_track(Track &t)
32 if(tracks.insert(&t).second)
33 signal_track_added.emit(t);
36 void Layout::remove_track(Track &t)
41 signal_track_removed.emit(t);
45 void Layout::check_links()
47 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
51 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
57 for(set<Track *>::iterator j=i; j!=tracks.end(); ++j)
59 (*i)->snap_to(**j, true);
63 for(set<Track *>::iterator i=flext.begin(); i!=flext.end(); ++i)
64 for(set<Track *>::iterator j=tracks.begin(); j!=tracks.end(); ++j)
66 (*i)->snap_to(**j, true);
69 void Layout::save(const string &fn)
71 IO::BufferedFile out(fn, IO::M_WRITE);
72 DataFile::Writer writer(out);
74 writer.write((DataFile::Statement("base"), base));
75 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
77 DataFile::Statement st("track");
78 st.append((*i)->get_type().get_article_number());
82 /*ofstream out(fn.c_str());
88 out<<"base \""<<base<<"\";\n";
89 for(set<Track *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
91 out<<"track "<<(*i)->get_type().get_article_number()<<"\n{\n";
92 const Point &p=(*i)->get_position();
93 out<<"\tposition "<<p.x<<' '<<p.y<<' '<<p.z<<";\n";
94 out<<"\trotation "<<(*i)->get_rotation()<<";\n";
95 out<<"\tslope "<<(*i)->get_slope()<<";\n";
97 unsigned id=(*i)->get_turnout_id();
99 out<<"\tturnout_id "<<id<<";\n";
101 id=(*i)->get_sensor_id();
103 out<<"\tsensor_id "<<id<<";\n";
106 out<<"\tflex true;\n";
115 Layout::Loader::Loader(Layout &l):
116 DataFile::BasicLoader<Layout>(l)
118 add("base", &Layout::base);
119 add("track", &Loader::track);
122 void Layout::Loader::finish()
126 for(set<Track *>::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i)
130 void Layout::Loader::track(unsigned art_nr)
132 TrackType &type=obj.catalogue.get_track(art_nr);
134 RefPtr<Track> trk=new Track(type);
136 obj.add_track(*trk.release());
139 } // namespace Marklin