2026-10-04 00:04:20 +08:00
|
|
|
#pragma once
|
2026-09-28 15:28:50 +08:00
|
|
|
#include "AecDbEntityBaseEx.h"
|
|
|
|
|
#include "TextPosition.h"
|
|
|
|
|
#include "ObjInfoUnit.h"
|
|
|
|
|
#include "TextRange.h"
|
|
|
|
|
#include "SubText.h"
|
|
|
|
|
#include "astring.h"
|
|
|
|
|
|
|
|
|
|
class TextPart
|
|
|
|
|
{
|
|
|
|
|
public:
|
2026-10-04 00:04:20 +08:00
|
|
|
ADSGePoint3d m_ptLowLeft; //基点
|
2026-09-28 15:28:50 +08:00
|
|
|
BOOL m_bChinese;
|
|
|
|
|
TCString m_sText;
|
2026-10-04 00:04:20 +08:00
|
|
|
double m_nSizeX, m_nSizeY; //总宽, 总高
|
|
|
|
|
double m_nWidthFactor; //字高
|
|
|
|
|
double m_nHeight, m_nHeightReal; //ACAD字高, 真实字高
|
2026-09-28 15:28:50 +08:00
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
int m_iType;//0,常规;1,圆字
|
2026-09-28 15:28:50 +08:00
|
|
|
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;
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
TextPart(const TCHAR *t, ADSGePoint3d pt, double height)//圆字
|
2026-09-28 15:28:50 +08:00
|
|
|
{
|
|
|
|
|
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; }
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
// sg modify 120516,增加一个参数,用于控制中文和英文(包括数字)是否拆分,主要是用于图形导出
|
2026-09-28 15:28:50 +08:00
|
|
|
// TParserStatus GetNext(TCString &sNext);
|
|
|
|
|
TParserStatus GetNext(TCString &sNext, BOOL bSplitEAndC = TRUE);
|
|
|
|
|
|
|
|
|
|
BOOL IsEOS() const
|
|
|
|
|
{
|
|
|
|
|
return (!m_pCurrent || !(*m_pCurrent));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class TextLine : public PtrList<TextPart>
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
TextLine() {}
|
|
|
|
|
|
|
|
|
|
double GetHeight(BOOL bFromBase = TRUE) const;
|
|
|
|
|
double GetWidth() const;
|
|
|
|
|
void AdjustWidthFactor(double nFactor);
|
|
|
|
|
void AdjustBasePoint(double x);
|
|
|
|
|
ADSGePoint3d GetExtents() const;
|
2026-10-04 00:04:20 +08:00
|
|
|
BOOL IsEmpty() const; //没有东西, 或空格
|
2026-09-28 15:28:50 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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;
|
2026-10-04 00:04:20 +08:00
|
|
|
AcDbHardPointerId m_idStyle; //文字样式
|
2026-09-28 15:28:50 +08:00
|
|
|
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;
|
2026-10-04 00:04:20 +08:00
|
|
|
virtual void GetTips(PtrList<ObjInfoUnit> &) const; //取动态属性显示数据
|
2026-09-28 15:28:50 +08:00
|
|
|
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
|
2026-10-04 00:04:20 +08:00
|
|
|
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
|
2026-09-28 15:28:50 +08:00
|
|
|
virtual TextPosition FindSubText(const TCHAR *sSubText, TextPosition &posStart, TextRange *pRange = NULL) const;
|
2026-10-04 00:04:20 +08:00
|
|
|
// 返回下一次查找的开始位置
|
2026-09-28 15:28:50 +08:00
|
|
|
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);
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
//add by xlc on 100305 为底层基类提供的调用方法
|
2026-09-28 15:28:50 +08:00
|
|
|
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;
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
//专业数据 和绘制设置
|
2026-09-28 15:28:50 +08:00
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
// sg add 101116,支持统一标高
|
2026-09-28 15:28:50 +08:00
|
|
|
virtual bool UnifyElevation(double dElevation = 0.0);
|
|
|
|
|
|
|
|
|
|
virtual SHJson::WValue& ToJson() const;
|
2026-10-04 00:04:20 +08:00
|
|
|
// 通过json创建
|
2026-09-28 15:28:50 +08:00
|
|
|
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<TextPart> &lineText, const double &dRotate) const;
|
|
|
|
|
BOOL ConvertFrom(const AcDbText *pText);
|
|
|
|
|
ADSGePoint3d Align2Base(ADSGePoint3d ptAlign, ADSGePoint3d ext) const;
|
|
|
|
|
ADSGePoint3d Base2Align(ADSGePoint3d ptBase, ADSGePoint3d ext) const;
|
2026-10-04 00:04:20 +08:00
|
|
|
// 没有考虑转角
|
2026-09-28 15:28:50 +08:00
|
|
|
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;
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
// sg modify 120516,增加一个参数,用于控制中文和英文(包括数字)是否拆分,主要是用于图形导出
|
2026-09-28 15:28:50 +08:00
|
|
|
//BOOL GetTextParts(PtrList<TextPart> &lsTextParts) const;
|
|
|
|
|
BOOL GetTextParts(PtrList<TextPart> &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<GePoly2D> &polys);
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|