X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=234b923411298cc755fde1c60a318f10eef88806;hb=444c7efb2fadb10e98197a62b791829d821370c0;hp=bd9ee712d5370ae5b7aac5afc180102fefdc6614;hpb=f9254f57b736927a57a2fd793ee18f6c9766dd43;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index bd9ee71..234b923 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -35,10 +35,44 @@ void Layout::add_track(Track &t) void Layout::remove_track(Track &t) { - if(tracks.count(&t)) - { - tracks.erase(&t); + if(tracks.erase(&t)) signal_track_removed.emit(t); +} + +void Layout::add_route(Route &r) +{ + if(routes.insert(&r).second) + signal_route_added.emit(r); +} + +void Layout::remove_route(Route &r) +{ + if(routes.erase(&r)) + signal_route_removed.emit(r); +} + +void Layout::save(const string &fn) +{ + IO::BufferedFile out(fn, IO::M_WRITE); + DataFile::Writer writer(out); + + if(!base.empty()) + writer.write((DataFile::Statement("base"), base)); + + for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + { + DataFile::Statement st("track"); + st.append((*i)->get_type().get_article_number()); + (*i)->save(st.sub); + writer.write(st); + } + + for(set::iterator i=routes.begin(); i!=routes.end(); ++i) + { + DataFile::Statement st("route"); + st.append((*i)->get_name()); + (*i)->save(st.sub); + writer.write(st); } } @@ -47,11 +81,11 @@ void Layout::check_links() for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) (*i)->break_links(); - set flext; + list flext; for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) { if((*i)->get_flex()) - flext.insert(*i); + flext.push_back(*i); else { for(set::iterator j=i; j!=tracks.end(); ++j) @@ -60,24 +94,65 @@ void Layout::check_links() } } - for(set::iterator i=flext.begin(); i!=flext.end(); ++i) + for(list::iterator i=flext.begin(); i!=flext.end(); ++i) for(set::iterator j=tracks.begin(); j!=tracks.end(); ++j) - if(j!=i) + if(*j!=*i) (*i)->snap_to(**j, true); } -void Layout::save(const string &fn) +void Layout::check_routes() { - IO::BufferedFile out(fn, IO::M_WRITE); - DataFile::Writer writer(out); - if(!base.empty()) - writer.write((DataFile::Statement("base"), base)); - for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) + for(set::iterator i=routes.begin(); i!=routes.end(); ++i) { - DataFile::Statement st("track"); - st.append((*i)->get_type().get_article_number()); - (*i)->save(st.sub); - writer.write(st); + // We must copy the turnout map, since adding tracks to the route will (temporarily) mess it up + const map turnouts = (*i)->get_turnouts(); + + Track *track = 0; + unsigned trk_route = 0; + for(set::const_iterator j=tracks.begin(); j!=tracks.end(); ++j) + { + map::const_iterator k = turnouts.find((*j)->get_turnout_id()); + if(k!=turnouts.end()) + { + track = *j; + trk_route = k->second; + break; + } + } + + (*i)->add_track(*track); + + const vector &eps = track->get_type().get_endpoints(); + unsigned ep = 0; + for(unsigned j=0; jtraverse(ep, trk_route); + if(out_ep<0) + break; + Track *next = track->get_links()[out_ep]; + if(!next || next == start) + break; + ep = next->get_endpoint_by_link(*track); + if(next->get_type().get_n_routes()>1) + { + map::const_iterator j = turnouts.find(next->get_turnout_id()); + if(j==turnouts.end()) + break; + trk_route = j->second; + } + else + trk_route = 0; + (*i)->add_track(*next); + track = next; + } } } @@ -86,17 +161,26 @@ Layout::Loader::Loader(Layout &l): DataFile::BasicLoader(l) { add("base", &Layout::base); + add("route", &Loader::route); add("track", &Loader::track); } void Layout::Loader::finish() { obj.check_links(); + obj.check_routes(); for(set::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i) (*i)->check_slope(); } +void Layout::Loader::route(const string &n) +{ + RefPtr rte = new Route(n); + load_sub(*rte); + obj.add_route(*rte.release()); +} + void Layout::Loader::track(unsigned art_nr) { TrackType &type = obj.catalogue.get_track(art_nr);