缩放机械符号

使用 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

 

现在更改符号引线的比例因子。为此,请使用前面描述的方法并更改符号标准中的值;所有基于此符号标准创建的符号都将具有新值。您还可以使用符号引线的方法(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

 

最后,使用全局符号比例:

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

 

今天就开始行动

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

免费试用