[返回博客](/cn/blog) # 在 BimRV 中创建 BlendElem 元素

Dmytro Hurin 八月 13, 2020 [\#rfa](/cn/blog/tag/rfa) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

一个 OdBmBlendElem 元素是一个由两个循环创建的形状。第一个是顶部轮廓，第二个是底部轮廓。此外，您可以使用自己的一组顶点连接，将底部轮廓与顶部轮廓连接起来。否则，将使用默认的顶点映射。

要使用 ODA BimRV 创建一个简单的 OdBmBlendElem：

1. 加载族 (.rfa) 文件。
2. 从数据库获取有效的草图平面。
3. 创建两个闭合轮廓（它们必须位于同一平面上）。
4. 创建一组顶点连接或使用空连接。
5. 创建一个新的 OdBmBlendElem 元素。
6. 为 OdBmBlendElem 设置起始和结束参数。
7. 打开事务。
8. 将创建的元素添加到数据库。
9. 提交事务。
10. 保存文件。

让我们通过一个例子更仔细地看看。下面显示的代码示例来自 Examples/TB\_DevGuideCommands/BmBlendCreateCmd.cpp 文件。使用该命令，您可以在 OdaBimApp Debug 应用程序中创建一个 OdBmBlendElem。

#### 打开模板或现有族文件

例如：

```
OdBmDatabasePtr pDb = app.readFile(L”blendExample.rfa”);
```

#### 从数据库获取有效的草图平面

在我们的命令示例中，我们从选择的底部轮廓中获取草图平面（草图平面对于两个轮廓是相同的）。

```
OdBmObjectId idSketchPlane;
  bool isSetSketchPlaneId = false;
  OdArray<OdBmCurveElemPtrArray>  aCurveSegments;
  //bot curveSegments;
  {
    OdBmCurveElemPtrArray botCurveSegments;
    OdBmSelectionSetIteratorPtr pItSS = pSet->newIterator();
    while (!pItSS->done())
    {
      OdBmCurveElemPtr pCurve = OdBmCurveElem::cast(pItSS->objectId().openObject());
      if (!pCurve.isNull())
      {
        if (!isSetSketchPlaneId)
        {
          idSketchPlane = pCurve->getSketchPlaneId();
          isSetSketchPlaneId = true;
        }
        botCurveSegments.push_back(pCurve.get());
      }
      pItSS->next();
    }
    aCurveSegments.push_back(botCurveSegments);
  }
```

#### 创建一组顶点连接或使用空连接

我们的示例不使用自定义顶点映射。

#### 创建两个轮廓

上面的代码段显示我们获取了文件中已创建的曲线。但是当您自己创建轮廓时，它必须是闭合的且没有交叉。曲线在下面的代码段中以循环形式形成：

```
for (OdUInt32 iLoop = 0; iLoop < arrProfile.size(); iLoop++)
  {
    OdBmGCurvePtrArray aCurvesOfLoop = arrProfile[iLoop];

    OdBmCurveLoopPtr pCurveLoop = OdBmCurveLoop::createObject();
    for (OdUInt32 iCurve = 0; iCurve < aCurvesOfLoop.size(); ++iCurve)
    {
      OdResult res = pCurveLoop->append(aCurvesOfLoop[iCurve]);
      if (res != eOk)
      {
        pIO->putString(OD_T("Invalid CurveLoops"));
        return;
      }
    }
    aCurveLoops.append(pCurveLoop);
  }
```

#### 创建一个新的 OdBmBlendElem 对象

```
OdBmBlendElemPtr pBlendElem = OdBmBlendElem::createObject();
```

#### 打开事务

在打开的事务中，将新创建的 pBlendElem 添加到数据库，设置起始和结束参数，然后调用方法创建融合几何体。

```
ODBM_TRANSACTION_BEGIN(tr, pDb); 
tr.start();
pDb->addElement(pBlendElem);
double thickness = pIO->getReal("Enter thickness of blend:", OdEd::kInpDefault, 30.0);
  	pBlendElem->setParam(OdBm::BuiltInParameter::BLEND_START_PARAM, 0.0);
  	pBlendElem->setParam(OdBm::BuiltInParameter::BLEND_END_PARAM, thickness);
  	pBlendElem->createBlend(aCurveLoops[0], aCurveLoops[1], idSketchPlane,       
    pBlendElem>getVtxConnections());
  	tr.commit()
ODBM_TRANSACTION_END();
```

在我们的命令中，我们从键盘获取融合的厚度。现在让我们描述一下 createBlend 的签名。

```
OdResult createBlend(const OdBmCurveLoopPtr &baseCurveLoop, const OdBmCurveLoopPtr &topCurveLoop, OdBmObjectId sketchPlaneId, const OdBmVtxConnectionsPtr &connections);
```

对于第一个参数，我们传递带有曲线的底部循环；对于第二个参数，我们传递带有曲线的顶部循环。在此示例中，我们使用在 OdaBimApp 中执行命令时从所选底部循环获取的草图平面 ID。对于顶点连接，我们传递一个空数组。

如果事务无错误完成，则 blendElem 已成功创建。现在您可以将此数据库保存到任何名称的新文件中。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
