From: Mikko Rasa Date: Sat, 25 May 2013 23:00:12 +0000 (+0300) Subject: Don't force signals to be positioned next to track X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=3109ae75c6de3b64b546fa9807d4299b337ca04b;p=r2c2.git Don't force signals to be positioned next to track They can now be positioned freely and will logically attach to a nearby track. --- diff --git a/source/libr2c2/signal.cpp b/source/libr2c2/signal.cpp index a25f8ec..0139b1f 100644 --- a/source/libr2c2/signal.cpp +++ b/source/libr2c2/signal.cpp @@ -1,4 +1,5 @@ #include "blockiter.h" +#include "catalogue.h" #include "driver.h" #include "layout.h" #include "signal.h" @@ -50,32 +51,36 @@ void Signal::set_address(unsigned a) } void Signal::set_position(const Vector &p) +{ + position = p; + + update_location(); +} + +void Signal::update_location() { const set &tracks = layout.get_tracks(); + float limit = layout.get_catalogue().get_gauge()*2; float dist = -1; for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) if(!(*i)->get_type().is_turnout()) { Snap sn; - sn.position = p; + sn.position = position; sn.rotation = rotation; - (*i)->snap(sn, 1000, SNAP_SEGMENT); - float d = distance(p, sn.position); + (*i)->snap(sn, limit, SNAP_SEGMENT); + float d = distance(position, sn.position); if(dget_block(); + if(!track) + return; unsigned n_endpoints = track->get_type().get_endpoints().size(); for(unsigned j=0; j=Angle::quarter_turn()) { BlockIter biter = TrackIter(track, j).block_iter(); - entry = biter.entry(); + if(biter) + { + block = &track->get_block(); + entry = biter.entry(); + } } } } void Signal::set_rotation(const Angle &r) { - Angle a = wrap_with_base(rotation-r, -Angle::quarter_turn()); - if(a>=Angle::quarter_turn()) - rotation = wrap_positive(rotation+Angle::half_turn()); + rotation = r; - normalize_location(); + update_location(); } unsigned Signal::get_n_snap_nodes() const diff --git a/source/libr2c2/signal.h b/source/libr2c2/signal.h index 886db69..73f4bb3 100644 --- a/source/libr2c2/signal.h +++ b/source/libr2c2/signal.h @@ -50,7 +50,7 @@ public: virtual void set_position(const Vector &); virtual void set_rotation(const Angle &); private: - void normalize_location(); + void update_location(); public: virtual Track *get_parent() const { return track; }