#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 { 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 &) 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 &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 &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 &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 &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 &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 &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