Mechanical SDK を使用すると、メカニカルシンボル (AcmSymbol から派生したクラス) に対して 2 種類の尺度係数を設定できます。
- 矢印の尺度 (引出線)
- メインシンボルとすべてのサブシンボルの尺度 (引出線を除く)
シンボル作成時に矢印の尺度が指定されていない場合、既定値は対応する標準から取得されます。各シンボル標準 (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);
結果として 2 つのシンボルが作成されますが、引出線の尺度が異なります。
最後に、グローバルシンボル尺度を使用するには:
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);
この記事のすべてのコードを実行すると、異なるスケールを持つ3つのシンボルが作成されます。
- AmdtEdge (デフォルトのスケールファクター)
- AmdtEdge (変更されたリーダーのスケールファクター)
- AmdtEdge (更新されたグローバルシンボルのスケールファクター)