使用 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);
结果,您将得到以下符号:
现在更改符号引线的比例因子。为此,请使用前面描述的方法并更改符号标准中的值;所有基于此符号标准创建的符号都将具有新值。您还可以使用符号引线的方法(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);
结果创建了两个符号,但引线的比例不同:
最后,使用全局符号比例:
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