Open CASCADE学习|为什么由Edge生成Wire不成功?

news2024/12/23 6:02:20

Wire 是一种复合形状,不是由几何形状构建的,而是由边缘的装配构建的。BRepBuilderAPI_MakeWire类可以从一个或多个Edge构建Wire,或将新Edge连接到现有Wire。

 BRepBuilderAPI_MakeWire 类将Edge连接到Wire。添加新Edge时,如果其顶点之一与Wire共享,则认为它已连接到Wire。如果没有共享顶点,则算法会搜索边的一个顶点和Wire的一个顶点,这两个顶点位于同一位置(使用顶点的公差来测试它们是否具有相同的位置)。如果找到这样的一对顶点,则将Edge与Wire的顶点一起复制,以替换原始顶点。Edge的所有顶点都可以与Wire的顶点交换。如果找不到连接,则认为Wire已断开连接。这是一个错误。

BRepBuilderAPI_MakeWire 类可以返回添加到Wire上的最后一条边(Edge 方法)。如果复制了这条Edge,则它可能与原始Edge不同。

#include <Geom_CylindricalSurface.hxx>
#include <gp_Ax3.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>
​
#include <GeomAPI_PointsToBSpline.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <GC_MakeCircle.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
​
#include <gp_GTrsf.hxx>
#include <BRepBuilderAPI_Transform.hxx>
​
#include"Viewer.h"
​
#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
#include <BRepAlgoAPI_Cut.hxx>
#include <BRepAlgoAPI_Common.hxx>
#include <BRepAlgoAPI_Section.hxx>
#include"GEOMAlgo_Splitter.h"
#include <TopExp_Explorer.hxx>
#include <ShapeAnalysis_Edge.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
​
​
int main(int argc, char* argv[])
{
    gp_Dir  Z(0.0, 0.0, 1.0);
    gp_Pnt center(0, 0, 0.0);
    gp_Pnt xr(0.5, 0, 0.0);
    gp_Pnt yr(0.0, 1.0, 0.0);
    gp_Pnt zr(0.0, 0.0, 7.0);
    gp_Ax2  wb(center, Z);
    gp_Circ  wbcircle(wb, 0.125 / 2);
    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);
    TopoDS_Edge xline = BRepBuilderAPI_MakeEdge(center, xr);
    TopoDS_Edge yline = BRepBuilderAPI_MakeEdge(center, yr);
    TopoDS_Edge zline = BRepBuilderAPI_MakeEdge(center, zr);
