Open CASCADE学习|统计形状拓扑数量

news2024/11/25 22:38:42

边界表示法(Boundary Representation,简称B-Rep)是几何造型中最成熟、无二义的表示法。它主要用于描述物体的几何信息和拓扑信息。在边界表示法中,一个实体(Solid)由一组封闭的面(Face)组成,而每个面又由其所在的曲面定义加上其边界来表示。面的边界是边的并集,而边又是由点来表示的。

边界表示法中的拓扑信息描述形体上的顶点(Vertex)、边(Edge)、面(Face)的连接关系,形成物体边界表示的“骨架”。拓扑的目的在于描述对象的局限性和连接关系,比如物体的边界以及对象之间的连接(通过公共边界)。例如,相交、相邻、相切、垂直、平行等关系都属于拓扑信息。

TopAbs 包含了 TopAbs_ShapeEnum 枚举类型,列举了不同的拓扑种类,包括COMPOUND(一组任意类型的拓扑物体)、COMPSOLID(复合刚体)、SOLID(由壳限制的空间的一部分)、SHELL(由边相连的面集)、FACE(在2D它是一个平面的一部分;在3D它是一个曲面的一部分)、WIRE(由顶点连接的边的集合)、EDGE(一个与被约束的曲线对应的拓扑元素)以及VERTEX(一个与一个点对应的拓扑元素)。这些拓扑类型形成了一个从复杂到简单的层次结构,因为复杂的物体在其表述中可以包含更简单的物体。

#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 <TopExp_Explorer.hxx>
#include <gp_GTrsf.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <GC_MakeSegment.hxx>
#include <IntAna2d_AnaIntersection.hxx>
#include <TopoDS.hxx>
#include <BRepPrimAPI_MakeRevol.hxx>

#include"Viewer.h"



