[返回博客](/cn/blog) # Teigha Mechanical：OdDbDatabase 中的物料清单物理数据模型

Andrii Morozov 十月 31, 2017 [\#mechanical](/cn/blog/tag/mechanical) [\#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>

物料清单是一个表格，其中包含所有零件和组件以及相应的数据和属性。其逻辑表示很容易理解，但 BOM 表的物理数据模型是一个复杂的概念，包括组件、零件和数据容器。

#### 机械字典

所有与 Teigha Mechanical 相关的通用数据都位于几个字典中，特别是 AcmDictionary。

![image1](/files/inline-images/image001_17.png)数据库中的 AcmDictionary

AcmDictionary 包含与物料清单相关的数据：AcmBOM 字典和 AcmDataDictionary。此外，该字典还包含一些通用数据，例如标准字典。

![image2](/files/inline-images/image002_10.png)BOM 字典

#### 机械数据字典

另一个重要的字典是 AcmBOMDATA 字典。此字典与 AcmDataDictionary 相关。基本上，AcmBOMDATA 包含 BOM 行和 BOM 表的数据容器。

数据容器可以是以下任何类型：DataEntry、DataEntryPart 或 DataEntryBlock。AcmDataDictionary 类处理和操作 BOM 数据：

```
OdResult  append(AcmDataEntryPtr pDataEntry, OdDbObjectId& newObjId);
OdResult createDataEntryFor(AcmBomPtr& pBom, const OdDbObjectId& targetId, OdDbObjectId& objId);
OdResult  createDataEntryFor2DCompDef(const OdDbObjectId& targetId, OdDbObjectId& objId);
OdResult  createDataEntryFor(const OdDbBlockTableRecordPtr& pBlockTableRecord, OdDbObjectId& objId);
OdResult getDataEntryByCompDefId(const OdDbObjectId& compDefId, OdDbObjectId& dataEntryId) const;

```

- append(AcmDataEntryPtr pDataEntry, OdDbObjectId&amp; newObjId) — 将新的数据条目容器添加到现有字典中。
- createDataEntryFor() — 这组方法创建新的数据条目容器。
- getDataEntryByCompDefId(const OdDbObjectId&amp; compDefId, OdDbObjectId&amp; dataEntryId) — 返回组件定义对象的数据条目容器。

![image3](/files/inline-images/image003_11.png)BOMData 字典和 DataEntries

#### DbInfo 服务类

AcadmDbInfo 是一个与 AcmDataDictionary 协同工作的服务类。此服务类旨在简化 Teigha Mechanical 字典的使用。

```
OdDbObjectId acmDictionaryId();
OdDbObjectId bomDictionaryId();
OdDbObjectId dataDictionaryId();
OdDbObjectId createBomDictionary();

```

- acmDictionaryId() — 返回当前数据库的 AcmDictionary OdDbObjectId。
- bomDictionaryId() — 返回当前数据库的 AcmBOM OdDbObjectId。
- dataDictionaryId() — 返回当前数据库的 AcmBOMDATA OdDbObjectId。
- createBomDictionary() — 如果当前数据库缺少 AcmBOM 字典，则创建一个新的。

#### BOM 对象

AcmBom 类表示物料清单表对象。AcmBom 对象包含一个数据条目容器，其中包含 BOM 表的适当数据以及表示 BOM 项的 BOM 行。

```
OdString                          name() const;
OdDbHardPointerId                 dataEntryId() const;
void                              setDataEntryId(OdDbHardPointerId objId);
void                              setName(OdString name);
bool                              isExpandedBOM() const;
OdInt16                           itemNumberStep() const;
OdString                          itemNumberStart() const;
void                              setItemNumberStart(const OdString& itemNumberStart);
void                              setItemNumberStep(OdInt16 itemNumberStep);

```

- dataEntryId() — 返回 BOM 表数据容器。
- setDataEntryId(OdDbHardPointerId objId) — 为 BOM 表设置数据容器。
- name() — 返回 BOM 表的名称。
- setName(OdString name) — 为 BOM 表设置名称。
- isExpandedBOM() — 如果 BOM 已展开，则返回 true；如果已结构化，则返回 false。
- itemNumberStep() — 返回 BOM 表的项目属性的编号步长。
- itemNumberStart() — 返回 BOM 表的属性的第一个编号。
- setItemNumberStart(const OdString&amp; itemNumberStart) — 为 BOM 表设置项目编号步长。
- setItemNumberStep(OdInt16 itemNumberStep) — 为 BOM 表设置第一个编号。

#### BOM 行

AcmBomRow 类表示 BOM 表项。BomRow 也包含一个数据容器。

```
OdString                 getItemName() const;
OdDbHardPointerId        getDataEntryId() const;
virtual bool             isVisible() const;
bool                     isToExpand() const;
OdInt32                  getSortPriority();
void                     setSortPriority(OdInt32 priority);

```

- getItemName() — 返回项目名称。
- getDataEntryId() — 返回数据容器。
- isVisible() — 如果项目可见，则返回 true。
- isToExpand() — 如果项目在展开的 BOM 中，则返回 true。
- getSortPriority() — 返回排序优先级。
- setSortPriority(OdInt32 priority) — 设置项目的排序优先级。

![image4](/files/inline-images/image004_9.png)BomRow 和 Bom

#### 结论

物料清单是一组字典，其中包含 BOM 项（行）和数据容器（数据条目）的子集。行和条目相互连接，行与组件连接。

## 今天就开始行动

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

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