.dwgをサポートするデータベースはAutodesk® AutoCAD®の線種をサポートしていますが、これらの線種は線種パターンに破線、点、テキストのみを含めることができます。DGN線種は、以下もサポートしているため、はるかに強力です。
- パターン内にブロックを埋め込む。
- オフセット付きで複数のパターンを描画する(OdDbMLineエンティティに類似)。
- 線種の破線動作を強化するための多くの追加フラグ。
ODA SDKには、DGN線種を.dwgデータベース内に埋め込むためのクラスと関数があります。さらに、ODA SDKによって保存された.dwgファイルは、2012年バージョン以降DGN線種のベクトル化をサポートしているAutoCADで同様にベクトル化できます。ただし、DGN線種は.dwgファイル形式でのみ保存でき、.dxfファイル形式で保存すると失われます。
DGN線種モジュールの設定
すべてのDGN線種埋め込み機能は、AcDgnLS.txモジュールによって提供されます。このモジュールは、DGN線種をベクトル化するために利用可能である必要があります。DGN線種を作成するには、このモジュールをロードして初期化する必要があります。動的ライブラリ構成の場合、AcDgnLS.txモジュール機能を使用する前に、初期化する必要があります。
::odrxDynamicLinker()->loadModule(OdDgnLSModuleName);
DGN線種作成を扱うアプリケーションは、追加でAcDgnLS.lib静的ライブラリ(非Windowsプラットフォームの場合はAcDgnLS.a)とリンクする必要があります。
静的にリンクされたアプリケーションの場合、AcDgnLS.txモジュールは静的モジュールマップに登録する必要があります。
/************************************************************************/
/* Define a module map for statically linked modules */
/************************************************************************/
#if !defined(_TOOLKIT_IN_DLL_) || defined(__MWERKS__)
ODRX_DECLARE_STATIC_MODULE_ENTRY_POINT(OdDgnLSModule);
ODRX_BEGIN_STATIC_MODULE_MAP()
ODRX_DEFINE_STATIC_APPMODULE(OdDgnLSModuleName, OdDgnLSModule)
ODRX_END_STATIC_MODULE_MAP()
#endif
ストロークパターンコンポーネントの作成
ストロークパターンは、一連の破線(点)とギャップ(スペース)で構成されます。これは、DGN線種作成のための最も単純なコンポーネントです。各破線は独自の特定のパラメータを持つことができます。例を簡素化するために、パラメータの一部のみを呼び出します。
コンポーネントを作成するには、一意のGUIDが必要です。AcDgnLS.txモジュールは、それらを扱うのを簡素化するいくつかの関数を提供します。これらの関数は、別のヘッダーファイルで利用できます。
#include "DgnLS/DbLSMisc.h"
GUIDを初期化するには、oddbDgnLSInitializeImportUID関数を呼び出します。
OdUInt8 dgnLS_UID[16];
::oddbDgnLSInitializeImportUID(dgnLS_UID);
OdDbLSStrokePatternComponentクラス宣言を含むヘッダーファイルを含めます。
#include "DgnLS/DbLSStrokePatternComponent.h"
これで、ストロークパターンコンポーネントを作成できます。
// Create Stroke LineStyle Component
OdDbLSStrokePatternComponentPtr pComponent = OdDbLSStrokePatternComponent::createObject();
pComponent->setComponentType(kLSStrokePatternComponent);
pComponent->setComponentUID(dgnLS_UID);
そして、ストロークパターンコンポーネント内にストロークとギャップを追加します。
// Append strokes
pComponent->insertStroke(0.008)->setDash();
pComponent->insertStroke(0.003)->setGap();
pComponent->insertStroke(0.002)->setDash();
pComponent->insertStroke(0.003)->setGap();
これらのストロークとギャップのセットにより、次の線種が得られます。
たとえば、最初の破線を変更し、幅などの追加パラメータを指定できます。
pComponent->insertStroke(0.008, 0.003, 0.002, OdDbLSStroke::kLSWidthFull)->setDash();
次の図は、この変更の結果を示しています。
そして最後に、例えば、破線の端点の動作を変更できます。
pComponent->insertStroke(0.008, 0.003, 0.002, OdDbLSStroke::kLSWidthFull, OdDbLSStroke::kLSCapsArc)->setDash();
そして、以下の線種を得ることができます。
もちろん、破線には他にも変更可能なパラメータがありますが、それらの説明はこの記事の範囲外です。
ストロークパターンコンポーネントを作成および設定した後、それを.dwgデータベースのDGN線種辞書に追加できます。
// Add component into LineStyles dictionary
OdDbDictionaryPtr pDict = ::oddbDgnLSGetComponentsDictionary(pDb, OdDb::kForWrite, true);
pDict->setAt(OD_T("DemoDgnLineStyleStrokeComponent"), pComponent);
線種を.dwgファイルにアタッチする (OdDbLinetypeTableRecord)
DGN線種を.dwgデータベースエンティティに適用するには、データベース内の線種を記述するネイティブの.dwgデータベースオブジェクト(OdDbLinetypeTableRecord)にアタッチします。
まず、OdDbLSDefinitionクラス宣言を含むヘッダーファイルを含めます。
#include "DgnLS/DbLSDefinition.h"
これで、線種テーブルレコードにアタッチされるOdDbLSDefinitionを作成できます。
// Create LineStyle Definition
OdDbLSDefinitionPtr pLSDef = OdDbLSDefinition::createObject();
pLSDef->setComponent(pComponent->objectId());
pLSDef->setComponentUID(pComponent->componentUID());
線種定義は既存の線種コンポーネントを参照します。もちろん、スケーリングなどの追加パラメータも含まれていますが、ここでは簡略化のために変更しません。これで、.dwgデータベース線種を作成できます。
// Create Linetype Table Record
OdDbLinetypeTableRecordPtr pLtpRec = OdDbLinetypeTableRecord::createObject();
pLtpRec->setName(OD_T("DemoDgnLineStyleStroke"));
pLtpRec->setComments(OD_T("Stroke 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);
これで、標準の線種と同様に、作成した線種を任意の.dwgデータベースエンティティで使用できます。例を完成させ、結果を示すために、この線種を使用してデータベースに新しい線を作成します。
// Create line for LineStyle testing
OdDbLinePtr pLine = OdDbLine::createObject();
pLine->setDatabaseDefaults(pDb);
pLine->setLinetype(lsId);
pLine->setEndPoint(OdGePoint3d(1.0, 0.0, 0.0));
OdDbBlockTableRecord::cast(pDb->getActiveLayoutBTRId().safeOpenObject(OdDb::kForWrite))->appendOdDbEntity(pLine);
ストロークパターンの作成(完全なコマンドソースコード)
#include "DbLinetypeTable.h"
#include "DbLinetypeTableRecord.h"
#include "DbLine.h"
#include "DgnLS/DbLSDefinition.h"
#include "DgnLS/DbLSStrokePatternComponent.h"
#include "DgnLS/DbLSMisc.h"
void _CreateDgnLineStyle_Stroke_func(OdEdCommandContext* pCmdCtx)
{
OdDbDatabasePtr pDb = pCmdCtx->baseDatabase();
OdDbUserIOPtr pIO = pCmdCtx->userIO();
::odrxDynamicLinker()->loadModule(OdDgnLSModuleName);
// We need GUID for DgnLS objects
OdUInt8 dgnLS_UID[16];
::oddbDgnLSInitializeImportUID(dgnLS_UID);
// Create Stroke LineStyle Component
OdDbLSStrokePatternComponentPtr pComponent = OdDbLSStrokePatternComponent::createObject();
pComponent->setComponentType(kLSStrokePatternComponent);
pComponent->setComponentUID(dgnLS_UID);
// Append strokes
pComponent->insertStroke(0.008, 0.003, 0.002, OdDbLSStroke::kLSWidthFull, OdDbLSStroke::kLSCapsArc)->setDash();
pComponent->insertStroke(0.003)->setGap();
pComponent->insertStroke(0.002)->setDash();
pComponent->insertStroke(0.003)->setGap();
// Add component into LineStyles dictionary
OdDbDictionaryPtr pDict = ::oddbDgnLSGetComponentsDictionary(pDb, OdDb::kForWrite, true);
pDict->setAt(OD_T("DemoDgnLineStyleStrokeComponent"), pComponent);
// Create LineStyle Definition
OdDbLSDefinitionPtr pLSDef = OdDbLSDefinition::createObject();
pLSDef->setComponent(pComponent->objectId());
pLSDef->setComponentUID(pComponent->componentUID());
// Create Linetype Table Record
OdDbLinetypeTableRecordPtr pLtpRec = OdDbLinetypeTableRecord::createObject();
pLtpRec->setName(OD_T("DemoDgnLineStyleStroke"));
pLtpRec->setComments(OD_T("Stroke 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);
// Create line for LineStyle testing
OdDbLinePtr pLine = OdDbLine::createObject();
pLine->setDatabaseDefaults(pDb);
pLine->setLinetype(lsId);
pLine->setEndPoint(OdGePoint3d(1.0, 0.0, 0.0));
OdDbBlockTableRecord::cast(pDb->getActiveLayoutBTRId().safeOpenObject(OdDb::kForWrite))->appendOdDbEntity(pLine);
}
このシリーズの次の記事では、内部線種コンポーネントの操作について説明します。