本文是关于在 .dwg 文件中使用 DGN 线型系列文章的一部分。有关上一篇文章,请参阅第 2 部分。
Autodesk® AutoCAD® 线型是 .dwg 数据库的默认线型,在线型内容方面存在限制。除了虚线和点,它们仅支持将文本和 SHX 形状嵌入到线型图案中。DGN 线型提供了将包含任何内容的整个块嵌入到线型图案中的能力,并提供了许多额外的自定义选项。在本文中,我们将探讨如何将符号(块)插入到嵌入 .dwg 数据库中的 DGN 线型中。
创建符号组件
符号组件表示 DGN 线型中的块参照,并提供参数来设置几何数据行为。
要开始使用符号组件,请包含带有 OdDbLSSymbolComponent 类声明的头文件:
#include "DgnLS/DbLSSymbolComponent.h"
创建符号组件与创建其他 DGN 线型组件非常相似:
// Create symbol component for first block
OdDbLSSymbolComponentPtr pSymComponent = OdDbLSSymbolComponent::createObject();
pSymComponent->setComponentType(kLSSymbolComponent);
pSymComponent->setDescription(OD_T("DemoDgnSymbol1"));
pSymComponent->setComponentUID(dgnLS_UID);
现在我们需要一个 .dwg 块来将其与创建的符号组件连接。例如,让我们使用以下函数生成一个新块并将其附加到 .dwg 数据库:
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 OdDbObjectId appendBlock(OdDbDatabase *pDb, OdDbBlockTableRecordPtr btrPtr)
{
return OdDbBlockTable::cast(pDb->getBlockTableId().openObject(OdDb::kForWrite))->add(btrPtr);
}
执行此代码后,数据库中会有一个名为“4helix”的新块,该块内部包含四个螺旋实体:
请注意,我们在块内部的几何图形使用了 [1.0 / 1000.0] 的比例。这是必需的,因为 AutoCAD 会忽略符号组件中设置的符号比例,因此它期望块内容使用 1/1000 的因子进行预缩放。
现在我们可以将创建的块附加到我们的符号组件,并将此组件注册到 DGN 线型字典中:
// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createSegmentBlock()));
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForSegment"), pSymComponent);
同样,在此示例中,我们创建了第二个符号组件,用于突出显示线曲线的末端:
// Create symbol component for second block
pSymComponent = OdDbLSSymbolComponent::createObject();
pSymComponent->setComponentType(kLSSymbolComponent);
pSymComponent->setDescription(OD_T("DemoDgnSymbol2"));
::oddbDgnLSIncrementUID(dgnLS_UID);
pSymComponent->setComponentUID(dgnLS_UID);
此代码与之前的符号组件创建几乎相同,但它包含对 oddbDgnLSIncrementUID 函数的额外调用。由于所有组件都最好包含不同的 UID,我们可以使用 oddbDgnLSIncrementUID 函数调用修改先前生成的 UID。这比生成一个全新的 UID 简单得多。此辅助函数在“DgnLS/DbLSMisc.h”头文件中声明。
我们用于在块内部创建箭头状几何图形的函数如下:
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;
}
它生成多段线几何图形:
对于之前生成的块,我们对块内容使用了 1/1000 的比例。
最后,将创建的块附加到符号组件,并将符号组件附加到 DGN 线型字典:
// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createArrowBlock()));
// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForLineEnd"), pSymComponent);
本系列的下一篇文章将介绍如何使用点线型组件。