bool handle_args(EnvT* e) { //T3D? static int t3dIx = e->KeywordIx( "T3D"); doT3d=(e->KeywordSet(t3dIx)|| T3Denabled()); //note: Z (VALUE) will be used uniquely if Z is not effectively defined. static int zvIx = e->KeywordIx( "ZVALUE"); zValue=0.0; e->AssureDoubleScalarKWIfPresent ( zvIx, zValue ); zValue=min(zValue,0.999999); //to avoid problems with plplot zValue=max(zValue,0.0); // system variable !P.NSUM first DLong nsum=(*static_cast<DLongGDL*>(SysVar::P()-> GetTag(SysVar::P()->Desc()->TagIndex("NSUM"), 0)))[0]; static int NSUMIx = e->KeywordIx( "NSUM"); e->AssureLongScalarKWIfPresent( NSUMIx, nsum); static int polarIx = e->KeywordIx( "POLAR"); bool polar = (e->KeywordSet(polarIx)); // DDoubleGDL *yValBis, *xValBis; // Guard<BaseGDL> xvalBis_guard, yvalBis_guard; //test and transform eventually if POLAR and/or NSUM! if( nParam() == 1) { yTemp = e->GetParAs< DDoubleGDL>( 0); if (yTemp->Rank() == 0) e->Throw("Expression must be an array in this context: "+e->GetParString(0)); yEl=yTemp->N_Elements(); xEl=yEl; xTemp = new DDoubleGDL( dimension( xEl), BaseGDL::INDGEN); xtemp_guard.Reset( xTemp); // delete upon exit } else { xTemp = e->GetParAs< DDoubleGDL>( 0); if (xTemp->Rank() == 0) e->Throw("Expression must be an array in this context: "+e->GetParString(0)); xEl=xTemp->N_Elements(); yTemp = e->GetParAs< DDoubleGDL>( 1); if (yTemp->Rank() == 0) e->Throw("Expression must be an array in this context: "+e->GetParString(1)); yEl=yTemp->N_Elements(); //silently drop unmatched values if (yEl != xEl) { SizeT size; size = min(xEl, yEl); xEl = size; yEl = size; } } //check nsum validity nsum=max(1,nsum); nsum=min(nsum,(DLong)xEl); if (nsum == 1) { if (polar) { xVal = new DDoubleGDL(dimension(xEl), BaseGDL::NOZERO); xval_guard.Reset(xVal); // delete upon exit yVal = new DDoubleGDL(dimension(yEl), BaseGDL::NOZERO); yval_guard.Reset(yVal); // delete upon exit for (int i = 0; i < xEl; i++) (*xVal)[i] = (*xTemp)[i] * cos((*yTemp)[i]); for (int i = 0; i < yEl; i++) (*yVal)[i] = (*xTemp)[i] * sin((*yTemp)[i]); } else { //careful about previously set autopointers! if (nParam() == 1) xval_guard.Init( xtemp_guard.release()); xVal = xTemp; yVal = yTemp; } } else { int i, j, k; DLong size = (DLong)xEl / nsum; xVal = new DDoubleGDL(size, BaseGDL::ZERO); //SHOULD BE ZERO, IS NOT! xval_guard.Reset(xVal); // delete upon exit yVal = new DDoubleGDL(size, BaseGDL::ZERO); //IDEM yval_guard.Reset(yVal); // delete upon exit for (i = 0, k = 0; i < size; i++) { (*xVal)[i] = 0.0; (*yVal)[i] = 0.0; for (j = 0; j < nsum; j++, k++) { (*xVal)[i] += (*xTemp)[k]; (*yVal)[i] += (*yTemp)[k]; } } for (i = 0; i < size; i++) (*xVal)[i] /= nsum; for (i = 0; i < size; i++) (*yVal)[i] /= nsum; if (polar) { DDouble x, y; for (i = 0; i < size; i++) { x = (*xVal)[i] * cos((*yVal)[i]); y = (*xVal)[i] * sin((*yVal)[i]); (*xVal)[i] = x; (*yVal)[i] = y; } } } return false; }
bool handle_args (EnvT* e) { // handle Log options passing via Keywords // note: undocumented keywords [xyz]type still exist and // have priority on [xyz]log ! static int xTypeIx = e->KeywordIx( "XTYPE" ); static int yTypeIx = e->KeywordIx( "YTYPE" ); static int zTypeIx = e->KeywordIx( "ZTYPE" ); static int xLogIx = e->KeywordIx( "XLOG" ); static int yLogIx = e->KeywordIx( "YLOG" ); static int zLogIx = e->KeywordIx( "ZLOG" ); static int xTickunitsIx = e->KeywordIx( "XTICKUNITS" ); static int yTickunitsIx = e->KeywordIx( "YTICKUNITS" ); static int zTickunitsIx = e->KeywordIx( "ZTICKUNITS" ); if ( e->KeywordPresent( xTypeIx ) ) xLog = e->KeywordSet( xTypeIx ); else xLog = e->KeywordSet( xLogIx ); if ( e->KeywordPresent( yTypeIx ) ) yLog = e->KeywordSet( yTypeIx ); else yLog = e->KeywordSet( yLogIx ); if ( e->KeywordPresent( zTypeIx ) ) zLog = e->KeywordSet( zTypeIx ); else zLog = e->KeywordSet( zLogIx ); if ( xLog && e->KeywordSet( xTickunitsIx ) ) { Message( "PLOT: LOG setting ignored for Date/Time TICKUNITS." ); xLog = FALSE; } if ( yLog && e->KeywordSet( yTickunitsIx ) ) { Message( "PLOT: LOG setting ignored for Date/Time TICKUNITS." ); yLog = FALSE; } if ( zLog && e->KeywordSet( zTickunitsIx ) ) { Message( "PLOT: LOG setting ignored for Date/Time TICKUNITS." ); zLog = FALSE; } if ( nParam ( )==1 ) { if ( (e->GetNumericArrayParDefined ( 0 ))->Rank ( )!=2 ) e->Throw ( "Array must have 2 dimensions: " +e->GetParString ( 0 ) ); BaseGDL* p0=e->GetNumericArrayParDefined ( 0 )->Transpose ( NULL ); zVal=static_cast<DDoubleGDL*> ( p0->Convert2 ( GDL_DOUBLE, BaseGDL::COPY ) ); p0_guard.reset ( p0 ); // delete upon exit if ( zVal->Rank ( )!=2 ) e->Throw ( "Array must have 2 dimensions: " +e->GetParString ( 0 ) ); xEl=zVal->Dim ( 1 ); yEl=zVal->Dim ( 0 ); xVal=new DDoubleGDL ( dimension ( xEl ), BaseGDL::INDGEN ); xval_guard.reset ( xVal ); // delete upon exit if (xLog) xVal->Inc(); yVal=new DDoubleGDL ( dimension ( yEl ), BaseGDL::INDGEN ); yval_guard.reset ( yVal ); // delete upon exit if (yLog) yVal->Inc(); } else if ( nParam ( )==2||nParam ( )>3 ) { e->Throw ( "Incorrect number of arguments." ); } else { BaseGDL* p0=e->GetNumericArrayParDefined ( 0 )->Transpose ( NULL ); zVal=static_cast<DDoubleGDL*> ( p0->Convert2 ( GDL_DOUBLE, BaseGDL::COPY ) ); p0_guard.reset ( p0 ); // delete upon exit if ( zVal->Rank ( )!=2 ) e->Throw ( "Array must have 2 dimensions: " +e->GetParString ( 0 ) ); xVal=e->GetParAs< DDoubleGDL>( 1 ); yVal=e->GetParAs< DDoubleGDL>( 2 ); if ( xVal->Rank ( )!=1 ) e->Throw ( "Unable to handle non-vectorial array "+e->GetParString ( 1 )+" (FIXME!)" ); if ( yVal->Rank ( )!=1 ) e->Throw ( "Unable to handle non-vectorial array "+e->GetParString ( 1 )+" (FIXME!)" ); if ( xVal->Rank ( )==1 ) { xEl=xVal->Dim ( 0 ); if ( xEl!=zVal->Dim ( 1 ) ) e->Throw ( "X, Y, or Z array dimensions are incompatible." ); } if ( yVal->Rank ( )==1 ) { yEl=yVal->Dim ( 0 ); if ( yEl!=zVal->Dim ( 0 ) ) e->Throw ( "X, Y, or Z array dimensions are incompatible." ); } } GetMinMaxVal ( xVal, &xStart, &xEnd ); GetMinMaxVal ( yVal, &yStart, &yEnd ); //XRANGE and YRANGE overrides all that, but Start/End should be recomputed accordingly DDouble xAxisStart, xAxisEnd, yAxisStart, yAxisEnd; bool setx=gdlGetDesiredAxisRange(e, "X", xAxisStart, xAxisEnd); bool sety=gdlGetDesiredAxisRange(e, "Y", yAxisStart, yAxisEnd); if(setx && sety) { xStart=xAxisStart; xEnd=xAxisEnd; yStart=yAxisStart; yEnd=yAxisEnd; } else if (sety) { yStart=yAxisStart; yEnd=yAxisEnd; } else if (setx) { xStart=xAxisStart; xEnd=xAxisEnd; //must compute min-max for other axis! { gdlDoRangeExtrema(xVal,yVal,yStart,yEnd,xStart,xEnd); } } #undef UNDEF_RANGE_VALUE // z range datamax=0.0; datamin=0.0; GetMinMaxVal ( zVal, &datamin, &datamax ); zStart=datamin; zEnd=datamax; setZrange = gdlGetDesiredAxisRange(e, "Z", zStart, zEnd); //SHADES: Doing the job will be for nothing since plplot does not give the functionality. static int shadesIx=e->KeywordIx ( "SHADES" ); doShade=false; if ( e->GetKW ( shadesIx )!=NULL ) { shades=e->GetKWAs<DLongGDL>( shadesIx ); doShade=true; } else { // Get COLOR from PLOT system variable static DStructGDL* pStruct=SysVar::P(); shades=new DLongGDL( 1, BaseGDL::NOZERO ); shades_guard.Init ( shades ); // delete upon exit shades=static_cast<DLongGDL*>(pStruct->GetTag(pStruct->Desc()->TagIndex("COLOR"), 0)); doShade=false; } if (doShade) Warning ( "SHADE_SURF: SHADES array ignored, shading with current color table." ); return false; }
bool handle_args (EnvT* e) { xLog=e->KeywordSet ( "XLOG" ); yLog=e->KeywordSet ( "YLOG" ); zLog=e->KeywordSet ( "ZLOG" ); if ( nParam ( )==1 ) { if ( (e->GetNumericArrayParDefined ( 0 ))->Rank ( )!=2 ) e->Throw ( "Array must have 2 dimensions: " +e->GetParString ( 0 ) ); BaseGDL* p0=e->GetNumericArrayParDefined ( 0 )->Transpose ( NULL ); zVal=static_cast<DDoubleGDL*> ( p0->Convert2 ( GDL_DOUBLE, BaseGDL::COPY ) ); p0_guard.reset ( p0 ); // delete upon exit if ( zVal->Rank ( )!=2 ) e->Throw ( "Array must have 2 dimensions: " +e->GetParString ( 0 ) ); xEl=zVal->Dim ( 1 ); yEl=zVal->Dim ( 0 ); xVal=new DDoubleGDL ( dimension ( xEl ), BaseGDL::INDGEN ); xval_guard.reset ( xVal ); // delete upon exit if (xLog) xVal->Inc(); yVal=new DDoubleGDL ( dimension ( yEl ), BaseGDL::INDGEN ); yval_guard.reset ( yVal ); // delete upon exit if (yLog) yVal->Inc(); } else if ( nParam ( )==2||nParam ( )>3 ) { e->Throw ( "Incorrect number of arguments." ); } else { BaseGDL* p0=e->GetNumericArrayParDefined ( 0 )->Transpose ( NULL ); zVal=static_cast<DDoubleGDL*> ( p0->Convert2 ( GDL_DOUBLE, BaseGDL::COPY ) ); p0_guard.reset ( p0 ); // delete upon exit if ( zVal->Rank ( )!=2 ) e->Throw ( "Array must have 2 dimensions: " +e->GetParString ( 0 ) ); xVal=e->GetParAs< DDoubleGDL>( 1 ); yVal=e->GetParAs< DDoubleGDL>( 2 ); if ( xVal->Rank ( )!=1 ) e->Throw ( "Unable to handle non-vectorial array "+e->GetParString ( 1 )+" (FIXME!)" ); if ( yVal->Rank ( )!=1 ) e->Throw ( "Unable to handle non-vectorial array "+e->GetParString ( 1 )+" (FIXME!)" ); if ( xVal->Rank ( )==1 ) { xEl=xVal->Dim ( 0 ); if ( xEl!=zVal->Dim ( 1 ) ) e->Throw ( "X, Y, or Z array dimensions are incompatible." ); } if ( yVal->Rank ( )==1 ) { yEl=yVal->Dim ( 0 ); if ( yEl!=zVal->Dim ( 0 ) ) e->Throw ( "X, Y, or Z array dimensions are incompatible." ); } } GetMinMaxVal ( xVal, &xStart, &xEnd ); GetMinMaxVal ( yVal, &yStart, &yEnd ); //XRANGE and YRANGE overrides all that, but Start/End should be recomputed accordingly DDouble xAxisStart, xAxisEnd, yAxisStart, yAxisEnd; bool setx=gdlGetDesiredAxisRange(e, "X", xAxisStart, xAxisEnd); bool sety=gdlGetDesiredAxisRange(e, "Y", yAxisStart, yAxisEnd); if(setx && sety) { xStart=xAxisStart; xEnd=xAxisEnd; yStart=yAxisStart; yEnd=yAxisEnd; } else if (sety) { yStart=yAxisStart; yEnd=yAxisEnd; } else if (setx) { xStart=xAxisStart; xEnd=xAxisEnd; //must compute min-max for other axis! { gdlDoRangeExtrema(xVal,yVal,yStart,yEnd,xStart,xEnd); } } #undef UNDEF_RANGE_VALUE // z range datamax=0.0; datamin=0.0; GetMinMaxVal ( zVal, &datamin, &datamax ); zStart=datamin; zEnd=datamax; setZrange = gdlGetDesiredAxisRange(e, "Z", zStart, zEnd); return false; }