​
    Standard_Real smallR = 0.112;
    Standard_Real bigR = 0.1975;
    Standard_Real xb = 0.0;
    Standard_Real yb = bigR;
    Standard_Real xs = 0.0105;
    Standard_Real ys = 0.1023;
    gp_Pnt p1(-0.0998, 0.0828, 0.0);
    gp_Pnt p2(-0.0456, 0.0053, 0.0);
    gp_Pnt p3(0.1637, 0.0871, 0.0);
    gp_Pnt p4(0.2237, 0.1471, 0.0);
    gp_Pnt scenter(xs, ys, 0.0);
    gp_Pnt bcenter(xb, yb, 0.0);
    gp_Ax2  sr(scenter, Z);
    gp_Ax2  br(bcenter, Z);
    gp_Circ  scircle(sr, smallR);
    gp_Circ  bcircle(br, bigR);
    TopoDS_Vertex v1 = BRepBuilderAPI_MakeVertex(p1);
    TopoDS_Vertex v2 = BRepBuilderAPI_MakeVertex(p2);
    TopoDS_Vertex v3 = BRepBuilderAPI_MakeVertex(p3);
    TopoDS_Vertex v4 = BRepBuilderAPI_MakeVertex(p4);
    Handle(Geom_TrimmedCurve) sc = GC_MakeArcOfCircle(scircle, p1, p2, 1);
    Handle(Geom_TrimmedCurve) bc = GC_MakeArcOfCircle(bcircle, p2, p3, 1);
    TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(sc);
    TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(bc);
    TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(v3, v4);
    TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge(v4, v1);
    //TopoDS_Wire out = BRepBuilderAPI_MakeWire(anEdge1,anEdge2);
    //TopoDS_Shape out1 = BRepAlgoAPI_Fuse(anEdge1, anEdge2);
    //TopoDS_Shape out = BRepAlgoAPI_Fuse(out1, anEdge3);
    TopTools_ListOfShape listEdge;
    listEdge.Append(anEdge4);
    listEdge.Append(anEdge3);
    listEdge.Append(anEdge2);
    //listEdge.Append(anEdge1);
    BRepBuilderAPI_MakeWire mw;
    mw.Add(listEdge);
    mw.Build();
    if (!mw.IsDone())
    {
        if (mw.Error() == BRepBuilderAPI_WireError::BRepBuilderAPI_EmptyWire)
        {
            std::cout << "Wire failed-EmptyWire!\n";
        }
        else if (mw.Error() == BRepBuilderAPI_WireError::BRepBuilderAPI_DisconnectedWire)
        {
            std::cout << "Wire failed-DisconnectedWire!\n";
        }
        else if (mw.Error() == BRepBuilderAPI_WireError::BRepBuilderAPI_NonManifoldWire)
        {
            std::cout << "Wire failed-NonManifoldWire!\n";
        }
        else
        {
            std::cout << "Wire failed!\n";
        }
    }
    //mw.Add(anEdge3);
    //mw.Add(anEdge2);
    //mw.Add(anEdge1);
   
    //TopoDS_Shape bcut = BRepBuilderAPI_MakeFace(aCylinder->Cylinder(), TopoDS::Wire(seccut), Standard_True);
    //std::cout << "ok" << std::endl;
    Viewer vout(50, 50, 500, 500);
    vout << wbe;
    vout << xline;
    vout << yline;
    vout << zline;
    vout << mw;
    //vout << anEdge1;
    //vout << anEdge2;
    vout.StartMessageLoop();
    return 0;
}
​

Error 方法返回 BRepBuilderAPI_WireError 枚举中的一个术语:WireDone – 没有发生错误。

EmptyWire – 未初始化算法,使用了空构造函数。

DisconnectedWire – 最后添加的边未连接到Wire。

NonManifoldWire – 具有某种奇异性的Wire。

上述代码返回结果:Wire failed-DisconnectedWire!

表明后面添加的边未连接到Wire,也就是两个圆弧未连接线

通过以下代码输出圆弧的端点坐标,发现圆弧之间的交点距离过大,超出了容差,将距离过大的用直线连接起来,成功生成Wire。
 

#include <Geom_CylindricalSurface.hxx>
#include <gp_Ax3.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>
​
#include <GeomAPI_PointsToBSpline.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <GC_MakeCircle.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
​
#include <gp_GTrsf.hxx>
#include <BRepBuilderAPI_Transform.hxx>
​
#include"Viewer.h"
​
#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
#include <BRepAlgoAPI_Cut.hxx>
#include <BRepAlgoAPI_Common.hxx>
#include <BRepAlgoAPI_Section.hxx>
#include <TopExp_Explorer.hxx>
#include <ShapeAnalysis_Edge.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
​
​
int main(int argc, char* argv[])
{
    gp_Dir  Z(0.0, 0.0, 1.0);
    gp_Pnt center(0, 0, 0.0);
    gp_Pnt xr(0.5, 0, 0.0);
    gp_Pnt yr(0.0, 1.0, 0.0);
    gp_Pnt zr(0.0, 0.0, 7.0);
    gp_Ax2  wb(center, Z);
    gp_Circ  wbcircle(wb, 0.125 / 2);
    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);
    TopoDS_Edge xline = BRepBuilderAPI_MakeEdge(center, xr);
    TopoDS_Edge yline = BRepBuilderAPI_MakeEdge(center, yr);
    TopoDS_Edge zline = BRepBuilderAPI_MakeEdge(center, zr);
