.dwgファイルでの.dgn線種の使用(4部構成のパート1)

.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();

これらのストロークとギャップのセットにより、次の線種が得られます。

image1

たとえば、最初の破線を変更し、幅などの追加パラメータを指定できます。

pComponent->insertStroke(0.008, 0.003, 0.002, OdDbLSStroke::kLSWidthFull)->setDash();

次の図は、この変更の結果を示しています。

image2

そして最後に、例えば、破線の端点の動作を変更できます。

pComponent->insertStroke(0.008, 0.003, 0.002, OdDbLSStroke::kLSWidthFull, OdDbLSStroke::kLSCapsArc)->setDash();

そして、以下の線種を得ることができます。

image3

もちろん、破線には他にも変更可能なパラメータがありますが、それらの説明はこの記事の範囲外です。

ストロークパターンコンポーネントを作成および設定した後、それを.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);
}

このシリーズの次の記事では、内部線種コンポーネントの操作について説明します。

今すぐ始める

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

無料で試す