TopoDS_Shape createGrindingwheel2()
{
    Standard_Real Line1_angle = 280 * M_PI / 180;
    Standard_Real Line1_length = 0.5031;
    Standard_Real Line2_angle = 236 * M_PI / 180;
    Standard_Real Line2_length = 0.5925;
    Standard_Real Arc1_r = 0.112;
    Standard_Real Arc1_angle = (180 + 10 + 50) * M_PI / 180;
    gp_Pnt Line1_p1(-0.6822 / 2, 0, 0);
    gp_Pnt Line2_p1(0.6822 / 2, 0, 0);
    gp_Lin Line1(Line1_p1, gp_Dir(cos(Line1_angle), sin(Line1_angle), 0.));
    gp_Lin Line2(Line2_p1, gp_Dir(cos(Line2_angle), sin(Line2_angle), 0.));
    Handle(Geom_TrimmedCurve) L1 = GC_MakeSegment(Line1, 0., Line1_length);
    TopoDS_Edge L1e = BRepBuilderAPI_MakeEdge(L1);
    Handle(Geom_TrimmedCurve) L2 = GC_MakeSegment(Line2, 0., Line2_length);
    TopoDS_Edge L2e = BRepBuilderAPI_MakeEdge(L2);
    gp_Pnt l1end = L1->EndPoint();
    gp_Pnt l2end = L2->EndPoint();
    gp_Lin Line1v(l1end, gp_Dir(cos(Line1_angle + M_PI_2), sin(Line1_angle + M_PI_2), 0.));
    gp_Lin2d Line2v(gp_Pnt2d(l2end.X(), l2end.Y()), gp_Dir2d(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2)));
    gp_Lin Line2v3d(l2end, gp_Dir(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2), 0.));
    Handle(Geom_TrimmedCurve) L1v = GC_MakeSegment(Line1v, 0., Arc1_r);
    gp_Pnt l1vend = L1v->EndPoint();
    gp_Circ c1(gp_Ax2(l1vend, gp_Dir(0, 0, 1)), Arc1_r);
    Handle(Geom_TrimmedCurve) c1c = GC_MakeArcOfCircle(c1, l1end, Arc1_angle, 1);
    gp_Pnt c1end = c1c->EndPoint();
    gp_Lin2d Line3(gp_Pnt2d(c1end.X(), c1end.Y()), gp_Dir2d(l2end.X() - c1end.X(), l2end.Y() - c1end.Y()));
    gp_Lin2d Line3v = Line3.Normal(gp_Pnt2d((l2end.X() + c1end.X()) / 2, (l2end.Y() + c1end.Y()) / 2));
    IntAna2d_AnaIntersection aIntAna;
    aIntAna.Perform(Line2v, Line3v);
    IntAna2d_IntPoint aIntPoint = aIntAna.Point(1);
    gp_Pnt o2(aIntPoint.Value().X(), aIntPoint.Value().Y(), 0.);
    Handle(Geom_TrimmedCurve) L2v = GC_MakeSegment(Line2v3d, l2end, o2);
    Standard_Real r2 = L2v->LastParameter();
    gp_Circ c2(gp_Ax2(o2, gp_Dir(0, 0, 1)), r2);
    Handle(Geom_TrimmedCurve) c2c = GC_MakeArcOfCircle(c2, c1end, l2end, 0);
    gp_Pnt c2low = c2c->Value(M_PI_2);

    TopoDS_Edge c1ce = BRepBuilderAPI_MakeEdge(c1c);
    TopoDS_Edge L1ev = BRepBuilderAPI_MakeEdge(L1v);
    TopoDS_Edge c2ce = BRepBuilderAPI_MakeEdge(c2c);

    gp_Pnt Line1_up(-0.9832 / 2, 5, 0);
    gp_Pnt Line2_up(0.9832 / 2, 5, 0);
    TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(Line1_p1, Line1_up);
    TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(Line1_up, Line2_up);
    TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(Line2_up, Line2_p1);
    TopTools_ListOfShape listEdge;
    listEdge.Append(anEdge1);
    listEdge.Append(anEdge2);
    listEdge.Append(anEdge3);
    listEdge.Append(L1e);
    listEdge.Append(c1ce);
    listEdge.Append(c2ce);
    listEdge.Append(L2e);
    BRepBuilderAPI_MakeWire mw;
    mw.Add(listEdge);
    mw.Build();

    TopoDS_Shape gwheel = BRepPrimAPI_MakeRevol(mw, gp_Ax1(gp_Pnt(0, 5, 0), gp_Dir(1, 0, 0)), 2 * M_PI);
    //平移:
    gp_Trsf theTransformation1;
    gp_Vec theVectorOfTranslation1(-c2low.X(), -c2low.Y(), 0.);
    theTransformation1.SetTranslation(theVectorOfTranslation1);

    BRepBuilderAPI_Transform myBRepTransformation1(gwheel, theTransformation1);
    TopoDS_Shape outzero = myBRepTransformation1.Shape();


    gp_Trsf theTransformation2;
    gp_Vec theVectorOfTranslation2(0., 0.125 / 2, 0.);
    theTransformation2.SetTranslation(theVectorOfTranslation2);
    //绕一个轴旋转:
    gp_Trsf theTransformation3;
    gp_Ax1 axez = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0., 0., 1.));
    theTransformation3.SetRotation(axez, -90 * M_PI / 180);

    gp_Trsf theTransformation4;
    gp_Ax1 axex = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(1., 0., 0.));
    theTransformation4.SetRotation(axex, -50 * M_PI / 180);

    BRepBuilderAPI_Transform myBRepTransformation(outzero, theTransformation4 * theTransformation3 * theTransformation2);
    TopoDS_Shape TransformedShape = myBRepTransformation.Shape();

    return TransformedShape;
}


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);
    //creat a profile of gringing wheel
    TopoDS_Shape gw = createGrindingwheel2();
    TopExp_Explorer anExp1(gw, TopAbs_SOLID);
    TopExp_Explorer anExp2(gw, TopAbs_SHELL);
    TopExp_Explorer anExp3(gw, TopAbs_FACE);
    TopExp_Explorer anExp4(gw, TopAbs_WIRE);
    TopExp_Explorer anExp5(gw, TopAbs_EDGE);
    int i = 0;
    Viewer vout(50, 50, 500, 500);
    for (; anExp1.More(); anExp1.Next())
    {
        TopoDS_Solid anSolid = TopoDS::Solid(anExp1.Current());
        i++;
    }
    std::cout << "numbers of TopoDS_Solid:" << i << std::endl;
    i = 0;
    for (; anExp2.More(); anExp2.Next())
    {
        TopoDS_Shell anShell = TopoDS::Shell(anExp2.Current());
        i++;
    }
    std::cout << "numbers of TopoDS_Shell:" << i << std::endl;
    i = 0;
    for (; anExp3.More(); anExp3.Next())
    {
        TopoDS_Face anFace = TopoDS::Face(anExp3.Current());
        i++;
    }
    std::cout << "numbers of TopoDS_Face:" <<i<< std::endl;
    i = 0;
    for (; anExp4.More(); anExp4.Next())
    {
        TopoDS_Wire anWire = TopoDS::Wire(anExp4.Current());
        i++;
    }
    std::cout << "numbers of TopoDS_Wire:" << i << std::endl;
    i = 0;
    for (; anExp5.More(); anExp5.Next())
    {
        TopoDS_Edge anEdge = TopoDS::Edge(anExp5.Current());
        i++;
    }
    std::cout << "numbers of TopoDS_Edge:" << i << std::endl;

    vout << wbe;
    vout << xline;
    vout << yline;
    vout << zline;
    vout << gw;
    vout.StartMessageLoop();
    return 0;
}

