#pragma once
#include "McDbEntity.h"

#include "McDbMText.h"

class McDbDimensionImp;
// -------------------------------------------------------------------------
// Summary:
// 		McDbDimension类是表示AutoCAD中所有标注实体类型的类的基类
// -------------------------------------------------------------------------
class ARXDLL McDbDimension : public McDbEntity
{
protected:

	McDbDimension(McDbDimensionImp* pImp);
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbDimension(void);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbDimension(void);

	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbDimension);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文本位置点
	// -------------------------------------------------------------------------
	McGePoint3d         textPosition() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文本位置点
	// Parameters:
	// 		pt	-	文本位置点 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setTextPosition(const McGePoint3d& pt);

	// -------------------------------------------------------------------------
	// Summary:
	// 		如果文本在标注的默认位置上则函数返回Mdesk::kTrue，否则返回Mdesk::kFalse
	// -------------------------------------------------------------------------
	Mdesk::Boolean      isUsingDefaultTextPosition() const;


	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数设置标注不使用默认的文本位置，从而文本在标注的默认文本位置改变时保持不动
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   useSetTextPosition();


	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数设置标注使用默认的文本位置，从而文本位置可在标注以默认文本位置改变的方法改变时自动地更新
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   useDefaultTextPosition();


	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注的高度值
	// -------------------------------------------------------------------------
	mxreal              elevation() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注的高度值
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setElevation(mxreal);

	// -------------------------------------------------------------------------
	// Summary:
	// 		访问标注类的文本集合和格式逻辑
	// -------------------------------------------------------------------------
	LPCMSTR               dimensionText() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注使用的文本字符串
	// Parameters:
	// 		pszText	-	标注使用的文本字符串 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// Remarks:
	//		这个字符串可以包含任何所需的多行文本格式字符
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setDimensionText(LPCMSTR pszText);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数返回标注注释文本的旋转角
	// -------------------------------------------------------------------------
	mxreal              textRotation() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注注释文本的旋转角
	// Parameters:
	// 		dAng	-	文本的旋转角
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setTextRotation(mxreal dAng);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注参考的McDbDimStyleTableRecord的对象ID
	// -------------------------------------------------------------------------
	McDbObjectId        dimensionStyle() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注参考的McDbDimStyleTableRecord的对象ID
	// Parameters:
	// 		id	-	McDbDimStyleTableRecord的对象ID
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setDimensionStyle(McDbObjectId id);

	
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注文本的对齐方式
	// -------------------------------------------------------------------------
	McDbMText::AttachmentPoint textAttachment() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注文本的对齐方式
	// Parameters:
	// 		eAtt	-	文本的对齐方式 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setTextAttachment(McDbMText::AttachmentPoint eAtt);

	//:Ignore


	McDb::LineSpacingStyle textLineSpacingStyle() const;
	Mcad::ErrorStatus   setTextLineSpacingStyle(McDb::LineSpacingStyle eStyle);

	mxreal              textLineSpacingFactor() const;
	Mcad::ErrorStatus   setTextLineSpacingFactor(mxreal dFactor);
	//:End Ignore
	/*
	Mcad::ErrorStatus   getDimstyleData(McDbDimStyleTableRecord*& pRecord) const;
	Mcad::ErrorStatus   setDimstyleData(McDbDimStyleTableRecord* pNewData);
	Mcad::ErrorStatus   setDimstyleData(McDbObjectId newDataId);
	*/

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注的水平旋转角（弧度）
	// -------------------------------------------------------------------------
	mxreal              horizontalRotation() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注的水平旋转角（弧度）
	// Parameters:
	// 		newVal	-	标注的水平旋转角（弧度） 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setHorizontalRotation(mxreal newVal);

	// -------------------------------------------------------------------------
	// Summary:
	// 		重新生成标注的图块记录,对设置标注属必后，特别是标注两端的箭头块名时，必须调用该函数得生成标注数据。
	// Parameters:
	// 		forceUpdate - 总是重新生成，而不管需不需要
	// Returns:
	// 		标注对象不在数据库中时，就取当前数据库，有了数据库对象后，就在数据库中创建图块记录。
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   recomputeDimBlock(bool forceUpdate = true,bool onlyCloneDimBlockRecord = false);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的整数类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	// Returns:
	// 		返回整数类型变量值
	// Remarks:	
	// 		例如: 该函数实现代码如下:
	// 		<code>
	// 		int GetDimVarInt(int iType) const
	// 		{
	// 	#define GetDimVarIntCase(var,type)	\
	// 			case type:	\
	// 			return var;
	// 
	// 	#define GetDimVarBoolCase(var,type)	\
	// 			case type:	\
	// 			return (var ? 1 : 0);
	// 
	// 	#define GetDimVarColorCase(var,type)	\
	// 			case type:	\
	// 			return var.colorIndex();
	// 			switch(iType)
	// 			{
	// 				GetDimVarIntCase(m_dimadec,179);
	// 				GetDimVarBoolCase(m_dimalt ,170);
	// 				GetDimVarIntCase(m_dimaltd ,171);
	// 
	// 				GetDimVarIntCase(m_dimalttd,274);
	// 				GetDimVarIntCase(m_dimalttz,286);
	// 				GetDimVarIntCase(m_dimaltu ,273);
	// 				GetDimVarIntCase(m_dimaltz ,285);
	// 
	// 				GetDimVarIntCase(m_dimaunit,275);
	// 
	// 				GetDimVarColorCase(m_dimclrd ,176);
	// 				GetDimVarColorCase(m_dimclre ,177);
	// 				GetDimVarColorCase(m_dimclrt ,178);
	// 				GetDimVarIntCase(m_dimdec  ,271);
	// 
	// 				GetDimVarIntCase(m_dimfit  ,287);
	// 
	// 				GetDimVarIntCase(m_dimjust ,280);
	// 
	// 				GetDimVarBoolCase(m_dimlim  , 72);
	// 
	// 				GetDimVarBoolCase(m_dimsah  ,173);
	// 
	// 				GetDimVarBoolCase(m_dimsd1  ,281);
	// 				GetDimVarBoolCase(m_dimsd2  ,282);
	// 				GetDimVarBoolCase(m_dimse1  , 75);
	// 				GetDimVarBoolCase(m_dimse2  , 76);
	// 
	// 				GetDimVarBoolCase(m_dimsoxd ,175);
	// 
	// 				GetDimVarIntCase(m_dimtad , 77);
	// 				GetDimVarIntCase(m_dimtdec ,272);
	// 
	// 				GetDimVarBoolCase(m_dimtih  , 73);
	// 				GetDimVarBoolCase(m_dimtix  ,174);
	// 
	// 				GetDimVarBoolCase(m_dimtofl ,172);
	// 				GetDimVarBoolCase(m_dimtoh  , 74);
	// 				GetDimVarBoolCase(m_dimtol  , 71);
	// 				GetDimVarIntCase(m_dimtolj ,283);
	// 
	// 
	// 				GetDimVarIntCase(m_dimzin , 78);
	// 				GetDimVarIntCase(m_dimunit ,270);
	// 				GetDimVarBoolCase(m_dimupt  ,288);
	// 				GetDimVarIntCase(m_dimtzin  ,284);
	// 				GetDimVarIntCase(m_dimfrac ,276);
	// 				GetDimVarIntCase(m_dimlunit,277);
	// 				GetDimVarIntCase(m_dimatfit,289);
	// 				GetDimVarIntCase(m_dimtmove,279);
	// 				GetDimVarIntCase(m_dimazin, 79);
	// 			case 278:
	// 				return (int)(m_dimdsep);
	// 			case 371:
	// 				return (int)(m_dimlwd);
	// 			case 372:
	// 				return (int)(m_dimlwe);
	// 			default:
	// 				return 0;
	// 			}
	// 			return 0;
	// 		}
	// 		</code>
	// -------------------------------------------------------------------------
	int              GetDimVarInt(int iType) const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的整数类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      iVal	-   设置的值
	// -------------------------------------------------------------------------
	void             SetDimVarInt(int iType,int iVal);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的实数类型变量值
	// Parameters:
	// 		iType	-	该属性的类型值
	// Returns:
	// 		返回实数类型变量值
	// Remarks:	
	// 		例如:   该函数实现代码如下:
	// 		<code>
	// 				mxreal GetDimVarmxreal(int iType) const
	// 				{
	// 			#define GetDimVarmxrealCase(var,type)	\
	// 					case type:	\
	// 					return var;
	// 
	// 					switch(iType)
	// 					{
	// 						GetDimVarDoubleCase(m_dimaltf,143);
	// 						GetDimVarDoubleCase(m_dimasz , 41);
	// 						GetDimVarDoubleCase(m_dimcen ,141);
	// 						GetDimVarDoubleCase(m_dimdle , 46);
	// 						GetDimVarDoubleCase(m_dimdli , 43);
	// 						GetDimVarDoubleCase(m_dimexe , 44);
	// 						GetDimVarDoubleCase(m_dimexo , 42);
	// 
	// 						GetDimVarDoubleCase(m_dimgap ,147);
	// 						GetDimVarDoubleCase(m_dimlfac,144);
	// 						GetDimVarDoubleCase(m_dimrnd , 45);
	// 
	// 						GetDimVarDoubleCase(m_dimscale, 40);
	// 						GetDimVarDoubleCase(m_dimtfac,146);
	// 						GetDimVarDoubleCase(m_dimtm  , 48);
	// 						GetDimVarDoubleCase(m_dimtp  , 47);
	// 						GetDimVarDoubleCase(m_dimtsz ,142);
	// 						GetDimVarDoubleCase(m_dimtvp ,145);
	// 						GetDimVarDoubleCase(m_dimtxt ,140);
	// 						GetDimVarDoubleCase(m_dimaltrnd,148);
	// 						////
	// 					default:
	// 						return 0.0;
	// 					}
	// 					return 0.0;
	// 				}
	// 		</code>
	// -------------------------------------------------------------------------
	mxreal           GetDimVarDouble(int iType) const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的实数类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      dVal	-   设置的值
	// -------------------------------------------------------------------------
	void             SetDimVarDouble(int iType,mxreal dVal);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的字符串类型变量值
	// Parameters:
	// 		iType	-	该属性的类型值
	// Returns:
	// 		返回字符串类型变量值
	// Remarks:	
	// 		例如: 函数实现代码如下
	// 		<code>
	// 			MxString     GetDimVarString(int iType) const
	// 			{
	// 		#define GetDimVarStringCase(var,type)	\
	// 				case type:	\
	// 				return var;
	// 
	// 				switch(iType)
	// 				{
	// 					GetDimVarStringCase(m_dimapost,4);
	// 					GetDimVarStringCase(m_dimpost,3);
	// 				default:
	// 					return _MXT("");
	// 				}
	// 				return _MXT("");
	// 			}
	// 		</code>
	// -------------------------------------------------------------------------
	MxString          GetDimVarString(int iType) const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的字符串类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      pszVal	-   设置的值
	// -------------------------------------------------------------------------
	void             SetDimVarString(int iType, LPCMSTR pszVal);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注属性的对象id类型变量值
	// Parameters:
	// 		iType	-	该属性的类型值
	// Returns:
	// 		返回字对象id类型变量值
	// Remarks:	
	// 		例如: 函数实现代码如下
	// 		<code>
	// 				McDbObjectId GetDimVarObjectId(int iType) const
	// 				{
	// 			#define GetDimVarObjectIdCase(var,type)	\
	// 					case type:	\
	// 					return var;
	// 
	// 					switch(iType)
	// 					{
	// 						GetDimVarObjectIdCase(m_dimblk,  342);
	// 						GetDimVarObjectIdCase(m_dimblk1,  343);
	// 						GetDimVarObjectIdCase(m_dimblk2,  344);
	// 						GetDimVarObjectIdCase(m_dimldrblk,341);
	// 						GetDimVarObjectIdCase(m_dimtxsty,340);
	// 						GetDimVarObjectIdCase(m_dimltype,345);
	// 						GetDimVarObjectIdCase(m_dimltex1,346);
	// 						GetDimVarObjectIdCase(m_dimltex2,347);
	// 					default:
	// 						return McDbObjectId::kNull;
	// 					}
	// 					return McDbObjectId::kNull;
	// 				}
	// 		</code>
	// -------------------------------------------------------------------------
	McDbObjectId     GetDimVarObjectId(int iType) const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注属性的对象id类型变量值
	// Parameters:
	// 		iType	-	该属性的类形值
	//      id		-   设置的值
	// -------------------------------------------------------------------------
	void             SetDimVarObjectId(int iType,McDbObjectId id);

	void			 SetUpDimBlock(bool isUp);
	//:Ignore
	virtual Mdesk::Boolean    worldDraw(McGiWorldDraw* mode);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	
	// 标注块定义处理函数
	McDbObjectId dimBlockId() const;
	void setDimBlockId(
		const McDbObjectId& dimBlockId);

	McGePoint3d dimBlockPosition() const;
	void setDimBlockPosition(
		const McGePoint3d& dimBlockPosition);

	mxreal dimBlockRotation() const;
	void setDimBlockRotation(
		mxreal dimBlockRotation);

	McGeScale3d dimBlockScale() const;
	void setDimBlockScale(
		const McGeScale3d& dimBlockScale);

	Mcad::ErrorStatus   getGeomExtents(McDbExtents& extents, bool roughCalculation = true) const;

	virtual void objectClose    (const McDbObject* dbObj);

	virtual void modified(const McDbObject* dbObj);

	virtual McRxObject*        clone() const;



	Mcad::ErrorStatus deepClone(McDbObject*& pClonedObject,
		McDbCloneIdMapping& idMap
	) const override;

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);

	Mcad::ErrorStatus transformByExplode(const McGeMatrix3d& mat);

	virtual Mcad::ErrorStatus   explode(McDbVoidPtrArray& entitySet) const;
	//
    #undef DBDIMVAR_H
	#include "dbdimvar.h"



	virtual void*        GetInnerFileListId() const;

	virtual void         SetInnerFileListId(void*);

	inline McDbDimensionImp* getMcDbDimensionImp() const {
		return (McDbDimensionImp*)m_pImp;
	}

