X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=a495a21968b62ade01645c3e733939d101c1feea;hb=f409cd39a687900724d987c9db629cbff0dd49be;hp=1448a1d76eef08085e76f4604c29fc2586b43e04;hpb=0ba614d0d72aed74edcf03f8bb9f655d06719641;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index 1448a1d..a495a21 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -28,7 +28,8 @@ namespace Marklin { Layout::Layout(Catalogue &c, Driver *d): catalogue(c), - driver(d) + driver(d), + next_turnout_id(0x800) { if(driver) driver->signal_sensor.connect(sigc::mem_fun(this, &Layout::sensor_event)); @@ -72,6 +73,11 @@ void Layout::remove_track(Track &t) } } +unsigned Layout::allocate_turnout_id() +{ + return next_turnout_id++; +} + void Layout::add_block(Block &b) { blocks.insert(&b); @@ -157,6 +163,12 @@ Route &Layout::get_route(const string &name) const return *i->second; } +void Layout::update_routes() +{ + for(map::iterator i=routes.begin(); i!=routes.end(); ++i) + i->second->update_turnouts(); +} + void Layout::remove_route(Route &r) { if(routes.erase(r.get_name())) @@ -264,106 +276,6 @@ void Layout::save_trains(const string &fn) } } -void Layout::check_links() -{ - for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) - (*i)->break_links(); - - list flext; - for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) - { - if((*i)->get_flex()) - flext.push_back(*i); - else - { - for(set::iterator j=i; j!=tracks.end(); ++j) - if(j!=i) - (*i)->snap_to(**j, true); - } - } - - for(list::iterator i=flext.begin(); i!=flext.end(); ++i) - for(set::iterator j=tracks.begin(); j!=tracks.end(); ++j) - if(*j!=*i) - (*i)->snap_to(**j, true); -} - -void Layout::check_routes() -{ - for(map::iterator i=routes.begin(); i!=routes.end(); ++i) - { - if(i->second->is_temporary()) - continue; - - /* We must copy the turnout map, since adding tracks to the route will - (temporarily) mess it up */ - const map turnouts = i->second->get_turnouts(); - - // Find any turnout in the route - Track *track = 0; - unsigned trk_path = 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_path = k->second; - break; - } - } - - if(!track) - continue; - - // Find an applicable endpoint - const vector &eps = track->get_type().get_endpoints(); - unsigned ep = 0; - for(unsigned j=0; jget_type().get_endpoints().size()<2) - break; - unsigned out_ep = track->traverse(ep, trk_path); - Track *next = track->get_links()[out_ep]; - if(!next || next == start) - break; - - ep = next->get_endpoint_by_link(*track); - if(next->get_type().is_turnout()) - { - // Select correct path across the turnout, or break if we hit an unknown turnout - map::const_iterator j = turnouts.find(next->get_turnout_id()); - if(j==turnouts.end()) - break; - trk_path = j->second; - } - else - { - trk_path = 0; - - /* Start adding tracks when we find the first non-turnout. This - prevents the occurrence of ambiguities while adding the tracks */ - if(!start) - start = next; - } - - if(start) - i->second->add_track(*next); - - track = next; - } - } -} - void Layout::sensor_event(unsigned addr, bool state) { if(state) @@ -391,10 +303,6 @@ Layout::Loader::Loader(Layout &l): void Layout::Loader::finish() { - if(new_tracks) - obj.check_links(); - obj.check_routes(); - for(set::iterator i=obj.tracks.begin(); i!=obj.tracks.end(); ++i) (*i)->check_slope(); } @@ -410,6 +318,9 @@ void Layout::Loader::track(unsigned art_nr) Track *trk = new Track(obj, obj.catalogue.get_track(art_nr)); load_sub(*trk); new_tracks = true; + for(set::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)