#pragma once

class McDbDatabase;
class McDbEntity;
class McDbDatabase;
class McDbObjectId;
class McDbCurve;

#ifdef MX_BUILD_APP_FUCTION
class McEdGetPointWorldDraw;
class MxTouchSet;
class MxEvent;
#endif

namespace Mx
{
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前的数据对象。
	// -------------------------------------------------------------------------
	ARXDLL McDbDatabase* mcdbCurDwg();

	// -------------------------------------------------------------------------
	// Summary:
	// 		得到系统变量值
	// Parameters:
	//		pszSym      -		系统变量名
	//		result      -		返回的系统变量值
	// Returns:
	// 		成功返回RTNORM
	// Remarks:
	// 		例如:
	// 		<code>
	// 			MrxDbgRbList spVal  = Mx::mcutNewRb(RTSHORT);
	// 			Mx::mcedGetVar(_T("OSMODE"),spVal.data());
	// 			// 最点捕足的值为512,进行位运算，去掉最点捕捉标志 
	// 			int iNewMode = spVal.data()->resval.rint & (~512);
	// 			// 设置新值
	// 			spVal.data()->resval.rint = iNewMode;
	// 			Mx::mcedSetVar(_T("OSMODE"),spVal.data() );
	//          正交变量是ORTHOMODE
	// 		</code>
	// -------------------------------------------------------------------------
	ARXDLL int	mcedGetVar (LPCMSTR pszSym, struct resbuf *result,McDbDatabase* pDatabase = NULL);

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置系统变量
	// Parameters:
	// 		pszSym        -		系统变量名
	//		val           -		设置的变量值
	// Returns:
	// 		成功返回RTNORM
	// Remarks:
	// 		例如:
	// 		<code>
	// 			MrxDbgRbList spVal  = Mx::mcutNewRb(RTSHORT);
	// 			Mx::mcedGetVar(_T("OSMODE"),spVal.data());
	// 			// 最点捕足的值为512,进行位运算，去掉最点捕捉标志 
	// 			int iNewMode = spVal.data()->resval.rint & (~512);
	// 			// 设置新值
	// 			spVal.data()->resval.rint = iNewMode;
	// 			Mx::mcedSetVar(_T("OSMODE"),spVal.data() );
	//          正交变量是ORTHOMODE
	// 		</code>
	// Remarks:	
	// 		例如:设置用户一次的输入点坐标
	// 		<code>
	// 					resbuf rb;
	// 					rb.restype = RTPOINT;
	// 					rb.resval.rpoint[X]= prvPoint.x;
	// 					rb.resval.rpoint[Y]= prvPoint.y;
	// 					rb.resval.rpoint[Z]= prvPoint.z;
	// 					Mx::mcedSetVar(_T("LASTPOINT"),&rb);
	// 		</code>
	// -------------------------------------------------------------------------
	ARXDLL int  mcedSetVar (LPCMSTR pszSym, const struct resbuf *val,McDbDatabase* pDatabase = NULL);


	ARXDLL int mcedSSGet(LPCMSTR pszStr, const void *pt1,
		const void *pt2, const struct resbuf *filter,
		mds_name& ss);

	

#ifdef MX_BUILD_APP_FUCTION
	ARXDLL int  mcedGetInput(MCHAR *str);
	ARXDLL int  mcedInitGet(int val, const MCHAR *kwl, int cursorType = -1, int touchType = 3);
	ARXDLL int  mcedGetPoint(const mds_point pt, LPCMSTR pszPrompt,mds_point& result, McEdGetPointWorldDraw* pUserDraw = NULL, MxTouchSet* pTouches = NULL, MxEvent* pEvent = NULL, McGePoint3d* pInitStartPoint = NULL);
	ARXDLL int  mcedEntSel(LPCMSTR pszStr, mds_name& entres, mds_point ptres, IN  struct resbuf* pRbFilter = 0, IN bool isFindLockLayer = true, IN bool isOffsetInputPostion = false);
#endif

