Files
envi-code/SourceCode/Code2026/Dimension/AecDbSymbElevation.h
T
2026-09-28 15:28:50 +08:00

236 lines
8.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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<ObjInfoUnit> &) 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;
};