• 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(" 已经创建%d个面域!", number);
    29.  
      }
    30.  
      else
    31.  
      {
    32.  
      acutPrintf(" 创建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.  
      }
  • 相关阅读:
    一段获取windows环境变量的代码
    尝试word2007的blog发布
    如何求一表所有行所有字段实际占用的空间
    如何查询全表扫描SQL
    Oracle 33个等待事件
    如何使用RMAN
    如何使用Diagnostics工具监控应用服务器
    如何查询每行数据的数据块信息
    如何理解recursive calls,db block gets和consistent gets
    如何编写批处理与SQLPLUS(例子)
  • 原文地址:https://www.cnblogs.com/mjgw/p/12392954.html
Copyright © 2020-2023  润新知