Browse Source

Gmt module: Function LayerShift now using new parameter reading scheme and error reporting

gmtdatadir
Michael Uleysky 8 years ago
parent
commit
0a92d40792
  1. 50
      modules/gmt/modgmt_func.cpp
  2. 2
      modules/gmt/modgmt_func.h

50
modules/gmt/modgmt_func.cpp

@ -89,54 +89,44 @@ const ObjectBase* GMT_ColorCMYK(const ObjectList* input)
/*
Input:
1) Three arguments, first is Layer, second and third are double. Interprets as new absolute position in cm.
2) Pairs list. Names are l (layer), x, y, xrel (xr), yrel (yr). Pair with name l may be absent, in this case search in list and using as layer object with ObjectGMTLayer type. x and y are absolute positions in cm, xrel and yrel are shift from current position. x (y) and xrel (yrel) are mutually exlusive, but x (y) and yrel (xrel) can be used simultaneously. If position for some axis is absent, then this position is unchanged.
2) Pairs list. Names are l (layer), x, y, relx (rx), rely (ry). Pair with name l may be absent, in this case search in list and using as layer object with ObjectGMTLayer type. x and y are absolute positions in cm, relx and rely are shift from current position. x (y) and relx (rely) are mutually exlusive, but x (y) and rely (relx) can be used simultaneously. If position for some axis is absent, then this position is unchanged.
*/
const ObjectBase* GMT_LayerShift(const ObjectList* input)
{
auto size=input->Size();
struct gmt_layer layer;
std::string err;
// Case 1
if(3==size)
{
Base2Layer l(input,0);
Base2Double x(input,1), y(input,2);
bool suc=true;
layer=l(&suc);
if(!suc) goto case2;
layer.shiftx=x(&suc);
layer.shifty=y(&suc);
if(!suc) goto case2;
RPosPar<Base2Layer> l("layer");
OPosPar<Base2DoubleD> x("x",0.0), y("y",0.0);
{ParsePositionalParameters params(input,l,x,y); if(!params) goto case2;} // Try case 2, if case 1 failed.
layer=l; layer.shiftx=x; layer.shifty=y;
return new ObjectGMTLayer(layer);
}
case2:
// Search layer for shifting
{
SearchParameter<struct gmt_layer> original(input,"layer","l");
bool suc=true;
layer=original(&suc);
if(!suc) goto fail; // Conversion failed or too many arguments
}
// Do shift
{
BaseM2Double xr(input,"xrel","xr"), yr(input,"yrel","yr");
Base2Double x(input,"x"), y(input,"y");
bool suc=true;
RNPar<Base2Layer> l("layer");
ONPar<Base2Double> x("x"),y("y"),rx("r[el]x"),ry("r[el]y");
{ParseNamedParameters params(input,l,x,y); if(!params) {err=params.Error(); goto fail;}} // Parsing error
// Check duplicate parameters
if( ( x.Exist() && xr.Exist() ) || ( y.Exist() && yr.Exist() ) ) goto fail;
if(x.Exist()) layer.shiftx=x(&suc);
if(y.Exist()) layer.shifty=y(&suc);
if(xr.Exist()) layer.shiftx+=x(&suc);
if(yr.Exist()) layer.shifty+=y(&suc);
if(!suc) goto fail;
if(x.Exist() && rx.Exist()) {err="Only one of "+x.Name()+" or "+rx.Name()+" can be specified."; goto fail;}
if(y.Exist() && ry.Exist()) {err="Only one of "+y.Name()+" or "+ry.Name()+" can be specified."; goto fail;}
// Do shift
if( x.Exist()) layer.shiftx=x;
if( y.Exist()) layer.shifty=y;
if(rx.Exist()) layer.shiftx+=rx;
if(ry.Exist()) layer.shifty+=ry;
}
return new ObjectGMTLayer(layer);
fail:
return 0;
return new ObjectError("LayerShift",err);
}

2
modules/gmt/modgmt_func.h

@ -177,9 +177,11 @@ using Base2Color =Base2Struct<struct gmt_color>;
using Base2Dash =Base2Struct<struct gmt_dash>;
using Base2Pen =Base2Struct<struct gmt_pen>;
using Base2Font =Base2Struct<struct gmt_font>;
using Base2Layer =Base2Struct<struct gmt_layer>;
// Simple aliases of convertors with default values
using Base2StringD=Base2StructD<std::string>;
using Base2DoubleD=Base2StructD<double>;
// Specialised convertors
// Convertor with default value for gmt_coord. Added constructor for creating default value from double argument

Loading…
Cancel
Save