public:
	bool IsMoveText() const;

	//:End Ignore
};


class McDbRotatedDimensionImp;
// -------------------------------------------------------------------------
// Summary:
// 		McDbRotatedDimension类表示在空间中两点在它们以一个特定角度（旋转角）投影至标注平面中的一条直线上时，标注这两点的距离的标注类型
//		一个是“水平”的标注,一个是“垂直”的标注
// Remarks:	
// 		例如:   控件中绘线型标注代码
// 		<code>
// 			void CDrawCommand::DrawRotatedDimension()
// 			{
// 
// 				mds_point pt1;
// 				if(Mx::mcedGetPoint(NULL,_MXT("\n 指定第一条尺寸界线原点:"),pt1) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				mds_point pt2;
// 				if(Mx::mcedGetPoint(pt1,_MXT("\n 指定第二条尺寸界线原点:"),pt2) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				Mx::mcutPrintf(_MXT("指定尺寸线位置:"));
// 
// 				McGePoint3d xLine1Point = asPnt3d(pt1);
// 				McGePoint3d xLine2Point = asPnt3d(pt2);
// 				McGePoint3d dimLinePoint = xLine2Point;
// 
// 
// 
// 				McDbRotatedDimension* pDim = new McDbRotatedDimension(0.0,
// 					xLine1Point,
// 					xLine2Point,
// 					dimLinePoint,
// 					NULL,
// 					Mx::mcdbHostApplicationServices()->workingDatabase()->dimstyle() );
// 
// 				CDrawRotatedDimensionJig jig(pDim);
// 				if(jig.DoIt() )
// 				{
// 					MrxDbgUtils::addToCurrentSpaceAndClose(pDim);
// 				}
// 				else
// 				{
// 					delete pDim;
// 				}
// 			}
// 		</code>
// 		例如: 倾斜的尺寸标注的代码
// 		<code>
// 			void CDrawCommand::ObliqueDimension()
// 			{
// 				MrxDbgRbList spFilter = Mx::mcutBuildList(RTDXF0,_MXT("ROTATEDDIMENSION,ALIGNEDDIMENSION"),0);
// 				McDbObjectId objId1;		
// 				McGePoint3d  ptPick1;
// 
// 				if(MrxDbgUtils::selectEnt(_MXT("选择需要倾斜的尺寸标注:"),spFilter.data(),objId1,ptPick1) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				McDbObjectPointer<McDbDimension> spDim(objId1,McDb::kForRead);
// 				if(spDim.openStatus() != Mcad::eOk)
// 					return;
// 
// 
// 				mxreal dAng = 0.0;
// 				if(McDbAlignedDimension::cast(spDim.object() ) != NULL)
// 				{
// 					McDbAlignedDimension* pAlignedDim = McDbAlignedDimension::cast(spDim.object() );
// 					dAng = pAlignedDim->oblique();
// 				}
// 				else if(McDbRotatedDimension::cast(spDim.object() ) != NULL)
// 				{
// 					McDbRotatedDimension* pRotatedDim = McDbRotatedDimension::cast(spDim.object() );
// 					dAng = pRotatedDim->oblique();
// 				}
// 				else
// 				{
// 					MXASSERT(0);
// 					return;
// 				}
// 
// 				mxreal dRetAng = dAng;
// 				if(!GetNewAngObliqueDimension(dAng,dRetAng) )
// 					return;
// 
// 
// 				if(!MxT::IsEqual(dRetAng,dAng,0.001))
// 				{
// 					if(!MxT::IsZero(dRetAng))
// 					{
// 						if(dRetAng < MxBase::kPI / 4.0
// 							|| dRetAng > MxBase::kPI * 3 / 4.0
// 							)
// 						{
// 							AfxMessageBox(_MXT("角度不合理.."));
// 							return;
// 						}
// 					}
// 
// 					spDim->upgradeOpen();
// 
// 					if(McDbAlignedDimension::cast(spDim.object() ) != NULL)
// 					{
// 						McDbAlignedDimension* pAlignedDim = McDbAlignedDimension::cast(spDim.object() );
// 						pAlignedDim->setOblique(dRetAng);
// 					}
// 					else if(McDbRotatedDimension::cast(spDim.object() ) != NULL)
// 					{
// 						McDbRotatedDimension* pRotatedDim = McDbRotatedDimension::cast(spDim.object() );
// 						pRotatedDim->setOblique(dRetAng);
// 					}
// 				}
// 
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbRotatedDimension : public McDbDimension
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbRotatedDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// Parameters:
	//		rotation	-	输入标注的旋转角（弧度）
	//		xLine1Point	-	输入第一条界线的起始点（WCS坐标中）
	//		xLine2Point	-	输入第二条界线的起始点（WCS坐标中）
	//		dimLinePoint-	输入标注线自身上的点（WCS坐标中）
	//		dimText		-	输入作为标注注解的文本字符串
	//		dimStyle	-	输入要使用的McDbDimStyleTableRecord的对象ID
	// -------------------------------------------------------------------------
	McDbRotatedDimension(
		mxreal             rotation,
		const McGePoint3d& xLine1Point,
		const McGePoint3d& xLine2Point,
		const McGePoint3d& dimLinePoint,
		LPCMSTR        dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbRotatedDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbRotatedDimension);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回输入第一条界线开始点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine1Point() const;
	// -------------------------------------------------------------------------
	// Summary:
	// 		设置输入第一条界线开始点
	// Parameters:
	// 		pt	-	第一条界线开始点
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine1Point(const McGePoint3d& pt);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回输入第二条界线开始点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine2Point() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置输入第二条界线开始点
	// Parameters:
	// 		pt	-	第二条界线开始点
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine2Point(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数返回标注使用的指定标注线位置的定义点,这个点必须在标注线上某处
	// -------------------------------------------------------------------------
	McGePoint3d         dimLinePoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注使用的指定标注线位置的定义点,这个点必须在标注线上某处
	// Parameters:
	// 		pt	-	标注使用的指定标注线位置的定义点
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setDimLinePoint(const McGePoint3d& pt);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注的界线倾斜角（弧度）
	// -------------------------------------------------------------------------
	mxreal              oblique() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注的界线倾斜角（弧度）
	// Parameters:
	// 		dAng	-	标注的界线倾斜角（弧度） 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setOblique(mxreal dAng);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注的旋转角（弧度）
	// -------------------------------------------------------------------------
	mxreal              rotation() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注的旋转角（弧度）
	// Parameters:
	// 		dAng	-	标注的旋转角（弧度）
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setRotation(mxreal dAng);

	//:Ignore
	
	//virtual Mdesk::Boolean    worldDraw(McGiWorldDraw* mode);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);

	virtual Mcad::ErrorStatus moveGripPointsAt(const McGeIntArray& indices,
		const McGeVector3d& offset);

	virtual Mcad::ErrorStatus getGripPoints(McGePoint3dArray& gripPoints,
		McGeIntArray& osnapModes,
		McGeIntArray& geomIds) const;

private:
	
	//:End Ignore
};


