当前位置: 首页 > article >正文

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

    }

}


http://www.kler.cn/a/385619.html

相关文章:

  • 【系统架构设计师】真题论文: 论软件可靠性设计与应用(包括解题思路和素材)
  • 大数据学习12之HBase
  • 【ARM】MDK-烧录配置文件无权限访问
  • 区块链技术在知识产权保护中的应用
  • ESLint 使用教程(四):ESLint 有哪些执行时机?
  • 二叉搜索树的应用(了解补充)
  • AI-Prompt、RAG、微调还是重新训练?选择正确的生成式AI的使用方法
  • Jmeter的安装和使用
  • qt QFileDialog详解
  • 负载均衡式在线oj项目开发文档(个人项目)
  • 缓存、注解、分页
  • Rust编程与项目实战-结构体
  • react组件02
  • 06 网络编程基础
  • TypeScript 变量声明
  • 练习题 - DRF 3.x Overviewses 框架概述
  • 速度快还看巡飞,筒射巡飞无人机技术详解
  • 【大数据学习 | kafka高级部分】kafka的数据同步和数据均衡
  • element-plus的Tree 树形控件添加图标
  • NAT网络工作原理和NAT类型
  • Maven(27)如何使用Maven进行依赖管理?
  • 【Axure高保真原型】PDF阅读器
  • Redis - 集群(Cluster)
  • RK3288 android7.1 适配 ilitek i2c接口TP
  • FET113i-S核心板已支持RISC-V,打造国产化降本的更优解 -飞凌嵌入式
  • Go-HTTP框架设计实现概述