OCC 拟合的平面转换为有界平面

问题:针对导入的部分面无法获取大小,同时也无法判断点是否在面上。但是OBB可以获取大小

解决方法:通过面拟合转换gp_Pln,然后获取面的内外边,重新修剪生成新的TopoDS_Face

疑问:本人对OCC中各种面的特性不是很了解有知道的老大可以帮忙普及一下:

TopoDS_Face

BRepAdaptor_Surface

GeomAbs_Plane

Geom_Plane

GeomPlate_Surface

gp_Pln

以下是实现的参数部分代码,通过UV提取点,判断点是否在面上。

//如果获取的包容盒小于步距,获取一下OBB包容盒判断是否大于2,大于2开始面转换

if (aUmax - aUmin < uStep || aVmax - aVmin < vStep)

{

Bnd_OBB obb;

BRepBndLib::AddOBB(aFace, obb, Standard_True, Standard_False);

if (2 * obb.XHSize() > 2 || 2 * obb.YHSize() > 2 || 2 * obb.ZHSize() > 2)

{

//判断面的类型 转换面类型 获取面的边界 修建获取新的有界面 针对平面

if (aSurface.GetType() == GeomAbs_SurfaceOfRevolution || aSurface.GetType() == GeomAbs_BSplineSurface)//回旋曲面//样条曲面

{

TopLoc_Location theTopLoc_Location = aFace.Location();

Handle(Geom_Surface) geomSurface = aSurface.Surface().Surface();

Handle(Geom_BSplineSurface) bsplineSurface = GeomConvert::SurfaceToBSplineSurface(geomSurface);

GeomConvert_SurfToAnaSurf converter(bsplineSurface);

converter.SetConvType(GeomConvert_Simplest);

converter.SetTarget(GeomAbs_Plane);

geomSurface = converter.ConvertToAnalytical(1);

gp_Pln thegp_Pln;

if (converter.IsCanonical(geomSurface))

{

Standard_CString aRotatedEntityTypeName = geomSurface->DynamicType()->Name();

if (geomSurface->IsKind(STANDARD_TYPE(Geom_Plane)))

{

Handle(Geom_Plane) theGeom_Plane = Handle(Geom_Plane)::DownCast(geomSurface);

theGeom_Plane->Transform(theTopLoc_Location);

if (theGeom_Plane.IsNull())

{

return 0;

}

thegp_Pln = theGeom_Plane->Pln();

TopoDS_Wire outerWire = ShapeAnalysis::OuterWire(aFace);

std::vector<TopoDS_Wire> innerHoles;

// 遍历面上的每个边界线 (TopoDS_Wire)

for (TopExp_Explorer wireExp(aFace, TopAbs_WIRE); wireExp.More(); wireExp.Next()) {

TopoDS_Wire wire = TopoDS::Wire(wireExp.Current());

if (!wire.IsSame(outerWire))

{

innerHoles.push_back(wire); // 内孔

}

}

BRepBuilderAPI_MakeFace faceBuilder(thegp_Pln, outerWire);

// 添加内孔

for (const auto& holeWire : innerHoles) {

faceBuilder.Add(holeWire);

}

// 生成新的有限平面

aFace = faceBuilder.Face();

aSurface = BRepAdaptor_Surface(aFace);

aUmin = aSurface.FirstUParameter();

aUmax = aSurface.LastUParameter();

aVmin = aSurface.FirstVParameter();

aVmax = aSurface.LastVParameter();

}

}

}

}

}

相关推荐
青瓷看世界2 小时前
华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力4-检测环境中的平面
平面·ar·harmonyos·虚拟现实
curemoon1 天前
推导将点映射到平面坐标系的计算公式
平面
优雅永不过时·2 天前
使用three.js 实现 自定义绘制平面的效果
前端·javascript·平面·github·threejs·着色器
吃个糖糖6 天前
Halcon 3D平面相切案例
数码相机·平面·3d
STRANGEX-037 天前
深度学习案例:带有一个隐藏层的平面数据分类
深度学习·平面·分类
邹莉斯12 天前
3DS MAX三维建模平面基础与修改工具(图形编辑与二维建模修改工具)
平面·3d·1024程序员节
xwz小王子17 天前
Nature Communications 英国伦敦大学等提出仿生自适应多平面触觉系统,实现机械与振动双重感知结合
平面·触觉系统
MATLAB滤波20 天前
蓝牙定位的MATLAB程序※平面上的定位,可自适应蓝牙基站的数量(附下载链接)
开发语言·matlab·平面
西猫雷婶21 天前
python画图|在三维空间的不同平面上分别绘制不同类型二维图
平面