class McDbAlignedDimensionImp;
// -------------------------------------------------------------------------
// Summary:
// 		McDbAlignedDimension类用于表示标注空间中任意两点距离的标注类型。标注的法向矢量必须与两点之间的线垂直。两个选择的点也作为两个标注界线的开始的定义点
// Remarks:	
// 		例如:   控件中绘对齐标注的代码
// 		<code>
// 			void CDrawCommand::DrawAlignedDimension()
// 			{
// 
// 				mds_point pt1;
// 				if(Mx::mcedGetPoint(NULL,_MXT("\n 指定第一条尺寸界线原点:"),pt1) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				mds_point pt2;
// 				if(Mx::mcedGetPoint(pt1,_MXT("\n 指定第二条尺寸界线原点:"),pt2) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				Mx::mcutPrintf(_MXT("指定尺寸线位置:"));
// 
// 				McGePoint3d xLine1Point = asPnt3d(pt1);
// 				McGePoint3d xLine2Point = asPnt3d(pt2);
// 				McGePoint3d dimLinePoint = xLine2Point;
// 
// 				McDbAlignedDimension* pDim = new McDbAlignedDimension(
// 					xLine1Point,
// 					xLine2Point,
// 					dimLinePoint,
// 					NULL,
// 					Mx::mcdbHostApplicationServices()->workingDatabase()->dimstyle() );
// 
// 
// 				// qjx test
// 				//pDim->setOblique(MxBase::kPI / 3.0);
// 
// 
// 				CDrawAlignedDimensionJig jig(pDim);
// 				if(jig.DoIt() )
// 				{
// 					MrxDbgUtils::addToCurrentSpaceAndClose(pDim);
// 				}
// 				else
// 				{
// 					delete pDim;
// 				}
// 			}
// 		</code>
// 		例如: 倾斜的尺寸标注的代码
// 		<code>
// 			void CDrawCommand::ObliqueDimension()
// 			{
// 				MrxDbgRbList spFilter = Mx::mcutBuildList(RTDXF0,_MXT("ROTATEDDIMENSION,ALIGNEDDIMENSION"),0);
// 				McDbObjectId objId1;		
// 				McGePoint3d  ptPick1;
// 
// 				if(MrxDbgUtils::selectEnt(_MXT("选择需要倾斜的尺寸标注:"),spFilter.data(),objId1,ptPick1) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				McDbObjectPointer<McDbDimension> spDim(objId1,McDb::kForRead);
// 				if(spDim.openStatus() != Mcad::eOk)
// 					return;
// 
// 
// 				mxreal dAng = 0.0;
// 				if(McDbAlignedDimension::cast(spDim.object() ) != NULL)
// 				{
// 					McDbAlignedDimension* pAlignedDim = McDbAlignedDimension::cast(spDim.object() );
// 					dAng = pAlignedDim->oblique();
// 				}
// 				else if(McDbRotatedDimension::cast(spDim.object() ) != NULL)
// 				{
// 					McDbRotatedDimension* pRotatedDim = McDbRotatedDimension::cast(spDim.object() );
// 					dAng = pRotatedDim->oblique();
// 				}
// 				else
// 				{
// 					MXASSERT(0);
// 					return;
// 				}
// 
// 				mxreal dRetAng = dAng;
// 				if(!GetNewAngObliqueDimension(dAng,dRetAng) )
// 					return;
// 
// 
// 				if(!MxT::IsEqual(dRetAng,dAng,0.001))
// 				{
// 					if(!MxT::IsZero(dRetAng))
// 					{
// 						if(dRetAng < MxBase::kPI / 4.0
// 							|| dRetAng > MxBase::kPI * 3 / 4.0
// 							)
// 						{
// 							AfxMessageBox(_MXT("角度不合理.."));
// 							return;
// 						}
// 					}
// 
// 					spDim->upgradeOpen();
// 
// 					if(McDbAlignedDimension::cast(spDim.object() ) != NULL)
// 					{
// 						McDbAlignedDimension* pAlignedDim = McDbAlignedDimension::cast(spDim.object() );
// 						pAlignedDim->setOblique(dRetAng);
// 					}
// 					else if(McDbRotatedDimension::cast(spDim.object() ) != NULL)
// 					{
// 						McDbRotatedDimension* pRotatedDim = McDbRotatedDimension::cast(spDim.object() );
// 						pRotatedDim->setOblique(dRetAng);
// 					}
// 				}
// 
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbAlignedDimension: public McDbDimension
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbAlignedDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// Parameters:
	//		xLine1Point	-	输入第一条界线的起始点（WCS坐标中）
	//		xLine2Point	-	输入第二条界线的起始点（WCS坐标中）
	//		dimLinePoint-	输入标注线自身上的点（WCS坐标中）
	//		dimText		-	输入作为标注注解的文本字符串
	//		dimStyle	-	输入要使用的McDbDimStyleTableRecord的对象ID
	McDbAlignedDimension(
		const McGePoint3d& xLine1Point,
		const McGePoint3d& xLine2Point,
		const McGePoint3d& dimLinePoint,
		const MCHAR *      dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);
	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbAlignedDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbAlignedDimension);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回输入第一条界线开始点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine1Point() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置输入第一条界线开始点
	// Parameters:
	// 		pt	-	第一条界线开始点
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine1Point(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回输入第二条界线开始点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine2Point() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置输入第二条界线开始点
	// Parameters:
	// 		pt	-	第二条界线开始点
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine2Point(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数返回标注使用的指定标注线位置的定义点,这个点必须在标注线上某处
	// -------------------------------------------------------------------------
	McGePoint3d         dimLinePoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注使用的指定标注线位置的定义点,这个点必须在标注线上某处
	// Parameters:
	// 		pt	-	标注使用的指定标注线位置的定义点
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setDimLinePoint(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回标注的界线倾斜角（弧度）
	// -------------------------------------------------------------------------
	mxreal              oblique() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置标注的界线倾斜角（弧度）
	// Parameters:
	// 		dAng	-	标注的界线倾斜角（弧度） 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setOblique(mxreal);

	//:Ignore

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);

	virtual Mcad::ErrorStatus moveGripPointsAt(const McGeIntArray& indices,
		const McGeVector3d& offset);

	virtual Mcad::ErrorStatus getGripPoints(McGePoint3dArray& gripPoints,
		McGeIntArray& osnapModes,
		McGeIntArray& geomIds) const;


private:


		//:End Ignore
};


//:Ignore

class McDb3PointAngularDimensionImp;
class ARXDLL McDb3PointAngularDimension: public McDbDimension
{
public:
	MCDB_DECLARE_MEMBERS(McDb3PointAngularDimension);

	McDb3PointAngularDimension();

	McDb3PointAngularDimension(
		const McGePoint3d& centerPoint,
		const McGePoint3d& xLine1Point,
		const McGePoint3d& xLine2Point,
		const McGePoint3d& arcPoint,
		const MCHAR *      dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);

	virtual ~McDb3PointAngularDimension();
	

	McGePoint3d         arcPoint() const;
	Mcad::ErrorStatus   setArcPoint(const McGePoint3d&);

	McGePoint3d         xLine1Point() const;
	Mcad::ErrorStatus   setXLine1Point(const McGePoint3d&);

	McGePoint3d         xLine2Point() const;
	Mcad::ErrorStatus   setXLine2Point(const McGePoint3d&);

	McGePoint3d         centerPoint() const;
	Mcad::ErrorStatus   setCenterPoint(const McGePoint3d&);


	bool extArcOn() const;
	Mcad::ErrorStatus setExtArcOn(bool value);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);

};
//:End Ignore

