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

news/2024/11/14 6:03:31/

问题:针对导入的部分面无法获取大小,同时也无法判断点是否在面上。但是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.ppmy.cn/news/1545872.html

相关文章

开发指南077-平台上各种时间、包大小设置

1、axios访问后台接口超时 /utils/qlm_request.js文件中&#xff1a; const service axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url base url request url // withCredentials: true, // send cookies when cross-domain requests timeout: 600000 // re…

CentOS 9 Stream 上安装 PostgreSQL 16

CentOS 9 Stream 上安装 PostgreSQL 16 CentOS 9 Stream 上安装 PostgreSQL 16设置密码并且远程连接 CentOS 9 Stream 上安装 PostgreSQL 16 在 CentOS 9 Stream 上安装 PostgreSQL 16 可以通过以下步骤完成&#xff1a; 添加 PostgreSQL 官方仓库&#xff1a; PostgreSQL 提…

ORACLE 删除archivelog日志

监控信息 df -h 查看磁盘空间 /oracle 500G 已用 450G&#xff0c;剩余 50G 具体分析 /oracle/oraarch 421G 占绝对大头&#xff0c;看文件信息 &#xff0c;从2023年以来一直没有做过日志删除 参考ORACLE 正确删除归档日志的方法_oracle 清理归档日志-CSDN博客 0. 切换…

如何使用 Python 语言的正则表达式进行网页数据的爬取?

以下是使用 Python 语言的正则表达式进行网页数据爬取的一般步骤&#xff1a; 一、安装必要的库&#xff1a; requests&#xff1a;用于发送 HTTP 请求获取网页内容。可以使用 pip install requests 命令进行安装。re&#xff1a;Python 的内置正则表达式库&#xff0c;用于对…

人工智能基础-opencv-图像处理篇

一.图像预处理 图像翻转 cv2.flip 是 OpenCV 库中的一个函数&#xff0c;用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。这个函数接受两个参数&#xff1a;要翻转的图像和一个指定翻转类型的标志。 img cv2.imread(../images/car2.png) #翻转 0&#xf…

GO语言的SOLID解析(超详细)

SOLID原则&#xff1a;面向对象设计的基石 在面向对象编程的世界里&#xff0c;SOLID原则被广泛认为是设计高质量类结构的黄金法则。这些原则不仅为开发者提供了一套明确的设计指南&#xff0c;还帮助他们遵循最佳实践&#xff0c;从而构建出更加健壮、灵活和易于维护的软件系…

Oracle-日期转换

1、获取年 select to_char(sysdate,‘yyyy’) from dual–2016 2、获取月 select to_char(sysdate,‘mm’) from dual–10 3、获取日 select to_char(sysdate,‘dd’) from dual–10 4、获取时 select to_char(sysdate,‘HH’) from dual–03 select to_char(sysdate,‘…

vite中env uat/dev文件项目配置

1&#xff1a;图示 在vscode中显示的是&#xff08;在文件中显示不是文件夹而在vscode中显示是文件夹-- .env 而这个.env也是有内容的&#xff09; 2&#xff1a;.env文件内容 # 标题 VITE_APP_TITLE管理系统# 项目本地运行端口号 VITE_PORT80# open 运行 npm run dev 时自动打…