#pragma once #include "StdAfx.h" #include "AecDbObjXDataMap.h" #include "AecDbEntityBaseEx.h" class TMakeDim { public: enum ETYPE { // 角度 eAngle = 0, // 弦长 eChord, // 弧长 eArc, // 绘图单位 mm-M emmM, // 绘图单位 M-M eMM, // 箭头样式 圆点 eNoneArrow, // 箭头样式 圆点 eCircle, // 箭头样式 箭头 eArrow, // 箭头样式 半箭头 eHalfArrow, // 箭头样式 十字 eCross, // 坐标取值 世界坐标 eWCS, // 坐标取值 用户坐标 eUCS, // 坐标类型 测量坐标 eXY, // 坐标类型 施工坐标 eAB, // 图名标注 国标样式 eGB, // 图名标注 传统样式 eOld, // 引出标注 始端对齐 eBeginAlign, // 引出标注 末端对齐 eEndAlign, // 引出标注 居中对齐 eMidAlign, // 箭头标注 齐线端 eSideLineAlign, // 箭头标注 齐线中 eMidLineAlign, // 箭头标注 在线端 eEndLineAlign, // 剖切样式 正交剖切 eZJPQ, // 剖切样式 断面剖切 eDMPQ, // 剖切 标注位置 两端 e2Pos, // 剖切 标注位置 末端 eEndPos, // 剖切 标注位置 始端 eStartPos, // 剖切 标注方向 沿剖切位置线 ePQWZX, // 剖切 标注方向 沿剖视方向线 ePSFXX, }; public: // 半径标注 static AcDbEntity* makeRadius( const AcGePoint3d &ptCnt // 圆心 , const AcGePoint3d &ptEnd // 圆上的标注点 ); // 直径标注 static AcDbEntity* makeDiameter( const AcGePoint3d &ptCnt // 圆心 , const AcGePoint3d &ptEnd // 圆上的标注点 ); // 角度标注 // 注意,标注方向为 起点 -> 终点 右手定则方向 static AcDbEntity* makeAngle( const AcGePoint3d &ptCnt // 圆心 , const AcGePoint3d &ptStart // 标注起始点 , const AcGePoint3d &ptEnd // 标注终止点 ); // 弧弦标注 // 注意,标注方向为 起点 -> 终点 右手定则方向 static AcDbEntity* makeArc( const AcGeCircArc3d &arc // 要标注的对象(圆弧对象) , ETYPE type // 标注类型 , double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位 ); // 逐点标注 static AcDbEntity* makeMPoint( const std::vector &pts // 点组,数量不小于2 , double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位 ); // 两点标注 static AcDbEntity* make2Point( const AcGePoint3d &ptS // 要标注的起点 , const AcGePoint3d &ptE // 要标注的终点 , double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位 ); static AcDbEntity* make2Point( const AcGePoint3d &ptS // 要标注的起点 , const AcGePoint3d &ptE // 要标注的终点 , LPCTSTR pszDim // 标注文字 , double toDimLine // 定位点到尺寸线的距离, 可以为负值, 图纸单位 ); // 坐标标注 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. // 北向角度 ); // 折断线 static AcDbEntity* makeSymbCut(const AcGePoint3d &ptS // 起点 , const AcGePoint3d &ptE // 终点 , double len // 向外延伸长度 ); // 图名标注 static AcDbEntity* makeDrawingNameSymb( 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 // 图名标注标准 ); // 引出标注 static AcDbEntity* makeSymbLeader( 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 // 文字相对基线对齐方式 ); // 节点标注 static AcDbEntity* makeSymbNode( 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 // 文字相对基线对齐方式 ); // 画指北针 // 右手定则 static AcDbEntity* makeNorthThumb( const AcGePoint3d &pt // 插入点 , double ang // 指向角度 ); // 画指北针 static AcDbEntity* makeNorthThumb( const AcGePoint3d &pt // 插入点 , const AcGePoint3d &ptAng // 取另一个点, 用 pt 和 ptAng 来判断指向角度 ); // 箭头标注(坡度标注) static AcDbEntity* makeSymbArrow( 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 // 对齐方式 ); // 索引符号(做法标注) static AcDbEntity* makeSymbIndex( 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 // 标注对齐方式 ); // 索引图名(做法标注) static AcDbEntity* makeSymbIndexDim( 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 // 线宽 ); // 剖切符号 static AcDbEntity* makeSymbSection( 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 // 图号方向 ); // 标高(基准标注) static AcDbEntity* makeSymbElevation1( 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 ); static double getElevation(AcDbEntity *pEnt); static bool modifyElevation(AcDbEntity *pEnt, LPCTSTR sElev); // 标高标注 static AcDbEntity* makeSymbElevation2( const AcGePoint3d &pt // 插入点 , LPCTSTR pszText // 标注文字 , LPCTSTR pszStyle = _T("STANDARD") // 标注文字样式 , double height = 3.5 // 字高 , bool bPre2 = true // 精度为2,否为3 ); template 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 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; } };