.dwgファイルで複合.dgn線種を使用する(1/2)

はじめに

これは、.dwgデータベースで複雑な.dgn線種を作成することに関する一連の最後の記事です。以前の記事で説明したDGN線種作成の知識を活用し、以前に作成したすべての線種コンポーネントを呼び出す最終的な複合線種を作成します。参考のために、以前の記事を以下に示します。

 

 

複合コンポーネントの作成

複合線種コンポーネントは、単一の複雑な線種内で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線種辞書に以下のコンポーネントリストが投入されます。

 

image0

 

そして、デモンストレーション用の線種を持つOdDbLineエンティティを作成するこれらの関数からテストコードを削除しなかったため、同じ位置に異なる線種を持つ3つの線が表示されます。

 

image1

 

もちろん、これは複合線種ではありません。これらの線は消去できます。将来の操作には必要ありません。

これで、以前に作成したコンポーネントのオブジェクト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);
  }

記述されたコードによって作成された最終的な図は次のようになります。

 

image2

 

作成された複合線種を詳しく見てみましょう。

 

image3

 

ここでは、線種の最初の行に内部コンポーネント(オフセット0.005)、中央に点と点ストロークパターンコンポーネント、線種の最後の行にダッシュセグメントの1つに幅を持つストロークパターンコンポーネント(オフセット-0.005)を見ることができます。実際、複合コンポーネントに追加される線種コンポーネントの側面は、曲線の方向に依存します。このデモンストレーションでは、左から右に伸びる線を作成したため、最終的に線種コンポーネントの順序を示しました。

このシリーズの次の記事では、特定のエンティティに適用できる線種修飾子について説明します。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す