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

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.mzph.cn/news/693104.shtml

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

相关文章

安卓OpenGL添加水印并录制(二)---抖音录制原理

文章目录 前文回顾音频处理留个小思考总结 本文首发地址 https://h89.cn/archives/146.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 源码地址: Gitee: OpenGLRecorder 通过 前文 我们知道了如何采集 Camera 视频&#xff0c;叠加水印、贴纸保存为MP4&#xff0c;…

Vue3 学习笔记(Day1)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 Vue3 简介 2 创建 Vue3 工程 2.1 基于 vue-cli 创建 2.2 基于 vite 创建&#xff08;推荐&#xff09; 2.3 …

Web3探索加密世界:什么是空投?

随着加密货币行业的迅速发展&#xff0c;人们开始听说各种各样的术语&#xff0c;其中包括"空投"&#xff08;Airdrop&#xff09;。在这里&#xff0c;我们将深入探讨什么是空投&#xff0c;以及它在加密世界中扮演的角色。 什么是空投&#xff1f; 空投是指在加密…

视频生成模型:构建虚拟世界的模拟器 [译]

原文&#xff1a;Video generation models as world simulators 我们致力于在视频数据上开展生成模型的大规模训练。具体来说&#xff0c;我们针对不同时长、分辨率和宽高比的视频及图像&#xff0c;联合训练了基于文本条件的扩散模型。我们采用了一种 Transformer 架构&#…

C# OpenCvSharp DNN Image Retouching

目录 介绍 模型 项目 效果 代码 下载 C# OpenCvSharp DNN Image Retouching 介绍 github地址&#xff1a;https://github.com/hejingwenhejingwen/CSRNet (ECCV 2020) Conditional Sequential Modulation for Efficient Global Image Retouching 模型 Model Properti…

信号系统之连续信号处理

1 Delta 函数 连续信号可以分解为缩放和移位的增量函数&#xff0c;就像处理离散信号一样。不同之处在于&#xff0c;连续 delta 函数比其离散函数复杂得多&#xff0c;在数学上也抽象得多。我们不是用它是什么来定义连续 delta 函数&#xff0c;而是用它所具有的特征来定义它…

汽车电子论文学习---电动汽车用高功率密度碳化硅电机控制器研究

关键重点&#xff1a; sic的特点&#xff1a;耐压高、开关速度快、开关损耗小&#xff1b;采用sic的控制器&#xff0c;损耗降低70%&#xff0c;续航里程提高5%。sic的模块并联设计难度高于IGBT模块&#xff1b;多芯片并联导致热耦合问题、温升不均&#xff0c;导致部分芯片率…

猫毛过敏不能养猫了吗?除猫毛好的宠物空气净化器品牌有哪些?

让我们来探讨一下如何让容易过敏的家庭成员和猫咪更好地相处。很多人喜欢猫咪&#xff0c;但与它们相处一段时间后&#xff0c;可能会出现鼻塞、喷嚏和眼泪不断的过敏症状。那么&#xff0c;为什么会过敏呢&#xff1f;这是因为猫的唾液中含有Fel d1蛋白质&#xff0c;当它们舔…

匠芯创ArtInChip D133CBS芯片:为工业HMI产品提供强大动力与稳健防护的理想之选

引言 当今工业自动化领域&#xff0c;对于高性能和可靠性的需求日益增长。为了满足这些要求&#xff0c;匠芯创ArtInChip推出了全新的D133CBS芯片&#xff0c;它以其卓越的性能和强大的功能&#xff0c;被设计用作工业人机界面&#xff08;HMI&#xff09;产品的主控制器。 D1…

URL、DNS过滤,AV---防火墙综合实验

拓扑图 该实验之前的配置请看我的上一篇博客&#xff0c;这里仅配置URL、DNS过滤&#xff0c;AV 需求 8&#xff0c;分公司内部的客户端可以通过域名访问到内部的服务器 这次的拓扑图在外网多增加了一个DNS服务器和HTTP服务器 DNS服务器IP&#xff1a;40.0.0.30 HTTP服务器…

Java 位运算

基本概念 1、当前常见的 CPU 位数是 32 位和 64 位&#xff0c;所谓 32 位处理器就是一次只能处理 32 位&#xff0c;也就是 4 个字节的数据&#xff0c;而 64 位处理器一次则能处理 64 位&#xff0c;即 8 个字节的数据。关于 64 位处理器 、32 和 64 位含义 、32 和 64 位区…

如何创建WordPress付款表单(简单方法)

您是否正在寻找一种简单的方法来创建付款功能WordPress表单&#xff1f; 小企业主通常需要创建一种简单的方法来在其网站上接受付款&#xff0c;而无需设置复杂的购物车。简单的付款表格使您可以轻松接受自定义付款金额、设置定期付款并收集自定义详细信息。 在本文中&#x…

论文速递 | Operations Research 1月文章合集

​ 编者按 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Operations Research在2024年1月份发布的7篇文章的基本信息&#xff0c;旨在帮助读者快速洞察领域新动态。 推荐文章1 ● 题目&#xff1a;Recovering Dantzig–Wolfe Bounds by Cutting Planes 通过切割平面恢复…

分销系统-分销小程序-多分销系统-

微信小程序分销返佣商城模式是一种基于微信小程序平台的新型商城销售模式。这种模式通过分销和返佣的方式&#xff0c;鼓励消费者成为分销商&#xff0c;并通过分享商品链接来提高销售效率和利润。 在分销返佣商城模式中&#xff0c;商家可以在小程序上发布商品信息&#xff0…

pclpy 安装和使用

pclpy 安装和使用 一、安装pclpy二、问题与解决方法三、测试四、测试结果五、相关链接 一、安装pclpy pclpy是点云库(PCL)的Python绑定。使用CppHeaderParser和pybind11从头文件生成。这个库正在积极开发中&#xff0c;目前Windows只支持python 3.6 x64 和 python3.7&#xff…

uniapp不同平台获取文件内容以及base64编码特征

前言 文件图片上传&#xff0c;客户端预览是很正常的需求&#xff0c;获取文件的md5特征码也是很正常的&#xff0c;那么&#xff0c;在uniapp中三种环境&#xff0c;h5, 小程序以及 app环境下&#xff0c;如何实现的&#xff1f; 参考&#xff1a; 如何在uniapp中读取文件Arr…

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、BiLSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-BiLSTM、VMD-BiLSTM、…

nginx 踩坑 之 mine.types

踩坑记录 在尝试在 mac 上部署静态 doc 项目时&#xff0c;发现样式死活显示不出来&#xff0c;但是在开发环境样式可以正常显示的&#xff0c;打包后使用 nginx 代理却不能正常显示&#xff0c;这让我感到很困惑&#xff0c;我一开始认为是代理地址&#xff0c;或者相对路径配…

【机器学习基础】正则化

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战 欢迎订阅&am…

Dockerfile文件中只指定挂载点会发生什么?

当你在VOLUME指令中只指定容器内的路径&#xff08;挂载点&#xff09;而不指定宿主机的目录时&#xff0c;Docker会为该挂载点自动生成一个匿名卷。这个匿名卷存储在宿主机的某个位置&#xff0c;但这个具体位置是由Docker自动管理的&#xff0c;用户通常不需要关心这个存储位…