static Acad::ErrorStatus postToDatabase(AcDbObjectId& Id, AcDbEntity* pEnt, AcDbDatabase* pDb)
{
if (pDb == nullptr)
return Acad::eInvalidInput;
if (pEnt == nullptr)
return Acad::eInvalidInput;
Acad::ErrorStatus es = eOk;
AcDbBlockTableRecordPointer pCurSpace(pDb->currentSpaceId(), AcDb::kForWrite);
es = pCurSpace.openStatus();
if (es == eOk)
{
es = pCurSpace->appendAcDbEntity(Id, pEnt);
}
return es;
}
static Acad::ErrorStatus selectPlines(AcDbObjectIdArray& ids)
{
struct resbuf* filter = acutBuildList(RTDXF0, ACRX_T("LWPOLYLINE"), RTNONE);
const ACHAR* prompt[] = { ACRX_T("\nSelect PLINES: "), ACRX_T("\nRemove PLINES: ") };
const ACHAR* mode = ACRX_T(":$");
ads_name ss = { 0L };
if (acedSSGet(mode, prompt, NULL, filter, ss) == RTNORM)
{
if (auto es = acedGetCurrentSelectionSet(ids); es != eOk)
{
acutPrintf(_T("\nSelection error = %ls :"), acadErrorStatusText(es));
return es;
}
acutRelRb(filter);
acedSSFree(ss);
}
return eOk;
}
static std::map<AcDbObjectId, AcGePoint3dArray> findObjects(AcDbObjectIdArray& plineIds, double len)
{
std::map<AcDbObjectId, AcGePoint3dArray> objs;
for (const auto& idl : plineIds)
{
AcDbObjectPointer<AcDbPolyline> pleft(idl);
for (const auto& idr : plineIds)
{
if(idr == idl)
continue;
AcGePoint3dArray hitPoints;
AcDbObjectPointer<AcDbPolyline> pright(idr);
if (pleft->intersectWith(pright, AcDb::kOnBothOperands, hitPoints) == eOk)
{
for (const auto& pnt : hitPoints)
{
{
double dist;
if (pleft->getDistAtPoint(pnt, dist) == eOk)
{
if (dist < len)
objs[idl].append(pnt);
}
}
{
AcDbPolylineUPtr pClone(static_cast<AcDbPolyline*>(pleft->clone()));
pClone->reverseCurve();
double dist;
if (pClone->getDistAtPoint(pnt, dist) == eOk)
{
if (dist < len)
objs[idl].append(pnt);
}
}
}
}
}
}
return objs;
}
static void tHeChopper(std::map<AcDbObjectId, AcGePoint3dArray> &objs, double len)
{
AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
for (auto& item : objs)
{
AcDbVoidPtrArray pSubents;
AcDbObjectPointer<AcDbPolyline> pLine(item.first);
if (pLine->getSplitCurves(item.second, pSubents) == eOk)
{
for (auto vd : pSubents)
{
AcDbCurveUPtr pCurve(static_cast<AcDbCurve*>(vd));
if (pCurve == nullptr)
continue;
double ep;
double dist;
if (pCurve->getEndParam(ep) == eOk)
{
pCurve->getDistAtParam(ep, dist);
if (dist > len)
{
AcDbObjectId nid;
postToDatabase(nid, pCurve.get(), pDb);
}
}
}
}
}
for (auto& item : objs)
{
AcDbObjectPointer<AcDbPolyline> pLine(item.first, AcDb::kForWrite);
pLine->erase();
}
}
static void CArxTest_doit()
{
double len = 0;
acedGetReal(_T("\nEnter a length: "), &len);
AcDbObjectIdArray plineIds;
if (selectPlines(plineIds) != eOk)
return;
auto map = findObjects(plineIds, len);
tHeChopper(map, len);
}