在08科创项目,绘图助手工具箱中的第二、三个命令RTLine、STLine就是使用了曲线打断的函数,为实现这个命令我查阅了多个网页,找出了几个重要的函数,分别是打断曲线的getSplitCurves、求两曲线交点的intersectwith。感谢ObjectARX编程站,让我找到很多ObjectARX方面我需要的东西,以下就是我转载的文章:
创建自己的曲线打断命令
原文地址:http://www.objectarx.net/bbs/viewthread.php?tid=1655&extra=page%3D1%26amp%3Bfilter%3Ddigest
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
void drawEntity(AcDbEntity* pEntity);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
bool breakCurve(AcDbCurve* curve, AcGePoint3d pt);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
bool breakCurve(AcDbCurve* curve, AcGePoint3d p1, AcGePoint3d p2);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
static void Mybreak2008_Mybreak(void)
{
// Add your code for command Mybreak2008._Mybreak here
ads_point pt1,pt2;
ads_name entName;
Acad::ErrorStatus es;
int ret;
ACHAR kWord[100];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (acedEntSel(_T("
选择所要打断的曲线:"), entName, pt1) !=RTNORM)
{
return;
}
AcDbObjectId entId;
AcDbCurve *pCurve=NULL;
AcDbEntity *pEnt = NULL;
es = acdbGetObjectId(entId, entName);
if (es != Acad::eOk)
{
return;
}
acdbOpenObject(pEnt, entId, AcDb::kForWrite);
if (pEnt->isKindOf(AcDbCurve::desc()))
{
pCurve = AcDbCurve::cast(pEnt);
if (pCurve != NULL)
{
acedInitGet (NULL, _T("F"));
ret=acedGetPoint(NULL,_T("
指定第二个打断点或[第一点(F)]:"),pt2);
switch (ret)
{
case RTKWORD:
ret=acedGetInput(kWord);
if ( ret!= RTNORM )
break ;
acedInitGet(RSG_NONULL, _T(""));
ret=acedGetPoint(NULL,_T("
指定第一个打断点:"),pt1);
if (ret!=RTNORM)
break;
acedInitGet(RSG_NONULL, _T(""));
ret=acedGetPoint(NULL,_T("
指定第二个打断点:"),pt2);
if (ret!=RTNORM)
break;
breakCurve(pCurve,asPnt3d(pt1), asPnt3d(pt2));
break;
case RTNONE:
breakCurve(pCurve,asPnt3d(pt1));
break;
case RTNORM:
breakCurve(pCurve,asPnt3d(pt1), asPnt3d(pt2));
break;
default:
break;
}
}
}
pEnt->close();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//以下为函数
//打断于点
bool breakCurve(AcDbCurve* curve,AcGePoint3d pt)
{
AcGePoint3d p1;
curve->getClosestPointTo(pt,p1);
double param;
curve->getParamAtPoint(p1,param);
AcGeDoubleArray params;
params.append(param);
AcDbVoidPtrArray curveSegments;
curve->getSplitCurves(params, curveSegments);
AcDbEntity* ent =NULL;
if (curveSegments.length()==2)
{
ent=(AcDbEntity*)curveSegments[0];
drawEntity(ent);
ent->close();
ent=(AcDbEntity*)curveSegments[1];
drawEntity(ent);
ent->close();
curve->erase();
}
else
{
curve->close();
}
return true ;
}
//两点打断
bool breakCurve(AcDbCurve* curve, AcGePoint3d p1, AcGePoint3d p2)
{
AcGePoint3d p11;
curve->getClosestPointTo(p1,p11);
double param1;
curve->getParamAtPoint(p11,param1);
AcGePoint3d p21;
curve->getClosestPointTo(p2,p21);
double param2;
curve->getParamAtPoint(p21,param2);
AcGeDoubleArray params;
if (param1<param2)
{
params.append(param1);
params.append(param2);
}
else
{
params.append(param2);
params.append(param1);
}
AcDbVoidPtrArray curveSegments;
curve->getSplitCurves(params, curveSegments);
AcDbEntity* ent =NULL;
if (curveSegments.length()==2)
{
ent=(AcDbEntity*)curveSegments[1];
drawEntity(ent);
ent->close();
}
else if (curveSegments.length()==3)
{
ent=(AcDbEntity*)curveSegments[0];
drawEntity(ent);
ent->close();
ent=(AcDbEntity*)curveSegments[2];
drawEntity(ent);
ent->close();
}
curve->erase();
return true ;
}
//绘制打断的曲线
void drawEntity(AcDbEntity* pEntity)
{
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *brec;
resbuf tilemode;
acedGetVar(_T("TILEMODE"),&tilemode);
int tile=tilemode.resval.rint;
if (tile)
pBlockTable->getAt(ACDB_MODEL_SPACE, brec,AcDb::kForWrite);
else
pBlockTable->getAt(ACDB_PAPER_SPACE, brec,AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId entid;
brec->appendAcDbEntity(entid, pEntity);
brec->close();
}
![复制代码](https://common.cnblogs.com/images/copycode.gif)