AcDbRegion面域交集布爾運算簡單實例


        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);
            }
        }
        */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM