|
static void Test_Clip ()
{
ads_point pt1, pt2;
ads_name ent;
if (acedEntSel(_T(“Select xref:”), ent, pt1) != RTNORM)
return;
AcDbObjectId idXref;
if (acdbGetObjectId(idXref,ent) != Acad::eOk)
return;
AcDbObjectPointer<<span style=”color: rgb(43, 145, 175);”>AcDbBlockReference> pRef(idXref, AcDb::kForRead);
if (pRef.openStatus() != Acad::eOk) {
acutPrintf(_T(“Not an xref!\n”));
return;
}
AcGePoint2dArray pts;
if (acedGetPoint(NULL,_T(“First point:”), pt1) != RTNORM) {
pRef->close();
return;
}
//the ECS of the vertices must be defined in the
//coordinate system of the _block_ so let’s calculate
//transform all points to that coordinate system
AcGeMatrix3d mat(pRef->blockTransform());
mat.invert();
AcGePoint3d pt3d(asPnt3d(pt1));
pt3d.transformBy(mat);
pts.append(AcGePoint2d(pt3d.x, pt3d.y));
while (acedGetPoint(pt1,_T(“Next point:”), pt2) == RTNORM) {
acedGrDraw(pt1, pt2, 1, 1);
pt3d = asPnt3d(pt2);
pt3d.transformBy(mat);
pts.append(AcGePoint2d(pt3d.x, pt3d.y));
memcpy(pt1, pt2, sizeof(ads_point));
}
acedRedraw(NULL,0);
AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
AcGeVector3d normal;
double elev;
if (pDb->tilemode()) {
normal = pDb->ucsxdir().crossProduct(pDb->ucsydir());
elev = pDb->elevation();
} else {
normal = pDb->pucsxdir().crossProduct(pDb->pucsydir());
elev = pDb->pelevation();
}
normal.normalize();
Acad::ErrorStatus es = pRef.object()->upgradeOpen();
if (es != Acad::eOk) {
pRef->close();
return;
}
//create the filter
AcDbSpatialFilter* pFilter = new AcDbSpatialFilter;
//add it to the extension dictionary of the block reference
//the AcDbIndexFilterManger class provides convenient utility functions
if (AcDbIndexFilterManager::addFilter(pRef.object(), pFilter) !=Acad::eOk)
delete pFilter;
else {
acutPrintf(_T(“Filter has been succesfully added!\n”));
pRef.object()->downgradeOpen();
}
if (pFilter->setDefinition(pts,normal,elev,
ACDB_INFINITE_XCLIP_DEPTH,-ACDB_INFINITE_XCLIP_DEPTH, true) !=Acad::eOk)
{
acutPrintf(L”Filter setDefinition failed.”);
//remove the filter if setDefinition fails.
pFilter->erase();
}
es = pFilter->erase();
pFilter->close();
pRef->close();
} |
|