​
    Standard_Real smallR = 0.112;
    Standard_Real bigR = 0.1975;
    Standard_Real xb = 0.0;
    Standard_Real yb = bigR;
    Standard_Real xs = 0.0105;
    Standard_Real ys = 0.1023;
    gp_Pnt p1(-0.0998, 0.0828, 0.0);
    gp_Pnt p2(-0.0456, 0.0053, 0.0);
    gp_Pnt p3(0.1637, 0.0871, 0.0);
    gp_Pnt p4(0.2237, 0.1471, 0.0);
    gp_Pnt scenter(xs, ys, 0.0);
    gp_Pnt bcenter(xb, yb, 0.0);
    gp_Ax2  sr(scenter, Z);
    gp_Ax2  br(bcenter, Z);
    gp_Circ  scircle(sr, smallR);
    gp_Circ  bcircle(br, bigR);
    TopoDS_Vertex v1 = BRepBuilderAPI_MakeVertex(p1);
    TopoDS_Vertex v2 = BRepBuilderAPI_MakeVertex(p2);
    TopoDS_Vertex v3 = BRepBuilderAPI_MakeVertex(p3);
    TopoDS_Vertex v4 = BRepBuilderAPI_MakeVertex(p4);
    Handle(Geom_TrimmedCurve) sc = GC_MakeArcOfCircle(scircle, p1, p2, 1);
    Standard_Real scfirstParam = sc->FirstParameter();
    Standard_Real sclastParam = sc->LastParameter();
    gp_Pnt scpf,scpl;
    sc->D0(scfirstParam, scpf);
    sc->D0(sclastParam, scpl);
    Handle(Geom_TrimmedCurve) bc = GC_MakeArcOfCircle(bcircle, p2, p3, 1);
    Standard_Real bcfirstParam = bc->FirstParameter();
    Standard_Real bclastParam = bc->LastParameter();
    gp_Pnt bcpf, bcpl;
    bc->D0(bcfirstParam, bcpf);
    bc->D0(bclastParam, bcpl);
    std::cout << "sc first:(" << scpf.X() << "," << scpf.Y() << "," << scpf.Z() << ")" << std::endl;
    std::cout << "sc last:(" << scpl.X() << "," << scpl.Y() << "," << scpl.Z() << ")" << std::endl;
    std::cout << "bc first:(" << bcpf.X() << "," << bcpf.Y() << "," << bcpf.Z() << ")" << std::endl;
    std::cout << "bc last:(" << bcpl.X() << "," << bcpl.Y() << "," << bcpl.Z() << ")" << std::endl;
    TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(sc);
    TopoDS_Edge anEdge12 = BRepBuilderAPI_MakeEdge(scpl, bcpf);
    TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(bc);
    TopoDS_Edge anEdge23 = BRepBuilderAPI_MakeEdge(bcpl,p3);
    TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(v3, v4);
    TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge(v4, v1);
    TopoDS_Edge anEdge41 = BRepBuilderAPI_MakeEdge(p1, scpf);
    //TopoDS_Wire out = BRepBuilderAPI_MakeWire(anEdge1,anEdge2);
    //TopoDS_Shape out1 = BRepAlgoAPI_Fuse(anEdge1, anEdge2);
    //TopoDS_Shape out = BRepAlgoAPI_Fuse(out1, anEdge3);
    TopTools_ListOfShape listEdge;
    listEdge.Append(anEdge1);
    listEdge.Append(anEdge12);
    listEdge.Append(anEdge2);
    listEdge.Append(anEdge23);
    listEdge.Append(anEdge3);
    listEdge.Append(anEdge4);
    listEdge.Append(anEdge41);
    //listEdge.Append(anEdge2);
    //listEdge.Append(anEdge1);
    BRepBuilderAPI_MakeWire mw;
    mw.Add(listEdge);
    mw.Build();
    if (!mw.IsDone())
    {
        if (mw.Error() == BRepBuilderAPI_WireError::BRepBuilderAPI_EmptyWire)
        {
            std::cout << "Wire failed-EmptyWire!\n";
        }
        else if (mw.Error() == BRepBuilderAPI_WireError::BRepBuilderAPI_DisconnectedWire)
        {
            std::cout << "Wire failed-DisconnectedWire!\n";
        }
        else if (mw.Error() == BRepBuilderAPI_WireError::BRepBuilderAPI_NonManifoldWire)
        {
            std::cout << "Wire failed-NonManifoldWire!\n";
        }
        else
        {
            std::cout << "Wire failed!\n";
        }
    }
    //mw.Add(anEdge3);
    //mw.Add(anEdge2);
    //mw.Add(anEdge1);
