栅格参考元素 (OdDgReferenceAttachmentHeader) 实际上是一个非图形元素,没有图形元素属性,例如图层属性等。它不能像其他元素一样被选中。实际上,它存在显示和选择问题。
从 Bentley® MicroStation® V8 XM 格式开始,添加了一种新的元素类型:栅格帧元素 (OdDgRasterFrame)。它没有实际的图形数据,因此无法渲染。它与栅格参考元素配对,并且始终与它一起使用(从不作为单独的元素使用)。它为特定的栅格参考元素提供了图形元素属性,而这正是解决 OdDgReferenceAttachmentHeader 显示和选择问题的元素。
OdDgReferenceAttachmentHeader 元素是类型 90,没有显示头,并与控制元素一起存储。OdDgRasterFrame 元素是类型 94,带有显示头,并与图形元素一起存储。
只有一个 OdDgRasterFrame 元素对应于 OdDgReferenceAttachmentHeader 元素。因此,一个 OdDgReferenceAttachmentHeader(类型 90)对应一个 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.