與cad裏執行REGION命令類似數組
具體的實現:app
void ZffCHAP2AddRegion() { // 使用選擇集,提示用戶選擇做爲面域邊界的對象 ads_name ss; int rt = acedSSGet(NULL, NULL, NULL, NULL, ss); // 提示用戶 選擇對象 AcDbObjectIdArray objIds; // 根據選擇集中的對象構建邊界曲線的ID數組 if (rt == RTNORM) { long length; acedSSLength(ss, &length); // 得到選擇集中的對象個數 for (int i = 0; i < length; i++) { ads_name ent; acedSSName(ss, i, ent); AcDbObjectId objId; acdbGetObjectId(objId, ent); objIds.append(objId); } } acedSSFree(ss); // 及時釋放選擇集 AcDbObjectIdArray regionIds; regionIds = CCreateEnt::CreateRegion(objIds); int number = regionIds.length(); if (number > 0) { acutPrintf("\n已經建立%d個面域!", number); } else { acutPrintf("\n建立0個面域!"); } }
建立面域:指針
AcDbObjectIdArray CCreateEnt::CreateRegion(const AcDbObjectIdArray& curveIds) { AcDbObjectIdArray regionIds; // 生成的面域的ID數組 AcDbVoidPtrArray curves; // 指向做爲面域邊界的曲線的指針的數組 AcDbVoidPtrArray regions; // 指向建立的面域對象的指針的數組 AcDbEntity *pEnt; // 臨時指針,用來關閉邊界曲線 AcDbRegion *pRegion; // 臨時對象,用來將面域添加到模型空間 // 用curveIds初始化curves for (int i = 0; i < curveIds.length(); i++) { acdbOpenAcDbEntity(pEnt, curveIds.at(i), AcDb::kForRead); if (pEnt->isKindOf(AcDbCurve::desc())) { curves.append(static_cast<void*>(pEnt)); } } Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves, regions); if (es == Acad::eOk) { // 將生成的面域添加到模型空間 for (i = 0; i < regions.length(); i++) { // 將空指針(可指向任何類型)轉化爲指向面域的指針 pRegion = static_cast<AcDbRegion*>(regions[i]); pRegion->setDatabaseDefaults(); AcDbObjectId regionId; regionId = CCreateEnt::PostToModelSpace(pRegion); regionIds.append(regionId); } } else // 若是建立不成功,也要刪除已經生成的面域 { for (i = 0; i < regions.length(); i++) { delete (AcRxObject*)regions[i]; } } // 關閉做爲邊界的對象 for (i = 0; i < curves.length(); i++) { pEnt = static_cast<AcDbEntity*>(curves[i]); pEnt->close(); } return regionIds; }