?? mitab_feature.cpp
字號:
return -1;
return 0;
}
/**********************************************************************
* TABFontPoint::QueryFontStyle()
*
* Return TRUE if the specified font style attribute is turned ON,
* or FALSE otherwise. See enum TABFontStyle for the list of styles
* that can be queried on.
**********************************************************************/
GBool TABFontPoint::QueryFontStyle(TABFontStyle eStyleToQuery)
{
return (m_nFontStyle & (int)eStyleToQuery) ? TRUE: FALSE;
}
void TABFontPoint::ToggleFontStyle(TABFontStyle eStyleToToggle, GBool bStyleOn)
{
if (bStyleOn)
m_nFontStyle |= (int)eStyleToToggle;
else
m_nFontStyle &= ~(int)eStyleToToggle;
}
/**********************************************************************
* TABFontPoint::GetFontStyleMIFValue()
*
* Return the Font Style value for this object using the style values
* that are used in a MIF FONT() clause. See MIF specs (appendix A).
*
* The reason why we have to differentiate between the TAB and the MIF font
* style values is that in TAB, TABFSBox is included in the style value
* as code 0x100, but in MIF it is not included, instead it is implied by
* the presence of the BG color in the FONT() clause (the BG color is
* present only when TABFSBox or TABFSHalo is set).
* This also has the effect of shifting all the other style values > 0x100
* by 1 byte.
*
* NOTE: Even if there is no BG color for font symbols, we inherit this
* problem because Font Point styles use the same codes as Text Font styles.
**********************************************************************/
int TABFontPoint::GetFontStyleMIFValue()
{
// The conversion is simply to remove bit 0x100 from the value and shift
// down all values past this bit.
return (m_nFontStyle & 0xff) + (m_nFontStyle & (0xff00-0x0100))/2;
}
void TABFontPoint:: SetFontStyleMIFValue(int nStyle)
{
m_nFontStyle = (nStyle & 0xff) + (nStyle & 0x7f00)*2;
}
/**********************************************************************
* TABFontPoint::SetSymbolAngle()
*
* Set the symbol angle value in degrees, making sure the value is
* always in the range [0..360]
**********************************************************************/
void TABFontPoint::SetSymbolAngle(double dAngle)
{
while(dAngle < 0.0) dAngle += 360.0;
while(dAngle > 360.0) dAngle -= 360.0;
m_dAngle = dAngle;
}
/**********************************************************************
* TABFontPoint::GetStyleString()
*
* Return style string for this feature.
*
* Style String is built only once during the first call to GetStyleString().
**********************************************************************/
const char *TABFontPoint::GetStyleString()
{
if (m_pszStyleString == NULL)
{
m_pszStyleString = CPLStrdup(GetSymbolStyleString(GetSymbolAngle()));
}
return m_pszStyleString;
}
/*=====================================================================
* class TABCustomPoint
*====================================================================*/
/**********************************************************************
* TABCustomPoint::TABCustomPoint()
*
* Constructor.
**********************************************************************/
TABCustomPoint::TABCustomPoint(OGRFeatureDefn *poDefnIn):
TABPoint(poDefnIn)
{
m_nUnknown_ = m_nCustomStyle = 0;
}
/**********************************************************************
* TABCustomPoint::~TABCustomPoint()
*
* Destructor.
**********************************************************************/
TABCustomPoint::~TABCustomPoint()
{
}
/**********************************************************************
* TABCustomPoint::CloneTABFeature()
*
* Duplicate feature, including stuff specific to each TABFeature type.
*
* This method calls the generic TABFeature::CloneTABFeature() and
* then copies any members specific to its own type.
**********************************************************************/
TABFeature *TABCustomPoint::CloneTABFeature(OGRFeatureDefn *poNewDefn/*=NULL*/)
{
/*-----------------------------------------------------------------
* Alloc new feature and copy the base stuff
*----------------------------------------------------------------*/
TABCustomPoint *poNew = new TABCustomPoint(poNewDefn ? poNewDefn :
GetDefnRef());
CopyTABFeatureBase(poNew);
/*-----------------------------------------------------------------
* And members specific to this class
*----------------------------------------------------------------*/
// ITABFeatureSymbol
*(poNew->GetSymbolDefRef()) = *GetSymbolDefRef();
// ITABFeatureFont
*(poNew->GetFontDefRef()) = *GetFontDefRef();
poNew->SetCustomSymbolStyle( GetCustomSymbolStyle() );
return poNew;
}
/**********************************************************************
* TABCustomPoint::ReadGeometryFromMAPFile()
*
* Fill the geometry and representation (color, etc...) part of the
* feature from the contents of the .MAP object pointed to by poMAPFile.
*
* It is assumed that poMAPFile currently points to the beginning of
* a map object.
*
* Returns 0 on success, -1 on error, in which case CPLError() will have
* been called.
**********************************************************************/
int TABCustomPoint::ReadGeometryFromMAPFile(TABMAPFile *poMapFile,
TABMAPObjHdr *poObjHdr,
GBool bCoordBlockDataOnly /*=FALSE*/,
TABMAPCoordBlock ** /*ppoCoordBlock=NULL*/)
{
double dX, dY;
OGRGeometry *poGeometry;
/* Nothing to do for bCoordBlockDataOnly (used by index splitting) */
if (bCoordBlockDataOnly)
return 0;
/*-----------------------------------------------------------------
* Fetch and validate geometry type
*----------------------------------------------------------------*/
m_nMapInfoType = poObjHdr->m_nType;
if (m_nMapInfoType != TAB_GEOM_CUSTOMSYMBOL &&
m_nMapInfoType != TAB_GEOM_CUSTOMSYMBOL_C )
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"ReadGeometryFromMAPFile(): unsupported geometry type %d (0x%2.2x)",
m_nMapInfoType, m_nMapInfoType);
return -1;
}
/*-----------------------------------------------------------------
* Read object information
*----------------------------------------------------------------*/
TABMAPObjCustomPoint *poPointHdr = (TABMAPObjCustomPoint *)poObjHdr;
m_nUnknown_ = poPointHdr->m_nUnknown_; // ???
m_nCustomStyle = poPointHdr->m_nCustomStyle;// 0x01=Show BG,
// 0x02=Apply Color
m_nSymbolDefIndex = poPointHdr->m_nSymbolId; // Symbol index
poMapFile->ReadSymbolDef(m_nSymbolDefIndex, &m_sSymbolDef);
m_nFontDefIndex = poPointHdr->m_nFontId; // Font index
poMapFile->ReadFontDef(m_nFontDefIndex, &m_sFontDef);
/*-----------------------------------------------------------------
* Create and fill geometry object
*----------------------------------------------------------------*/
poMapFile->Int2Coordsys(poPointHdr->m_nX, poPointHdr->m_nY, dX, dY);
poGeometry = new OGRPoint(dX, dY);
SetGeometryDirectly(poGeometry);
SetMBR(dX, dY, dX, dY);
SetIntMBR(poObjHdr->m_nMinX, poObjHdr->m_nMinY,
poObjHdr->m_nMaxX, poObjHdr->m_nMaxY);
return 0;
}
/**********************************************************************
* TABCustomPoint::WriteGeometryToMAPFile()
*
* Write the geometry and representation (color, etc...) part of the
* feature to the .MAP object pointed to by poMAPFile.
*
* It is assumed that poMAPFile currently points to a valid map object.
*
* Returns 0 on success, -1 on error, in which case CPLError() will have
* been called.
**********************************************************************/
int TABCustomPoint::WriteGeometryToMAPFile(TABMAPFile *poMapFile,
TABMAPObjHdr *poObjHdr,
GBool bCoordBlockDataOnly /*=FALSE*/,
TABMAPCoordBlock ** /*ppoCoordBlock=NULL*/)
{
GInt32 nX, nY;
OGRGeometry *poGeom;
OGRPoint *poPoint;
/* Nothing to do for bCoordBlockDataOnly (used by index splitting) */
if (bCoordBlockDataOnly)
return 0;
/*-----------------------------------------------------------------
* We assume that ValidateMapInfoType() was called already and that
* the type in poObjHdr->m_nType is valid.
*----------------------------------------------------------------*/
CPLAssert(m_nMapInfoType == poObjHdr->m_nType);
/*-----------------------------------------------------------------
* Fetch and validate geometry
*----------------------------------------------------------------*/
poGeom = GetGeometryRef();
if (poGeom && wkbFlatten(poGeom->getGeometryType()) == wkbPoint)
poPoint = (OGRPoint*)poGeom;
else
{
CPLError(CE_Failure, CPLE_AssertionFailed,
"TABCustomPoint: Missing or Invalid Geometry!");
return -1;
}
poMapFile->Coordsys2Int(poPoint->getX(), poPoint->getY(), nX, nY);
/*-----------------------------------------------------------------
* Copy object information
*----------------------------------------------------------------*/
TABMAPObjCustomPoint *poPointHdr = (TABMAPObjCustomPoint *)poObjHdr;
poPointHdr->m_nX = nX;
poPointHdr->m_nY = nY;
poPointHdr->SetMBR(nX, nY, nX, nY);
poPointHdr->m_nUnknown_ = m_nUnknown_;
poPointHdr->m_nCustomStyle = m_nCustomStyle;// 0x01=Show BG,
// 0x02=Apply Color
m_nSymbolDefIndex = poMapFile->WriteSymbolDef(&m_sSymbolDef);
poPointHdr->m_nSymbolId = m_nSymbolDefIndex; // Symbol index
m_nFontDefIndex = poMapFile->WriteFontDef(&m_sFontDef);
poPointHdr->m_nFontId = m_nFontDefIndex; // Font index
if (CPLGetLastErrorNo() != 0)
return -1;
return 0;
}
/**********************************************************************
* TABCustomPoint::GetStyleString()
*
* Return style string for this feature.
*
* Style String is built only once during the first call to GetStyleString().
**********************************************************************/
const char *TABCustomPoint::GetStyleString()
{
if (m_pszStyleString == NULL)
{
m_pszStyleString = CPLStrdup(GetSymbolStyleString());
}
return m_pszStyleString;
}
/*=====================================================================
* class TABPolyline
*====================================================================*/
/**********************************************************************
* TABPolyline::TABPolyline()
*
* Constructor.
**********************************************************************/
TABPolyline::TABPolyline(OGRFeatureDefn *poDefnIn):
TABFeature(poDefnIn)
{
m_bCenterIsSet = FALSE;
m_bSmooth = FALSE;
m_bWriteTwoPointLineAsPolyline = FALSE;
}
/**********************************************************************
* TABPolyline::~TABPolyline()
*
* Destructor.
**********************************************************************/
TABPolyline::~TABPolyline()
{
}
/**********************************************************************
* TABPolyline::CloneTABFeature()
*
* Duplicate feature, including stuff specific to each TABFeature type.
*
* This method calls the generic TABFeature::CloneTABFeature() and
* then copies any members specific to its own type.
**********************************************************************/
TABFeature *TABPolyline::CloneTABFeature(OGRFeatureDefn *poNewDefn/*=NULL*/)
{
/*--------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -