X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrack.cpp;h=74e51acab73fddb2246b750d23a3339b9e2dab24;hb=f409cd39a687900724d987c9db629cbff0dd49be;hp=250888dd6a8f5aa23f331a1bcf39830c789d3af7;hpb=47bff0c8939de3ae20b5ced1ee2f6a264397dcee;p=r2c2.git diff --git a/source/libmarklin/track.cpp b/source/libmarklin/track.cpp index 250888d..74e51ac 100644 --- a/source/libmarklin/track.cpp +++ b/source/libmarklin/track.cpp @@ -22,15 +22,17 @@ Track::Track(Layout &l, const TrackType &t): rot(0), slope(0), flex(false), - turnout_id(0), + turnout_id(type.is_turnout() ? layout.allocate_turnout_id() : 0), sensor_id(0), - links(t.get_endpoints().size()), + links(type.get_endpoints().size()), active_path(0) { layout.add_track(*this); if(layout.has_driver()) layout.get_driver().signal_turnout.connect(sigc::mem_fun(this, &Track::turnout_event)); + + for(unsigned paths = type.get_paths(); !(paths&1); ++active_path, paths>>=1) ; } Track::~Track() @@ -101,8 +103,13 @@ void Track::set_turnout_id(unsigned i) turnout_id = i; layout.create_blocks(*this); + layout.update_routes(); if(layout.has_driver() && turnout_id) + { layout.get_driver().add_turnout(turnout_id); + if(type.is_double_address()) + layout.get_driver().add_turnout(turnout_id+1); + } } void Track::set_sensor_id(unsigned i) @@ -124,8 +131,10 @@ void Track::set_active_path(unsigned p) throw InvalidParameterValue("Invalid path"); layout.get_driver().set_turnout(turnout_id, p&1); - if(type.get_n_paths()>2) + if(type.is_double_address()) layout.get_driver().set_turnout(turnout_id+1, p&2); + else if(type.get_n_paths()>2) + active_path = (active_path&1) | (p&2); } int Track::get_endpoint_by_link(const Track &other) const @@ -167,7 +176,7 @@ float Track::get_endpoint_direction(unsigned epi) const bool Track::snap_to(Track &other, bool link) { - float limit = (link && !flex) ? 1e-6 : 1e-4; + float limit = (link && !flex && !other.get_flex()) ? 1e-6 : 1e-4; const vector &eps = type.get_endpoints(); const vector &other_eps = other.get_type().get_endpoints(); @@ -185,13 +194,16 @@ bool Track::snap_to(Track &other, bool link) float dy = epp2.y-epp.y; if(dx*dx+dy*dy &st) const { st.push_back((DataFile::Statement("position"), pos.x, pos.y, pos.z));