[返回博客](/cn/blog) # Mechanical SDK：机械结构简介

Andrii Pobeda 十月 06, 2023 [\#mechanical](/cn/blog/tag/mechanical)

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

### 机械结构概述

在 ODA Mechanical SDK 中，您可以将几何图形标记并收集到结构化实体中，从而简化复杂图纸的处理。

机械结构是一种机制，允许您将几何图形标记为组件并为标记的几何图形创建组件视图。无论几何图形标记类型如何，标记的几何图形都将出现在 BOM（物料清单）中。

有关收集和标记几何图形的另一种选项，请参阅[零件参考](https://docs.opendesign.com/mech/mech_part_references_overview.html)文档。

机械结构包括组件和组件视图的概念。组件是为提供结构功能而创建的不可见实体。组件视图是保存几何图形的实体。组件和组件视图都具有层次结构。

此外，机械结构还具有定义和实例的概念。首先创建组件定义和组件视图定义，然后为定义创建实例。此概念提供了重用组件和组件视图的能力。

### 机械结构的基本操作

所有机械结构操作都通过 Mechanical 的 McadApi 库进行。

机械结构提供以下操作：

- amiCreate2dCompDef – 创建新的组件定义。
- amiInstance2dComp – 根据组件定义创建组件实例。
- ami2DSCreateCompViewDef – 根据先前创建的组件创建组件视图定义。
- ami2DSInstanceCompView – 根据组件视图定义创建组件视图实例。
- ami2DSInstanceAnnotationView – 创建注释视图。
- ami2DSCreateAnnotationViewLabels – 为注释视图创建注释视图标签。
- ami2DSGetViewsInComp – 获取组件中包含的视图。
- ami2DSGetViewName – 获取视图名称。
- ami2DSGetCompViewOwnerDef – 获取组件视图的所有者定义。
- ami2DSGetViewOwnerDef – 获取视图的所有者定义。
- ami2DSGetNextComponentDefinitionName – 获取指定名称之后的组件定义的名称。
- ami2DSGetViewGeomExtents – 获取视图的几何范围。
- ami2DSGetViewDefChildren – 获取视图定义的子项。
- ami2DSCompDefHasComponentViewDefinition – 指示指定的组件定义是否包含某个组件视图定义。
- amiGetCompInstanceByGeom – 通过几何体获取组件实例。
- amiGetMasterCompDef – 获取主组件定义。
- amiGetMasterViewDef – 获取主视图定义。
- amiGetCompDef – 获取指定组件的定义。
- amiGetCompDefChildren – 获取组件定义的子项。
- amiGetCompName – 获取组件的名称。
- amiGetCompOwner – 获取组件的所有者。
- amiIsCompDefMaster – 指示指定的组件定义是否为主组件定义。
- amiIsCompDefFeature – 指示组件定义是否为特征。
- amiIsCompDef2DAssembly – 指示组件定义是否为二维装配体。
- amiIsCompDefExternal – 指示组件定义是否为外部的。
- amiSetCompDefName – 为组件定义设置新名称。

### 简单机械结构示例

本节提供了一个创建、标记、收集几何体并将其放入 BOM 表的示例。

首先，应创建一些基本几何体，例如同一细节的顶视图和前视图的圆和线：

```

OdGeVector3d topPos(200.0, 100.0, 0.0);
OdGeVector3d frontPos(400.0, 100.0, 0.0);
        
OdDbCirclePtr pCircle1 = OdDbCircle::createObject();
pCircle1->setDatabaseDefaults(pDb);
pCircle1->setCenter(topPos.asPoint());
pCircle1->setRadius(50.0);
pTMModelSpace->appendOdDbEntity(pCircle1);
       
OdDbLinePtr pLine1 = OdDbLine::createObject();
pLine1->setDatabaseDefaults(pDb);
pLine1->setStartPoint(frontPos.asPoint() + OdGeVector3d(-50.0, .0, .0));
pLine1->setEndPoint(frontPos.asPoint() + OdGeVector3d(50.0, .0, .0));
pTMModelSpace->appendOdDbEntity(pLine1);

```

几何体创建后，也可以创建并实例化组件。此示例演示了一个组件和两个附加组件视图的创建过程：

```
AmiCompDefKeyPtr pCompDefKey1;
AmiCompKeyPtr    pCompKey1;
amiCreate2dCompDef(pDb, pCompDefKey1, L"CIRCLE_COMPONENT");
amiInstance2dComp(pDb, pCompKey1, pCompDefKey1, AmiCompDefKeyPtr());
```

创建组件后，也可以创建第一个组件视图（顶视图）：

```
OdGeMatrix3d compMatrix1;
compMatrix1.setTranslation(topPos);
AmiCompViewDefKeyPtr pComp1TopDef;
AmiCompViewKeyPtr    pComp1Top;
OdArray<AmiFolderKey> arrayFolders;
OdDbObjectIdArray entities;
entities.append(pCircle1->objectId());
       
ami2DSCreateCompViewDef(pDb,
  pComp1TopDef,
  pComp1Top,
  pCompKey1,
  entities,
  arrayFolders,
  compMatrix1,
  AmiFolderKeyPtr(),
  L"Top");
```

附加组件视图（前视图）：

```
OdGeMatrix3d compMatrixFront;
compMatrixFront.setTranslation(frontPos);
AmiCompViewDefKeyPtr pComp1FrontDef;
AmiCompViewKeyPtr    pComp1Front;
OdArray<AmiFolderKey> arrayFoldersFront;
OdDbObjectIdArray entitiesFront;
entitiesFront.append(pLine1->objectId());
   
ami2DSCreateCompViewDef(
  pDb,
  pComp1FrontDef,
  pComp1Front,
  pCompKey1,
  entitiesFront,
  arrayFoldersFront,
  compMatrixFront,
  AmiFolderKeyPtr(),
  L"Front");
```

组件完成后，可以创建包含该组件的BOM表：

```
AcmBOMManagerPtr pBomMgr = getAcmBomMgr();
OdDbObjectId bomId;
pBomMgr->createBomTable(bomId, OdDbObjectId::kNull, OD_T("MAIN"), true, pDb);
```

数据库字典中新BOM表（带组件行）的物理表示：  
![](https://docs.opendesign.com/mech/mech_introducing_mechanical_structure_1.png)

您可以在[我们的文档](https://docs.opendesign.com/mech/mech_introducing_mechanical_structure.html)中找到更多信息。

## 今天就开始行动

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

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