ラスター参照要素 (OdDgReferenceAttachmentHeader) は、実際にはレベルプロパティなどのグラフィック要素プロパティを持たない非グラフィック要素です。他の要素のように選択することはできません。実際、これには表示および選択の問題があります。
Bentley® MicroStation® V8 XM形式以降、新しい要素タイプであるラスターフレーム要素 (OdDgRasterFrame) が追加されました。これには実際のグラフィックデータがないため、レンダリングできません。これはラスター参照要素と対になっており、常にそれと組み合わせて使用されます(単独の要素として使用されることはありません)。特定のラスター参照要素にグラフィック要素プロパティを提供し、これこそがOdDgReferenceAttachmentHeaderの表示および選択の問題を解決する要素です。
OdDgReferenceAttachmentHeader要素は、表示ヘッダーを持たないタイプ90であり、制御要素とともに保存されます。OdDgRasterFrame要素は、表示ヘッダーを持つタイプ94であり、グラフィック要素とともに保存されます。
1つのOdDgReferenceAttachmentHeader要素には、1つのOdDgRasterFrame要素のみが対応します。したがって、1つのOdDgReferenceAttachmentHeader (タイプ90) に対して1つのOdDgRasterFrame (タイプ94) が存在します。ラスターアタッチメントを記述するために必要なすべてのデータを含むのは、OdDgRasterFrame要素です。
OdDgReferenceAttachmentHeader要素が変更されると、Teighaは適切なOdDgRasterFrameを更新および同期します。
注: 対応するOdDgRasterFrame要素なしでOdDgReferenceAttachmentHeader要素を作成することも可能であり、出力ファイルは有効です。ただし、この場合、アプリケーションはラスターの「表示および選択の問題」を解決する必要があります(たとえば、MicroStationがそのような場合に実行するように、対応するOdDgRasterFrame要素を作成するなど)。
OdDgReferenceAttachmentHeader要素の作成
ラスター参照要素を含む.dgnファイルを作成します(ファイルデータベースと環境は既に存在します)。
- OdDgRasterAttachmentHeaderオブジェクトを作成します。
- ラスター参照をデータベースに追加します。
- 基本プロパティ(ファイル名、範囲、向きなど)を入力します。
- OdDgRasterFrameオブジェクトを作成します。
- フレーム要素をデータベースに追加します。
- ラスター参照の参照IDを設定します。
- 基本フレームプロパティ(ラスターカラーモードなど)を入力します。
// Add Raster Reference element
//
// EntityBoxes m_EntityBoxes; //some table with number of rows and columns
// int boxRow;
// int boxColumn;
// OdDgModelPtr pModel3d;
{
// creates Raster Reference element
OdDgRasterAttachmentHeaderPtr raster = OdDgRasterAttachmentHeader::createObject();
double sx = m_EntityBoxes.getHeight() / 2.; //some Height value
double rotation = .1;
double affinity = .03; // some angles for demonstration
m_pModel3d->addElement(raster); // add Raster Reference element to database
raster->setFilename(OdString( "attachUnkown.jpg"));
//some non-existent file name is set just for sample
raster->setExtent(OdGePoint2d(1., 1.));
raster->setOrientation(m_EntityBoxes.getBoxCenter(boxRow, boxColumn) -
OdGeVector3d(sx / 3., 0., 0.),
OdGeVector3d(cos(rotation), sin(rotation), 0. ) * .01,
OdGeVector3d(-sin(rotation + affinity), cos(rotation + affinity), 0. ) * .01);
raster->setApplyRotationFlag(true);
// creates Raster Frame element
OdDgRasterFramePtr pRasterFrame = OdDgRasterFrame::createObject();
m_pModel3d->addElement(pRasterFrame);// add Raster Frame element to database
pRasterFrame->setRasterReferenceId(raster->id());
// binds Raster Reference element with the specific Raster Reference element
// sets graphic element properties…
pRasterFrame->setColorIndex(5);
pRasterFrame->setLineStyleEntryId(2);
pRasterFrame->setLineWeight(2);
pRasterFrame->setPrintableFlag(true);
pRasterFrame->setTintColorIndex(1536);
pRasterFrame->setForegroundColorIndex(1536);
pRasterFrame->setBackgroundColorIndex(2032);
pRasterFrame->setHighlightColorIndex(0);
// sets a valid file name. Raster Reference element data will be synchronized
pRasterFrame->setFileName(OdString("attach.jpg"));
OdString sFileNameRasteReferense = raster->getFilename();
OdString sFileNameRasterFrame = pRasterFrame->getFileName();
// you can compare sFileNameRasteReferense and sFileNameRasterFrame.
// They are obliged to be equal.