[ブログに戻る](/ja/blog) # B-Rep Builder を使用した ACIS Nurbs サーフェスの作成

Oleksandr Bryzghalin 12月 05, 2017 [\#rvt](/ja/blog/tag/rvt) [\#rfa](/ja/blog/tag/rfa) [\#getting started](/ja/blog/tag/getting-started) [\#Example](/ja/blog/tag/example)

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

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日間無料でお試しください。  
リスクなし、クレジットカード不要。**

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