ObjectARX_AutoCAD创建圆功能实现

创建圆的方法主要有:圆心+半径、圆心+直径、三点画圆、两点画圆。

void CreateCircle()//创建圆命令
{
	ads_point point;
	AcGeVector3d vec(0, 0, 1);
	int nReturn;
	acedInitGet(NULL, _T("3P 2P"));
	nReturn = acedGetPoint(NULL, _RXST("指定圆的圆心或[三点(3P)][两点(2P)]:"), point);
	if (nReturn == RTNORM)
	{
		ads_real distant;
		acedInitGet(NULL, _T("D"));
		nReturn = acedGetDist(point, _T("\n指定圆的半径或[直径(D)]:"), &distant);
		if (nReturn == RTNORM)//半径
		{
			acutPrintf(_RXST("\n距离为:%f"), distant);
			//根据圆心和半径创建圆
			AcDbCircle *pCir = new AcDbCircle(asPnt3d(point), vec, distant);
			HysuEditor::PostToModelSpace(pCir);
		}
		else if (nReturn == RTKWORD)//关键字,表示输直径
		{
			//根据圆心和直径创建圆
			acedGetDist(point, _T("\n指定圆的直径:"), &distant);
			AcDbCircle *pCir = new AcDbCircle(asPnt3d(point), vec, distant/2);
			HysuEditor::PostToModelSpace(pCir);
		}
	}
	else if (nReturn == RTKWORD)
	{
		ACHAR kword[20];
		if (acedGetInput(kword) != RTNORM) {
			return;
		}
		if (_tcscmp(kword, _T("3P")) == 0) {
			ads_point firstPt, secondPt, thirdPt;
			acedGetPoint(NULL, _RXST("\n指定圆上的第一点:"), firstPt);
			acedGetPoint(firstPt, _RXST("\n指定圆上的第二点:"), secondPt);
			acedGetPoint(secondPt, _RXST("\n指定圆上的第二点:"), thirdPt);
			//根据三点计算圆心
			ads_real x1, y1, x2, y2;
			x1 = secondPt[X] - firstPt[X];
			y1 = secondPt[Y] - firstPt[Y];
			x2 = thirdPt[X] - firstPt[X];
			y2 = thirdPt[Y] - firstPt[Y];
			ads_point center;
			center[X] = ((-x2*x2*y1) + y1*y1*y2 + x1*x1*y2 - y1*y2*y2) / (2*x1*y2 - 2*x2*y1) + firstPt[X];
			center[Y] = (x1*x2*x2 + x1*y2*y2 - x1*x1*x2 - x2*y1*y1) / (2*x1*y2 - 2*x2*y1) + firstPt[Y];
			//计算半径
			ads_real radius = sqrt((center[X] - firstPt[X])*(center[X] - firstPt[X]) +
				(center[Y] - firstPt[Y])*(center[Y] - firstPt[Y]));
			AcDbCircle *pCir = new AcDbCircle(asPnt3d(center), vec, radius);
			HysuEditor::PostToModelSpace(pCir);
			return;
		}
		else if (_tcscmp(kword, _T("2P")) == 0)
		{
			ads_point startpoint, endpoint;
			acedGetPoint(NULL, _RXST("\n指定圆直径的第一个端点:"), startpoint);
			acedGetPoint(startpoint, _RXST("\n指定圆直径的第二个端点:"), endpoint);
			//根据两个端点为直径,计算出圆心
			ads_point center;
			center[X] = (startpoint[X] + endpoint[X])*0.5;
			center[Y] = (startpoint[Y] + endpoint[Y])*0.5;
			//计算半径
			ads_real radius = sqrt((center[X] - startpoint[X])*(center[X] - startpoint[X]) +
				(center[Y] - startpoint[Y])*(center[Y] - startpoint[Y]));
			AcDbCircle *pCir = new AcDbCircle(asPnt3d(center), vec, radius);
			HysuEditor::PostToModelSpace(pCir);
			return;
		}
		else
			AfxMessageBox(_RXST("关键字无效."));
	}
}
AcDbObjectId HysuEditor::PostToModelSpace(AcDbEntity *pEnt, AcDbDatabase *pDb)
{
	AcDbBlockTable *pBlkTbl = NULL;
	Acad::ErrorStatus es;
	es = pDb->getBlockTable(pBlkTbl, AcDb::kForRead);
	if (es != Acad::eOk)
	{
		acutPrintf(_T("\n块表打开失败,错误代码:%s"), acadErrorStatusText(es));
		return AcDbObjectId::kNull;
	}
	AcDbBlockTableRecord *pBlkTblRcd = NULL;
	es = pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite);
	if (es != Acad::eOk)
	{
		acutPrintf(_T("\n模型空间块表记录打开失败,错误代码:%s"), acadErrorStatusText(es));
		pBlkTbl->close();
		return AcDbObjectId::kNull;
	}
	pBlkTbl->close();
	AcDbObjectId outId;
	es = pBlkTblRcd->appendAcDbEntity(outId, pEnt);
	if (es != Acad::eOk)
	{
		acutPrintf(_T("\n无法添加实体到模型空间,错误代码:%s"), acadErrorStatusText(es));
		pBlkTblRcd->close();
		return AcDbObjectId::kNull;
	}
	pEnt->close();
	pBlkTblRcd->close();
	return outId;
}

猜你喜欢

转载自blog.csdn.net/qq49649174/article/details/118945218
今日推荐