X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftracktype.cpp;h=6b16c553809dc7941a9523aac7889ee34f8a4f34;hb=11c68656ac53318801dcb36078509a07ae2c2a94;hp=7a1f27ad5adcc69ee282a028d10755dabf68d37a;hpb=d405b9943c888e3945c7ea4e496f9d300b114fe0;p=r2c2.git diff --git a/source/libr2c2/tracktype.cpp b/source/libr2c2/tracktype.cpp index 7a1f27a..6b16c55 100644 --- a/source/libr2c2/tracktype.cpp +++ b/source/libr2c2/tracktype.cpp @@ -1,5 +1,7 @@ #include +#include #include +#include "trackappearance.h" #include "tracktype.h" using namespace std; @@ -7,13 +9,25 @@ using namespace Msp; namespace R2C2 { -TrackType::TrackType(const ArticleNumber &an, const TrackAppearance &ta): +TrackType::TrackType(const ArticleNumber &an): ObjectType(an), - appearance(ta), + appearance(0), state_bits(0), autofit_preference(1) { } +const TrackAppearance &TrackType::get_appearance() const +{ + if(!appearance) + throw logic_error("no appearance"); + return *appearance; +} + +float TrackType::get_gauge() const +{ + return get_appearance().get_gauge(); +} + float TrackType::get_total_length() const { return get_path_length(-1); @@ -44,6 +58,36 @@ unsigned TrackType::get_n_paths() const return n; } +unsigned TrackType::coerce_path(unsigned entry, unsigned path) const +{ + const Endpoint &ep = get_endpoint(entry); + if(ep.has_path(path)) + return path; + + unsigned paths = get_paths(); + if(paths>>(1<>p; p+=step) + if(ep.has_path(p)) + return p; + } + + // Find an endpoint that's connected to the entry and has the requested path + for(vector::const_iterator i=endpoints.begin(); i!=endpoints.end(); ++i) + if(i->has_path(path) && i->has_common_paths(ep)) + { + unsigned p = 1; + for(unsigned m=i->paths&ep.paths; m>>p; ++p) ; + return p-1; + } + + // TODO crossings fall here + throw logic_error("TrackType::coerce_path"); +} + bool TrackType::is_turnout() const { return endpoints.size()>2; @@ -178,10 +222,12 @@ TrackType::Endpoint::Endpoint(float x, float y, const Angle &d, unsigned p): { } -TrackType::Loader::Loader(TrackType &t): +TrackType::Loader::Loader(TrackType &t, Collection &c): DataFile::DerivedObjectLoader(t), + coll(c), state_bits_set(false) { + add("appearance", &TrackType::appearance); add("autofit_preference", &TrackType::autofit_preference); add("object", &TrackType::object); add("state_bits", &Loader::state_bits);