この記事は、.dwgファイルでDGN線種を使用することに関する一連の記事の一部です。前の記事については、パート3を参照してください。
点線スタイルコンポーネントの作成
点線スタイルコンポーネントは、各ストロークパターン破線(またはギャップ)または曲線の開始/終了点に対してベクトル化されるシンボルコンポーネントを設定する機能を提供します。また、各ポリライン頂点でベクトル化されるシンボルコンポーネントを設定する機能も提供します。ストロークパターン破線(およびギャップ)のシンボルを設定するには、まずストロークパターンコンポーネントを作成します。この例では、以前の記事からのシンプルなストロークパターンコンポーネントを使用します。
// Create Stroke LineStyle Component
OdDbLSStrokePatternComponentPtr pLsComponent = OdDbLSStrokePatternComponent::createObject();
pLsComponent->setComponentType(kLSStrokePatternComponent);
pLsComponent->setComponentUID(dgnLS_UID);
// Append strokes
pLsComponent->insertStroke(0.008)->setDash();
pLsComponent->insertStroke(0.003)->setGap();
pLsComponent->insertStroke(0.002)->setDash();
pLsComponent->insertStroke(0.003)->setGap();
// Add component into LineStyles dictionary
OdDbDictionaryPtr pDict = ::oddbDgnLSGetComponentsDictionary(pDb, OdDb::kForWrite, true);
pDict->setAt(OD_T("DemoDgnLineStyleStrokeComponentForPointComponent"), pLsComponent);
このストロークとギャップのセットは、以下の線スタイルを生成します。
これで、新しい点コンポーネント(このコードはすべてのDGN線スタイルコンポーネントの作成に典型的です)を作成し、既存のストロークパターンコンポーネントをそれにアタッチできます。
// Create Point Component
OdDbLSPointComponentPtr pPtComponent = OdDbLSPointComponent::createObject();
pPtComponent->setComponentType(kLSPointComponent);
::oddbDgnLSIncrementUID(dgnLS_UID);
pPtComponent->setComponentUID(dgnLS_UID);
// Set up stroke component for point component
pPtComponent->setStrokeComponent(pLsComponent->objectId());
注: 基になるストロークパターンコンポーネントの破線は、点コンポーネントにアタッチされてもベクトル化されません。ストロークパターンコンポーネントを点コンポーネントシンボルと一緒にベクトル化するには、複合コンポーネントの作成が必要です。複合コンポーネントについては、今後のブログ記事で説明します。
点コンポーネントを使用するには、プログラムのソースコードに追加のインクルードファイルを追加します。
#include "DgnLS/DbLSPointComponent.h"
次に、例えば、既存のシンボルコンポーネントをストロークパターンコンポーネントの2番目のセグメント(これはストロークパターンの最初のギャップです)に接続します。
// Set symbol for stroke component gaps
OdDbLSSymbolReference lsRef;
lsRef.setSymbolComponent(pSymComponent->objectId());
lsRef.setJustify(OdDbLSSymbolReference::kLSJustifyCenter);
pPtComponent->insertSymbolForStroke(&lsRef, 1);
このコードのOdDbLSSymbolReference構造体は、回転、オフセット、位置合わせ、およびいくつかの追加フラグなど、一連のシンボルパラメータを表します。この例では、OdDbLSSymbolReference::setSymbolComponentメソッドを使用して、シンボルコンポーネントIDをOdDbLSSymbolReference構造体にアタッチします。さらに、ストロークパターンギャップの中央にシンボルを表示するように位置合わせを設定します。ストロークのシンボルをアタッチするには、位置合わせパラメータを設定する必要があります。最後に、OdDbLSPointComponent::insertSymbolForStrokeメソッドを呼び出して、シンボルを点コンポーネントにアタッチします。
そして、2番目のシンボルコンポーネントをアタッチして、曲線の端でベクトル化します。
// Set symbol for line end
lsRef.setSymbolComponent(pSymComponent->objectId());
lsRef.setJustify(OdDbLSSymbolReference::kLSNoJustify);
pPtComponent->insertSymbolForVertex(&lsRef, OdDbLSSymbolReference::kLSAtEnd);
最後に、点コンポーネントをDGN線スタイルコンポーネント辞書にアタッチします。
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnPointComponent"), pPtComponent);
次のコードはすべて、線スタイル定義コンポーネントを作成し、それをOdDbLinetypeTableRecordにアタッチし、線スタイル視覚化をテストするための線エンティティを作成するために、以前の記事で詳しく説明されています。ここでは、ストロークパターンコンポーネントの代わりに新しい点線スタイルコンポーネントを線スタイル定義にアタッチするという小さな違いがありますが、再度使用します。
// Create LineStyle Definition
OdDbLSDefinitionPtr pLSDef = OdDbLSDefinition::createObject();
pLSDef->setComponent(pPtComponent->objectId());
pLSDef->setComponentUID(pPtComponent->componentUID());
// Create Linetype Table Record
OdDbLinetypeTableRecordPtr pLtpRec = OdDbLinetypeTableRecord::createObject();
pLtpRec->setName(OD_T("DemoDgnLineStylePoint"));
pLtpRec->setComments(OD_T("Point 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);
コード実行後に得られる線スタイルは、以下の画像(異なるズームレベル)のようになります。
4つのヘリックスを含むブロックは、各線種(ストローク)パターンの繰り返しごとに表示され、ポリライン矢印を含むブロックは、OdDbLineエンティティの終点に表示されます。
点コンポーネントの作成(完全なコマンドソースコード)
#include "DbLinetypeTable.h"
#include "DbLinetypeTableRecord.h"
#include "DbLine.h"
#include "DbHelix.h"
#include "DbPolyline.h"
#include "DbBlockTable.h"
#include "DgnLS/DbLSDefinition.h"
#include "DgnLS/DbLSStrokePatternComponent.h"
#include "DgnLS/DbLSPointComponent.h"
#include "DgnLS/DbLSSymbolComponent.h"
#include "DgnLS/DbLSMisc.h"
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 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;
}
static OdDbObjectId appendBlock(OdDbDatabase *pDb, OdDbBlockTableRecordPtr btrPtr)
{
return OdDbBlockTable::cast(pDb->getBlockTableId().openObject(OdDb::kForWrite))->add(btrPtr);
}
void _CreateDgnLineStyle_Point_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 pLsComponent = OdDbLSStrokePatternComponent::createObject();
pLsComponent->setComponentType(kLSStrokePatternComponent);
pLsComponent->setComponentUID(dgnLS_UID);
// Append strokes
pLsComponent->insertStroke(0.008)->setDash();
pLsComponent->insertStroke(0.003)->setGap();
pLsComponent->insertStroke(0.002)->setDash();
pLsComponent->insertStroke(0.003)->setGap();
// Add component into LineStyles dictionary
OdDbDictionaryPtr pDict = ::oddbDgnLSGetComponentsDictionary(pDb, OdDb::kForWrite, true);
pDict->setAt(OD_T("DemoDgnLineStyleStrokeComponentForPointComponent"), pLsComponent);
// Create symbol component for first block
OdDbLSSymbolComponentPtr pSymComponent = OdDbLSSymbolComponent::createObject();
pSymComponent->setComponentType(kLSSymbolComponent);
pSymComponent->setDescription(OD_T("DemoDgnSymbol1"));
::oddbDgnLSIncrementUID(dgnLS_UID);
pSymComponent->setComponentUID(dgnLS_UID);
// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createSegmentBlock()));
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForSegment"), pSymComponent);
// Create Point Component
OdDbLSPointComponentPtr pPtComponent = OdDbLSPointComponent::createObject();
pPtComponent->setComponentType(kLSPointComponent);
::oddbDgnLSIncrementUID(dgnLS_UID);
pPtComponent->setComponentUID(dgnLS_UID);
// Set up stroke component for point component
pPtComponent->setStrokeComponent(pLsComponent->objectId());
// Set symbol for stroke component gaps
OdDbLSSymbolReference lsRef;
lsRef.setSymbolComponent(pSymComponent->objectId());
lsRef.setJustify(OdDbLSSymbolReference::kLSJustifyCenter);
pPtComponent->insertSymbolForStroke(&lsRef, 1);
// Create symbol component for second block
pSymComponent = OdDbLSSymbolComponent::createObject();
pSymComponent->setComponentType(kLSSymbolComponent);
pSymComponent->setDescription(OD_T("DemoDgnSymbol2"));
::oddbDgnLSIncrementUID(dgnLS_UID);
pSymComponent->setComponentUID(dgnLS_UID);
// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createArrowBlock()));
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForLineEnd"), pSymComponent);
// Set symbol for line end
lsRef.setSymbolComponent(pSymComponent->objectId());
lsRef.setJustify(OdDbLSSymbolReference::kLSNoJustify);
pPtComponent->insertSymbolForVertex(&lsRef, OdDbLSSymbolReference::kLSAtEnd);
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnPointComponent"), pPtComponent);
// Create LineStyle Definition
OdDbLSDefinitionPtr pLSDef = OdDbLSDefinition::createObject();
pLSDef->setComponent(pPtComponent->objectId());
pLSDef->setComponentUID(pPtComponent->componentUID());
// Create Linetype Table Record
OdDbLinetypeTableRecordPtr pLtpRec = OdDbLinetypeTableRecord::createObject();
pLtpRec->setName(OD_T("DemoDgnLineStylePoint"));
pLtpRec->setComments(OD_T("Point 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);
}