ObjectARX_面域

與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;
}
相關文章
相關標籤/搜索