288 lines
11 KiB
C++
288 lines
11 KiB
C++
#ifndef __DBTEXT_H
|
|
#define __DBTEXT_H
|
|
//#include "DbEntity.h"
|
|
//#include "wstring.h"
|
|
#include "imgdef.h"
|
|
#include "imgent.h"
|
|
|
|
class TARCH_EXP 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 TARCH_EXP TTextParser
|
|
{
|
|
public:
|
|
//enum TParserStatus { kEndBuffer=0, kNormalChinese=1, kNormalEnglish=2,
|
|
// kUpperText=3, kLowerText=4, kParagragh=5, kControlCode=6,kCircleText=7};
|
|
enum TParserStatus { kEndBuffer=0, kNormalChinese=1, kNormalEnglish=2,
|
|
kUpperText=3, kLowerText=4, kParagragh=5, kControlCode=6, kCircleText=7, kT3NormalText=8};
|
|
|
|
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; }
|
|
|
|
// sg modify 120516,增加一个参数,用于控制中文和英文(包括数字)是否拆分,主要是用于图形导出
|
|
// TParserStatus GetNext(XString &sNext);
|
|
TParserStatus GetNext(XString &sNext, BOOL bSplitEAndC = TRUE);
|
|
|
|
BOOL IsEOS() const
|
|
{
|
|
return (!m_pCurrent || !(*m_pCurrent));
|
|
}
|
|
};
|
|
|
|
class TARCH_EXP 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 TARCH_EXP TDbText: public TDbEntity
|
|
{
|
|
DECLARE_TENTBASE();
|
|
ACRX_DECLARE_MEMBERS(TDbText);
|
|
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:
|
|
TDbText();
|
|
~TDbText();
|
|
|
|
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 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 TDbEntity
|
|
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
|
|
virtual DrawType GetDrawType() const;
|
|
virtual void GetTips(DList<TObjInfoUnit> &) 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 TTextPosition FindSubText(const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange=NULL) const;
|
|
// 返回下一次查找的开始位置
|
|
virtual TTextPosition ReplaceSubText(const TTextPosition &posRep, const TCHAR *sRepText, TTextRange *pRange=NULL);
|
|
virtual long GetSubTextNum()const{return 1;}//ok
|
|
virtual TSubText* GetSubText(long iText)const{return new TSubText(objectId(),(AcDbEntity*)clone(),0);}//ok
|
|
virtual TSubText* HitTestText(XPoint pt)const;
|
|
virtual void SetSubText(long i,CString sText){SetText(sText);}//ok
|
|
virtual void UnionScale(double nScale);
|
|
|
|
//add by xlc on 100305 为底层基类提供的调用方法
|
|
virtual BOOL TBaseConvertFrom(const AcDbText *pText);
|
|
virtual AcDbEntity* TBaseCreateWipeOut();
|
|
|
|
virtual const TCHAR * TBaseGetText() const;
|
|
virtual void TBaseSetText(const TCHAR *pszText);
|
|
|
|
virtual TADSGePoint3d TBaseGetLocation() const;
|
|
virtual void TBaseSetLocation(TADSGePoint3d pt);
|
|
|
|
virtual void TBaseSetRotation(double nRot);
|
|
virtual double TBaseGetRotation() const;
|
|
|
|
// sg 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;
|
|
|
|
// sg modify 120516,增加一个参数,用于控制中文和英文(包括数字)是否拆分,主要是用于图形导出
|
|
//BOOL GetTextParts(DList<TTextPart> &lstTextParts) const;
|
|
BOOL GetTextParts(DList<TTextPart> &lstTextParts, BOOL bSplitEAndC = TRUE) 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);
|
|
void GetMaskPoly(std::vector<TGGePoly2D> &polys);
|
|
};
|
|
|
|
class TARCH_EXP TDbMText: public TDbText {
|
|
DECLARE_TENTBASE();
|
|
ACRX_DECLARE_MEMBERS(TDbMText);
|
|
private:
|
|
const static Adesk::UInt8 g_nVersion;
|
|
protected:
|
|
double m_nPageWidth; //段落宽度
|
|
double m_nLineSpace; //行间距
|
|
public:
|
|
TDbMText();
|
|
~TDbMText();
|
|
virtual BOOL IsValid() const;
|
|
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
|
|
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
|
|
virtual TTextPosition FindSubText(const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange=NULL) const;
|
|
// 返回下一次查找的开始位置
|
|
virtual TTextPosition ReplaceSubText(const TTextPosition &posRep, const TCHAR *sRepText, TTextRange *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 TDbEntity
|
|
virtual void GetTips(DList<TObjInfoUnit> &lstInfo) const; //取动态属性显示数据
|
|
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
|
|
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
|
|
virtual TSubText* 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 |