[返回博客](/cn/blog) # 在 .dwg 文件中使用 .dgn 线型（第 3 部分，共 4 部分）

Andrew Markovich 一月 31, 2019 [\#Example](/cn/blog/tag/example) [\#.dwg](/cn/blog/tag/dwg)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

本文是关于在 .dwg 文件中使用 DGN 线型系列文章的一部分。有关上一篇文章，请参阅[第 2 部分](https://www.opendesign.com/blog/2019/january/using-dgn-line-styles-dwg-file-part-2-4)。

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](/files/inline-images/lss11.jpg)请注意，我们在块内部的几何图形使用了 \[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](/files/inline-images/lss12.jpg)对于之前生成的块，我们对块内容使用了 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 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
