Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

330 lines
13 KiB
C++

#ifndef __DBTEXT_H
#define __DBTEXT_H
#include "XPoint.h"
#include "AString.h"
#include "AecEntity.h"
#include "SubText.h"
class GEOAPI TTextPart {
public:
XPoint m_ptLowLeft; //基点
BOOL m_bChinese;
XString m_sText;
double m_nSizeX, m_nSizeY; //总宽, 总高
double m_nWidthFactor; //字高
double m_nHeight, m_nHeightReal; //ACAD字高, 真实字高
int m_iType;//0,常规;1,圆字
public:
TTextPart() { m_bChinese=FALSE; m_nSizeX=m_nSizeY=0.0; m_nHeight=0.0; m_nHeightReal=0.0; m_iType=0;}
TTextPart(const TCHAR *t, XPoint pt, BOOL bCh, double nHeightR, double nHeight, double nWidthFactor, double sx, double sy) {
m_sText=t;
m_ptLowLeft=pt;
m_bChinese=bCh;
m_nSizeX=sx;
m_nSizeY=sy;
m_nHeight=nHeight;
m_nHeightReal=nHeightR;
m_nWidthFactor=nWidthFactor;
m_iType=0;
}
TTextPart(const TCHAR *t, XPoint pt,double height)//圆字
{
m_sText=t;
m_ptLowLeft=pt;
m_nHeight=m_nHeightReal=height;
m_nSizeX=m_nSizeY=height;
m_bChinese=FALSE;
m_iType=1;
}
TTextPart(const TTextPart &src) {
*this = src;
}
TTextPart & operator= (const TTextPart &src);
BOOL IsParagraph() const {
return m_sText[0]=='\n';
}
BOOL IsSpacer() const;
BOOL IsPunctuation() const;
int GetControlCode() const; // ^2==2, ^3=3, ^4=4
double GetHeightReal(BOOL bFromBase=TRUE) const {
return (bFromBase? m_nHeightReal : m_nSizeY);
}
double GetWidth() const {
return m_nSizeX;
}
double GetYMax() const {
return (m_ptLowLeft.y+GetHeightReal(TRUE));
}
double GetYMin() const {
return (m_ptLowLeft.y-(GetHeightReal(FALSE)-GetHeightReal(TRUE)));
}
};
class GEOAPI TTextParser {
public:
enum TParserStatus { kEndBuffer=0, kNormalChinese=1, kNormalEnglish=2,
kUpperText=3, kLowerText=4, kParagragh=5, kControlCode=6,kCircleText=7};
protected:
AString m_sText;
const char *m_pszSource;
const char *m_pCurrent;
public:
TTextParser() { m_pszSource=m_pCurrent=NULL; }
TTextParser(const TCHAR *pszSrc):m_sText(pszSrc) { m_pszSource=(const char*)m_sText; m_pCurrent=m_pszSource; }
TParserStatus GetNext(XString &sNext);
BOOL IsEOS() const {
return (!m_pCurrent || !(*m_pCurrent));
}
};
class GEOAPI TTextLine: public DList<TTextPart> {
public:
TTextLine() {}
double GetHeight(BOOL bFromBase=TRUE) const;
double GetWidth() const;
void AdjustWidthFactor(double nFactor);
void AdjustBasePoint(double x);
XPoint GetExtents() const;
BOOL IsEmpty() const; //没有东西, 或空格
};
// XExplodeDraw::kLeft:
// XExplodeDraw::kRight:
// XExplodeDraw::kCenter:
// XExplodeDraw::kTextFit:
class AcDbRasterImage;
class GEOAPI AecDbText: public AecEntity {
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(AecDbText);
private:
const static Adesk::UInt8 g_nVersion;
protected:
XString m_sText;
XPoint m_ptText;
double m_nHeight, m_nRotation;
AcDbHardPointerId m_idStyle; //文字样式
XExplodeDraw::TextAlignment m_nAlignment;
Adesk::UInt8 m_nMaskFlag;
public:
AecDbText();
~AecDbText();
virtual BOOL IsValid() const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
virtual Acad::ErrorStatus audit(AcDbAuditInfo* pAuditInfo);
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) const;
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
virtual Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
// drived from AecEntity
virtual DrawType GetDrawType() const;
virtual void GetTips(DList<ObjInfoUnit> &) const; //取动态属性显示数据
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual const TCHAR *GetDefaultLayer() const;
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual int ConvertText(TConvertTextPtr ptr, void *pData); //RTNORM/RTNONE/RTERROR
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
virtual TextPosition FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange=NULL) const;
// 返回下一次查找的开始位置
virtual TextPosition ReplaceSubText(const TextPosition &posRep, const TCHAR *sRepText, TextRange *pRange=NULL);
virtual long GetSubTextNum()const{return 1;}//ok
virtual SubText* GetSubText(long iText)const{return new SubText(objectId(),(AcDbEntity*)clone(),0);}//ok
virtual SubText* HitTestText(XPoint pt)const;
virtual void SetSubText(long i,CString sText){SetText(sText);}//ok
virtual void UnionScale(double nScale);
//add by aec on 100305 为底层基类提供的调用方法
virtual BOOL TBaseConvertFrom(const AcDbText *pText);
virtual AcDbEntity* TBaseCreateWipeOut();
virtual const TCHAR * TBaseGetText() const;
virtual void TBaseSetText(const TCHAR *pszText);
virtual XPoint TBaseGetLocation() const;
virtual void TBaseSetLocation(XPoint pt);
virtual void TBaseSetRotation(double nRot);
virtual double TBaseGetRotation() const;
// aec add 101116,支持统一标高
virtual bool UnifyElevation(double dElevation = 0.0);
// Helper Method
AcDbObjectId InitWipeout() const;
AcDbEntity *CreateWipeOut() const;
void SetupImageInfo(AcDbRasterImage *pAcDbRasterImage) const;
void OutputTextLine(XExplodeDraw &dc, XPoint ptBase, const DList<TTextPart> &lineText) const;
BOOL ConvertFrom(const AcDbText *pText);
XPoint Align2Base(XPoint ptAlign, XPoint ext) const;
XPoint Base2Align(XPoint ptBase, XPoint ext) const;
// 没有考虑转角
BOOL GetExtents(double *pWidth, double *pHeight, double *pHeight1=NULL) const;
virtual XPoint GetExtents() const;
// Properties
BOOL GetStyleParam1(double *nHeight, double *nWidthFactor) const;
BOOL GetStyleParam2(double *nHeight, double *nWidthFactor) const;
BOOL GetTextParts(DList<TTextPart> &lstTextParts) const;
Adesk::UInt8 GetMaskFlag() const;
XPoint GetLocation() const;
double GetRotation() const;
double GetHeight(BOOL bAsPaperUnit=TRUE) const;
AcDbObjectId GetStyleId() const;
const TCHAR* GetText() const;
XExplodeDraw::TextAlignment GetAlignment() const;
void SetMaskFlag(Adesk::UInt8 nFlag);
void SetLocation(XPoint pt);
void SetRotation(double nRot);
void SetHeight(double nHeight, BOOL bAsPaperUnit=TRUE);
void SetStyleId(AcDbObjectId id);
void SetText(const TCHAR *pszText);
void SetAlignment(XExplodeDraw::TextAlignment nAlign);
};
class GEOAPI AecDbMText: public AecDbText {
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(AecDbMText);
private:
const static Adesk::UInt8 g_nVersion;
protected:
double m_nPageWidth; //段落宽度
double m_nLineSpace; //行间距
public:
AecDbMText();
~AecDbMText();
virtual BOOL IsValid() const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
virtual TextPosition FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange=NULL) const;
// 返回下一次查找的开始位置
virtual TextPosition ReplaceSubText(const TextPosition &posRep, const TCHAR *sRepText, TextRange *pRange=NULL);
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
// drived from AecEntity
virtual void GetTips(DList<ObjInfoUnit> &lstInfo) const; //取动态属性显示数据
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual SubText* HitTestText(XPoint pt)const{return NULL;}//ok
// Helper Method
//BOOL ConvertFrom(const AcDbMText *pText);
// 没有考虑转角
virtual XPoint GetExtents() const;
void GetTextLines(DList<TTextLine> &lstLines) const;
// Properties
double GetPageWidth(BOOL bAsPaperUnit=TRUE) const;
double GetLineSpace(BOOL bAsPaperUnit=TRUE) const;
void SetPageWidth(double nWidth, BOOL bAsPaperUnit=TRUE);
void SetLineSpace(double nWidth, BOOL bAsPaperUnit=TRUE);
};
class GEOAPI AecDbMTextNew: public AecDbText {
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(AecDbMTextNew);
private:
const static Adesk::UInt8 g_nVersion;
protected:
double m_nPageWidth; //段落宽度
double m_nLineSpace; //行间距
//--------------------------------
double m_nPageSpace;//页间距
Adesk::Boolean m_bDir;//排版
//--------------------------------
double m_nPagHeight;//行高
CString m_sTextBk;
public:
AecDbMTextNew();
~AecDbMTextNew();
virtual BOOL IsValid() const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
virtual TextPosition FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange=NULL) const;
// 返回下一次查找的开始位置
virtual TextPosition ReplaceSubText(const TextPosition &posRep, const TCHAR *sRepText, TextRange *pRange=NULL);
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
// drived from AecEntity
virtual void GetTips(DList<ObjInfoUnit> &lstInfo) const; //取动态属性显示数据
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual SubText* HitTestText(XPoint pt)const{return NULL;}//ok
// Helper Method
//BOOL ConvertFrom(const AcDbMText *pText);
// 没有考虑转角
virtual XPoint GetExtents() const;
void GetTextLines(DList<TTextLine> &lstLines) const;
// Properties
double GetPageWidth(BOOL bAsPaperUnit=TRUE) const;
double GetLineSpace(BOOL bAsPaperUnit=TRUE) const;
void SetPageWidth(double nWidth, BOOL bAsPaperUnit=TRUE);
void SetLineSpace(double nWidth, BOOL bAsPaperUnit=TRUE);
};
#endif