//:Ignore
class McDb2LineAngularDimensionImp;
//:End Ignore

// -------------------------------------------------------------------------
// Summary:
// 		二维的角度标注实体
// Remarks:	
// 		例如: 控件中绘制角度标注的代码
// 		<code>
// 			void CDrawCommand::Draw2LineAngularDimension()
// 			{
// 				MrxDbgRbList spFilter = Mx::mcutBuildList(RTDXF0,_MXT("LINE"),0);
// 				McDbObjectId objId1;		
// 				McGePoint3d  ptPick1;
// 
// 				if(MrxDbgUtils::selectEnt(_MXT("选择直线段1:"),spFilter.data(),objId1,ptPick1) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 
// 				McDbObjectId objId2;		
// 				McGePoint3d  ptPick2;
// 
// 				if(MrxDbgUtils::selectEnt(_MXT("选择直线段2:"),spFilter.data(),objId2,ptPick2) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				if(objId1 == objId2)
// 				{
// 					Mx::mcutPrintf(_MXT("不能选择同一个直线"));
// 					return;
// 				}
// 
// 				McDbObjectPointer<McDbCurve> spCurve1(objId1,McDb::kForRead);
// 				if(spCurve1.openStatus() != Mcad::eOk )
// 				{
// 					MXASSERT(0);
// 					return;
// 				}
// 
// 				McDbObjectPointer<McDbCurve> spCurve2(objId2,McDb::kForRead);
// 				if(spCurve2.openStatus() != Mcad::eOk )
// 				{
// 					MXASSERT(0);
// 					return;
// 				}
// 
// 				McGePoint3d pt11,pt12,pt21,pt22;
// 				spCurve1->getStartPoint(pt11);
// 				spCurve1->getEndPoint(pt12);
// 
// 				spCurve2->getStartPoint(pt21);
// 				spCurve2->getEndPoint(pt22);
// 
// 				McGeVector3d vec1 = pt12 - pt11;
// 				McGeVector3d vec2 = pt22 - pt21;
// 
// 				if(vec1.isParallelTo(vec2) == Mdesk::kTrue)
// 				{
// 					Mx::mcutPrintf(_MXT("两个直线不能平行"));
// 					return;
// 				}
// 
// 				McDb2LineAngularDimension* pDim = new McDb2LineAngularDimension(pt11,
// 					pt12,
// 					pt21,
// 					pt22,
// 					ptPick2,
// 					NULL,
// 					Mx::mcdbHostApplicationServices()->workingDatabase()->dimstyle() );
// 
// 				CDraw2LineAngularDimensionJig jig(pDim);
// 				if(jig.DoIt() )
// 				{
// 					MrxDbgUtils::addToCurrentSpaceAndClose(pDim);
// 				}
// 				else
// 				{
// 					delete pDim;
// 				}
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDb2LineAngularDimension: public McDbDimension
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDb2LineAngularDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// Parameters:
	// 		xLine1Start -	角度标注第一个参考线的开始点
	// 		xLine1End	-	角度标注第一个参考线的结束点
	//		xLine2Start	-	角度标注第二个参考线的开始点
	//		xLine2End	-	角度标注第二个参考线的结束点
	//		arcPoint	-	文字位置点
	//		dimText		-   标注替换文字
	//		dimStyle	-   标注样式id
	// -------------------------------------------------------------------------
	McDb2LineAngularDimension(
		const McGePoint3d& xLine1Start,
		const McGePoint3d& xLine1End,
		const McGePoint3d& xLine2Start,
		const McGePoint3d& xLine2End,
		const McGePoint3d& arcPoint,
		const MCHAR *      dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDb2LineAngularDimension();

	MCDB_DECLARE_MEMBERS(McDb2LineAngularDimension);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回角度标注在圆弧上的点
	// -------------------------------------------------------------------------
	McGePoint3d         arcPoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置角度标注在圆弧上的点
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setArcPoint(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回角度标注第一个参考线的开始点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine1Start() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置角度标注第一个参考线的开始点
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine1Start(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回角度标注第一个参考线的结束点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine1End() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置角度标注第一个参考线的结束点
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine1End(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回角度标注第二个参考线的开始点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine2Start() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置角度标注第二个参考线的开始点
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine2Start(const McGePoint3d&);


	// -------------------------------------------------------------------------
	// Summary:
	// 		返回角度标注第二个参考线的结束点
	// -------------------------------------------------------------------------
	McGePoint3d         xLine2End() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置角度标注第二个参考线的结束点
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setXLine2End(const McGePoint3d&);

	//:Ignore

	bool extArcOn() const;
	Mcad::ErrorStatus setExtArcOn(bool value);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);


	virtual Mcad::ErrorStatus moveGripPointsAt(const McGeIntArray& indices,
		const McGeVector3d& offset);

	virtual Mcad::ErrorStatus getGripPoints(McGePoint3dArray& gripPoints,
		McGeIntArray& osnapModes,
		McGeIntArray& geomIds) const;
private:
	//:End Ignore
};

class McDbDiametricDimensionImp;

// -------------------------------------------------------------------------
// Summary:
// 		直径标注类型
// Remarks:	
// 		例如:   控件中绘直接标注的代码
// 		<code>
// 			void CDrawCommand::DrawDiametricDimension()
// 			{
// 				MrxDbgRbList spFilter = Mx::mcutBuildList(RTDXF0,_MXT("CIRCLE,ARC"),0);
// 				McDbObjectId objId;
// 				McGePoint3d  ptPick;
// 
// 				if(MrxDbgUtils::selectEnt(_MXT("选择圆弧或圆:"),spFilter.data(),objId,ptPick) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 
// 				McDbDiametricDimension* pDim = new McDbDiametricDimension;
// 				pDim->setDimensionStyle(Mx::mcdbHostApplicationServices()->workingDatabase()->dimstyle() );
// 
// 				CDrawDiametricDimensionJig jig(pDim,objId,ptPick);
// 				if(jig.DoIt() )
// 				{
// 					MrxDbgUtils::addToCurrentSpaceAndClose(pDim);
// 				}
// 				else
// 				{
// 					delete pDim;
// 				}
// 			}
// 			CDrawDiametricDimensionJig::CDrawDiametricDimensionJig(McDbDiametricDimension* pDim,
// 																   McDbObjectId id,McGePoint3d ptPick)
// 			{
// 				m_pDim	= pDim;
// 				m_id	= id;
// 
// 				CalculationDimPoint(ptPick);
// 			}
// 
// 			BOOL CDrawDiametricDimensionJig::CalculationDimPoint(McGePoint3d ptPick)
// 			{
// 				McDbObjectPointer<McDbEntity> spEnt(m_id,McDb::kForRead);
// 				if(spEnt.openStatus() != Mcad::eOk)
// 				{
// 					MXASSERT(0);
// 					return FALSE;
// 				}
// 				{
// 					McDbArc* pArc = McDbArc::cast(spEnt.object() );
// 					if(pArc != NULL)
// 					{
// 						McGePoint3d ptCenter = pArc->center();
// 
// 
// 						McGePoint3d cordPoint;
// 						McGePoint3d farcordPoint;
// 						if(pArc->getClosestPointTo(ptPick,cordPoint) != Mcad::eOk)
// 						{
// 							MXASSERT(0);
// 							cordPoint = ptCenter + AcGeVector3d::kXAxis * pArc->radius();
// 						}
// 						farcordPoint = cordPoint + (ptCenter - cordPoint) * 2.0;
// 
// 						m_pDim->setChordPoint(cordPoint);
// 						m_pDim->setFarChordPoint(farcordPoint);
// 
// 						m_pDim->setTextPosition(ptPick);
// 
// 						mxreal dSAng = pArc->startAngle();
// 						mxreal dEAng = pArc->endAngle();
// 						if(dEAng < dSAng)
// 							dEAng += MxBase::k2PI;
// 
// 						m_pDim->setExtArcEndAngle(dEAng);
// 						m_pDim->setExtArcStartAngle(dSAng);
// 
// 						return TRUE;
// 					}
// 				}
// 
// 				{
// 					McDbCircle* pCircle = McDbCircle::cast(spEnt.object() );
// 					if(pCircle != NULL)
// 					{
// 						McGePoint3d ptCenter = pCircle->center();
// 
// 
// 						McGePoint3d cordPoint;
// 						McGePoint3d farcordPoint;
// 						if(pCircle->getClosestPointTo(ptPick,cordPoint) != Mcad::eOk)
// 						{
// 							MXASSERT(0);
// 							cordPoint = ptCenter + AcGeVector3d::kXAxis * pCircle->radius();
// 						}
// 						farcordPoint = cordPoint + (ptCenter - cordPoint) * 2.0;
// 						m_pDim->setChordPoint(cordPoint);
// 						m_pDim->setFarChordPoint(farcordPoint);
// 
// 						m_pDim->setTextPosition(ptPick);
// 
// 						m_pDim->setExtArcEndAngle(MxBase::k2PI);
// 						m_pDim->setExtArcStartAngle(0.0);
// 						return TRUE;
// 					}
// 				}
// 
// 				MXASSERT(0);
// 				return FALSE;
// 			}
// 
// 			CDrawDiametricDimensionJig::~CDrawDiametricDimensionJig(void)
// 			{
// 
// 			}
// 
// 			McEdJig::DragStatus CDrawDiametricDimensionJig::sampler()
// 			{
// 				AcGePoint3d point;
// 				AcEdJig::DragStatus ret = acquirePoint(point);
// 				if(ret == AcEdJig::kNormal)
// 				{
// 					CalculationDimPoint(point);
// 				}
// 				return ret;
// 			}
// 
// 			Adesk::Boolean CDrawDiametricDimensionJig::update()
// 			{
// 				return Adesk::kTrue;
// 			}
// 
// 			AcDbEntity* CDrawDiametricDimensionJig::entity() const
// 			{
// 
// 				return m_pDim;
// 			}
// 
// 			bool    CDrawDiametricDimensionJig::DoIt()
// 			{
// 				if(drag(NULL,NULL,FALSE) == AcEdJig::kNormal)
// 				{
// 					return true;
// 				}
// 				return false;
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbDiametricDimension: public McDbDimension
{
	MCDB_DECLARE_MEMBERS(McDbDiametricDimension);
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbDiametricDimension();
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// Parameters:
	// 		chordPoint		- 在被标注的曲线上的第一个点
	// 		farChordPoint	- 在被标注的曲线上的第二个点，这个点与chordPoint直径相对
	//		leaderLength	- 输入箭头长度
	//		dimText			- 标注替换文字
	//		dimStyle		-  标注样式id
	// -------------------------------------------------------------------------
	McDbDiametricDimension(
		const McGePoint3d& chordPoint,		
		const McGePoint3d& farChordPoint,
		mxreal             leaderLength,
		LPCMSTR			  dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbDiametricDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 	    返回标注引线长度,此函数是过时的且总是返回0，除非在标注创建时设置了长度	
	// -------------------------------------------------------------------------
	mxreal              leaderLength() const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注引线长度	
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setLeaderLength(mxreal);

	// -------------------------------------------------------------------------
	// Summary:
	// 	    返回在被标注的曲线上的第一个点
	// -------------------------------------------------------------------------
	McGePoint3d         chordPoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置在被标注的曲线上的第一个点
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setChordPoint(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 	    返回在被标注的曲线上的第二个点，这个点与chordPoint直径相对	
	// -------------------------------------------------------------------------
	McGePoint3d         farChordPoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置在被标注的曲线上的第二个点，这个点与chordPoint直径相对		
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setFarChordPoint(const McGePoint3d&);

	
	//:Ignore
	
	mxreal extArcStartAngle() const;
	Mcad::ErrorStatus setExtArcStartAngle(mxreal newAngle);

	mxreal extArcEndAngle() const;
	Mcad::ErrorStatus setExtArcEndAngle(mxreal newAngle);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);


	Mcad::ErrorStatus moveGripPointsAt(const McGeIntArray& indices,
		const McGeVector3d& offset) override;

	Mcad::ErrorStatus getGripPoints(McGePoint3dArray& gripPoints,
		McGeIntArray& osnapModes,
		McGeIntArray& geomIds) const override;

private:

	//:End Ignore
};

//:Ignore

class McDbOrdinateDimensionImp;
class ARXDLL McDbOrdinateDimension: public McDbDimension
{
public:
	McDbOrdinateDimension();
	McDbOrdinateDimension(
		Mdesk::Boolean     useXAxis,
		const McGePoint3d& definingPoint,
		const McGePoint3d& leaderEndPoint,
		LPCMSTR      dimText = NULL,
		McDbObjectId       dimStyle  = McDbObjectId::kNull);
	virtual ~McDbOrdinateDimension();
	MCDB_DECLARE_MEMBERS(McDbOrdinateDimension);

	Mdesk::Boolean      isUsingXAxis() const;
	Mdesk::Boolean      isUsingYAxis() const;
	Mcad::ErrorStatus   useXAxis();
	Mcad::ErrorStatus   useYAxis();

	McGePoint3d         origin() const;
	Mcad::ErrorStatus   setOrigin(const McGePoint3d&);

	McGePoint3d         definingPoint() const;
	Mcad::ErrorStatus   setDefiningPoint(const McGePoint3d&);

	McGePoint3d         leaderEndPoint() const;
	Mcad::ErrorStatus   setLeaderEndPoint(const McGePoint3d&);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);
};
//:End Ignore


class McDbRadialDimensionImp;
// -------------------------------------------------------------------------
// Summary:
// 		半径标注类型
// Remarks:	
// 		例如:   控件中绘制半径标注的代码
// 		<code>
// 			void CDrawCommand::DrawRadialDimension()
// 			{
// 				MrxDbgRbList spFilter = Mx::mcutBuildList(RTDXF0,_MXT("CIRCLE,ARC"),0);
// 				McDbObjectId objId;
// 				McGePoint3d  ptPick;
// 
// 				if(MrxDbgUtils::selectEnt(_MXT("选择圆弧或圆:"),spFilter.data(),objId,ptPick) != RTNORM)
// 				{
// 					return;
// 				}
// 
// 				McDbRadialDimension* pDim = new McDbRadialDimension;
// 				pDim->setDimensionStyle(Mx::mcdbHostApplicationServices()->workingDatabase()->dimstyle() );
// 
// 				CDrawRadialDimensionJig jig(pDim,objId,ptPick);
// 				if(jig.DoIt() )
// 				{
// 					MrxDbgUtils::addToCurrentSpaceAndClose(pDim);
// 				}
// 				else
// 				{
// 					delete pDim;
// 				}
// 			}
// 			CDrawRadialDimensionJig::CDrawRadialDimensionJig(McDbRadialDimension* pDim,
// 															 McDbObjectId id,McGePoint3d ptPick)
// 			{
// 				m_pDim	= pDim;
// 				m_id	= id;
// 
// 				CalculationDimPoint(ptPick);
// 			}
// 
// 			BOOL CDrawRadialDimensionJig::CalculationDimPoint(McGePoint3d ptPick)
// 			{
// 				McDbObjectPointer<McDbEntity> spEnt(m_id,McDb::kForRead);
// 				if(spEnt.openStatus() != Mcad::eOk)
// 				{
// 					MXASSERT(0);
// 					return FALSE;
// 				}
// 				{
// 					McDbArc* pArc = McDbArc::cast(spEnt.object() );
// 					if(pArc != NULL)
// 					{
// 						McGePoint3d ptCenter = pArc->center();
// 						m_pDim->setCenter(ptCenter );
// 
// 						McGePoint3d cordPoint;
// 						if(pArc->getClosestPointTo(ptPick,cordPoint) != Mcad::eOk)
// 						{
// 							MXASSERT(0);
// 							cordPoint = ptCenter + AcGeVector3d::kXAxis * pArc->radius();
// 						}
// 
// 						m_pDim->setChordPoint(cordPoint);
// 
// 						m_pDim->setTextPosition(ptPick);
// 
// 						mxreal dSAng = pArc->startAngle();
// 						mxreal dEAng = pArc->endAngle();
// 						if(dEAng < dSAng)
// 							dEAng += MxBase::k2PI;
// 
// 						m_pDim->setExtArcEndAngle(dEAng);
// 						m_pDim->setExtArcStartAngle(dSAng);
// 
// 						return TRUE;
// 					}
// 				}
// 
// 				{
// 					McDbCircle* pCircle = McDbCircle::cast(spEnt.object() );
// 					if(pCircle != NULL)
// 					{
// 						McGePoint3d ptCenter = pCircle->center();
// 						m_pDim->setCenter(ptCenter );
// 
// 						McGePoint3d cordPoint;
// 						if(pCircle->getClosestPointTo(ptPick,cordPoint) != Mcad::eOk)
// 						{
// 							MXASSERT(0);
// 							cordPoint = ptCenter + AcGeVector3d::kXAxis * pCircle->radius();
// 						}
// 
// 						m_pDim->setChordPoint(cordPoint);
// 
// 						m_pDim->setTextPosition(ptPick);
// 
// 						m_pDim->setExtArcEndAngle(MxBase::k2PI);
// 						m_pDim->setExtArcStartAngle(0.0);
// 
// 
// 						return TRUE;
// 					}
// 				}
// 
// 				MXASSERT(0);
// 				return FALSE;
// 			}
// 
// 			CDrawRadialDimensionJig::~CDrawRadialDimensionJig(void)
// 			{
// 
// 			}
// 
// 			McEdJig::DragStatus CDrawRadialDimensionJig::sampler()
// 			{
// 				AcGePoint3d point;
// 				AcEdJig::DragStatus ret = acquirePoint(point);
// 				if(ret == AcEdJig::kNormal)
// 				{
// 					CalculationDimPoint(point);
// 				}
// 				return ret;
// 			}
// 
// 			Adesk::Boolean CDrawRadialDimensionJig::update()
// 			{
// 				return Adesk::kTrue;
// 			}
// 
// 			AcDbEntity* CDrawRadialDimensionJig::entity() const
// 			{
// 
// 				return m_pDim;
// 			}
// 
// 			bool    CDrawRadialDimensionJig::DoIt()
// 			{
// 				if(drag(NULL,NULL,FALSE) == AcEdJig::kNormal)
// 				{
// 					return true;
// 				}
// 				return false;
// 			}
// 
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbRadialDimension: public McDbDimension
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbRadialDimension();

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// Parameters:
	// 		center		- 被标注的曲线的中点
	// 		chordPoint	- 被标注的曲线上的点
	//		leaderLength- 输入箭头长度
	//		dimText		- 标注替换文字
	//		dimStyle	- 标注样式id
	// -------------------------------------------------------------------------
	McDbRadialDimension(
		const McGePoint3d& center,
		const McGePoint3d& chordPoint,
		mxreal             leaderLength,
		LPCMSTR      dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbRadialDimension();
	MCDB_DECLARE_MEMBERS(McDbRadialDimension);

	// -------------------------------------------------------------------------
	// Summary:
	// 	    返回标注引线长度,此函数是过时的且总是返回0，除非在标注创建时设置了长度	
	// -------------------------------------------------------------------------
	mxreal              leaderLength() const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置标注引线长度	
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setLeaderLength(mxreal);

	// -------------------------------------------------------------------------
	// Summary:
	// 	    返回被标注的曲线的中点	
	// -------------------------------------------------------------------------
	McGePoint3d         center() const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置被标注的曲线上的点	
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setCenter(const McGePoint3d&);

	// -------------------------------------------------------------------------
	// Summary:
	// 	    返回被标注的曲线上的点
	// -------------------------------------------------------------------------
	McGePoint3d         chordPoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	//      设置被标注的曲线上的点	
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus   setChordPoint(const McGePoint3d&);

	//:Ignore
	
	mxreal extArcStartAngle() const;
	Mcad::ErrorStatus setExtArcStartAngle(mxreal newAngle);

	mxreal extArcEndAngle() const;
	Mcad::ErrorStatus setExtArcEndAngle(mxreal newAngle);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);


	Mcad::ErrorStatus moveGripPointsAt(const McGeIntArray& indices,
		const McGeVector3d& offset) override;

	Mcad::ErrorStatus getGripPoints(McGePoint3dArray& gripPoints,
		McGeIntArray& osnapModes,
		McGeIntArray& geomIds) const  override;

private:
	//:End Ignore
};

//:Ignore

class McDbArcDimensionImp;
class ARXDLL McDbArcDimension: public McDbDimension
{
public:

	McDbArcDimension();

	McDbArcDimension(
		const McGePoint3d& centerPoint,
		const McGePoint3d& xLine1Point,
		const McGePoint3d& xLine2Point,
		const McGePoint3d& arcPoint,
		LPCMSTR dimText = NULL,
		McDbObjectId dimStyle = McDbObjectId::kNull);

	virtual ~McDbArcDimension();
	MCDB_DECLARE_MEMBERS(McDbArcDimension);


	McGePoint3d         arcPoint() const;

	Mcad::ErrorStatus   setArcPoint(const McGePoint3d & arcPt);


	McGePoint3d         xLine1Point() const;

	Mcad::ErrorStatus   setXLine1Point(const McGePoint3d & xLine1Pt);


	McGePoint3d         xLine2Point() const;

	Mcad::ErrorStatus   setXLine2Point(const McGePoint3d & xLine2Pt);


	McGePoint3d         centerPoint() const;

	Mcad::ErrorStatus   setCenterPoint(const McGePoint3d & ctrPt);


	bool                isPartial() const;

	Mcad::ErrorStatus   setIsPartial(const bool & partial);


	mxreal              arcStartParam() const;

	Mcad::ErrorStatus   setArcStartParam(const mxreal & arcParam);


	mxreal              arcEndParam() const;

	Mcad::ErrorStatus   setArcEndParam(const mxreal & arcParam);


	bool                hasLeader() const;

	Mcad::ErrorStatus   setHasLeader(const bool & leaderVal);


	McGePoint3d         leader1Point() const;

	Mcad::ErrorStatus   setLeader1Point(const McGePoint3d & ldr1Pt);


	McGePoint3d         leader2Point() const;

	Mcad::ErrorStatus   setLeader2Point(const McGePoint3d & ldr2Pt);


	int arcSymbolType() const;

	Mcad::ErrorStatus setArcSymbolType(const int symbol);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);

private:
	
};

