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();

}

}

}

}

}

相关推荐
ueotek9 天前
Ansys Speos丨平面 OLED 人眼视觉仿真分析
平面
mqiqe9 天前
LLM Gateway:企业级大模型应用的“统一控制平面”
平面·flask·gateway
weixin_4462608510 天前
AtumAI:面向数据中心控制平面策略的规范化智能体生成框架
人工智能·平面
落苜蓿蓝14 天前
多张覆盖视场的平面棋盘图片; 、对每张图片用 OpenCV 的 findChessboardCorners 检测内角点并用 corn ...
数码相机·opencv·平面
梵构广告14 天前
平台怎么做品牌营销策划?—品牌营销
大数据·人工智能·平面·品牌策划
梵构广告15 天前
百货品牌营销策划书怎么写?
平面·产品运营·品牌策划
鲸大鱼的自我修养15 天前
LC谐振状态轨迹图,相平面分析
平面
不吃辣4901 个月前
从0-1学习导航页面布局优化和搭建
ui·平面·前端框架
海清河宴1 个月前
平面直线和曲线以及空间曲线计算方法
平面
Σίσυφος19001 个月前
激光三角 光平面标定之后计算深度图
算法·平面