はじめに
これは、.dwgデータベースで複雑な.dgn線種を作成することに関する一連の最後の記事です。以前の記事で説明したDGN線種作成の知識を活用し、以前に作成したすべての線種コンポーネントを呼び出す最終的な複合線種を作成します。参考のために、以前の記事を以下に示します。
- .dwgファイルで.dgn線種を使用する(1/4)
- .dwgファイルで.dgn線種を使用する(2/4)
- .dwgファイルで.dgn線種を使用する(3/4)
- .dwgファイルで.dgn線種を使用する(4/4)
複合コンポーネントの作成
複合線種コンポーネントは、単一の複雑な線種内で2つ以上の線種コンポーネントを結合するために使用できます。新しく作成された複合コンポーネント内に既存のストロークパターン、内部、点、およびその他の複合コンポーネントを追加し、それらの間にオフセットを設定すると、それらは単一の複雑な線種として一緒に描画されます。.dwgデータベースの観点から見ると、複合線種コンポーネントはOdDbMlineエンティティ機能と同様の機能を提供しますが、DGN線種は多くの追加機能を提供します。
複合コンポーネントの使用を開始するには、OdDbLSCompoundComponentクラス宣言を含むヘッダーを含めます。
#include "DgnLS/DbLSCompoundComponent.h"
しかし、まず、新しく作成する複合コンポーネントに追加する他の既存コンポーネントのオブジェクトIDが必要です。ここでは、以前の記事で説明した既存のコンポーネントを使用するため、既に存在する関数を呼び出すことができます。
// Declare commands from previous articles.
void _CreateDgnLineStyle_Stroke_func(OdEdCommandContext* pCmdCtx);
void _CreateDgnLineStyle_Internal_func(OdEdCommandContext* pCmdCtx);
void _CreateDgnLineStyle_Point_func(OdEdCommandContext* pCmdCtx);
そして、それらを呼び出すだけで、ストロークパターン、内部、および点コンポーネントを.dwgデータベースに投入します。
// Create stroke, internal and point components
_CreateDgnLineStyle_Stroke_func(pCmdCtx);
_CreateDgnLineStyle_Internal_func(pCmdCtx);
_CreateDgnLineStyle_Point_func(pCmdCtx);
これらの関数を呼び出すと、DGN線種辞書に以下のコンポーネントリストが投入されます。
そして、デモンストレーション用の線種を持つOdDbLineエンティティを作成するこれらの関数からテストコードを削除しなかったため、同じ位置に異なる線種を持つ3つの線が表示されます。
もちろん、これは複合線種ではありません。これらの線は消去できます。将来の操作には必要ありません。
これで、以前に作成したコンポーネントのオブジェクトIDを抽出できます。
OdDbDictionaryPtr pLsDict = ::oddbDgnLSGetComponentsDictionary(pDb, OdDb::kForRead);
OdDbObjectId strokeCompId = pLsDict->getAt(OD_T("DemoDgnLineStyleStrokeComponent"));
OdDbObjectId internalCompId = pLsDict->getAt(OD_T("DemoDgnLineStyleInternalComponent"));
OdDbObjectId pointCompId = pLsDict->getAt(OD_T("DemoDgnPointComponent"));
OdDbObjectId pointStrokeCompId = pLsDict->getAt(OD_T("DemoDgnLineStyleStrokeComponentForPointComponent"));
「DemoDgnLineStyleStrokeComponent」は_CreateDgnLineStyle_Stroke_func()関数呼び出しによって作成されました。「DemoDgnLineStyleInternalComponent」は_CreateDgnLineStyle_Internal_func()関数呼び出しによって作成されました。「DemoDgnPointComponent」と「DemoDgnLineStyleStrokeComponentForPointComponent」は_CreateDgnLineStyle_Point_func()関数呼び出しによって作成されました。
これで、複合コンポーネント自体を作成できます。複合コンポーネントの作成は、他のDGN線種コンポーネントの作成と非常によく似ています。
// We need GUID for DgnLS objects
OdUInt8 dgnLS_UID[16];
::oddbDgnLSInitializeImportUID(dgnLS_UID);
// Create Compound LineStyle Component
OdDbLSCompoundComponentPtr pCompComponent = OdDbLSCompoundComponent::createObject();
pCompComponent->setComponentType(kLSCompoundComponent);
pCompComponent->setComponentUID(dgnLS_UID);
複合コンポーネントの作成後、既存の4つの線種コンポーネントのオブジェクトIDをそれに付加できます。
// Append compound component sub-components
pCompComponent->appendComponent(pointStrokeCompId);
pCompComponent->appendComponent(pointCompId);
pCompComponent->appendComponent(strokeCompId, -0.005);
pCompComponent->appendComponent(internalCompId, 0.005);
このコードでは、オフセットなしで点ストロークパターンと点コンポーネントを追加しました。ストロークパターンと内部コンポーネントは、異なる側に0.005のオフセットで追加されました。
最後に、作成した複合コンポーネントをDGN線種辞書にアタッチできます。
// Add component into LineStyles dictionary
pLsDict->upgradeOpen();
pLsDict->setAt(OD_T("DemoDgnLineStyleCompoundComponent"), pCompComponent);
線種定義と.dwg線種テーブルレコードを作成するために使用されるコードは、以前の記事のコードと非常によく似ています。
// Create LineStyle Definition
OdDbLSDefinitionPtr pLSDef = OdDbLSDefinition::createObject();
pLSDef->setComponent(pCompComponent->objectId());
pLSDef->setComponentUID(pCompComponent->componentUID());
// Create Linetype Table Record
OdDbLinetypeTableRecordPtr pLtpRec = OdDbLinetypeTableRecord::createObject();
pLtpRec->setName(OD_T("DemoDgnLineStyleCompound"));
pLtpRec->setComments(OD_T("Compound component"));
OdDbObjectId lsId = OdDbLinetypeTable::cast(pDb->getLinetypeTableId().safeOpenObject(OdDb::kForWrite))->add(pLtpRec);
// Attach LineStyle Definition to Linetype Table Record
pLtpRec->createExtensionDictionary();
OdDbDictionaryPtr pLtpDict = OdDbDictionary::cast(pLtpRec->extensionDictionary().openObject(OdDb::kForWrite));
pLtpDict->setAt(::oddbDgnLSGetDefinitionKeyName(), pLSDef);
そして、いくつかのOdDbLineエンティティを生成できます。
// Create three lines for LineStyle testing
OdDbObjectId lineIds[3];
for (int nLine = 0; nLine < 3; nLine++)
{
OdDbLinePtr pLine = OdDbLine::createObject();
pLine->setDatabaseDefaults(pDb);
pLine->setLinetype(lsId);
pLine->setStartPoint(OdGePoint3d(1.1, 0.03 - 0.03 * nLine, 0.0));
pLine->setEndPoint(OdGePoint3d(1.2, 0.03 - 0.03 * nLine, 0.0));
lineIds[nLine] = OdDbBlockTableRecord::cast(pDb->getActiveLayoutBTRId().safeOpenObject(OdDb::kForWrite))->appendOdDbEntity(pLine);
}
記述されたコードによって作成された最終的な図は次のようになります。
作成された複合線種を詳しく見てみましょう。
ここでは、線種の最初の行に内部コンポーネント(オフセット0.005)、中央に点と点ストロークパターンコンポーネント、線種の最後の行にダッシュセグメントの1つに幅を持つストロークパターンコンポーネント(オフセット-0.005)を見ることができます。実際、複合コンポーネントに追加される線種コンポーネントの側面は、曲線の方向に依存します。このデモンストレーションでは、左から右に伸びる線を作成したため、最終的に線種コンポーネントの順序を示しました。
このシリーズの次の記事では、特定のエンティティに適用できる線種修飾子について説明します。