#pragma once #include "BFileR.h" #include "ParseArgs.h" #include "mdatetime.h" #include "mregex.h" #include "simple2ddata.h" #include #include using michlib::M_PI; using michlib::MDateTime; using michlib::real; using michlib::Round; class VYLETData { std::unique_ptr vylet; MDateTime start, end, ref; bool invtime; real maxx, maxy; std::vector lons, lats; std::vector elon, elat; MDateTime R2Time(real r) const { auto sec = static_cast(Round(r * MDateTime::secondsperday)); return ref + (invtime ? -sec : sec); }; public: using Data = Rect2DData; private: auto Name2ColNum(const MString& name) const { auto nc = vylet->Columns(); decltype(nc) i; for(i = 1; i <= nc; i++) if(vylet->ColumnName(i) == name) return i; i = 0; return i; } Data ReadD() const; Data ReadL() const; Data ReadT() const; Data ReadNx() const; Data ReadNy() const; Data ReadRx() const; Data ReadRy() const; Data ReadEx() const; Data ReadEy() const; Data ReadPhip() const; Data ReadPhim() const; Data ReadPhit() const; Data ReaddS() const; Data ReadAngle() const; Data ReadLen() const; Data ReadTmask() const; public: static constexpr const char* name = "VYLET"; static constexpr const char* disabledactions = "genintfile uv"; MString DefaultVars() const { MString vars = "vylD,vylRx,vylRy,vylEx,vylEy,vylAngle,vylLen"; if(HasLyap()) vars += ",vylL"; if(HasTime()) vars += ",vylT"; return vars; } VarPresence CheckVar(const MString& vname) const { std::set vars{"vylD", "vylNx", "vylNy", "vylRx", "vylRy", "vylEx", "vylEy", "vylPhip", "vylPhim", "vylPhit", "vylAngle", "vylLen"}; if(HasLyap()) vars.insert("vylL"); if(HasLyap()) vars.insert("vyldS"); if(HasTime()) vars.insert("vylT"); if(HasTime()) vars.insert("vylTmask"); return vars.contains(vname) ? VarPresence::DERIVED : VarPresence::NONE; } bool Read(const MString& vname, std::map& cache, size_t tind) const; size_t NTimes() const { return vylet ? 1 : 0; } MDateTime Time(size_t i) const { if(i == 0 && vylet) return start; return MDateTime(); } bool HasLyap() const { if(!vylet) return false; vylet->UsePrefix(""); MString method = vylet->ParameterSValue("Method", ""); return method == "BicubicL" || method == "BicubicIL"; } bool HasCoast() const { if(!vylet) return false; vylet->UsePrefix(""); return vylet->ParameterBValue("checkcoast", true); } real Left() const { vylet->UsePrefix(""); return vylet->ParameterRValue("xl", -1.0); } real Right() const { vylet->UsePrefix(""); return vylet->ParameterRValue("xr", maxx + 1.0); } real Down() const { vylet->UsePrefix(""); return vylet->ParameterRValue("yd", -1.0); } real Up() const { vylet->UsePrefix(""); return vylet->ParameterRValue("yu", maxy + 1.0); } bool HasBorders() const { return Left() >= 0.0 || Right() <= maxx || Down() >= 0.0 || Up() <= maxy; } bool HasTime() const { return HasCoast() || HasBorders(); } bool LengthFast() const { vylet->UsePrefix(""); return !vylet->ParameterBValue("sisangle", false); } MString Info() const; MString Open(const CLArgs& args); };