ObjectARX_面域

与cad里执行REGION命令相似

具体的实现:

  1.  
    void ZffCHAP2AddRegion()
  2.  
    {
  3.  
    // 使用选择集,提示用户选择作为面域边界的对象
  4.  
    ads_name ss;
  5.  
    int rt = acedSSGet(NULL, NULL, NULL, NULL, ss); // 提示用户
  6.  
    选择对象
  7.  
    AcDbObjectIdArray objIds;
  8.  
    // 根据选择集中的对象构建边界曲线的ID数组
  9.  
    if (rt == RTNORM)
  10.  
    {
  11.  
    long length;
  12.  
    acedSSLength(ss, &length); // 获得选择集中的对象个数
  13.  
    for (int i = 0; i < length; i++)
  14.  
    {
  15.  
    ads_name ent;
  16.  
    acedSSName(ss, i, ent);
  17.  
    AcDbObjectId objId;
  18.  
    acdbGetObjectId(objId, ent);
  19.  
    objIds.append(objId);
  20.  
    }
  21.  
    }
  22.  
    acedSSFree(ss); // 及时释放选择集
  23.  
    AcDbObjectIdArray regionIds;
  24.  
    regionIds = CCreateEnt::CreateRegion(objIds);
  25.  
    int number = regionIds.length();
  26.  
    if (number > 0)
  27.  
    {
  28.  
    acutPrintf("\n已经创建%d个面域!", number);
  29.  
    }
  30.  
    else
  31.  
    {
  32.  
    acutPrintf("\n创建0个面域!");
  33.  
    }
  34.  
    }

创建面域:

  1.  
    AcDbObjectIdArray CCreateEnt::CreateRegion(const AcDbObjectIdArray& curveIds)
  2.  
    {
  3.  
    AcDbObjectIdArray regionIds; // 生成的面域的ID数组
  4.  
    AcDbVoidPtrArray curves; // 指向作为面域边界的曲线的指针的数组
  5.  
    AcDbVoidPtrArray regions; // 指向创建的面域对象的指针的数组
  6.  
    AcDbEntity *pEnt; // 临时指针,用来关闭边界曲线
  7.  
    AcDbRegion *pRegion; // 临时对象,用来将面域添加到模型空间
  8.  
    // 用curveIds初始化curves
  9.  
    for (int i = 0; i < curveIds.length(); i++)
  10.  
    {
  11.  
    acdbOpenAcDbEntity(pEnt, curveIds.at(i), AcDb::kForRead);
  12.  
    if (pEnt->isKindOf(AcDbCurve::desc()))
  13.  
    {
  14.  
    curves.append(static_cast<void*>(pEnt));
  15.  
    }
  16.  
    }
  17.  
    Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves,
  18.  
    regions);
  19.  
    if (es == Acad::eOk)
  20.  
    {
  21.  
    // 将生成的面域添加到模型空间
  22.  
    for (i = 0; i < regions.length(); i++)
  23.  
    {
  24.  
    // 将空指针(可指向任何类型)转化为指向面域的指针
  25.  
    pRegion = static_cast<AcDbRegion*>(regions[i]);
  26.  
    pRegion->setDatabaseDefaults();
  27.  
    AcDbObjectId regionId;
  28.  
    regionId = CCreateEnt::PostToModelSpace(pRegion);
  29.  
    regionIds.append(regionId);
  30.  
    }
  31.  
    }
  32.  
    else // 如果创建不成功,也要删除已经生成的面域
  33.  
    {
  34.  
    for (i = 0; i < regions.length(); i++)
  35.  
    {
  36.  
    delete (AcRxObject*)regions[i];
  37.  
    }
  38.  
    }
  39.  
    // 关闭作为边界的对象
  40.  
    for (i = 0; i < curves.length(); i++)
  41.  
    {
  42.  
    pEnt = static_cast<AcDbEntity*>(curves[i]);
  43.  
    pEnt->close();
  44.  
    }
  45.  
    return regionIds;
  46.  
    }
posted @ 2020-03-01 23:20  中国膜结构网mjgou  阅读(658)  评论(0编辑  收藏  举报