创建圆的方法主要有:圆心+半径、圆心+直径、三点画圆、两点画圆。
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;
}