#pragma once #include "AecDbEntityBaseEx.h" #include "TextPosition.h" #include "ObjInfoUnit.h" #include "TextRange.h" #include "SubText.h" #include "astring.h" class TextPart { public: ADSGePoint3d m_ptLowLeft; //基点 BOOL m_bChinese; TCString m_sText; double m_nSizeX, m_nSizeY; //总宽, 总高 double m_nWidthFactor; //字高 double m_nHeight, m_nHeightReal; //ACAD字高, 真实字高 int m_iType;//0,常规;1,圆字 public: TextPart() { m_bChinese = FALSE; m_nSizeX = m_nSizeY = 0.0; m_nHeight = 0.0; m_nHeightReal = 0.0; m_iType = 0; } TextPart(const TCHAR *t, ADSGePoint3d 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; } TextPart(const TCHAR *t, ADSGePoint3d 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; } TextPart(const TextPart &src) { *this = src; } TextPart & operator= (const TextPart &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 TextParser { 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: TextParser() { m_pszSource = m_pCurrent = NULL; } TextParser(const TCHAR *pszSrc) :m_sText(pszSrc) { m_pszSource = (const char*)m_sText; m_pCurrent = m_pszSource; } // sg modify 120516,增加一个参数,用于控制中文和英文(包括数字)是否拆分,主要是用于图形导出 // TParserStatus GetNext(TCString &sNext); TParserStatus GetNext(TCString &sNext, BOOL bSplitEAndC = TRUE); BOOL IsEOS() const { return (!m_pCurrent || !(*m_pCurrent)); } }; class TextLine : public PtrList { public: TextLine() {} double GetHeight(BOOL bFromBase = TRUE) const; double GetWidth() const; void AdjustWidthFactor(double nFactor); void AdjustBasePoint(double x); ADSGePoint3d GetExtents() const; BOOL IsEmpty() const; //没有东西, 或空格 }; class AecXDbText: public AecXDbEntityBaseEx { public: ACRX_DECLARE_MEMBERS(AecXDbText); private: const static Adesk::UInt8 g_nVersion; protected: TCString m_sText; ADSGePoint3d m_ptText; double m_nHeight, m_nRotation; AcDbHardPointerId m_idStyle; //文字样式 AcGiDraw::TextAlignment m_nAlignment; Adesk::UInt8 m_nMaskFlag; public: AecXDbText(); ~AecXDbText(); //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 DrawModeType GetDrawType() const; virtual void GetTips(PtrList &) const; //取动态属性显示数据 virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const; virtual const TCHAR *GetDefaultLayer() const; virtual Acad::ErrorStatus Draw2d(AcGiDraw &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(ADSGePoint3d 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 ADSGePoint3d TBaseGetLocation() const; virtual void TBaseSetLocation(ADSGePoint3d pt); virtual void TBaseSetRotation(double nRot); virtual double TBaseGetRotation() const; //专业数据 和绘制设置 // sg add 101116,支持统一标高 virtual bool UnifyElevation(double dElevation = 0.0); virtual SHJson::WValue& ToJson() const; // 通过json创建 virtual bool ByJson(const SHJson::WValue &v); const AcDbVoidPtrArray& Get2DBuffers()const { return AecDbEntityBase::Get2DBuffer(); } // Helper Method AcDbObjectId InitWipeout() const; AcDbEntity *CreateWipeOut() const; void SetupImageInfo(AcDbRasterImage *pAcDbRasterImage) const; void OutputTextLine(AcGiDraw &dc, ADSGePoint3d ptBase, const PtrList &lineText, const double &dRotate) const; BOOL ConvertFrom(const AcDbText *pText); ADSGePoint3d Align2Base(ADSGePoint3d ptAlign, ADSGePoint3d ext) const; ADSGePoint3d Base2Align(ADSGePoint3d ptBase, ADSGePoint3d ext) const; // 没有考虑转角 BOOL GetExtents(double *pWidth, double *pHeight, double *pHeight1 = NULL) const; virtual ADSGePoint3d GetExtents() const; // Properties BOOL GetStyleParam1(double *nHeight, double *nWidthFactor) const; BOOL GetStyleParam2(double *nHeight, double *nWidthFactor) const; // sg modify 120516,增加一个参数,用于控制中文和英文(包括数字)是否拆分,主要是用于图形导出 //BOOL GetTextParts(PtrList &lsTextParts) const; BOOL GetTextParts(PtrList &lsTextParts, BOOL bSplitEAndC = TRUE) const; Adesk::UInt8 GetMaskFlag() const; ADSGePoint3d GetLocation() const; double GetRotation() const; double GetHeight(BOOL bAsPaperUnit = TRUE) const; AcDbObjectId GetStyleId() const; const TCHAR* GetText() const; AcGiDraw::TextAlignment GetAlignment() const; void SetMaskFlag(Adesk::UInt8 nFlag); void SetLocation(ADSGePoint3d pt); void SetRotation(double nRot); void SetHeight(double nHeight, BOOL bAsPaperUnit = TRUE); void SetStyleId(AcDbObjectId id); void SetText(const TCHAR *pszText); void SetAlignment(AcGiDraw::TextAlignment nAlign); void GetMaskPoly(std::vector &polys); };