Files
envi-code/SourceCode/Code2026/Dimension/anotate_export.h
T

318 lines
9.4 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#pragma once
2026-09-28 15:28:50 +08:00
#include "StdAfx.h"
#include "AecDbObjXDataMap.h"
#include "AecDbEntityBaseEx.h"
class TMakeDim
{
public:
enum ETYPE
{
2026-10-04 00:04:20 +08:00
// 角度
2026-09-28 15:28:50 +08:00
eAngle = 0,
2026-10-04 00:04:20 +08:00
// 弦长
2026-09-28 15:28:50 +08:00
eChord,
2026-10-04 00:04:20 +08:00
// 弧长
2026-09-28 15:28:50 +08:00
eArc,
2026-10-04 00:04:20 +08:00
// 绘图单位 mm-M
2026-09-28 15:28:50 +08:00
emmM,
2026-10-04 00:04:20 +08:00
// 绘图单位 M-M
2026-09-28 15:28:50 +08:00
eMM,
2026-10-04 00:04:20 +08:00
// 箭头样式 圆点
2026-09-28 15:28:50 +08:00
eNoneArrow,
2026-10-04 00:04:20 +08:00
// 箭头样式 圆点
2026-09-28 15:28:50 +08:00
eCircle,
2026-10-04 00:04:20 +08:00
// 箭头样式 箭头
2026-09-28 15:28:50 +08:00
eArrow,
2026-10-04 00:04:20 +08:00
// 箭头样式 半箭头
2026-09-28 15:28:50 +08:00
eHalfArrow,
2026-10-04 00:04:20 +08:00
// 箭头样式 十字
2026-09-28 15:28:50 +08:00
eCross,
2026-10-04 00:04:20 +08:00
// 坐标取值 世界坐标
2026-09-28 15:28:50 +08:00
eWCS,
2026-10-04 00:04:20 +08:00
// 坐标取值 用户坐标
2026-09-28 15:28:50 +08:00
eUCS,
2026-10-04 00:04:20 +08:00
// 坐标类型 测量坐标
2026-09-28 15:28:50 +08:00
eXY,
2026-10-04 00:04:20 +08:00
// 坐标类型 施工坐标
2026-09-28 15:28:50 +08:00
eAB,
2026-10-04 00:04:20 +08:00
// 图名标注 国标样式
2026-09-28 15:28:50 +08:00
eGB,
2026-10-04 00:04:20 +08:00
// 图名标注 传统样式
2026-09-28 15:28:50 +08:00
eOld,
2026-10-04 00:04:20 +08:00
// 引出标注 始端对齐
2026-09-28 15:28:50 +08:00
eBeginAlign,
2026-10-04 00:04:20 +08:00
// 引出标注 末端对齐
2026-09-28 15:28:50 +08:00
eEndAlign,
2026-10-04 00:04:20 +08:00
// 引出标注 居中对齐
2026-09-28 15:28:50 +08:00
eMidAlign,
2026-10-04 00:04:20 +08:00
// 箭头标注 齐线端
2026-09-28 15:28:50 +08:00
eSideLineAlign,
2026-10-04 00:04:20 +08:00
// 箭头标注 齐线中
2026-09-28 15:28:50 +08:00
eMidLineAlign,
2026-10-04 00:04:20 +08:00
// 箭头标注 在线端
2026-09-28 15:28:50 +08:00
eEndLineAlign,
2026-10-04 00:04:20 +08:00
// 剖切样式 正交剖切
2026-09-28 15:28:50 +08:00
eZJPQ,
2026-10-04 00:04:20 +08:00
// 剖切样式 断面剖切
2026-09-28 15:28:50 +08:00
eDMPQ,
2026-10-04 00:04:20 +08:00
// 剖切 标注位置 两端
2026-09-28 15:28:50 +08:00
e2Pos,
2026-10-04 00:04:20 +08:00
// 剖切 标注位置 末端
2026-09-28 15:28:50 +08:00
eEndPos,
2026-10-04 00:04:20 +08:00
// 剖切 标注位置 始端
2026-09-28 15:28:50 +08:00
eStartPos,
2026-10-04 00:04:20 +08:00
// 剖切 标注方向 沿剖切位置线
2026-09-28 15:28:50 +08:00
ePQWZX,
2026-10-04 00:04:20 +08:00
// 剖切 标注方向 沿剖视方向线
2026-09-28 15:28:50 +08:00
ePSFXX,
};
public:
2026-10-04 00:04:20 +08:00
// 半径标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeRadius(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &ptCnt // 圆心
, const AcGePoint3d &ptEnd // 圆上的标注点
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 直径标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeDiameter(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &ptCnt // 圆心
, const AcGePoint3d &ptEnd // 圆上的标注点
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 角度标注
// 注意,标注方向为 起点 -> 终点 右手定则方向
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeAngle(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &ptCnt // 圆心
, const AcGePoint3d &ptStart // 标注起始点
, const AcGePoint3d &ptEnd // 标注终止点
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 弧弦标注
// 注意,标注方向为 起点 -> 终点 右手定则方向
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeArc(
2026-10-04 00:04:20 +08:00
const AcGeCircArc3d &arc // 要标注的对象(圆弧对象)
, ETYPE type // 标注类型
, double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 逐点标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeMPoint(
2026-10-04 00:04:20 +08:00
const std::vector<AcGePoint3d> &pts // 点组,数量不小于2
, double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 两点标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* make2Point(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &ptS // 要标注的起点
, const AcGePoint3d &ptE // 要标注的终点
, double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位
2026-09-28 15:28:50 +08:00
);
static AcDbEntity* make2Point(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &ptS // 要标注的起点
, const AcGePoint3d &ptE // 要标注的终点
, LPCTSTR pszDim // 标注文字
, double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 坐标标注
static AcDbEntity* makeCoordDim(const AcGePoint3d &ptLoc // 要标注的点
, const AcGePoint3d &ptSec // 转折点
,ETYPE Unit = emmM // 绘图单位
, int precision = 3 // 精度
, ETYPE arrow = eNoneArrow // 箭头样式
, ETYPE wcs = eWCS // 坐标取值
, ETYPE xy = eXY // 坐标类型
, double NorthAng = 90. // 北向角度
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 折断线
static AcDbEntity* makeSymbCut(const AcGePoint3d &ptS // 起点
, const AcGePoint3d &ptE // 终点
, double len // 向外延伸长度
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 图名标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeDrawingNameSymb(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt // 标注点
,LPCTSTR pszName // 标注文字
,LPCTSTR pszScale // 比例文字
,double nameheight = 7. // 标注文字字高
,double scaleheight = 5. // 比例文字字高
,LPCTSTR pszNameStyle = _T("STANDARD") // 标注文字样式
,LPCTSTR pszScaleStyle = _T("STANDARD") // 比例文字样式
,bool bShowScale = true // 是否显示比例
, ETYPE Gb = eOld // 图名标注标准
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 引出标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbLeader(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt1 // 标注点
, const AcGePoint3d &pt2 // 转折点
, double baseLen // 文字基线长度
,LPCTSTR pszUp // 上标文字
, LPCTSTR pszDown // 下标文字
, LPCTSTR pszStyle = _T("STANDARD") // 文字样式
, double height = 3.5 // 字高
, ETYPE arrow = eNoneArrow // 箭头样式
, double arrowSize = 3.0 // 箭头大小
, ETYPE align = eMidAlign // 文字相对基线对齐方式
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 节点标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbNode(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt1 // 标注点
, const AcGePoint3d &pt2 // 转折点
, double baseLen // 文字基线长度
, LPCTSTR pszUp // 上标文字
, LPCTSTR pszStyle = _T("STANDARD") // 文字样式
, double height = 3.5 // 字高
, ETYPE arrow = eNoneArrow // 箭头样式
, double arrowSize = 3.0 // 箭头大小
, ETYPE align = eBeginAlign // 文字相对基线对齐方式
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 画指北针
// 右手定则
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeNorthThumb(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt // 插入点
, double ang // 指向角度
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 画指北针
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeNorthThumb(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt // 插入点
, const AcGePoint3d &ptAng // 取另一个点, 用 pt 和 ptAng 来判断指向角度
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 箭头标注(坡度标注)
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbArrow(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &ptS // 起点
, const AcGePoint3d &ptE // 终点
, LPCTSTR pszUp // 上标文字
, LPCTSTR pszDown // 下标文字
, LPCTSTR pszStyle = _T("STANDARD") // 文字样式
, double height = 3.5 // 字高
, double arrowSize = 3.0 // 箭头大小
, ETYPE arrow = eArrow // 箭头样式
, ETYPE align = eMidLineAlign // 对齐方式
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 索引符号(做法标注)
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbIndex(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt1 // 起始点
, double dRadius // 范围半径
, const AcGePoint3d &pt2 // 转折点
, double baseLen // 文字基线长度
, LPCTSTR pszIdxUp // 索引编号
, LPCTSTR pszIdxDown // 索引图号
, LPCTSTR pszDimUp // 上标文字
, LPCTSTR pszDimDown // 下标文字
, LPCTSTR pszIdxStyle = _T("STANDARD") // 索引文字样式
, LPCTSTR pszDimStyle = _T("STANDARD") // 标注文字样式
, double height = 3.5 // 标注文字字高
, ETYPE align = eEndAlign // 标注对齐方式
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 索引图名(做法标注)
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbIndexDim(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt // 插入点
, LPCTSTR pszUp // 上标文字
, LPCTSTR pszDown = NULL // 下标文字
, LPCTSTR pszScale = NULL // 比例文字
, LPCTSTR pszStyleDim = _T("STANDARD") // 标注文字样式
, LPCTSTR pszStyleScale = _T("STANDARD") // 比例文字样式
, double height = 3.5 // 字高
, double radius = 7 // 半径
, double lw = .5 // 线宽
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 剖切符号
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbSection(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt1 // 起点
, const AcGePoint3d &pt2 // 终点
, const AcGePoint3d &ptDir // 方向点
, LPCTSTR pszLable // 编号文字
, LPCTSTR pszDrawing = NULL // 图号文字
, ETYPE sectionType = eDMPQ // 标注样式
, LPCTSTR pszStyleLable = _T("STANDARD") // 标注文字样式
, LPCTSTR pszStyleDrawing = _T("STANDARD") // 比例文字样式
, double heightLable = 5.0 // 编号字高
, double heightDrawing = 3.5 // 图号字高
, ETYPE drawingPos = e2Pos // 图号位置类型
, ETYPE drawingDir = ePQWZX // 图号方向
2026-09-28 15:28:50 +08:00
);
2026-10-04 00:04:20 +08:00
// 标高(基准标注)
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbElevation1(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt // 插入点
, LPCTSTR pszText // 标注文字
, LPCTSTR pszStyle = _T("STANDARD") // 标注文字样式
, double height = 3.5 // 字高
, bool bHasBaseLine = false // 带基线?
, double baseLen = 0. // 基线长度
, bool bHasLeaderLine = false // 带引线?
, double leaderLen = 0. // 引线长度
, bool bPre2 = true // 精度为2,否为3
2026-09-28 15:28:50 +08:00
);
static double getElevation(AcDbEntity *pEnt);
static bool modifyElevation(AcDbEntity *pEnt, LPCTSTR sElev);
2026-10-04 00:04:20 +08:00
// 标高标注
2026-09-28 15:28:50 +08:00
static AcDbEntity* makeSymbElevation2(
2026-10-04 00:04:20 +08:00
const AcGePoint3d &pt // 插入点
, LPCTSTR pszText // 标注文字
, LPCTSTR pszStyle = _T("STANDARD") // 标注文字样式
, double height = 3.5 // 字高
, bool bPre2 = true // 精度为2,否为3
2026-09-28 15:28:50 +08:00
);
template <class T>
static bool setData2DataMap(AcDbEntity *pEnt, LPCTSTR pszKey, const T &data)
{
if (!pszKey) return false;
AecXDbCurveBaseEx *pCurveBase = AecXDbCurveBaseEx::cast(pEnt);
AecXDbEntityBaseEx *pEntBase = AecXDbEntityBaseEx::cast(pEnt);
if (!pCurveBase && !pEntBase) return false;
AecDbObjXDataMap *pMap(NULL);
if (pCurveBase)
{
pMap = pCurveBase->GetSpecialtyData();
}
else if (pEntBase)
{
pMap = pEntBase->GetSpecialtyData();
}
if (!pMap) return false;
return pMap->SetAt(pszKey, data) == FALSE ? false : true;
}
template <class T>
static bool getDataByDataMap(AcDbEntity* pEnt, LPCTSTR pszKey, T & data)
{
if (!pszKey) return false;
AecXDbCurveBaseEx *pCurveBase = AecXDbCurveBaseEx::cast(pEnt);
AecXDbEntityBaseEx *pEntBase = AecXDbEntityBaseEx::cast(pEnt);
if (!pCurveBase && !pEntBase) return false;
AecDbObjXDataMap *pMap(NULL);
if (pCurveBase)
{
pMap = pCurveBase->GetSpecialtyData();
}
else if (pEntBase)
{
pMap = pEntBase->GetSpecialtyData();
}
if (!pMap) return false;
return pMap->GetAt(pszKey, data) == FALSE ? false : true;
}
};