この記事は、.dwg ファイルで DGN 線種を使用することに関する一連の記事の一部です。前の記事については、パート2をご覧ください。
Autodesk® AutoCAD® の線種は、.dwg データベースの既定の線種ですが、線種の内容に制限があります。ダッシュとドットに加えて、線種パターンへのテキストと SHX シェイプの埋め込みのみをサポートしています。DGN 線種スタイルは、線種パターン内に任意のコンテンツを含むブロック全体を埋め込む機能を提供し、多くの追加のカスタマイズ オプションを提供します。この記事では、.dwg データベースに埋め込まれた DGN 線種スタイルにシンボル (ブロック) を挿入する方法について説明します。
シンボルコンポーネントの作成
シンボルコンポーネントは、DGN線種におけるブロック参照を表し、ジオメトリデータの動作を設定するためのパラメータを提供します。
シンボルコンポーネントの操作を開始するには、OdDbLSSymbolComponentクラス宣言を含むヘッダーを含めます。
#include "DgnLS/DbLSSymbolComponent.h"
シンボルコンポーネントの作成は、他のDGN線種コンポーネントの作成と非常によく似ています。
// Create symbol component for first block
OdDbLSSymbolComponentPtr pSymComponent = OdDbLSSymbolComponent::createObject();
pSymComponent->setComponentType(kLSSymbolComponent);
pSymComponent->setDescription(OD_T("DemoDgnSymbol1"));
pSymComponent->setComponentUID(dgnLS_UID);
次に、作成したシンボルコンポーネントに接続するための.dwgブロックが必要です。たとえば、以下の関数を使用して新しいブロックを生成し、.dwgデータベースにアタッチしてみましょう。
static OdDbHelixPtr createHelix(OdGePoint3d location, double radius)
{
OdDbHelixPtr helPtr = OdDbHelix::createObject();
helPtr->setStartPoint(location - OdGeVector3d::kZAxis);
helPtr->setConstrain(OdDbHelix::kTurns);
helPtr->setBaseRadius(radius);
helPtr->setTopRadius(radius / 5);
helPtr->setTurns(4.0);
helPtr->setAxisVector(OdGeVector3d::kZAxis);
helPtr->createHelix();
return helPtr;
}
static OdDbBlockTableRecordPtr createSegmentBlock()
{ const double fBlockScale = 1.0 / 1000.0;
OdDbBlockTableRecordPtr btrPtr = OdDbBlockTableRecord::createObject();
btrPtr->appendOdDbEntity(createHelix(OdGePoint3d(-fBlockScale, -fBlockScale, 0.0), fBlockScale));
btrPtr->appendOdDbEntity(createHelix(OdGePoint3d( fBlockScale, -fBlockScale, 0.0), fBlockScale));
btrPtr->appendOdDbEntity(createHelix(OdGePoint3d(-fBlockScale, fBlockScale, 0.0), fBlockScale));
btrPtr->appendOdDbEntity(createHelix(OdGePoint3d( fBlockScale, fBlockScale, 0.0), fBlockScale));
btrPtr->setName(OD_T("4helix"));
return btrPtr;
}
static OdDbObjectId appendBlock(OdDbDatabase *pDb, OdDbBlockTableRecordPtr btrPtr)
{
return OdDbBlockTable::cast(pDb->getBlockTableId().openObject(OdDb::kForWrite))->add(btrPtr);
}
このコードを実行すると、データベースに「4helix」という名前の新しいブロックが作成され、そのブロック内には4つのらせんエンティティが含まれています。
ブロック内のジオメトリには[1.0 / 1000.0]のスケールを使用していることに注意してください。これは、AutoCADがシンボルコンポーネントで設定されたシンボルスケールを無視し、その結果、ブロックコンテンツが1/1000の係数を使用して事前にスケーリングされていることを期待するためです。
これで、作成したブロックをシンボルコンポーネントにアタッチし、このコンポーネントをDGN線種辞書に登録できます。
// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createSegmentBlock()));
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForSegment"), pSymComponent);
同様に、この例では、線曲線の終端を強調表示するために使用される2番目のシンボルコンポーネントを作成します。
// Create symbol component for second block
pSymComponent = OdDbLSSymbolComponent::createObject();
pSymComponent->setComponentType(kLSSymbolComponent);
pSymComponent->setDescription(OD_T("DemoDgnSymbol2"));
::oddbDgnLSIncrementUID(dgnLS_UID);
pSymComponent->setComponentUID(dgnLS_UID);
このコードは、以前のシンボルコンポーネントの作成とほとんど同じですが、odDbDgnLSIncrementUID関数への追加の呼び出しが1つ含まれています。すべてのコンポーネントが異なるUIDを持つことが推奨されるため、odDbDgnLSIncrementUID関数呼び出しを使用して、以前に生成されたUIDを変更できます。これは、完全に新しいUIDを生成するよりもはるかに簡単です。このヘルパー関数は、「DgnLS/DbLSMisc.h」ヘッダーファイルで宣言されています。
ブロック内に矢印のようなジオメトリを作成するために使用する関数は次のとおりです。
static OdDbBlockTableRecordPtr createArrowBlock()
{
const double fBlockScale = 1.0 / 1000.0;
OdDbPolylinePtr pPl = OdDbPolyline::createObject();
pPl->addVertexAt(0, OdGePoint2d(-fBlockScale, -fBlockScale));
pPl->addVertexAt(1, OdGePoint2d(-fBlockScale, fBlockScale));
pPl->addVertexAt(2, OdGePoint2d( fBlockScale, 0.0));
pPl->setClosed(true);
OdDbBlockTableRecordPtr btrPtr = OdDbBlockTableRecord::createObject();
btrPtr->appendOdDbEntity(pPl);
btrPtr->setName(OD_T("arrow"));
return btrPtr;
}
ポリラインジオメトリを生成します。
以前に生成されたブロックと同様に、ブロックコンテンツには1/1000のスケールを使用しました。
そして最後に、作成したブロックをシンボルコンポーネントにアタッチし、シンボルコンポーネントをDGN線種辞書にアタッチします。
// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createArrowBlock()));
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForLineEnd"), pSymComponent);
このシリーズの次の記事では、点線種コンポーネントの操作について説明します。