使用 Teigha,您可以使用 B-Rep Builder 接口创建 ACIS NURBS 曲面。目前 Teigha 有两种 B-Rep Builder 实现:一种在 Teigha Kernel 中名为 AcisBrepBuilder,另一种在 Teigha BIM 中名为 BmBrepBuilder。
尽管目前 AcisBrepBuilder 的功能有限(您只能创建一个面,并且边/共边几何体分别仅通过 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)
第一个参数是指向曲面的指针;第二个参数是面相对于曲面的方向(同向或不同向)。因此,对于 AcisBrepBuilder 曲面,应该有一个 OdGeNurbSurface。作为输出,您将获得面 ID,该 ID 将用于稍后创建修剪环。它使用此方法创建:
BRepBuilderGeometryId OdBrepBuilder::addLoop(BRepBuilderGeometryId& faceId)
在这里,输入参数是面标识符,因此修剪环将位于此特定面上。通常,一个面可以有多个环,例如,如果您需要在面上打一个孔,则可以创建多个环。
接下来指定环的几何形状。为此,使用以下方法:
BRepBuilderGeometryId OdBrepBuilder::addEdge(OdGeCurve3d* pCurveForEdge)
BRepBuilderGeometryId OdBrepBuilder::addCoedge(BRepBuilderGeometryId& loopId, BRepBuilderGeometryId& edgeId, EntityDirection codgeDirection = kForward, OdGeCurve2d* pParCur = NULL)
第一个方法创建具有给定几何形状的边,第二个方法创建共边。首先,创建一条边。为此,将边的几何形状设置为指向 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 示例中找到。