#pragma once #include "BFileW.h" #include "actiondep.h" #include "ncfilew.h" #include "ncfuncs.h" #include using michlib::BFileW; ADD_ACTION(TSC, tsc, ReadPSupported || ReadSupported); template MString ActionTSC::DoAction(const CLArgs& args, D& ds) { auto [reg, regerr] = GetRegion(args); if(regerr.Exist()) return regerr; auto resop = ds.Open(args); if(resop.Exist()) return "Can't open source: " + resop; michlib_internal::ParameterListEx pars; pars.UsePrefix(""); pars.SetParameter("source", args.at("source")); auto [tindexes, err] = GetTIndexes(ds, args, pars); if(err.Exist()) return err; if(!args.contains("var")) return "Variable not specified"; MString vname = args.at("var"); if(!ds.CheckVar(vname)) return "Variable " + vname + " not exists in this dataset"; pars.SetParameter("variable", vname); std::unique_ptr sourcepars; if constexpr(ParametersSupported) { if constexpr(ParametersRequiredRegion) { auto [p, err] = ds.Parameters(pars, args, reg); if(err.Exist()) return err; sourcepars.reset(p); } else { auto [p, err] = ds.Parameters(pars, args); if(err.Exist()) return err; sourcepars.reset(p); } } auto p = sourcepars.get(); auto data = Read(ds, vname, p, tindexes); if(!data) return "Can't read data"; if(!data.Unit().Exist()) michlib::errmessage("Unknown measurement unit!"); MString name = args.contains("out") ? args.at("out") : "out.bin"; MString outfmt = args.contains("format") ? args.at("format") : (GetExt(name) == "nc" ? "nc" : "bin"); if(outfmt == "bin") { BFileW fw; fw.Create(name, 3); fw.SetColumnName(1, "Longitude"); fw.SetColumnName(2, "Latitude"); fw.SetColumnName(3, vname + ", " + (data.Unit().Exist() ? data.Unit() : "unknown")); fw.SetParameters(pars); for(size_t i = 0; i < data.N(); i++) { fw.Write(data.Lon(i)); fw.Write(data.Lat(i)); fw.Write(data.IsFill(i) ? NAN : data(i)); } fw.Finalize(); fw.Close(); return ""; } if(outfmt == "nc" || outfmt == "netcdf") { int compress = 3; NCFileW fw; MString err; if(args.contains("compress")) compress = args.at("compress").ToInt(); if(!err.Exist()) err = fw.Create(data, name, args.at("_cmdline"), compress); if(!err.Exist()) err = fw.AddVariable(vname, NCFuncs::Name2StName(vname), NCFuncs::Name2LongName(vname), data.Unit()); if(!err.Exist()) err = fw.WriteGrid(data); if(!err.Exist()) err = fw.WriteVariable(data, vname); if(err.Exist()) return err; fw.Close(); return ""; } return "Unknown format: " + outfmt; };