[ブログに戻る](/ja/blog) # Teigha BIM: 塗りつぶしパターン入門 \[パート1\]

Daniil Zhirnov 7月 04, 2017 [\#rvt](/ja/blog/tag/rvt) [\#rfa](/ja/blog/tag/rfa) [\#Example](/ja/blog/tag/example)

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

OdBmFillPatternElemは、OdBmFace-&gt;OdBmGFilling-&gt;PatternIdを介して面にバインドされます。したがって、BrepRendererで面を走査する際、各面についてIBrFace-&gt;getFillPatternId()を介してOdBmFillPatternElem IDを取得します。以下のコードを参照してください。

```
OdUInt64 id;
if (face.getFillPatternId(id))
{
  if (pWd)
  {
    OdDbStub* pStub = pWd->context()->getStubByID(id);
    if (pStub)
    {
      OdGiDrawablePtr pDrawable = pWd->context()->openDrawable(pStub);
      if (!pDrawable.isNull())
      {
        pDrawable->setAtribute(&pWd->subEntityTraits());
      }
    }
  }
}

```

BIM固有のクラスは使用できないため、このIDはGiContextを介して描画可能オブジェクトとして開かれ、setAttributes()を介してエンティティ特性が提供されます。これにより、正しいOdGiFill特性属性を提供する責任を負うOdBmFillPatternElem::subSetAttributes(OdGiDrawableTraits\* pDrwTraits)呼び出しが発生します。これは概略的に次のように示されます。

```
if (m_pFill.isNull())
{
  m_pFill = OdGiHatchPattern::createObject();
  const OdBmFillPattern* pFillPattern = getFillPattern().get();
  if (pFillPattern)
  {
    // Do OdBmFillPattern to OdGiHatchPattern cobversion
  }
}

OdGiSubEntityTraits* pSub = static_cast< OdGiSubEntityTraits* >(pDrwTraits);
pSub->setFill(m_pFill);
if (m_pFill->patternLines().size() == 0)
{
  // Set solid fill attributes
}
```

OdGiHatchPatternPtr m\_pFillはメンバーとして実装されているため、後続の呼び出しでOdBmFillPatternからOdGiHatchPatternへの変換が再度必要になることはありません。新しい形式で保存できる単純なパターンを除けば、変換は非常に簡単です。

```
double dx, d0 = (*i)->getDeltasItem(0);
double dy, d1 = (*i)->getDeltasItem(1);
if(OdZero(d0))
{
  double sina = fabs(sin(pl->m_dLineAngle));
  double cosa = fabs(cos(pl->m_dLineAngle));

  if (sina > cosa)
  {
    dx = d1 / sina;
    dy = 0.0;
  }
  else
  {
    dx = 0.0;
    dy = d1 / cosa;
  }
}
else
{
  dx = d0;
  dy = d1;
}
``` 

DeltasItem\[0\]がゼロの場合、与えられたaとd = DeltasItem\[1\]からx、yを計算する必要があります。

![image1](/files/inline-images/image004_0.png)最後に、ハッチ構造を一般的に記述する塗りつぶし属性として設定されたOdGiHatchPatternを持つエンティティ特性があります。これはFillPatternの正しいレンダリングには十分ではありません。面固有のハッチ開始点とハッチ方向を提供するOdBmFillPatternPlacerデータも提供する必要があります。したがって、同じOdBmFillPatternElemを参照する多くの面が異なる方法で描画される可能性があります。OdGiFaceDataは、OdBmFillPatternPlacer属性をGiサブシステムに渡すために使用されます。IBrFaceは、BrepRenderer内でこの属性アクセスをサポートするように拡張されています。

```
OdGiFaceData FaceData;
OdGePoint2dArray fillOriginArr;
OdGeVector2dArray fillDirectionArr;
{
  OdGePoint2d faceFillOrigin;
  OdGeVector2d faceFillDirection;
  if (face.getFillingAttributes(faceFillOrigin, faceFillDirection))
  {
    fillOriginArr.resize(FAceList.size(), faceFillOrigin);
    FaceData.setFillOrigins(FillOriginArr.getPtr());

    fillDirectionArr.resize(FaceList.size(), faceFillDirection);
    FaceData.setFillDirections(fillDirectionArr.getPtr());
  }
}
```

Teigha BIMは、面の平面上にある塗りつぶしパターンに2D座標系を使用します。したがって、すべての面は独自の座標系を持ち、塗りつぶし原点の3D座標を計算する際にはこれを考慮に入れる必要があります。この座標系は、対応するOdBmPlaneのXVector、YVector、およびOriginとして保存されるため、変換を簡単にするのに役立ちます。

```
OdBmFillPatternPlacerPtr pPlacer = pFilling->getPlacer();
if (!pPlacer.isNull())
{
  OdGePoint2d baseOrigin = pFilling->getPlacer();
  OdBmPlanePtr pPlane = OdBmPlane::cast(((OdBmFace*)m_pImp)->getSurface());
  if (!pPlane.isNull())
  {
    origin = (pPlane->getOrigin() + baseOrigin.x * pPlane->getXVector() + baseOrigin.y * pPlane->getYVector()).convert2d();
  }
}
```

最後に、必要なすべてのデータが計算および設定され、FillPatternをレンダリングできるようになります。

## 今すぐ始める

**ODAソフトウェアを60日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