​
    //TopoDS_Shape bcut = BRepBuilderAPI_MakeFace(aCylinder->Cylinder(), TopoDS::Wire(seccut), Standard_True);
    //std::cout << "ok" << std::endl;
    Viewer vout(50, 50, 500, 500);
    vout << wbe;
    vout << xline;
    vout << yline;
    vout << zline;
    vout << mw;
    //vout << anEdge1;
    //vout << anEdge2;
    vout.StartMessageLoop();
    return 0;
}
​

sc first:(-0.0997897,0.0828018,0)

sc last:(-0.0455727,0.00534717,0)

bc first:(-0.0455918,0.00533436,0)

bc last:(0.163743,0.0870711,0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣基础刷题---二分查找

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 中心思想&#xff1a;找到中间值&#xff0c;跟中间值比…

区块链游戏解说:什么是 Nine Chronicles

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a; Nine Chronicles Dashboard 什么是 Nine Chronicles Nine Chronicles 是一款去中心化的在线角色扮演游戏&#xff0c;标志着在线游戏和区块链技术的发展。 Nine Chroni…

阿里云OTA升级指南

阿里云OTA升级指南 OTA简介 OTA是Over-The-Air的缩写&#xff0c;中文意为“通过空中传输”。在计算机和通信技术领域中&#xff0c;OTA指的是通过无线网络等方式将软件、固件、配置文件等更新、下载、安装到设备上的一种技术手段。它可以实现远程升级和管理设备的软件和配置…

【Python】 剪辑法欠采样 CNN压缩近邻法欠采样

借鉴&#xff1a;关于K近邻&#xff08;KNN&#xff09;&#xff0c;看这一篇就够了&#xff01;算法原理&#xff0c;kd树&#xff0c;球树&#xff0c;KNN解决样本不平衡&#xff0c;剪辑法&#xff0c;压缩近邻法 - 知乎 但是不要看他里面的代码&#xff0c;因为作者把代码…

Paddlepaddle使用自己的VOC数据集训练目标检测(0废话简易教程)

一 安装paddlepaddle和paddledection&#xff08;略&#xff09; 笔者使用的是自己的数据集 二 在dataset目录下新建自己的数据集文件&#xff0c;如下&#xff1a; 其中 xml文件内容如下&#xff1a; 另外新建一个createList.py文件&#xff1a; # -- coding: UTF-8 -- imp…

云打印api接口收费吗?

随着近来云打印服务的发展&#xff0c;越来越多的用户都开始选择云打印服务。很多工具类、学习累的App和软件看到了这其中的甜头&#xff0c;也都想要对接云打印业务来完成变现。对接云打印服务则需要找到合适的平台进行api对接。那么云打印api接口收费吗&#xff1f;收费标准是…

TF卡辨别指南|拓优星辰

在存储领域&#xff0c;TF卡&#xff08;MicroSD卡&#xff09;是一种常见的存储设备&#xff0c;但市场上也存在着各种品牌和型号。为了帮助用户准确辨别TF卡&#xff0c;我们提供了以下辨别指南&#xff0c;以确保用户能够选择符合其需求的高性能、高可靠性的TF卡。 二、外观…

数据结构笔记1线性表及其实现

终于开始学习数据结构了 c语言结束之后 我们通过题目来巩固了 接下来我们来学习数据结构 这里我们将去认识到数据结构的一些基础知识&#xff0c;我在第一次学习的时候会很迷糊现在重新学习发现之前的时候还是因为c语言学的不牢固导致学习数据结构困难 这里 我会尽量的多写代码…

fast-planner代码解读【kino_replan_fsm.cpp】

概述 kino_replan_fsm.cpp订阅实时定位和目标点信息&#xff0c;每隔0.01s执行一次状态机&#xff0c;进行状态切换&#xff1b;每隔0.05s执行一次碰撞检测&#xff0c;按需进行重新规划。核心为执行变量exec_state_ 主要函数及作用 KinoReplanFSM::init 输入&#xff1a;句…

SD-WAN解决方案:企业异地组网挑战之视频会议

随着企业的发展&#xff0c;不少企业开始面临规模扩大、分公司组建、异地办公的需求。其中&#xff0c;远程视频会议作为企业异地管理和运营的重要组成部分&#xff0c;对网络稳定性和视频传输质量有较高的要求。在本文&#xff0c;我们将探讨企业视频会议遇到的网络问题以及这…

SpringBoot+Vue+MySQL:图书管理系统的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

面试经典150题——生命游戏

​"Push yourself, because no one else is going to do it for you." - Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 之所以先暴力求解&#xff0c;是因为我开始也没什么更好的思路&#xff0c;所以就先写一种解决方案&#xff0c;没准写着写…

2月21日

Bean生命周期 过程概述 创建对象 实例化(构造方法) 依赖注入 初始化 执行Aware接口回调 执行BeanPostProcessor.psotProcessBeforeInitialization 执行InitializingBean回调(先执行PostConstruct) 执行BeanPsotProcessor.postProcessAfterInitialization 使用对象 销毁对象…

Javaweb之SpringBootWeb案例之切入点表达式的详细解析

3.3 切入点表达式 从AOP的入门程序到现在&#xff0c;我们一直都在使用切入点表达式来描述切入点。下面我们就来详细的介绍一下切入点表达式的具体写法。 切入点表达式&#xff1a; 描述切入点方法的一种表达式 作用&#xff1a;主要用来决定项目中的哪些方法需要加入通知 …

ffmpeg TS复用代码详解——mpegtsenc.c

一、mpegtsenc.c 整体架构 二、主要函数 mpegts_write_pes(AVFormatContext *s, AVStream *st, const uint8_t *payload, int payload_size, int64_t pts, int64_t dts)这个函数就是TS打包的主函数了&#xff0c;这个函数主要功能就是把一帧数据拆分成188字节的TS包&#xff0…

自助点餐系统微信小程序,支持外卖、到店等

总体介绍 系统总共分为三个端&#xff1a;后端&#xff0c;后台管理系统、微信小程序。 基于当前流行技术组合的前后端分离商城系统&#xff1a; SpringBoot2MybatisPlusSpringSecurityjwtredisVue的前后端分离的商城系统&#xff0c; 包含分类、sku、积分、多门店等 预览图…

FariyGUI × Cocos Creator 入门

前言 程序员向的初探Cocos Creator结和FairyGUI的使用&#xff0c;会比较偏向FairyGUI一点&#xff0c;默认各位读者都熟练掌握Cocos Creator以及js/ts脚本编写。 初探门径&#xff0c;欢迎大佬指教&#xff0c;欢迎在评论区或私信与本人交流&#xff0c;谢谢&#xff01; 下…

DBSCAN密度聚类介绍 样本点 样本集合 半径 邻域 核心对象 边界点 密度直达 密度可达 密度相连

DBSCAN密度聚类介绍 样本点 样本集合 半径 邻域 核心对象 边界点 密度直达 密度可达 密度相连 简介概念定义原理DBSCAN的优点DBSCAN的缺点小尝试制作不易&#xff0c;感谢三连&#xff0c;谢谢啦 简介 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications wi…

Codeforces Round 927 (Div. 3)(A,B,C,D,E,F,G)

这场简单些&#xff0c;E题是个推结论的数学题&#xff0c;沾点高精的思想。F是个需要些预处理的DP&#xff0c;G题是用exgcd算边权的堆优化dijkstra。C题有点骗&#xff0c;硬啃很难做。 A Thorns and Coins 题意&#xff1a; 在你的电脑宇宙之旅中&#xff0c;你偶然发现了…

LeetCode 0105.从前序与中序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看)

【LetMeFly】105.从前序与中序遍历序列构造二叉树&#xff1a;分治&#xff08;递归&#xff09;——五彩斑斓的题解&#xff08;若不是彩色的可以点击原文链接查看&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-preorder-a…