	// -------------------------------------------------------------------------
	// Summary:
	// 		 返回选择集中对象的个数
	// Parameters:
	// 		sname	- 选择集对象
	// 		len		- 返回选择集中对象的过数
	// Returns:
	// 		成功返回RTNORM
	// -------------------------------------------------------------------------
	ARXDLL int  mcedSSLength (const mds_name sname, long *len);

	// -------------------------------------------------------------------------
	// Summary:
	// 		向选择集中增加一个对象
	// Parameters:
	//		sname     -       选择集对象
	//		ename     -       实体名
	//		result    -       返回新的选择集
	// Returns:
	// 		成功返回RTNORM
	// -------------------------------------------------------------------------
	ARXDLL int  mcedSSAdd (const mds_name ename, const mds_name sname,
		mds_name& result);

	// -------------------------------------------------------------------------
	// Summary:
	// 		把实体从选择集中删除
	// Parameters:
	// 		ss		-			选择集对象
	//		ename   -			实体名
	// Returns:
	// 		成功返回RTNORM
	// -------------------------------------------------------------------------
	ARXDLL int  mcedSSDel  (const mds_name ename, const mds_name ss);

	// -------------------------------------------------------------------------
	// Summary:
	// 		释放选择集
	// Parameters:
	// 		sname         -       选择集对象
	// Returns:
	// 		成功返回RTNORM
	// -------------------------------------------------------------------------
	ARXDLL int  mcedSSFree (const mds_name sname);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回选择集中指定位置的实体名
	// Parameters:
	// 		ss          -      选择集对象
	//		i           -      在选择集数组中的位置，从0开始计数
	//		entres      -      返回该位置处的实体名
	// Returns:
	// 		成功返回RTNORM
	// -------------------------------------------------------------------------
	ARXDLL int  mcedSSName (const mds_name ss, long i, mds_name& entres);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回函数或命令传过来的参数,返回的参数不需要用户自己释放
	// Returns:
	// 		返回函数或命令传过来的参数,返回的参数不需要用户自己释放
	// -------------------------------------------------------------------------
	ARXDLL struct resbuf *mcedGetArgs (void);

	

	ARXDLL void mcutPolar (const mds_point pt, mds_real angle,
		mds_real dist,mds_point ptres);



	// -------------------------------------------------------------------------
	// Summary:
	// 		由圆弧上的两个点和凸度计算圆弧参数
	// Parameters:
	// 		p1				-	圆弧的开始点
	//		p2				-	圆弧上的一点
	//		dBulge			-	凸度
	//		cCenPoint		-	返回圆弧的中心点
	//		dR				-	返回圆弧的半径
	//		dStartAng		-	返回圆弧的开始角
	//		dEndAng			-	返回圆弧的结束角
	// -------------------------------------------------------------------------
	ARXDLL void  mcutCalcArc(IN McGePoint3d p1,
		IN McGePoint3d p2,
		IN mxreal dBulge,
		OUT McGePoint3d &cCenPoint,
		OUT mxreal &dR,
		OUT mxreal &dStartAng,
		OUT mxreal &dEndAng);

	ARXDLL void  setOutMxW(bool isMxW);

	ARXDLL bool  getUselessLayer(std::vector<McDbObjectId>& setUselessLayer, McDbDatabase* pDatabase);


	ARXDLL Mcad::ErrorStatus getSplitCurvesSupportZValue(McDbCurve* pEnt, const McGeDoubleArray& params,
		McDbVoidPtrArray& curveSegments);


	ARXDLL Mcad::ErrorStatus getSplitCurvesSupportZValue(McDbCurve* pEnt, const McGePoint3dArray& points,
		McDbVoidPtrArray& curveSegments);

	ARXDLL Mcad::ErrorStatus getOffsetCurvesExSupportZValue(McDbCurve* pEnt, double offsetDist,
		McDbVoidPtrArray& offsetCurves, McGePoint3d ptOffsetRef);

};

class  MxJsonParam;
class ARXDLL MxJsonParamValue {
public:
	MxJsonParamValue(const char* pszJson = 0);
	~MxJsonParamValue();

	bool getBool(const std::string& var_name, bool& val);

	void setBool(const std::string& var_name, bool val);
private:
	std::map <std::string, bool > m_mapBool;
	MxJsonParam* m_pImp;
};