B-Rep Builder を使用した ACIS Nurbs サーフェスの作成

Teigha を使用すると、B-Rep Builder インターフェースを使用して ACIS nurbs サーフェスを作成できます。現在、Teigha には 2 つの B-Rep Builder 実装があります。1 つは Teigha Kernel の AcisBrepBuilder、もう 1 つは Teigha BIM の BmBrepBuilder です。

現在、AcisBrepBuilder の機能は限定的ですが(作成できるのは 1 つの面のみで、エッジ/コエッジジオメトリはそれぞれ OdGeNurbCurve3d/OdGeNurbCurve2d でのみ設定されます)、例えば 3D モデルをある形式から別の形式に変換するなど、機能を拡張できます。例えば、ソースファイルをロードし、Br クラスを使用してエンティティを取得および作成する場合、AcisBrepBuilder と Br エンティティを入力として渡すことができます。OdRxObjectPtr OdBrepBuilder :: finish () を呼び出した後、新しい ACIS エンティティが取得されます。

これはどのように機能しますか?

ACIS カーネルを使用しているとします。まず、AcisBrepBuilder を作成する必要があります。一般的に、コンストラクタを使用すると、AcisBrepBuilder の作成は次のようになります。

OdBrepBuilder brepBuilder;
new AcisBrepBuilder(brepType);

ここで brepType は作成されるエンティティのタイプです。現在、BmBrepBuilder でのみ使用されており、次の値を取ることができます。

  • kOpenShell — 出力ジオメトリがオープンシェルである場合。
  • kSolid — 出力ジオメトリがソリッドである場合。
  • kVoid — 出力ジオメトリがボイド(つまり、反転したソリッド)である場合。

次に、このメソッドを使用して入力データをテストするために使用される許容値を設定します。

void setValidatorParameters(BrepValidator* vparams)

ここで BrepValidator* vparams は、必要な許容値を含むオブジェクトへのポインタです。各 BrepBuilder について、必要なすべての許容値を含む独自のクラスを指定できます。

使いやすさのため、BrepBuilder の初期化はサービスに移動され、AcisBrepBuilder を初期化するには、このメソッドを呼び出すだけで済みます。

OdResult OdModelerGeometryCreatorABImpl::initBrepBuilder(OdBrepBuilder& brepBuilder, BrepType, OdGeTol& resTol, OdGeTol& distancetol)

これで、ACIS モデルの作成に直接進むことができます。

OdBrepBuilderインターフェースには多くのメソッドが含まれており、ACISモデルを作成するには、少なくとも面を定義する必要があります。面はサーフェスであり、その上にトリミングループがあります。面を設定するには、次のメソッドを使用します。

BRepBuilderGeometryId addFace(OdGeSurface* pSurf, EntityDirection faceDirection)

最初のパラメータはサーフェスへのポインタです。2番目のパラメータは、面がサーフェスに対してどのように向き付けられるか(同方向か否か)です。したがって、AcisBrepBuilderサーフェスの場合、OdGeNurbSurfaceが必要です。出力として、後でトリミングループを作成するために使用される面IDが得られます。これは次のメソッドを使用して作成されます。

BRepBuilderGeometryId OdBrepBuilder::addLoop(BRepBuilderGeometryId& faceId) 

ここで、入力パラメータは面識別子であるため、トリミングループはこの特定の面に作成されます。一般に、1つの面には複数のループを持つことができます。たとえば、面に穴を開ける必要がある場合、いくつかのループを作成できます。

次に、ループのジオメトリを指定します。この目的のために、これらのメソッドが使用されます。

BRepBuilderGeometryId OdBrepBuilder::addEdge(OdGeCurve3d* pCurveForEdge)
BRepBuilderGeometryId OdBrepBuilder::addCoedge(BRepBuilderGeometryId& loopId, BRepBuilderGeometryId& edgeId, EntityDirection codgeDirection = kForward, OdGeCurve2d* pParCur = NULL)

最初のメソッドは指定されたジオメトリでエッジを作成し、2番目のメソッドはコエッジを作成します。まず、エッジを作成します。これを行うには、エッジのジオメトリを3Dカーブへのポインタとして設定します。AcisBrepBuilderでは、ジオメトリエッジはOdGeNubrCurve3dを使用して指定されます。出力として、コエッジを作成するために必要なエッジIDを取得します。OdBrepBuilder::addCoedgeメソッドを呼び出し、ループID、エッジID、エッジに対する方向、および実数直線の区間を2D実数ベクトル空間(パラメータ空間)にマッピングするパラメトリックカーブを渡します。次の条件を満たす必要があります。パラメトリックカーブの区間は、エッジの3Dカーブの区間と同じでなければなりません。このようにして、面を作成するために必要な最小限のものを設定します。次に、OdRxObjectPtr OdBrepBuilder::finish () を呼び出してエンティティを取得します。

OdWriteExの例を使用して、AcisBrepBuilderでNURBSサーフェスを作成することを検討します。主な部分は次のとおりです。

1. 初期化。

/********************************************************************/
/* BrepBuilder initialization                                       */
/********************************************************************/
OdDbHostAppServices *pService = pDb->appServices();
BrepType bbType = kOpenShell;
OdBrepBuilder brep;
pService->brepBuilder(brep, bbType);

2. エッジ/コエッジのジオメトリを作成します。以下のコードはすべて含まれていませんが、カーブは手動で作成することも、Brクラスの助けを借りて取得することもできます。

OdGeNurbSurface nurbSurf;
OdArray<OdArray< OdGeNurbCurve3d*> > arrLoops;    //Array of loops
OdArray<OdArray< OdGeNurbCurve2d*> > arrLoopsPar; //Their parametric curves
OdDbNurbSurfacePtr pSurface = OdDbNurbSurface::createObject();//Resulting acis nurb surface
OdArray< OdGeNurbCurve3d*> currentLoop;    //The edge array of current loop 
OdArray< OdGeNurbCurve2d*> currentParLoop; //The coedges geometry of current loop 

3. ACISモデルのトポロジを作成します。面とその上にトリミングループを作成します。トリミングループはコエッジから作成されます。その後、brep.finish () を呼び出します。

/********************************************************************/
/* Create NURBS Surface by BrepBuilder                              */
/********************************************************************/
try
{ 
  BRepBuilderGeometryId faceId = brep.addFace(&nurbSurf, OdBrepBuilder::kForward);
  ODA_ASSERT(arrLoops.size() == arrLoopsPar.size());
  for (unsigned int i = 0; i < arrLoops.size(); i++)
  {
    OdArray< OdGeNurbCurve3d*> currentLoop = arrLoops[i];
    OdArray< OdGeNurbCurve2d*> currentParLoop = arrLoopsPar[i];
    ODA_ASSERT(currentLoop.size() == currentParLoop.size());
    BRepBuilderGeometryId LoopId = brep.addLoop(faceId);
    for (unsigned int j = 0; j < currentLoop.length(); j++)
    {
      BRepBuilderGeometryId edgeId = brep.addEdge(currentLoop[j]);
      brep.addCoedge(LoopId, edgeId, OdBrepBuilder::kForward, currentParLoop[j]);
    }
  }
  OdRxObjectPtr pModelGeometry;
  pModelGeometry = brep.finish();
  pSurface->setBody(pModelGeometry);
}
catch (const OdError& e)
{
  odPrintConsoleString(L"\n\nException occurred: %ls\n", e.description().c_str());
}

完全な例は、TeighaをインストールしたExamplesフォルダにあるOdWriteExサンプルで見つけることができます。

今すぐ始める

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

無料で試す