Teigha BIM: 塗りつぶしパターン入門 [パート1]

OdBmFillPatternElemは、OdBmFace->OdBmGFilling->PatternIdを介して面にバインドされます。したがって、BrepRendererで面を走査する際、各面についてIBrFace->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

最後に、ハッチ構造を一般的に記述する塗りつぶし属性として設定された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日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す