[返回博客](/cn/blog) # 缩放机械符号

Dmytro Kabenok 八月 13, 2021 [\#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>

使用 Mechanical SDK，您可以为机械符号（派生自 AcmSymbol 的类）配置两种类型的比例因子：

- 箭头比例（引线）
- 主符号和所有子符号的比例（不包括引线）

如果在符号创建期间未指定箭头比例，则默认值取自相应的标准。每个符号标准（AcmSymbolStd 派生类）默认取决于主标准（AcmStandard 类）中的参数。如果主标准设置发生更改，则符号标准中的参数会相应更改（如果依赖关系未中断）。

要获取或设置全局符号比例的值，请使用函数 odmGetSymbolScale() 和 odmSetSymbolScale()。它们在文件“OdmSymScale.h”中声明。全局符号比例的值不依赖于标准，并存储在数据库中的一个单独对象中。

公制标准的箭头比例默认值为 3.5，英制标准 (ANSI) 的默认值为 0.12。主符号和所有子符号的默认比例不依赖于测量，等于 1.0。

您可以使符号标准中的参数独立于主标准。对于您不希望在主标准参数发生更改时更新的字段，将负责“按标准”的标志设置为 false。例如，您可以调用 AcmSymbolStd 类的 setArwScaleByStandard() 方法，并将输入参数设置为 false，它将仅针对此字段删除对主标准的依赖关系（如果输入值设置为 true，它将恢复依赖关系并从主标准复制值）。您还可以使用新的比例值调用 setArwScale() 方法；这也会删除对主标准的依赖关系。

#### 示例

使用从主标准获取的默认数据创建一个简单符号。例如，创建一个 AmdtEdge 符号：

```
// Create AmdtEdge and set default values
AmdtEdgePtr pEdgeSym = AmdtEdge::createObject();
if (pEdgeSym->setSymbolDefaults(pDb) != Acm::eOk) // pDb - pointer to the database
  return;

// Customize AmdtEdge
pEdgeSym->setStdNum(true);
pEdgeSym->setNewSymbolRev();
pEdgeSym->setValue(Acm::EdgeMax, L"12.2");
pEdgeSym->setValue(Acm::EdgeMin, L"-3.2");

// Create the leader points array and add the leader
OdGePoint3dArray leadPoints;
leadPoints.append(OdGePoint3d(10.0, 11.0, 0.0));
leadPoints.append(OdGePoint3d(15.5, 18.5, 0.0));
if (pEdgeSym->addLeader(leadPoints) != Acm::eOk)
  return;

// Set the origin
pEdgeSym->setOrigin(leadPoints[1]);

// Open the model space object and append the entity to the model space
OdDbBlockTableRecordPtr pBTR = pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
pBTR->appendOdDbEntity(pEdgeSym);
```

结果，您将得到以下符号：

![As a result, you get the following symbol](/files/inline-images/mechanical%20oda.png)现在更改符号引线的比例因子。为此，请使用前面描述的方法并更改符号标准中的值；所有基于此符号标准创建的符号都将具有新值。您还可以使用符号引线的方法（setArrowType() 和 setArrowScale()）仅更改当前符号的值。

```
AmdtEdgePtr pEdgeSym2 = AmdtEdge::createObject();
if (pEdgeSym2->setSymbolDefaults(pDb) != Acm::eOk)
  return;

pEdgeSym2->setStdNum(true);
pEdgeSym2->setNewSymbolRev();
pEdgeSym2->setValue(Acm::EdgeMax, L"12.2");
pEdgeSym2->setValue(Acm::EdgeMin, L"-3.2");

OdGePoint3dArray leadPoints;
leadPoints.append(OdGePoint3d(50.0, 11.0, 0.0));
leadPoints.append(OdGePoint3d(55.5, 18.5, 0.0));

if (pEdgeSym2->addLeader(leadPoints) != Acm::eOk)
  return;

pEdgeSym2->setOrigin(leadPoints[1]);

// Get the leader
AcmCLeader* pLeader = pEdgeSym2->getLeader(0);
if (!pLeader)
  return;

// For setting the new arrow scale in the symbol leader you need to override the arrow type.
// Value Acm::kByStandard was set by default, it disables logic for arrowScale changing.
pLeader->setArrowType(Acm::kArrowAcadClosedFilled);
//// Set the new arrow scale
pLeader->setArrowScale(6.3);

// Or you can use the next code, that was described in the overview, but keep in
// mind that changes in parameters in the symbol standard may affect all
// previously created symbols (related to this symbol standard).
/*{
  AmdtEdgeStdPtr pSymbStd = AmdtEdgeStd::cast(pEdgeSym2->serverId().openObject(OdDb::kForWrite));
  if (pSymbStd.isNull())
    return;

  pSymbStd->setArrowType(Acm::kArrowAcadClosedFilled);
  pSymbStd->setArwScale(6.3);
}*/

OdDbBlockTableRecordPtr pBTR = pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
pBTR->appendOdDbEntity(pEdgeSym2);
```

结果创建了两个符号，但引线的比例不同：

![Two symbols are created](/files/inline-images/different%20scales%20for%20the%20leaders.png)最后，使用全局符号比例：

```
AmdtEdgePtr pEdgeSym3 = AmdtEdge::createObject();
if (pEdgeSym3->setSymbolDefaults(pDb) != Acm::eOk)
  return;

pEdgeSym3->setStdNum(true);
pEdgeSym3->setNewSymbolRev();

pEdgeSym3->setValue(Acm::EdgeMax, L"12.2");
pEdgeSym3->setValue(Acm::EdgeMin, L"-3.2");

OdGePoint3dArray leadPoints;
leadPoints.append(OdGePoint3d(25.0, 31.0, 0.0));
leadPoints.append(OdGePoint3d(31.5, 43.5, 0.0));
if (pEdgeSym3->addLeader(leadPoints) != Acm::eOk)
  return;

pEdgeSym3->setOrigin(leadPoints[1]);
odmSetSymbolScale(pDb, 3.0);  // Change the global symbol scale; value by default is 1.0
pEdgeSym3->setScale(odmGetSymbolScale(pDb)); // update scale for the current symbol

OdDbBlockTableRecordPtr pBTR = pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
pBTR->appendOdDbEntity(pEdgeSym3);
```

执行本文中的所有代码时，将创建三个具有不同比例的符号：

- 具有默认比例因子的 AmdtEdge
- 具有修改后的引线比例因子的 AmdtEdge
- 具有更新的全局符号比例因子的 AmdtEdge

![Three symbols with different scales](/files/inline-images/mechanical%20final%20result.png)

## 今天就开始行动

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

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