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.mfbz.cn/a/398265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云呐智能运维硬件包括哪些?智能运维体系包括哪些?

智能运维体系时&#xff0c;能够详细了解该体系包含的各个组成部分。具体来说&#xff0c;我们应该知道智能运维体系中涉及的软件组件有哪些&#xff0c;以及这些组件是如何相互协作以实现高效运维的。此外&#xff0c;智能运维体系中使用的硬件设备感兴趣。列举了智能运维硬件…

《Go 简易速速上手小册》第4章:接口与抽象(2024 最新版)

文章目录 4.1 接口的定义与实现 - Go 语言的多面手4.1.1 基础知识讲解4.1.2 重点案例&#xff1a;动物乐队功能描述实现代码 4.1.3 拓展案例 1&#xff1a;通用支付系统拓展案例 1&#xff1a;通用支付系统功能描述实现代码 4.1.4 拓展案例 2&#xff1a;动物园管理器拓展案例 …

Vuex状态管理

Vuex状态管理 一、[Vuex](https://vuex.vuejs.org/zh/) 概述二、需求: 多组件共享数据三、vuex 的使用 - 创建仓库四、核心概念 - state 状态五、通过辅助函数 - mapState获取 state中的数据六、开启严格模式及Vuex的单项数据流七、核心概念-mutations八、带参数的 mutations九…

探秘OpenAI的神奇之作:Sora技术揭秘

探秘OpenAI的神奇之作&#xff1a;Sora技术揭秘 1. 引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正日益成为各个领域的关键技术。而在人工智能领域中&#xff0c;OpenAI公司一直以来都扮演着重要的角色。他们的最新创新——Sora技术&#x…

Linux:docker的Portainer部署

官网 Portainer: Container Management Software for Kubernetes and Dockerhttps://www.portainer.io/ 1.下载 portainer也是一个docker的镜像直接下载即可 docker pull portainer/portainer 2.运行 直接运行镜像即可直接使用 docker run -d -p 8000:8000 -p 9000:9000 -…

2.20学习总结

1.【模板】单源最短路径&#xff08;弱化版&#xff09; 2.【模板】单源最短路径&#xff08;标准版&#xff09; 3.无线通讯网 4.子串简写 5.整数删除 6.拆地毯 【模板】单源最短路径&#xff08;标准版&#xff09;https://www.luogu.com.cn/problem/P4779 题目描述 给定一个…

社区店选址的黄金法则:选择最佳位置的关键因素

对于计划开设实体店或创业的人来说&#xff0c;选址是至关重要的一步。 作为一名5年的鲜奶吧创业者&#xff0c;我将以专业的角度&#xff0c;详细阐述社区店选址的黄金法则&#xff0c;帮助你找到最理想的店铺位置。 1、市场需求与目标客户&#xff1a; 在选址之前&#xf…

Vue 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button&…

MyBatis数据库查询

文章目录 什么是MyBatisMyBatis程序的创建MyBatis实现数据库查询传参查询插入实现添加操作获取自增ID删除实现修改实现#{}和${}SQL注入 like查询 resultMap和resultType多表查询 对于普遍的后端开发而言&#xff0c;其程序主要包含了后端主程序和数据库两个部分&#xff0c;用户…

floyd算法解析+python实现

具体原理可以参考链接1 视频讲解 python实现如下 # dist是任意两点之间的最短路径&#xff0c;path是这两点之间的最短路径&#xff0c;所需途径的点 def floyd_warshall(graph):n len(graph)dist [[float(inf)] * n for _ in range(n)]path [[-1] * n for _ in range(n)]…

【算法2-1】前缀和、差分与离散化

一、【P3406】海底高铁&#xff08;差分贪心&#xff09;​​​​​​ 由于本题涉及到线路问题&#xff0c;需要统计Uim途径每条线路的次数&#xff0c;而且Uim每次的轨迹都是很长一段路径&#xff0c;所以需要使用一个合理的数据结构来维护区间的变化&#xff0c;首先想到线段…

测试工具之压测工具JMeter(一)

有时候我们接到的需求是秒杀或者抽奖类的功能开发&#xff0c;这时候可能会在某一时间点大量请求并发&#xff0c;我们手工自测很难发现一些高并发场景下的问题&#xff0c;这时候可以借助一些压测工具帮我们模拟出大量请求来测试我们的接口是否能满足业务要求。JMeter是Apache…

Golang for 循环

从基础知识到高级技术、并发和通道 Go&#xff08;Golang&#xff09;编程语言中的“for”循环是一个基本而多功能的结构&#xff0c;用于迭代集合、重复执行代码块以及管理循环控制流。Golang的“for”循环语法简洁却强大&#xff0c;为处理多样的循环场景提供了一系列能力。无…

神经网络基础——激活函数的选择、参数初始化

一、神经网络 1、神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;是一种模仿生物神经网络结构 和功能的计算模型。 2、基本部分 输入层&#xff1a;输入 x 输出层&#xff1a;输出 y 隐…

DS Wannabe之5-AM Project: DS 30day int prep day20

Q1. Do you have any idea about Event2Mind in NLP? Yes, it is based on NLP research paper to understand the common-sense inference from sentences. Event2Mind: Common-sense Inference on Events, Intents, and Reactions The study of “Commonsense Reasoning”…

为什么json属性名被设计为必须有引号?

JSON——JavaScript Object Notation&#xff0c;直译过来就是JavaScript对象标记法。 这是一种数据交换格式&#xff0c;简单来说&#xff0c;就像我们平时写收发地址一样&#xff0c;规定了一种大家都认同的格式&#xff0c;让数据在不同的系统之间传递得既安全又不会走丢。 …

使用go-llama.cpp 运行 yi-01-6b大模型,使用本地CPU运行,速度挺快的

1&#xff0c;视频地址 2&#xff0c;关于llama.cpp 项目 https://github.com/ggerganov/llama.cpp LaMA.cpp 项目是开发者 Georgi Gerganov 基于 Meta 释出的 LLaMA 模型&#xff08;简易 Python 代码示例&#xff09;手撸的纯 C/C 版本&#xff0c;用于模型推理。所谓推理…

Python之海象运算符

在 Python 3.8 及更高版本中&#xff0c;引入了一种新的语法特性&#xff0c;称为"海象运算符"&#xff08;Walrus Operator&#xff09;&#xff0c;它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…

14. UE5 RPG使用GameplayTag

GameplayTag本来是应用在GAS游戏技能系统里面的&#xff0c;后来UE直接将其抽离出来&#xff0c;作为一个模块&#xff0c;现在可以不在GAS里也可以使用这个模块。比如&#xff0c;我需要判断一个射线拾取的物体&#xff0c;首先我需要判断这个actor是否存在&#xff0c;然后判…

torch.manual_seed(233333)

torch.manual_seed&#xff08;233333&#xff09; 介绍报错信息解决问题总结 介绍 这是在使用GPT-SoVITS时运行缺失pytorch导致报的错 报错信息 Traceback (most recent call last): File “D:\vits\GPT-SoVITS-beta\GPT-SoVITS-beta0217\webui.py”, line 10, in torch.m…