[返回博客](/cn/blog) # Mechanical SDK 的 BOM 管理器

Andrii Morozov 五月 02, 2019 [\#mechanical](/cn/blog/tag/mechanical)

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

Mechanical SDK 的一个重要部分是物料清单 (BOM) 表功能，它有助于组织图纸的元素。物料清单表是一个特殊的数据库持久对象，它与其他 Mechanical SDK 实体交互。

Mechanical SDK 的 BOM 表之前已在[物料清单简介](https://www.opendesign.com/blog/2017/july/introduction-bill-materials-teigha-mechanical)以及其他与机械结构和零件（零件参考）相关的文章中进行了描述。

#### BOM 表解释

机械图纸不仅仅是折线、圆形等基本图元的集合。通常，机械图纸复杂且分层。Mechanical SDK 允许用户标记图纸的几何图形，然后将其收集到 BOM 表中。几何图形可以标记为组件或零件。每个零件在 BOM 表中表示为一行。此功能很复杂，因此使用 BOM Manager 服务类来简化工作。

#### BOM 表和 Drawings SDK

在数据库层面，BOM 表是一个对象，它在 Drawings SDK 中看起来像一个字典对象。从逻辑上讲，物料清单表只是一组行，但它本身没有图形表示。为此，Mechanical SDK 有一个 PartList 实体，用于显示表的内容。PartList 不仅仅是 BOM 行；它可以通过过滤器和组进行重新配置，这就是为什么任何 BOM 表都可以包含多个 PartList 实体的原因。

此 PartList 显示 BOM 表的内容：

![bom manager mechanical](/files/inline-images/BOM%20Manager.png)#### 如何使用BOM管理器

要使用BOM管理器，只需包含以下文件：

```
#include "AcmBOMManager.h"
```

并调用此函数：

```
AcmBOMManagerPtr pBomMgr = getAcmBomMgr();
```

#### 基本创建方法

目前，BOM管理器有三种创建BOM表的方法：

```
virtual OdResult createBomTable(OdDbObjectId& aNewBomTableId, const OdDbObjectId targetId = OdDbObjectId::kNull, const OdString& name = "", bool addToBrowser = true, OdDbDatabase * pHostDb = NULL);

virtual OdResult createBomTable(OdDbObjectId& aNewBomTableId, const AmiCompDefKey* pTargetKey, OdString name = OdString::kEmpty);

virtual OdResult createBorderBomTable(OdDbObjectId& aNewBomTableId, const OdDbObjectId borderId, OdString name = "", bool populate = false);

```

这些方法具有相似的签名。开头是BOM表参数，然后是目标参数（块或组件定义）、BOM表名称和OdDbDatabase。前两种方法生成相同的表，但签名不同，第三种方法生成一个附加到特定标题边框的BOM表。

#### 基本获取器

BOM表和BOM行与不同的机械实体（例如气球）之间存在复杂的交互。气球附着在BOM行上。BOM管理器有一个特殊方法，用于为特定BOM行选择气球（有时BOM行也可以称为项目或BOM项目）：

```

virtual OdResult getItemBalloons(const OdDbObjectId& itemId, OdDbObjectIdArray& ballIdArray, const OdDbObjectId& refId) const; virtual OdResult getItemBalloons(const OdDbObjectId& itemId, OdDbObjectIdArray& ballIdArray, const OdDbObjectIdArray& refIds) const;
```

第一个参数是行ID，第二个参数是与该行相关的气球数组，第三个参数是单个引用ID或引用ID数组，用于获取特定气球或多个气球。

这是一个气球附着到项目编号值为“1”的行的示例：

![шьфпу2](/files/inline-images/2_2.jpg)BOM的另一个有用功能是其行可以包含属性（或附加到行的组件），例如数量、名称、标准等。在大多数情况下，一组属性受其标准（BOMStd）的约束。BOM管理器有几个方法可以获取特定行的数据：

```

virtual OdResult getItemAttribute(const OdDbObjectId& itemId, const OdString& key, OdString& attrib, bool evaluate = true, const OdDbObjectId& bomStdId = OdDbObjectId::kNull) const;
```

第一个参数是行ID，第二个是属性名称，第三个是属性值。

```

virtual OdResult getItemData(const OdDbObjectId& itemId, OdString& itemNo, OdUInt32& numOfItems, OdMapStringToString& valueMap, const OdDbObjectId& bomStdId = OdDbObjectId::kNull) const;
```

第一个参数是行ID，第二个是BOM行号，第三个是数量（或项目数），第四个是包含“属性名称”—“属性值”对的映射。

例如，让我们看看本文中的第一张图片，假设我们想获取第一行的getItemData。我们将得到一个包含以下值的映射：

- 名称：螺塞
- 标准：DIN 910 - M18 x 1.5
- 材料：\*空\*

此外，'itemNo' 将为 '1'，表示BOM行号，'numOfItems' 将为 '1'，表示项目数量。

#### BOM管理器迭代器

BOM 管理器提供两种迭代器：

- 项迭代器，用于遍历 BOM 行。
- 零件数据迭代器，用于遍历零件数据。

```

virtual AcmIteratorPtr newItemIterator(const OdDbObjectId& bomId, Acm::PartListDirection sort = Acm::kTopDown, bool expanded = false) const;
```

'newPartDataIterator' 方法返回一个零件数据迭代器。第一个参数是 OdDbDatabase 对象，第二个参数定义是否仅收集主 BOM 表数据，第三个参数定义是否使用外部参照。

机械 BOM 是一个相当复杂但功能强大的工具，可帮助工程师使图纸更清晰、更易于理解。Mechanical SDK 目前支持 BOM 管理器应支持的所有基本方法。本文仅包含服务类的基本描述，并将在未来进行扩展。

####  

## 今天就开始行动

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

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