CAD工具之家's Archivers

From boitboy on 2015-04-02 09:39:32

AcDbSpatialFilter的使用,由于使用较少,arx中找不到资料,记录,备用

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();   }

查看完整版本: AcDbSpatialFilter的使用,由于使用较少,arx中找不到资料,记录,备用

Tags:


©CAD工具之家
创办于:2013年5月24日