ads_name ss; struct resbuf *rb=acutBuildList(RTDXF0,_T("REGION"),RTNONE); acutPrintf(_T("\n請選擇兩個需要布爾運算(交集)的面域: ")); if(RTNORM != acedSSGet(NULL,NULL,NULL,rb,ss)) { acutRelRb(rb); return; } acutRelRb(rb); Adesk::Int32 nssLen=0; acedSSLength(ss,&nssLen); if(nssLen<2) { acedSSFree(ss); return; } ads_name ent; acedSSName(ss,0,ent); AcDbObjectId objId1; acdbGetObjectId(objId1,ent); acedSSName(ss,1,ent); AcDbObjectId objId2; acdbGetObjectId(objId2,ent); acedSSFree(ss); //使用ARX智能指針寫打開面域對象 AcDbObjectPointer<AcDbRegion>pRegion1(objId1,AcDb::kForWrite); if (Acad::eOk != pRegion1.openStatus()) { return; } AcDbObjectPointer<AcDbRegion>pRegion2(objId2,AcDb::kForWrite); if (Acad::eOk != pRegion2.openStatus()) { return; } //執行布爾操作 Acad::ErrorStatus es= pRegion1->booleanOper(AcDb::kBoolIntersect,pRegion2); if (Acad::eOk != eOk) { acutPrintf(_T("\n布爾操作失敗!,錯誤碼:%s"),acadErrorStatusText(es)); return; } //判斷是否有交集,如果為空,則刪除對象。 if (pRegion1->isNull()) { acutPrintf(_T("\n沒有交集,刪除對象!")); pRegion1->erase(); pRegion2->erase(); return; } //刪除多余的面域實體,執行交集布爾運算后,參數計算的面域面積為0。 if (pRegion2->isNull()) { pRegion2->erase(); } //打開當前數據庫的當前塊表記錄 AcDbBlockTableRecordPointer pBlkRcd(curDoc()->database()->currentSpaceId(),AcDb::kForWrite); if (Acad::eOk != pBlkRcd.openStatus()) { acutPrintf(_T("\n打開塊表記錄失敗!,錯誤碼:%s"),acadErrorStatusText(pBlkRcd.openStatus())); return; } //分解面域 AcDbVoidPtrArray ptrArray; es = pRegion1->explode(ptrArray); if(Acad::eOk != es) { acutPrintf(_T("\n面域分解操作失敗!,錯誤碼:%s"),acadErrorStatusText(es)); return; } //遍歷添加分解后的實體到當前空間,如果不加入數據庫就需要自己delete分解后的對象 for (int i=0;i<ptrArray.length();i++) { AcDbEntity*pEnt=(AcDbEntity*)ptrArray.at(i); if (pEnt!=NULL) { if (pEnt->isKindOf(AcDbRegion::desc())) { AcDbVoidPtrArray subptrArray; es = pEnt->explode(subptrArray); if(Acad::eOk != es) { acutPrintf(_T("\n子面域分解操作失敗!,錯誤碼:%s"),acadErrorStatusText(es)); continue; } for (int j=0;j<subptrArray.length();j++) { AcDbEntity*pSubEnt=(AcDbEntity*)subptrArray.at(j); if (pSubEnt!=NULL) { pBlkRcd->appendAcDbEntity(pSubEnt); //關閉pSubEnt對象 pSubEnt->close(); } } } else { pBlkRcd->appendAcDbEntity(pEnt); } //關閉pEnt對象 pEnt->close(); } } //刪除面域 //pRegion1->erase(); /* //獲取拉伸點集合,(另類的獲取面域端點的方式) AcGePoint3dArray pts; pRegion1->getStretchPoints(pts); if (pts.length()>0) { for (int i=0;i<pts.length();i++) { AcGePoint3d pt=pts.at(i); acutPrintf(_T("\n x=%lf,y=%lf,z=%lf"),pt.x,pt.y,pt.z); } } */