[ブログに戻る](/ja/blog) # .dwgファイルで複合.dgn線種を使用する（1/2）

Andrew Markovich 4月 04, 2019 [\#dgn](/ja/blog/tag/dgn) [\#.dwg](/ja/blog/tag/dwg) [\#Example](/ja/blog/tag/example)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

#### はじめに

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

- [.dwgファイルで.dgn線種を使用する（1/4）](https://www.opendesign.com/blog/2018/december/using-dgn-line-styles-dwg-file-part-1-4)
- [.dwgファイルで.dgn線種を使用する（2/4）](https://www.opendesign.com/blog/2019/january/using-dgn-line-styles-dwg-file-part-2-4)
- [.dwgファイルで.dgn線種を使用する（3/4）](https://www.opendesign.com/blog/2019/january/using-dgn-line-styles-dwg-file-part-3-4)
- [.dwgファイルで.dgn線種を使用する（4/4）](https://www.opendesign.com/blog/2019/february/using-dgn-line-styles-dwg-file-part-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線種辞書に以下のコンポーネントリストが投入されます。

![image0](/files/inline-images/0.png)そして、デモンストレーション用の線種を持つOdDbLineエンティティを作成するこれらの関数からテストコードを削除しなかったため、同じ位置に異なる線種を持つ3つの線が表示されます。

![image1](/files/inline-images/1_0.png)もちろん、これは複合線種ではありません。これらの線は消去できます。将来の操作には必要ありません。

これで、以前に作成したコンポーネントのオブジェクト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](/files/inline-images/2_0.png)作成された複合線種を詳しく見てみましょう。

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

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

## 今すぐ始める

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

[無料で試す](https://www.opendesign.com/ja/free-trial)
