?? ogrfeaturestyle.cpp
字號:
return FALSE;
break;
}
////////////////////////////////////////////////////////////////////////
// Here we will loop on each element in the StyleString. If it's
// a valid element, we will add it in the StyleTool with
// SetParamStr().
//
// It's important to note that the SetInternalUnit...() is use to update
// the unit of the StyleTool param (m_eUnit).
// See OGRStyleTool::SetParamStr().
// There's a StyleTool unit (m_eUnit), which is the output unit, and each
// parameter of the style have its own unit value (the input unit). Here we
// set m_eUnit to the input unit and in SetParamStr(), we will use this
// value to set the input unit. Then after the loop we will reset m_eUnit
// to it's original value. (Yes it's a side effect / black magic)
//
// The pasStyle variable is a global variable passed in argument to the
// function. See at the top of this file the four OGRStyleParamId
// variable. They are used to register the valid parameter of each
// StyleTool.
////////////////////////////////////////////////////////////////////////
// Save Scale and output Units because the parsing code will alter
// the values
eLastUnit = m_eUnit;
double dSavedScale = m_dfScale;
int i, nElements = CSLCount(papszToken2);
for ( i = 0; i < nElements; i++ )
{
char **papszStylePair =
CSLTokenizeString2( papszToken2[i], ":", CSLT_HONOURSTRINGS );
int j, nTokens = CSLCount(papszStylePair);
if ( nTokens < 1 || nTokens > 2 )
{
CPLError( CE_Warning, CPLE_AppDefined,
"Error in the StyleTool String %s", m_pszStyleString );
CPLError( CE_Warning, CPLE_AppDefined,
"Malformed element #%d (\"%s\") skipped",
i, papszToken2[i] );
CSLDestroy(papszStylePair);
continue;
}
for ( j = 0; j < nCount; j++ )
{
if ( EQUAL(pasStyle[j].pszToken, papszStylePair[0]) )
{
if (nTokens == 2 && pasStyle[j].bGeoref == TRUE)
SetInternalInputUnitFromParam(papszStylePair[1]);
// Set either the actual value of style parameter or "1"
// for boolean parameters which do not have values.
// "1" means that boolean parameter is present in the style
// string.
OGRStyleTool::SetParamStr( pasStyle[j], pasValue[j],
(nTokens == 2) ? papszStylePair[1] : "1" );
break;
}
}
CSLDestroy( papszStylePair );
}
m_eUnit = eLastUnit;
m_dfScale = dSavedScale;
CSLDestroy(papszToken2);
CSLDestroy(papszToken);
return TRUE;
}
/************************************************************************/
/* SetInternalInputUnitFromParam() */
/************************************************************************/
void OGRStyleTool::SetInternalInputUnitFromParam(char *pszString)
{
char *pszUnit;
if (pszString == NULL)
return;
pszUnit = strstr(pszString,"g");
if (pszUnit)
{
SetUnit(OGRSTUGround);
pszUnit[0]= '\0';
return;
}
pszUnit = strstr(pszString,"px");
if (pszUnit)
{
SetUnit(OGRSTUPixel);
pszUnit[0]= '\0';
return;
}
pszUnit = strstr(pszString,"pt");
if (pszUnit)
{
SetUnit(OGRSTUPoints);
pszUnit[0]= '\0';
return;
}
pszUnit = strstr(pszString,"mm");
if (pszUnit)
{
SetUnit(OGRSTUMM);
pszUnit[0]= '\0';
return;
}
pszUnit = strstr(pszString,"cm");
if (pszUnit)
{
SetUnit(OGRSTUCM);
pszUnit[0]= '\0';
return;
}
pszUnit = strstr(pszString,"in");
if (pszUnit)
{
SetUnit(OGRSTUInches);
pszUnit[0]= '\0';
return;
}
SetUnit(OGRSTUMM);
}
/************************************************************************/
/* ComputeWithUnit() */
/************************************************************************/
double OGRStyleTool::ComputeWithUnit(double dfValue, OGRSTUnitId eInputUnit)
{
OGRSTUnitId eOutputUnit = GetUnit();
double dfNewValue = dfValue; // dfValue in Meter;
if (eOutputUnit == eInputUnit)
return dfValue;
switch (eInputUnit)
{
case OGRSTUGround:
dfNewValue = dfValue / m_dfScale;
break;
case OGRSTUPixel:
dfNewValue = dfValue / (72.0 * 39.37);
break;
case OGRSTUPoints:
dfNewValue =dfValue / (72.0 * 39.37);
break;
case OGRSTUMM:
dfNewValue = 0.001 * dfValue;
break;
case OGRSTUCM:
dfNewValue = 0.01 * dfValue;
break;
case OGRSTUInches:
dfNewValue = dfValue / 39.37;
break;
default:
break; //imp
}
switch (eOutputUnit)
{
case OGRSTUGround:
dfNewValue *= m_dfScale;
break;
case OGRSTUPixel:
dfNewValue *= (72.0 * 39.37);
break;
case OGRSTUPoints:
dfNewValue *= (72.0 * 39.37);
break;
case OGRSTUMM:
dfNewValue *= 1000.0;
break;
case OGRSTUCM:
dfNewValue *= 100.0;
break;
case OGRSTUInches:
dfNewValue *= 39.37;
break;
default:
break; // imp
}
return dfNewValue;
}
/************************************************************************/
/* ComputeWithUnit() */
/************************************************************************/
int OGRStyleTool::ComputeWithUnit(int nValue, OGRSTUnitId eUnit)
{
return (int) ComputeWithUnit((double )nValue, eUnit);
}
/************************************************************************/
/* GetParamStr() */
/************************************************************************/
const char *OGRStyleTool::GetParamStr(OGRStyleParamId &sStyleParam ,
OGRStyleValue &sStyleValue,
GBool &bValueIsNull)
{
if (!Parse())
{
bValueIsNull = TRUE;
return NULL;
}
bValueIsNull = !sStyleValue.bValid;
if (bValueIsNull == TRUE)
return NULL;
switch (sStyleParam.eType)
{
// if sStyleParam.bGeoref == TRUE , need to convert to output value;
case OGRSTypeString:
return sStyleValue.pszValue;
case OGRSTypeDouble:
if (sStyleParam.bGeoref)
return CPLSPrintf("%f",ComputeWithUnit(sStyleValue.dfValue,
sStyleValue.eUnit));
else
return CPLSPrintf("%f",sStyleValue.dfValue);
case OGRSTypeInteger:
if (sStyleParam.bGeoref)
return CPLSPrintf("%d",ComputeWithUnit(sStyleValue.nValue,
sStyleValue.eUnit));
else
return CPLSPrintf("%d",sStyleValue.nValue);
case OGRSTypeBoolean:
return CPLSPrintf("%d",sStyleValue.nValue);
default:
bValueIsNull = TRUE;
return NULL;
}
}
/****************************************************************************/
/* int OGRStyleTool::GetParamNum(OGRStyleParamId sStyleParam , */
/* OGRStyleValue sStyleValue, */
/* GBool &bValueIsNull) */
/* */
/****************************************************************************/
int OGRStyleTool::GetParamNum(OGRStyleParamId &sStyleParam ,
OGRStyleValue &sStyleValue,
GBool &bValueIsNull)
{
return (int)GetParamDbl(sStyleParam,sStyleValue,bValueIsNull);
}
/****************************************************************************/
/* double OGRStyleTool::GetParamDbl(OGRStyleParamId sStyleParam , */
/* OGRStyleValue sStyleValue, */
/* GBool &bValueIsNull) */
/* */
/****************************************************************************/
double OGRStyleTool::GetParamDbl(OGRStyleParamId &sStyleParam ,
OGRStyleValue &sStyleValue,
GBool &bValueIsNull)
{
if (!Parse())
{
bValueIsNull = TRUE;
return 0;
}
bValueIsNull = !sStyleValue.bValid;
if (bValueIsNull == TRUE)
return 0;
switch (sStyleParam.eType)
{
// if sStyleParam.bGeoref == TRUE , need to convert to output value;
case OGRSTypeString:
if (sStyleParam.bGeoref)
return ComputeWithUnit(atof(sStyleValue.pszValue),
sStyleValue.eUnit);
else
return atof(sStyleValue.pszValue);
case OGRSTypeDouble:
if (sStyleParam.bGeoref)
return ComputeWithUnit(sStyleValue.dfValue,
sStyleValue.eUnit);
else
return sStyleValue.dfValue;
case OGRSTypeInteger:
if (sStyleParam.bGeoref)
return (double)ComputeWithUnit(sStyleValue.nValue,
sStyleValue.eUnit);
else
return (double)sStyleValue.nValue;
case OGRSTypeBoolean:
return (double)sStyleValue.nValue;
default:
bValueIsNull = TRUE;
return 0;
}
}
/****************************************************************************/
/* void OGRStyleTool::SetParamStr(OGRStyleParamId &sStyleParam , */
/* OGRStyleValue &sStyleValue, */
/* const char *pszParamString) */
/* */
/****************************************************************************/
void OGRStyleTool::SetParamStr(OGRStyleParamId &sStyleParam ,
OGRStyleValue &sStyleValue,
const char *pszParamString)
{
Parse();
StyleModified();
sStyleValue.bValid = TRUE;
sStyleValue.eUnit = GetUnit();
switch (sStyleParam.eType)
{
// if sStyleParam.bGeoref == TRUE , need to convert to output value;
case OGRSTypeString:
sStyleValue.pszValue = CPLStrdup(pszParamString);
break;
case OGRSTypeDouble:
sStyleValue.dfValue = atof(pszParamString);
break;
case OGRSTypeInteger:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -