DYT/Tool/OpenSceneGraph-3.6.5/include/ogr_featurestyle.h
2024-12-25 07:49:36 +08:00

859 lines
20 KiB
C++

/******************************************************************************
* $Id$
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: Define of Feature Representation
* Author: Stephane Villeneuve, stephane.v@videtron.ca
*
******************************************************************************
* Copyright (c) 1999, Frank Warmerdam
*
* SPDX-License-Identifier: MIT
****************************************************************************/
#ifndef OGR_FEATURESTYLE_INCLUDE
#define OGR_FEATURESTYLE_INCLUDE
#include "cpl_conv.h"
#include "cpl_string.h"
#include "ogr_core.h"
class OGRFeature;
/**
* \file ogr_featurestyle.h
*
* Simple feature style classes.
*/
/*
* All OGRStyleTool param lists are defined in ogr_core.h.
*/
/** OGR Style type */
typedef enum ogr_style_type
{
OGRSTypeUnused = -1,
OGRSTypeString,
OGRSTypeDouble,
OGRSTypeInteger,
OGRSTypeBoolean
} OGRSType;
//! @cond Doxygen_Suppress
typedef struct ogr_style_param
{
int eParam;
const char *pszToken;
GBool bGeoref;
OGRSType eType;
} OGRStyleParamId;
typedef struct ogr_style_value
{
char *pszValue;
double dfValue;
int nValue; // Used for both integer and boolean types
GBool bValid;
OGRSTUnitId eUnit;
} OGRStyleValue;
//! @endcond
// Every time a pszStyleString given in parameter is NULL,
// the StyleString defined in the Mgr will be use.
/**
* This class represents a style table
*/
class CPL_DLL OGRStyleTable
{
private:
char **m_papszStyleTable = nullptr;
CPLString osLastRequestedStyleName{};
int iNextStyle = 0;
CPL_DISALLOW_COPY_ASSIGN(OGRStyleTable)
public:
OGRStyleTable();
~OGRStyleTable();
GBool AddStyle(const char *pszName, const char *pszStyleString);
GBool RemoveStyle(const char *pszName);
GBool ModifyStyle(const char *pszName, const char *pszStyleString);
GBool SaveStyleTable(const char *pszFilename);
GBool LoadStyleTable(const char *pszFilename);
const char *Find(const char *pszStyleString);
GBool IsExist(const char *pszName);
const char *GetStyleName(const char *pszName);
void Print(FILE *fpOut);
void Clear();
OGRStyleTable *Clone();
void ResetStyleStringReading();
const char *GetNextStyle();
const char *GetLastStyleName();
};
class OGRStyleTool;
/**
* This class represents a style manager
*/
class CPL_DLL OGRStyleMgr
{
private:
OGRStyleTable *m_poDataSetStyleTable = nullptr;
char *m_pszStyleString = nullptr;
CPL_DISALLOW_COPY_ASSIGN(OGRStyleMgr)
public:
explicit OGRStyleMgr(OGRStyleTable *poDataSetStyleTable = nullptr);
~OGRStyleMgr();
GBool SetFeatureStyleString(OGRFeature *,
const char *pszStyleString = nullptr,
GBool bNoMatching = FALSE);
/* It will set in the given feature the pszStyleString with
the style or will set the style name found in
dataset StyleTable (if bNoMatching == FALSE). */
const char *InitFromFeature(OGRFeature *);
GBool InitStyleString(const char *pszStyleString = nullptr);
const char *GetStyleName(const char *pszStyleString = nullptr);
const char *GetStyleByName(const char *pszStyleName);
GBool AddStyle(const char *pszStyleName,
const char *pszStyleString = nullptr);
const char *GetStyleString(OGRFeature * = nullptr);
GBool AddPart(OGRStyleTool *);
GBool AddPart(const char *);
int GetPartCount(const char *pszStyleString = nullptr);
OGRStyleTool *GetPart(int hPartId, const char *pszStyleString = nullptr);
/* It could have a reference counting process us for the OGRStyleTable, if
needed. */
//! @cond Doxygen_Suppress
OGRStyleTable *GetDataSetStyleTable()
{
return m_poDataSetStyleTable;
}
static OGRStyleTool *
CreateStyleToolFromStyleString(const char *pszStyleString);
//! @endcond
};
/**
* This class represents a style tool
*/
class CPL_DLL OGRStyleTool
{
private:
GBool m_bModified = false;
GBool m_bParsed = false;
double m_dfScale = 1.0;
OGRSTUnitId m_eUnit = OGRSTUMM;
OGRSTClassId m_eClassId = OGRSTCNone;
char *m_pszStyleString = nullptr;
virtual GBool Parse() = 0;
CPL_DISALLOW_COPY_ASSIGN(OGRStyleTool)
protected:
#ifndef DOXYGEN_SKIP
GBool Parse(const OGRStyleParamId *pasStyle, OGRStyleValue *pasValue,
int nCount);
#endif
public:
OGRStyleTool()
: m_bModified(FALSE), m_bParsed(FALSE), m_dfScale(0.0),
m_eUnit(OGRSTUGround), m_eClassId(OGRSTCNone),
m_pszStyleString(nullptr)
{
}
explicit OGRStyleTool(OGRSTClassId eClassId);
virtual ~OGRStyleTool();
static GBool GetRGBFromString(const char *pszColor, int &nRed, int &nGreen,
int &nBlue, int &nTransparence);
static int GetSpecificId(const char *pszId, const char *pszWanted);
#ifndef DOXYGEN_SKIP
GBool IsStyleModified()
{
return m_bModified;
}
void StyleModified()
{
m_bModified = TRUE;
}
GBool IsStyleParsed()
{
return m_bParsed;
}
void StyleParsed()
{
m_bParsed = TRUE;
}
#endif
OGRSTClassId GetType();
#ifndef DOXYGEN_SKIP
void SetInternalInputUnitFromParam(char *pszString);
#endif
void SetUnit(OGRSTUnitId,
double dfScale = 1.0); // the dfScale will be
// used if we are working with Ground
// Unit ( ground = paper * scale);
OGRSTUnitId GetUnit()
{
return m_eUnit;
}
// There are two way to set the parameters in the Style, with generic
// methods (using a defined enumeration) or with the reel method specific
// for Each style tools.
virtual const char *GetStyleString() = 0;
void SetStyleString(const char *pszStyleString);
const char *GetStyleString(const OGRStyleParamId *pasStyleParam,
OGRStyleValue *pasStyleValue, int nSize);
const char *GetParamStr(const OGRStyleParamId &sStyleParam,
const OGRStyleValue &sStyleValue,
GBool &bValueIsNull);
int GetParamNum(const OGRStyleParamId &sStyleParam,
const OGRStyleValue &sStyleValue, GBool &bValueIsNull);
double GetParamDbl(const OGRStyleParamId &sStyleParam,
const OGRStyleValue &sStyleValue, GBool &bValueIsNull);
void SetParamStr(const OGRStyleParamId &sStyleParam,
OGRStyleValue &sStyleValue, const char *pszParamString);
void SetParamNum(const OGRStyleParamId &sStyleParam,
OGRStyleValue &sStyleValue, int nParam);
void SetParamDbl(const OGRStyleParamId &sStyleParam,
OGRStyleValue &sStyleValue, double dfParam);
#ifndef DOXYGEN_SKIP
double ComputeWithUnit(double, OGRSTUnitId);
int ComputeWithUnit(int, OGRSTUnitId);
#endif
};
//! @cond Doxygen_Suppress
/**
* This class represents a style pen
*/
class CPL_DLL OGRStylePen : public OGRStyleTool
{
private:
OGRStyleValue *m_pasStyleValue;
GBool Parse() override;
CPL_DISALLOW_COPY_ASSIGN(OGRStylePen)
public:
OGRStylePen();
~OGRStylePen() override;
/**********************************************************************/
/* Explicit fct for all parameters defined in the Drawing tools Pen */
/**********************************************************************/
const char *Color(GBool &bDefault)
{
return GetParamStr(OGRSTPenColor, bDefault);
}
void SetColor(const char *pszColor)
{
SetParamStr(OGRSTPenColor, pszColor);
}
double Width(GBool &bDefault)
{
return GetParamDbl(OGRSTPenWidth, bDefault);
}
void SetWidth(double dfWidth)
{
SetParamDbl(OGRSTPenWidth, dfWidth);
}
const char *Pattern(GBool &bDefault)
{
return GetParamStr(OGRSTPenPattern, bDefault);
}
void SetPattern(const char *pszPattern)
{
SetParamStr(OGRSTPenPattern, pszPattern);
}
const char *Id(GBool &bDefault)
{
return GetParamStr(OGRSTPenId, bDefault);
}
void SetId(const char *pszId)
{
SetParamStr(OGRSTPenId, pszId);
}
double PerpendicularOffset(GBool &bDefault)
{
return GetParamDbl(OGRSTPenPerOffset, bDefault);
}
void SetPerpendicularOffset(double dfPerp)
{
SetParamDbl(OGRSTPenPerOffset, dfPerp);
}
const char *Cap(GBool &bDefault)
{
return GetParamStr(OGRSTPenCap, bDefault);
}
void SetCap(const char *pszCap)
{
SetParamStr(OGRSTPenCap, pszCap);
}
const char *Join(GBool &bDefault)
{
return GetParamStr(OGRSTPenJoin, bDefault);
}
void SetJoin(const char *pszJoin)
{
SetParamStr(OGRSTPenJoin, pszJoin);
}
int Priority(GBool &bDefault)
{
return GetParamNum(OGRSTPenPriority, bDefault);
}
void SetPriority(int nPriority)
{
SetParamNum(OGRSTPenPriority, nPriority);
}
/*****************************************************************/
const char *GetParamStr(OGRSTPenParam eParam, GBool &bValueIsNull);
int GetParamNum(OGRSTPenParam eParam, GBool &bValueIsNull);
double GetParamDbl(OGRSTPenParam eParam, GBool &bValueIsNull);
void SetParamStr(OGRSTPenParam eParam, const char *pszParamString);
void SetParamNum(OGRSTPenParam eParam, int nParam);
void SetParamDbl(OGRSTPenParam eParam, double dfParam);
const char *GetStyleString() override;
};
/**
* This class represents a style brush
*/
class CPL_DLL OGRStyleBrush : public OGRStyleTool
{
private:
OGRStyleValue *m_pasStyleValue;
GBool Parse() override;
CPL_DISALLOW_COPY_ASSIGN(OGRStyleBrush)
public:
OGRStyleBrush();
~OGRStyleBrush() override;
/* Explicit fct for all parameters defined in the Drawing tools Brush */
const char *ForeColor(GBool &bDefault)
{
return GetParamStr(OGRSTBrushFColor, bDefault);
}
void SetForeColor(const char *pszColor)
{
SetParamStr(OGRSTBrushFColor, pszColor);
}
const char *BackColor(GBool &bDefault)
{
return GetParamStr(OGRSTBrushBColor, bDefault);
}
void SetBackColor(const char *pszColor)
{
SetParamStr(OGRSTBrushBColor, pszColor);
}
const char *Id(GBool &bDefault)
{
return GetParamStr(OGRSTBrushId, bDefault);
}
void SetId(const char *pszId)
{
SetParamStr(OGRSTBrushId, pszId);
}
double Angle(GBool &bDefault)
{
return GetParamDbl(OGRSTBrushAngle, bDefault);
}
void SetAngle(double dfAngle)
{
SetParamDbl(OGRSTBrushAngle, dfAngle);
}
double Size(GBool &bDefault)
{
return GetParamDbl(OGRSTBrushSize, bDefault);
}
void SetSize(double dfSize)
{
SetParamDbl(OGRSTBrushSize, dfSize);
}
double SpacingX(GBool &bDefault)
{
return GetParamDbl(OGRSTBrushDx, bDefault);
}
void SetSpacingX(double dfX)
{
SetParamDbl(OGRSTBrushDx, dfX);
}
double SpacingY(GBool &bDefault)
{
return GetParamDbl(OGRSTBrushDy, bDefault);
}
void SetSpacingY(double dfY)
{
SetParamDbl(OGRSTBrushDy, dfY);
}
int Priority(GBool &bDefault)
{
return GetParamNum(OGRSTBrushPriority, bDefault);
}
void SetPriority(int nPriority)
{
SetParamNum(OGRSTBrushPriority, nPriority);
}
/*****************************************************************/
const char *GetParamStr(OGRSTBrushParam eParam, GBool &bValueIsNull);
int GetParamNum(OGRSTBrushParam eParam, GBool &bValueIsNull);
double GetParamDbl(OGRSTBrushParam eParam, GBool &bValueIsNull);
void SetParamStr(OGRSTBrushParam eParam, const char *pszParamString);
void SetParamNum(OGRSTBrushParam eParam, int nParam);
void SetParamDbl(OGRSTBrushParam eParam, double dfParam);
const char *GetStyleString() override;
};
/**
* This class represents a style symbol
*/
class CPL_DLL OGRStyleSymbol : public OGRStyleTool
{
private:
OGRStyleValue *m_pasStyleValue;
GBool Parse() override;
CPL_DISALLOW_COPY_ASSIGN(OGRStyleSymbol)
public:
OGRStyleSymbol();
~OGRStyleSymbol() override;
/*****************************************************************/
/* Explicit fct for all parameters defined in the Drawing tools */
/*****************************************************************/
const char *Id(GBool &bDefault)
{
return GetParamStr(OGRSTSymbolId, bDefault);
}
void SetId(const char *pszId)
{
SetParamStr(OGRSTSymbolId, pszId);
}
double Angle(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolAngle, bDefault);
}
void SetAngle(double dfAngle)
{
SetParamDbl(OGRSTSymbolAngle, dfAngle);
}
const char *Color(GBool &bDefault)
{
return GetParamStr(OGRSTSymbolColor, bDefault);
}
void SetColor(const char *pszColor)
{
SetParamStr(OGRSTSymbolColor, pszColor);
}
double Size(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolSize, bDefault);
}
void SetSize(double dfSize)
{
SetParamDbl(OGRSTSymbolSize, dfSize);
}
double SpacingX(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolDx, bDefault);
}
void SetSpacingX(double dfX)
{
SetParamDbl(OGRSTSymbolDx, dfX);
}
double SpacingY(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolDy, bDefault);
}
void SetSpacingY(double dfY)
{
SetParamDbl(OGRSTSymbolDy, dfY);
}
double Step(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolStep, bDefault);
}
void SetStep(double dfStep)
{
SetParamDbl(OGRSTSymbolStep, dfStep);
}
double Offset(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolOffset, bDefault);
}
void SetOffset(double dfOffset)
{
SetParamDbl(OGRSTSymbolOffset, dfOffset);
}
double Perp(GBool &bDefault)
{
return GetParamDbl(OGRSTSymbolPerp, bDefault);
}
void SetPerp(double dfPerp)
{
SetParamDbl(OGRSTSymbolPerp, dfPerp);
}
int Priority(GBool &bDefault)
{
return GetParamNum(OGRSTSymbolPriority, bDefault);
}
void SetPriority(int nPriority)
{
SetParamNum(OGRSTSymbolPriority, nPriority);
}
const char *FontName(GBool &bDefault)
{
return GetParamStr(OGRSTSymbolFontName, bDefault);
}
void SetFontName(const char *pszFontName)
{
SetParamStr(OGRSTSymbolFontName, pszFontName);
}
const char *OColor(GBool &bDefault)
{
return GetParamStr(OGRSTSymbolOColor, bDefault);
}
void SetOColor(const char *pszColor)
{
SetParamStr(OGRSTSymbolOColor, pszColor);
}
/*****************************************************************/
const char *GetParamStr(OGRSTSymbolParam eParam, GBool &bValueIsNull);
int GetParamNum(OGRSTSymbolParam eParam, GBool &bValueIsNull);
double GetParamDbl(OGRSTSymbolParam eParam, GBool &bValueIsNull);
void SetParamStr(OGRSTSymbolParam eParam, const char *pszParamString);
void SetParamNum(OGRSTSymbolParam eParam, int nParam);
void SetParamDbl(OGRSTSymbolParam eParam, double dfParam);
const char *GetStyleString() override;
};
/**
* This class represents a style label
*/
class CPL_DLL OGRStyleLabel : public OGRStyleTool
{
private:
OGRStyleValue *m_pasStyleValue;
GBool Parse() override;
CPL_DISALLOW_COPY_ASSIGN(OGRStyleLabel)
public:
OGRStyleLabel();
~OGRStyleLabel() override;
/*****************************************************************/
/* Explicit fct for all parameters defined in the Drawing tools */
/*****************************************************************/
const char *FontName(GBool &bDefault)
{
return GetParamStr(OGRSTLabelFontName, bDefault);
}
void SetFontName(const char *pszFontName)
{
SetParamStr(OGRSTLabelFontName, pszFontName);
}
double Size(GBool &bDefault)
{
return GetParamDbl(OGRSTLabelSize, bDefault);
}
void SetSize(double dfSize)
{
SetParamDbl(OGRSTLabelSize, dfSize);
}
const char *TextString(GBool &bDefault)
{
return GetParamStr(OGRSTLabelTextString, bDefault);
}
void SetTextString(const char *pszTextString)
{
SetParamStr(OGRSTLabelTextString, pszTextString);
}
double Angle(GBool &bDefault)
{
return GetParamDbl(OGRSTLabelAngle, bDefault);
}
void SetAngle(double dfAngle)
{
SetParamDbl(OGRSTLabelAngle, dfAngle);
}
const char *ForeColor(GBool &bDefault)
{
return GetParamStr(OGRSTLabelFColor, bDefault);
}
void SetForColor(const char *pszForColor)
{
SetParamStr(OGRSTLabelFColor, pszForColor);
}
const char *BackColor(GBool &bDefault)
{
return GetParamStr(OGRSTLabelBColor, bDefault);
}
void SetBackColor(const char *pszBackColor)
{
SetParamStr(OGRSTLabelBColor, pszBackColor);
}
const char *Placement(GBool &bDefault)
{
return GetParamStr(OGRSTLabelPlacement, bDefault);
}
void SetPlacement(const char *pszPlacement)
{
SetParamStr(OGRSTLabelPlacement, pszPlacement);
}
int Anchor(GBool &bDefault)
{
return GetParamNum(OGRSTLabelAnchor, bDefault);
}
void SetAnchor(int nAnchor)
{
SetParamNum(OGRSTLabelAnchor, nAnchor);
}
double SpacingX(GBool &bDefault)
{
return GetParamDbl(OGRSTLabelDx, bDefault);
}
void SetSpacingX(double dfX)
{
SetParamDbl(OGRSTLabelDx, dfX);
}
double SpacingY(GBool &bDefault)
{
return GetParamDbl(OGRSTLabelDy, bDefault);
}
void SetSpacingY(double dfY)
{
SetParamDbl(OGRSTLabelDy, dfY);
}
double Perp(GBool &bDefault)
{
return GetParamDbl(OGRSTLabelPerp, bDefault);
}
void SetPerp(double dfPerp)
{
SetParamDbl(OGRSTLabelPerp, dfPerp);
}
GBool Bold(GBool &bDefault)
{
return GetParamNum(OGRSTLabelBold, bDefault);
}
void SetBold(GBool bBold)
{
SetParamNum(OGRSTLabelBold, bBold);
}
GBool Italic(GBool &bDefault)
{
return GetParamNum(OGRSTLabelItalic, bDefault);
}
void SetItalic(GBool bItalic)
{
SetParamNum(OGRSTLabelItalic, bItalic);
}
GBool Underline(GBool &bDefault)
{
return GetParamNum(OGRSTLabelUnderline, bDefault);
}
void SetUnderline(GBool bUnderline)
{
SetParamNum(OGRSTLabelUnderline, bUnderline);
}
int Priority(GBool &bDefault)
{
return GetParamNum(OGRSTLabelPriority, bDefault);
}
void SetPriority(int nPriority)
{
SetParamNum(OGRSTLabelPriority, nPriority);
}
GBool Strikeout(GBool &bDefault)
{
return GetParamNum(OGRSTLabelStrikeout, bDefault);
}
void SetStrikeout(GBool bStrikeout)
{
SetParamNum(OGRSTLabelStrikeout, bStrikeout);
}
double Stretch(GBool &bDefault)
{
return GetParamDbl(OGRSTLabelStretch, bDefault);
}
void SetStretch(double dfStretch)
{
SetParamDbl(OGRSTLabelStretch, dfStretch);
}
const char *ShadowColor(GBool &bDefault)
{
return GetParamStr(OGRSTLabelHColor, bDefault);
}
void SetShadowColor(const char *pszShadowColor)
{
SetParamStr(OGRSTLabelHColor, pszShadowColor);
}
const char *OutlineColor(GBool &bDefault)
{
return GetParamStr(OGRSTLabelOColor, bDefault);
}
void SetOutlineColor(const char *pszOutlineColor)
{
SetParamStr(OGRSTLabelOColor, pszOutlineColor);
}
/*****************************************************************/
const char *GetParamStr(OGRSTLabelParam eParam, GBool &bValueIsNull);
int GetParamNum(OGRSTLabelParam eParam, GBool &bValueIsNull);
double GetParamDbl(OGRSTLabelParam eParam, GBool &bValueIsNull);
void SetParamStr(OGRSTLabelParam eParam, const char *pszParamString);
void SetParamNum(OGRSTLabelParam eParam, int nParam);
void SetParamDbl(OGRSTLabelParam eParam, double dfParam);
const char *GetStyleString() override;
};
//! @endcond
#endif /* OGR_FEATURESTYLE_INCLUDE */