在 .dwg 文件中使用 .dgn 线型(第 3 部分,共 4 部分)

本文是关于在 .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”的新块,该块内部包含四个螺旋实体:

 

image1

 

请注意,我们在块内部的几何图形使用了 [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;
}

它生成多段线几何图形:

 

image2

 

对于之前生成的块,我们对块内容使用了 1/1000 的比例。

最后,将创建的块附加到符号组件,并将符号组件附加到 DGN 线型字典:

// Attach block to symbol component
pSymComponent->setBlockTableRecord(::appendBlock(pDb, ::createArrowBlock()));

// Add component into LineStyles dictionary
pDict->setAt(OD_T("DemoDgnSymbolForLineEnd"), pSymComponent);

本系列的下一篇文章将介绍如何使用点线型组件。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用