Browse Source

Make keys "layer" and "layers" synonyms. Same for "depth" and "depths".

master
Michael Uleysky 3 weeks ago
parent
commit
17cef3af99
  1. 8
      doc.txt
  2. 78
      src/CF.cpp

8
doc.txt

@ -74,11 +74,9 @@ COPERNICUS - источник для зеркалирования данных
filter - регулярное выражение, определяющее имена файлов для зеркалирования. По умолчанию - ".*". Только для действия mirror.
Следующие параметры влияют на выбор подмножества данных и работают для действий tsc и info.
lonb, lone, latb, late - регион, для которого берутся данные. В случае отсутствия используются минимумы/максимумы из данных.
layer, layers, depth, depths - выбор горизонта/горизонтов. Если отсутствуют все эти параметры, используется слой с нулевым номером (приповерхностный). Если присутствуют два или более параметра, то использует параметр с большим приоритетом. layer > depth > layers > depths.
layer - номер горизонта, ноль соответствует поверхности,
layers - номер горизонта или диапазон горизонтов через двоеточие или слово ALL (all) для выбора всех горизонтов,
depth - глубина, выбирается горизонт, ближайший к этой глубине,
depths - глубина или диапазон глубин, разделённых двоеточием, горизонты выбираются так же, как и для параметра depth.
layer, layers, depth, depths - выбор горизонта/горизонтов. Если отсутствуют все эти параметры, используется слой с нулевым номером (приповерхностный). Если присутствуют два или более параметра, то использует параметр с большим приоритетом (layers > layer > depths > depth).
layer, layers - номер горизонта (ноль соответствует поверхности) или диапазон горизонтов через двоеточие или слово ALL (all) для выбора всех горизонтов.
depth, depths - глубина или диапазон глубин, разделённых двоеточием, или слово ALL (all). Горизонты выбираются ближайшие к заданным глубинам.
time, timeb, timee, timefilt - параметры, управляющие выбором моментов времени. Использовать можно либо time, либо тройку timeb, timee, timefilt.
time - фиксированое время, регулярное выражение или одно из значений BEGIN, BEG, FIRST (соответствуют минимальному времени, для которого доступны данные) или END, LAST (соответствуют максимальному времени, для которого доступны данные). В случае фиксированого времени, выбирается ближайшее доступное время. Если time регулярное выражение, то это синоним timefilt.
timeb, timee, timefilt - выбираются времена в интервале timeb : timee, удовлетворяющие регулярному выражению timefilt. Если timefilt отсутствует, используются все времена в интервале. По умолчанию timeb=BEG, timee=END.

78
src/CF.cpp

@ -285,48 +285,21 @@ Error CF::FillAdapterFromCF(const CLArgs& args, michlib_internal::ParameterListE
rinfoplane->zb = rinfoplane->ze = rinfo->zb = rinfo->ze = depths.size() - 1;
}
if(args.contains("layer") || args.contains("depth"))
{
size_t layer = 0;
if(args.contains("layer"))
layer = args.at("layer").ToInteger<size_t>();
else
{
auto d = args.at("depth").ToReal();
if(d < depths.front()) d = depths.front();
if(d > depths.back()) d = depths.back();
for(size_t i = 0; i < depths.size() - 1; i++)
if(d >= depths[i] && d <= depths[i + 1])
{
layer = (d - depths[i] <= depths[i + 1] - d) ? i : (i + 1);
break;
}
if(debug) pars.AddParameter("Requested depth", d);
}
if(layer > depths.size() - 1) return {pref, "Layer must be lesser then " + MString(depths.size())};
rinfoplane->zb = rinfoplane->ze = rinfo->zb = rinfo->ze = depthinv ? depths.size() - layer - 1 : layer;
vert.reset(new Vertical(Vertical::Create<Vertical::Type::FIXED>(depths[layer])));
pars.AddParameter("layer", layer);
pars.AddParameter("depth", depths[layer]);
if(debug) pars.AddParameter("zb", rinfo->zb);
}
else if(args.contains("layers") || args.contains("depths"))
if(args.contains("layer") || args.contains("depth") || args.contains("layers") || args.contains("depths"))
{
size_t layer1 = 0, layer2 = 0;
if(args.contains("layers"))
if(args.contains("layers") || args.contains("layer"))
{
if(args.at("layers") == "ALL" || args.at("layers") == "all")
MString layerarg = args.contains("layers") ? args.at("layers") : args.at("layer");
if(layerarg == "ALL" || layerarg == "all")
{
layer1 = 0;
layer2 = depths.size() - 1;
}
else
{
auto layerstr = args.at("layers").Split(":");
auto layerstr = layerarg.Split(":");
if(layerstr.size() > 2 || layerstr.size() == 0) return {pref, "Layers must have format layer1:layer2"};
if(layerstr.size() == 1)
@ -340,11 +313,18 @@ Error CF::FillAdapterFromCF(const CLArgs& args, michlib_internal::ParameterListE
}
else
{
real d1 = 0.0, d2 = 0.0;
auto depthstr = args.at("depths").Split(":");
real d1 = 0.0, d2 = 0.0;
MString deptharg = args.contains("depths") ? args.at("depths") : args.at("depth");
auto depthstr = deptharg.Split(":");
if(depthstr.size() > 2 || depthstr.size() == 0) return {pref, "Depths must have format depth1:depth2"};
if(depthstr.size() == 1)
d1 = d2 = depthstr[0].ToReal();
if(depthstr[0] == "ALL" || depthstr[0] == "all")
{
d1 = depths.front();
d2 = depths.back();
}
else
d1 = d2 = depthstr[0].ToReal();
else
{
d1 = depthstr[0].ToReal();
@ -369,8 +349,13 @@ Error CF::FillAdapterFromCF(const CLArgs& args, michlib_internal::ParameterListE
}
if(debug)
{
pars.AddParameter("Requested depth1", d1);
pars.AddParameter("Requested depth2", d2);
if(d1 == d2)
pars.AddParameter("Requested depth", d1);
else
{
pars.AddParameter("Requested depth1", d1);
pars.AddParameter("Requested depth2", d2);
}
}
}
@ -381,10 +366,18 @@ Error CF::FillAdapterFromCF(const CLArgs& args, michlib_internal::ParameterListE
rinfo->zb = depthinv ? depths.size() - layer1 - 1 : layer1;
rinfo->ze = depthinv ? depths.size() - layer2 - 1 : layer2;
pars.AddParameter("layer1", layer1);
pars.AddParameter("depth1", depths[layer1]);
pars.AddParameter("layer2", layer2);
pars.AddParameter("depth2", depths[layer2]);
if(layer1 == layer2)
{
pars.AddParameter("layer", layer1);
pars.AddParameter("depth", depths[layer1]);
}
else
{
pars.AddParameter("layer1", layer1);
pars.AddParameter("depth1", depths[layer1]);
pars.AddParameter("layer2", layer2);
pars.AddParameter("depth2", depths[layer2]);
}
if(debug)
{
@ -393,6 +386,9 @@ Error CF::FillAdapterFromCF(const CLArgs& args, michlib_internal::ParameterListE
}
// Create vertical projection
if(layer1 == layer2)
vert.reset(new Vertical(Vertical::Create<Vertical::Type::FIXED>(depths[layer1])));
else
{
decltype(depths) rdepths(depths.begin() + layer1, depths.begin() + layer2 + 1);
vert.reset(new Vertical(Vertical::Create<Vertical::Type::HORIZONTS>(rdepths)));

Loading…
Cancel
Save