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

}

}

}

}

}

相关推荐
csdn_aspnet2 天前
c++ 给定欧氏平面中的一组线可以形成的三角形的数量
c++·算法·平面
csdn_aspnet2 天前
C# 给定欧氏平面中的一组线可以形成的三角形的数量
算法·平面·c#
不二青衣9 天前
利用平面进行位姿约束优化
算法·平面
昵称难产中9 天前
浅谈计算机网络02 | SDN控制平面
网络协议·计算机网络·平面·云计算·信息与通信
不二青衣9 天前
使用gtsam添加OrientedPlane3Factor平面约束因子
人工智能·算法·平面
昵称难产中9 天前
浅谈计算机网络01 | SDN数据平面
网络·计算机网络·平面
红黑色的圣西罗17 天前
Unity 中计算射线和平面相交距离的原理
平面·unity·游戏引擎
Pipi_Xia_22 天前
相切于球体上定点的平面
线性代数·算法·平面·几何学
Pipi_Xia_22 天前
过圆外一点与圆相切的直线
线性代数·算法·平面·几何学
晨航1 个月前
5个实用的设计相关的AI网站
人工智能·平面·交互