numbers of TopoDS_Solid:0

numbers of TopoDS_Shell:1

numbers of TopoDS_Face:6

numbers of TopoDS_Wire:6

numbers of TopoDS_Edge:24

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

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

相关文章

创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

本文介绍基于C语言GDAL库&#xff0c;批量创建大量栅格遥感影像文件&#xff0c;并将数据批量写入其中的方法。 首先&#xff0c;我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C GDAL提取多时相遥感影像中像…

nginx工作原理解析

目录 1、master-workers 的工作机制介绍 2、master-workers 的机制的好处 3、设置多少个 worker 4、最大连接数和支持的最大并发数的计算 1、master-workers 的工作机制介绍 nginx在启动后&#xff0c;会有一个master进程和一个或者多个相互独立的worker进程 过来的请求由…

HDLbits 刷题 --Exams/m2014 q4h

Implement the following circuit: 实现以下电路&#xff1a; module top_module (input in,output out);assign out in; endmodule 运行结果&#xff1a;

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS time FROM table1 WHERE…

关于Linux下的进程等待(进程篇)

目录 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 怎样去执行进程等待&#xff1f; status options 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 代码示例&#xff1a;模仿僵尸进程 #include <stdio.h> #include <unistd.…

3D-Aware Multi-Class Image-to-Image Translation with NeRFs

3D-Aware Multi-Class Image-to-Image Translation with NeRFs 利用NeRFs实现3D感知的多类图像到图像的翻译 Senmao Li1  Joost van de Weijer2  Yaxing Wang1 李森茂 1 范德维杰 2 王亚兴 1  Fahad Shahbaz Khan3,4  Meiqin Liu5  Jian Yang1 法哈德夏巴兹汗 3,4 刘梅琴 …

DSP笔记13-时间基准子模块Time base(TB)比较子模块Counter cpmpare(CC)

时间基准子模块Time base(TB) 同步&#xff0c;计数 CTR计数寄存器 PRD周期寄存器 CMP比较寄存器&#xff0c;占空比 EPWMA&#xff0c; EPWMB&#xff0c;两个比较寄存器&#xff0c;但只有以及计数寄存器以及一个周期寄存器 计数模式 计数时钟TBCLK HSPCLKDIVx x0,分…

存算架构优化:为大模型算力提升铺平道路

随着人工智能技术的飞速发展&#xff0c;大模型已经成为了推动各行各业进步的关键力量。从自然语言处理到图像识别&#xff0c;再到复杂的数据分析&#xff0c;大模型以其卓越的性能和广泛的应用前景&#xff0c;正逐渐成为AI领域的焦点。然而&#xff0c;大模型的高效运行离不…

Day 2. 2440相关知识点

1、arm的工作模式有哪些&#xff1f; ARM的工作模式分为普通模式、特权模式&#xff0c;其中特权模式又细分为六种模式 普通模式用户模式&#xff08;User&#xff09;大部分任务执行在这种模式 特权模式快速中断模式FIQ当一个高优先级&#xff08;fast) 中断产生时将会进入…