// McDbRadialDimensionLarge;
class McDbRadialDimensionLargeImp;
class ARXDLL McDbRadialDimensionLarge: public McDbDimension
{
public:

	McDbRadialDimensionLarge();

	McDbRadialDimensionLarge(
		const McGePoint3d& center,
		const McGePoint3d& chordPoint,
		const McGePoint3d& overrideCenter,
		const McGePoint3d& jogPoint,
		mxreal             jogAngle,
		LPCMSTR      dimText = NULL,
		McDbObjectId       dimStyle = McDbObjectId::kNull);

	virtual ~McDbRadialDimensionLarge();
	MCDB_DECLARE_MEMBERS(McDbRadialDimensionLarge);



	McGePoint3d         center() const;

	Mcad::ErrorStatus   setCenter(const McGePoint3d & centerPoint);


	McGePoint3d         chordPoint() const;

	Mcad::ErrorStatus   setChordPoint(const McGePoint3d & chordPoint);


	McGePoint3d         overrideCenter() const;

	Mcad::ErrorStatus   setOverrideCenter(const McGePoint3d & overrideCenterPoint);


	McGePoint3d         jogPoint() const;

	Mcad::ErrorStatus   setJogPoint(const McGePoint3d & jogPoint);


	mxreal              jogAngle() const;

	Mcad::ErrorStatus   setJogAngle(mxreal jogAngle);

	Mcad::ErrorStatus   setOverrideCenterPP(const McGePoint3d & overrideCenterPointPP);

	Mcad::ErrorStatus   setJogPointPP(const McGePoint3d & jogPointPP);

	Mcad::ErrorStatus   setTextPositionPP(const McGePoint3d & textPointPP);


	mxreal extArcStartAngle() const;
	Mcad::ErrorStatus setExtArcStartAngle(mxreal newAngle);

	mxreal extArcEndAngle() const;
	Mcad::ErrorStatus setExtArcEndAngle(mxreal newAngle);

	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);

	virtual Mcad::ErrorStatus   transformBy(const McGeMatrix3d& xform);
private:
};
//:End Ignore