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

这篇具有很好参考价值的文章主要介绍了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)

Open CASCADE学习|为什么由Edge生成Wire不成功?,Open CASCADE,学习,c++,Open CASCADE文章来源地址https://www.toymoban.com/news/detail-835315.html

到了这里,关于Open CASCADE学习|为什么由Edge生成Wire不成功?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么要学习消息队列

    消息队列作为使用最广泛、生命力最旺盛的中间件,无论技术如何发展,都离不开分布式系统的最基本需求:通信。它涉及的底层技术是非常全面的,比如:高性能通信、海量数据存储、高并发等。并且,消息队列具有功能简洁、结构清晰的特点,入门简单但具有足够的深度

    2024年02月08日
    浏览(55)
  • 为什么要学习C++

    UINX操作系统诞生之初是用汇编语言编写的。 随着UNIX的发展,汇编语言的开发效率成为一个瓶颈。 寻找新的高效开发语言成为UNIX开发者需要解决的问题。 当时BCPL语言成为了当时的选择之一。 Ken Thomposn对BCPL进行简化得到了B语言。 但是B语言不是直接生成机器码,而是生成中

    2024年02月10日
    浏览(46)
  • 《让云落地 云计算服务模式》第一章 [为什么是云计算,为什么是现在] 学习

    “时间会带来标准和最佳实践” 1.云计算的由来 云计算是从中央主机时代,向个人计算机时代诞生带来的分布式主从架构时代,以及企业能够通过覆盖全球的计算机网络联系世界的互联网时代的自然发展。 每一次新的技术革命都会伴随着阻力。早期的试用者和风险承受者会

    2024年04月28日
    浏览(46)
  • Open CASCADE学习|创建旋转体

    旋转体是一个几何概念,指的是通过旋转一个平面图形得到的立体图形。具体来说,一个平面图形绕着它所在的平面内的一条定直线旋转一周所形成的曲面,这个曲面会围成一个几何体,这个几何体就叫做旋转体。这条定直线被称为旋转体的轴。 常见的旋转体有圆柱、圆锥、

    2024年01月23日
    浏览(49)
  • Open CASCADE学习|曲线向曲面投影

    在三维空间中,将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现,但最常见的是使用数学和几何库,如OpenCASCADE,来处理这些计算。 在OpenCASCADE中,投影曲线到曲面通常涉及以下步骤: 定义曲线(Curve)和曲面(Surface)。 使用适当的算法或类(如

    2024年02月19日
    浏览(42)
  • ChatGPT为什么使用强化学习

    最近出现很多ChatGPT相关论文,但基本都是讨论其使用场景和伦理问题,至于其原理,ChatGPT在其主页上介绍,它使用来自人类反馈的强化学习训练模型,方法与InstructGPT相同,只在数据收集上有细微的差别。 那么,InstructGPT和ChatGPT为什么使用强化学习呢?先看个示例: 先不论

    2023年04月13日
    浏览(43)
  • 神经网络为什么可以学习

    本资料转载于B站up主:大模型成长之路,仅用于学习和讨论,如有侵权请联系 动画解析神经网络为什么可以学习_哔哩哔哩_bilibilis 1.1 也可以是一层,也可以是多层  2.1 每两个神经元之间有两个参数,我们称之为权重 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 16.1  17.1 18.1

    2024年02月12日
    浏览(132)
  • 半监督学习为什么能work?以及直推式学习是什么

    今天在看半监督的时候,突然想起这个问题: 半监督用训好的模型去生成伪标签,再把伪标签当做真标签去训, 但是模型能生成伪标签说明模型已经学到了这部分内容,把模型已经学会的内容加进去,让模型继续学,能学出什么新东西呢? 去知乎搜了一下,一张图简洁明了

    2023年04月10日
    浏览(50)
  • 机器学习中为什么需要梯度下降

            在机器学习中,梯度下降是一种常用的优化算法,用于寻找损失函数的最小值。我们可以用一个简单的爬山场景来类比梯度下降的过程。         假设你被困在山上,需要找到一条通往山下的路。由于你是第一次来到这座山,对地形不熟悉,你只能通过尝试和

    2024年02月19日
    浏览(53)
  • 机器学习强基计划10-1:为什么需要集成学习?核心原理是什么?

    机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编

    2024年02月06日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包