#pragma once #include "AecDbSymbWithText.h" #include "ObjInfoUnit.h" #define SEF_DOWN 0x01 // 下标注 #define SEF_LEFT 0x02 // 左标注 #define SEF_BASELINE 0x04 // 有基线 #define SEF_LEADER 0x08 // 有引线 #define SEF_PREC2 0x10 // 2位精度 #define SEF_FILLED 0x20 // 填充 // sg add 090204 #define SEF_DOTE 0x40 // 室外标高圆点样式 #define SEF_STANDARD 0x80 // 规范样式 // 以下保存在 m_nFlag2 内,不要骂娘,也不知道是谁这么干的。无解。 #define SEF_PARENTHESES 0x01 // 传统方式是否增加括号 // sg add 090220 #define SEF_ATSIDE 0x02 // 文字齐线端 #define SEF_ARCHELEV 0x04 // 是否是建筑标高 // sg add 090301 #define SEF_UPDOWNTEXT 0x08 // 总图标高是否上下排列 // 以下保存在 m_nFlag3 内。 // sg add 120608 #define SEF_TRIANGLE 0x01 // 空心三角形标高符号 #define SEF_NEWELEV 0x02 // 新总图标高中的右上标注形式,只对三角形填充标高作用 // jsx add 160517 #define SEF_CROSS 0x04 // 十字样式标高 class AecXDbText; class AecXDbSymbElevation : public AecXDbSymbWithText { public: ACRX_DECLARE_MEMBERS(AecXDbSymbElevation); private: const static Adesk::UInt8 g_nVersion; protected: Adesk::UInt8 m_nFlag; // 控制标记 ADSGePoint3d m_ptLocation; TCString m_sText; // 文字参数,多个的则分行 double m_nTextBaseLen, // 文字基线长度(图纸尺寸) m_nLeaderLen, // 引线长度(图纸尺寸) m_nBaseLen; // 基线长度(图纸尺寸) // TArch8 double m_dText2BaseRatio; // 文字距基线系数,sg add 081111 ADSGePoint3d m_ptText; // 文字夹点位置点,sg add 090204 Adesk::UInt8 m_nFlag2; // 文字与基线的相对位置标记 TCString m_sLowText; // 预留以后在线下增加文字使用,sg add 090211 ADSGePoint3d m_ptLowText; // TArch9 Adesk::UInt8 m_nFlag3; public: AecXDbSymbElevation(); ~AecXDbSymbElevation(); virtual BOOL IsValid() const; virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag); virtual Adesk::Boolean subCloneMeForDragging(); //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 subGetGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const; virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) const; virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset); virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset); // drived from TDbEntity virtual void GetTips(PtrList &) const; // 取动态属性显示数据 virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const; virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const; virtual int ConvertText(TConvertTextPtr ptr, void *pData = NULL); virtual SubText* HitTestText(ADSGePoint3d pt)const; virtual long GetSubTextNum()const { return 1; } // ok // sg add 090326,处理右键在位编辑错误 virtual SubText* GetSubText(long iText)const; virtual void SetSubText(long i, CString sText) { SetText(sText); } // ok virtual const TCHAR *GetDefaultLayer() const; // sg add 090204 BOOL GetText(Adesk::UInt32 cookies, AecXDbText &text, double &dPageWidth) const; 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 DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, // BOOL *bErase); // sg add 090216,图形导出 // sg add 101116,支持统一标高 virtual bool UnifyElevation(double dElevation = 0.0); public: // Helper Method void GetVertexes(ADSGePoint3d ptArray[7]) const; double GetDefaultTextBaseLen(BOOL bAsPaperUnit = TRUE) const; // sg add 090318,将文字位置点,有WCS改为ECS,以下3个函数,用于转化 AcGePoint2d GetEcsOriginPt() const; void GetEcsAxisVector(AcGeVector2d &xAxis, AcGeVector2d &yAxis) const; ADSGePoint3d GetWcsTextPt(BOOL bLowText = FALSE) const; // 从8.0的BETA2起,GetDefaultTextLocation、GetDefaultTextLocation2函数可不使用 ADSGePoint3d GetDefaultTextLocation() const; // sg add 090204 ADSGePoint3d GetDefaultTextLocation2() const; // sg add 090216 BOOL IsDigitEle(const TCString &sText) const; // sg add 090204,判断是否是数字标注 // sg add 090212,计算多行文字最小页宽 double GetMinTextBaseLen(TCStringList &lstTexts, BOOL bAsPaperUnit) const; // ADSGePoint3d GetElev1DrawPt() const; // sg add 090216,获取各个多行文字的绘制点 // ADSGePoint3d GetElev2DrawPt() const; // ADSGePoint3d GetFloorDrawPt() const; // sg modify 110125,获取各个多行文字的绘制点,增加参数传递,减少循环次数 ADSGePoint3d GetElev1DrawPt(TCStringList &lstElevs1, TCStringList &lstElevs2) const; ADSGePoint3d GetElev2DrawPt(const ADSGePoint3d &pt1, const double &dPage) const; ADSGePoint3d GetFloorDrawPt(const ADSGePoint3d &pt1, TCStringList &lstElevs1, TCStringList &lstElevs2, TCStringList &lstFloors, BOOL bHasPt1 = TRUE) const; // 获取基线下方文字,在X方向的宽度(相当于页宽) double GetLowTextXExtents(BOOL bAsPaperUnit) const; CString FormatLowText() const; // sg add 090223,对基线下方文字进行格式化 // Properties const TCHAR *GetText() const; // add by whl on 040922 // void GetTexts(TCStringList &lstTexts)const; // sg modify 090211 void GetTexts(TCStringList &lstElevs1, TCStringList &lstElevs2, TCStringList &lstFloors)const; bool GetElev1(double&res)const; // 取相对高程 bool GetElev2(double&res)const; // 取黄海高程 CString GetNoteString()const; // 括号中内容 void AddElev(double elev); // 高程变化 Adesk::UInt8 GetFlag() { return m_nFlag; } Adesk::UInt8 GetFlag2() { return m_nFlag2; } Adesk::UInt8 GetFlag3() { return m_nFlag3; } public: // Set、Get ADSGePoint3d GetLocation() const; double GetTextBaseLen(BOOL bAsPaperUnit = TRUE) const; double GetLeaderLen(BOOL bAsPaperUnit = TRUE) const; double GetBaseLen(BOOL bAsPaperUnit = TRUE) const; BOOL HasBaseLine() const; BOOL HasLeader() const; BOOL IsPrec2() const; BOOL IsFilled() const { return ((m_nFlag & SEF_FILLED) != 0); } void SetText(const TCHAR *pszText); void SetLocation(ADSGePoint3d pt); void SetTextBaseLen(double val, BOOL bAsPaperUnit = TRUE); void SetBaseLen(double val, BOOL bAsPaperUnit = TRUE); void SetLeaderLen(double val, BOOL bAsPaperUnit = TRUE); void SetBaseLine(BOOL bTrue); void SetLeader(BOOL bTrue); void SetPrec2(BOOL bTrue); void SetFilled(BOOL bTrue) { assertWriteEnabled(); if (bTrue) m_nFlag |= SEF_FILLED; else m_nFlag &= ~SEF_FILLED; } // sg add 081111,bRealDist用来控制,返回“实际距离”(自动乘字高)或“系数” double GetText2BaseRatio(BOOL bAsPaperUnit = TRUE, BOOL bRealDist = TRUE) const; void SetText2BaseRatio(double dVal, BOOL bAsPaperUnit = TRUE); // sg add 090204 ADSGePoint3d GetTextPoint(BOOL bEcsPoint = FALSE) const; BOOL IsRightText() const; BOOL IsDote() const; BOOL IsStandard() const; void SetTextPoint(ADSGePoint3d pt); void SetDote(BOOL bTrue); void SetStandard(BOOL bTrue); void SetLowText(const TCHAR *pszText); // sg add 090211 void SetLowTextPt(ADSGePoint3d pt); const TCHAR* GetLowText() const; ADSGePoint3d GetLowTextPt(BOOL bEcsPoint = FALSE) const; //jsx add 160517 BOOL IsCross() const; void SetCross(BOOL bTrue); BOOL IsParentheses() const; // sg add 090212,传统样式时,楼层信息部分,是否增加括号 void SetParentheses(BOOL bTrue); BOOL IsAtLineSide() const; // sg add 090220,设置文字是否齐线端 void SetAtLineSide(BOOL bTrue); BOOL IsArchElev() const; // sg add 090223,设置标高类型,普通标高、总图标高 void SetArchElev(BOOL bTrue); BOOL IsUpDownTextElev() const; // sg add 090301,总图标高是否上下排列 void SetUpDownTextElev(BOOL bTrue); BOOL IsFloorsOnRightSide() const; // sg add 110125,多层标高符号中的楼层是否在标高值左侧 void SetFloorsOnRightSide(BOOL bTrue); BOOL IsNewSitePlanElev() const; // sg add 120608,9.0新增加的总图右上侧标注的三角形填充标高 void SetNewSitePlanElev(BOOL bTrue); BOOL IsHollowTriangle() const; // sg add 120608,9.0新增加的空心三角形总图标高 void SetHollowTriangle(BOOL bTrue); BOOL HasKnowFloorsLoc() const; // sg add 110125,判断是否是需要知道楼层注释在左侧或右侧的特殊标高 private: // sg add 091116,打开T7对象后,对标注内容进行检查,如果是类似"9(%%P0.00)",则将文字拆分成两部分 void CheckAndModifyT7String(); // sg add 120608,将T9格式标高内容与原来的标高格式内容相互转化 void Change2T9ElevText(); CString Change2OldElevText() const; };