[返回博客](/cn/blog) # 通过 B-Rep 处理实体和壳

Alexander Fokin 七月 05, 2018 [\#b-rep](/cn/blog/tag/b-rep) [\#Example](/cn/blog/tag/example)

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

借助 ODA 平台，您可以使用边界表示 (B-Rep) 处理实体和壳。在 ODA Drawings（用于处理 .dwg 和 .dgn 文件）、ODA PRC 和 ODA BimRv 中，B-Rep 接口有单独的实现，但您可以使用通用类 OdBrBrep 来处理它们。

B-Rep 可以借助相应的 BrepBuilder 创建。构建器由通用类 OdBrepBuilder 包装，就像 B-Rep 一样。

您可以通过调用 add\* 方法（addFace、addEdge 等）手动填充构建器。示例可在以下位置找到：

- BimRv/Examples/TB\_DevGuideCommands/BmFreeFormElemCmd.cpp
- CommonApplications/Prc/Examples/OdPrcBrepBuilderEx/Box.cpp
- CommonApplications/Prc/Examples/OdPrcBrepBuilderEx/ComplexPlane.cpp
- CommonApplications/Prc/Examples/OdPrcBrepBuilderEx/Cone.cpp
- CommonApplications/Prc/Examples/OdPrcBrepBuilderEx/Cylinder.cpp
- CommonApplications/Prc/Examples/OdPrcBrepBuilderEx/Sphere.cpp
- Drawing/Examples/ExCustObjs/ExCreateBreps.cpp
- Drawing/Examples/OdWriteEx/DbFiller.cpp

或者您可以使用现有的 B-Rep 和 OdBrepBuilderFiller。OdBrepBuilderFiller 是核心扩展模块。它遍历 B-Rep 并收集拓扑和视觉信息。然后该模块将数据放入构建器中。

#### 使用 OdBrepBuilderFiller：

1. 添加包含头文件：
    ```
    #include "BrepBuilderFillerModule.h""
    
    ```
2. 使用宿主应用程序服务实例的 brepBuilder 方法设置 OdBrepBuilder 的实现。例如：
    ```
    OdDbHostAppServices* pHostApp;
    …
    OdBrepBuilder builder;
    OdResult err = pHostApp->brepBuilder(builder, kOpenShell);
    if (eOk != err)
    {
      throw OdError(err);
    }
    
    ```
3. 初始化一个 B-Rep。例如：
    ```
    OdDbSurface* pSurf;
    …
    OdBrBrep brep;
    pSurf->brep(brep);
    
    ```
4. 创建 OdBrepBuilderFiller：
    ```
    OdBrepBuilderFiller bbFiller;
    
    ```

    注意：填充器存储构建器引用的几何体。因此，当您调用 builder.finish() 时，填充器应该存在。
5. 初始化填充器参数，这可以通过不同的方式完成：
    - 当您需要处理材质和颜色时，此变体很有用：
        ```
        bbFiller.params().setupFor(pDbOfBrep, pDbOfBuilder);
        ```

         setupFor 参数根据每个数据库（DGN 除外）确定源和目标 B-Rep 的拓扑格式。
    - DGN 格式支持 Parasolid 和 ACIS B-Rep 拓扑。因此 setupFor 无法确定拓扑类型。要确定 B-Rep 拓扑格式：
        ```
        OdDgModelerGeometry* pModeler;
        …
        OdDgModelerGeometry::OdDgModelerVersion modelerVersion = 0;
        OdResult err = pModeler->comeFromVersion(modelerVersion);
        if (eOk != err)
        {
          throw OdError(err);
        }
        OdBrepBuilderFillerParams::BrepType brepType = (modelerVersion & OdDgModelerGeometry::kAcisMask) ? OdBrepBuilderFillerParams::kBrepAcisDgn : OdBrepBuilderFillerParams::kBrepPS;
        bbFiller.params().setupFor(pDbOfBrep, brepType, pDbOfBuilder);
        ```
    - 您也可以手动设置拓扑格式。例如：
        ```
        bbFiller.params().setupFor(OdBrepBuilderFillerParams::kBrepAcisDwg, OdBrepBuilderFillerParams::kBrepAcisDgn);
        ```

        您还可以通过调用 OdBrepBuilderFillerParams::set\* 方法直接设置填充器的选项。需要这些选项是因为不同的 B-Rep 拓扑可以有自己的规则。

        注意：setupFor 方法将填充器的选项重置为数据库转换特定的默认值。因此，您需要在所有 set\* 调用之前调用 setupFor。
6. 当您在同一数据库中转换 B-Rep 时，使用辅助类 OdBaseMaterialAndColorHelper 来处理材质：
    ```
    OdBaseMaterialAndColorHelper materialHelper;
    
    ```

    注意：在填充器参数中提供数据库。

    此外，OdBaseMaterialAndColorHelper 具有一种简单的机制，用于缓存早期创建的材质。因此，OdBaseMaterialAndColorHelper 的实例应在同一数据库对中使用。不同数据库之间的转换有些复杂。您可能需要重写 OdBaseMaterialAndColorHelper 的一些方法。
7. 要初始化构建器，请使用 initFrom 方法：
    ```
    OdResult err = bbFiller.initFrom(builder, brep, &materialHelper);
    if (eOk != err)
    {
      throw OdError(err);
    }
    
    ```

## 今天就开始行动

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

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