传输层协议——UDP/TCP协议

目录 端口号 端口号范围 pidof UDP协议 UDP协议格式 UDP特点 UDP缓冲区 UDP的注意事项 基于UDP的应用层协议 TCP协议 TCP协议格式 序号与确认序号 窗口大小 6个标记位 紧急指针 确认应答机制 连接管理机制 三次握手 四次挥手 超时重传机制 流量控制 滑动…

虚拟网络设备的真正使命:实现有控制的通信

在数字化时代&#x1f4f2;&#xff0c;网络安全&#x1f512;成为了企业和个人防御体系中不可或缺的一部分。随着网络攻击的日益复杂和频繁&#x1f525;&#xff0c;传统的物理网络安全措施已经无法满足快速发展的需求。虚拟网络设备&#x1f5a7;&#xff0c;作为网络架构中…

快速删除node_modules

1.rd /s /q node_modules 2.rimraf node_modules/ 亲测可用

「JavaEE」初识进程

初识进程 &#x1f349;进程&#x1f34c;操作系统的进程管理 &#x1f349;PCB 重要属性&#x1f34c;进程的身份标识&#x1f34c;内存指针&#x1f34c;文件描述符表&#x1f34c;进程的状态&#x1f34c;优先级&#x1f34c;记账信息&#x1f34c;上下文 &#x1f349;内存…

网络安全---RSA公钥加密与签名

实验项目&#xff1a;RSA公钥加密与签名实验 1.实验目的 本实验的学习目标是让学生获得 RSA 算法的动手经验。 通过课堂学习&#xff0c;学生应该已经了解 RSA 算法的理论部分&#xff0c; 知道在数学上如何生成公钥、私钥以及如何执行加密、解密和签名生成、验证。 通过使用…

前端保留两位小数

一、保留两位小数&#xff08;四舍五入&#xff09; 解决方案&#xff1a;使用 toFixed(x) 方法可以对小数进行指定位数保留&#xff0c;其中x是要保留的位数用法&#xff1a;num.toFixed(x)&#xff0c;其中num为需要操作的数据&#xff0c;x为要保留的位数示例&#xff1a;1…

【leetcode】动态规划::前缀和(二)

标题&#xff1a;【leetcode】前缀和&#xff08;二&#xff09; 水墨不写bug 正文开始&#xff1a; &#xff08;一&#xff09; 和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续…

Redis从入门到精通(十一)Redis实战(八)关注、共同关注和Feed流

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.9 好友关注4.9.1 关注和取消关注4.9.1.1 创建表是实体类4.9.1.2 实现关注和取消关注 4.9.2 共同关注4.9.2.1 改造关注和取消关注功能4.9.2.2 实现查询共同关注好友功能 4.9.3 Feed流4.9.3.1 Feed流介绍及其实现模…

蓝桥杯模拟赛题——魔法失灵了——toRefs()

目标 找到 index.html 中 TODO 部分&#xff0c;正确修复代码使 data 对象恢复响应式特性&#xff0c;即点击页面上的 - 与 按钮可以改变 value 的值。正确实现后效果如下&#xff1a; 题解 value是reactive 利用toRefs; toRefs() 函数可以将 reactive() 创建出来的响应式对象…

SSL证书有什么作用?

SSL证书的作用&#xff0c;简单来说就是给你的网站穿上“防护服”&#xff0c;保护用户数据安全&#xff0c;增强网站可信度。具体来说&#xff1a; 最重要的是可以帮您的网站实现HTTPS访问。 1. 加密传输&#xff1a; - 像给信件加封密锁一样&#xff0c;SSL证书让网站和用户…

python爬虫 爬取网页图片

http://t.csdnimg.cn/iQgHw //爬虫爬取图片其实是很简单的&#xff0c;但是大多数同学&#xff0c;可能对 url的设置一直有困惑&#xff08;这点本人也在研究&#xff09;&#xff0c;而本篇文章&#xff0c;对于想要爬取图片的小白简直是福利。你只需要将文章代码运行即可&am…