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サンプルで見つけることができます。