当前位置: 首页 > news >正文

opencascade TopoDS_Builder 源码学习

opencascade TopoDS_Builder
在这里插入图片描述

前言

构建器(Builder)用于创建拓扑数据结构。它是构建器类层次结构的根。
构建器中包含三组方法:

  1. Make 方法用于创建形状(Shapes)。
  2. Add 方法用于将一个形状包含到另一个形状中。
  3. Remove 方法用于从一个形状中移除另一个形状。

构建器中的方法不是静态的,它们可以在继承的构建器中被重新定义。
此构建器不提供用于创建顶点(Vertices)、边(Edges)、面(Faces)、壳(Shells)或实体(Solids)的 Make 方法。这些方法在继承的构建器中提供,因为它们必须提供几何形状信息。
Add 方法遵循以下规则:
任何形状(SHAPE)都可以被添加到复合形状(COMPOUND)中。
只有实体(SOLID)可以被添加到复合实体(COMPSOLID)中。
只有壳(SHELL)、边(EDGE)和顶点(VERTEX)可以被添加到实体(SOLID)中。边和顶点可以是内部的或外部的。
只有面(FACE)可以被添加到壳(SHELL)中。
只有线框(WIRE)和顶点(VERTEX)可以被添加到面(FACE)中。顶点可以是内部的或外部的。
只有边(EDGE)可以被添加到线框(WIRE)中。
只有顶点(VERTEX)可以被添加到边(EDGE)中。
顶点(VERTEX)中不能添加任何内容。

方法

1

创建一个空的线框(Wire)。
void MakeWire (TopoDS_Wire& W) const;

2

创建一个空的壳(Shell)。
void MakeShell (TopoDS_Shell& S) const;

3

创建一个覆盖整个3D空间的实体(Solid)。
void MakeSolid (TopoDS_Solid& S) const;

4

创建一个空的复合实体(Composite Solid)。
void MakeCompSolid (TopoDS_CompSolid& C) const;

5

创建一个空的组合体(Compound)。
void MakeCompound (TopoDS_Compound& C) const;

6

将形状C添加到形状S中。
异常如果S不是自由状态且无法被修改,则抛出TopoDS_FrozenShape异常。
如果S和C不兼容,则抛出TopoDS__UnCompatibleShapes异常。
void Add (TopoDS_Shape& S, const TopoDS_Shape& C) ;

7

从形状S中移除形状C。
异常如果S被冻结且无法被修改,则抛出TopoDS_FrozenShape异常。
void Remove (TopoDS_Shape& S, const TopoDS_Shape& C)

用法用例

在OpenCASCADE(OCCT)中,TopoDS_Builder 是一个用于构建复杂拓扑结构的类,它允许用户按照自定义的方式构建 TopoDS_Shape 对象,例如顶点、边、面或实体等。下面是一个简单的示例,展示如何使用 TopoDS_Builder 类来构建一个简单的几何体,并添加顶点、边和面。

示例:使用 TopoDS_Builder 构建几何体

#include <iostream>
#include <TopoDS.hxx>
#include <TopoDS_Builder.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>int main() {// 创建一个空的 TopoDS_Shape 对象TopoDS_Shape shape;TopoDS_Builder builder;builder.MakeCompound(shape); // 创建一个复合体// 添加一个顶点TopoDS_Vertex vertex;builder.MakeVertex(vertex, gp_Pnt(0.0, 0.0, 0.0)); // 在原点创建一个顶点builder.Add(shape, vertex); // 将顶点添加到复合体中// 添加一条边TopoDS_Edge edge;builder.MakeEdge(edge, gp_Pnt(0.0, 0.0, 0.0), gp_Pnt(1.0, 0.0, 0.0)); // 创建一条连接两个顶点的边builder.Add(shape, edge); // 将边添加到复合体中// 添加一个面TopoDS_Face face;builder.MakeFace(face); // 创建一个空面builder.Add(shape, face); // 将面添加到复合体中// 输出复合体中包含的元素数量std::cout << "Number of elements in the compound shape: " << shape.NbChildren() << std::endl;return 0;
}

示例说明:

  1. 包含头文件

    • <TopoDS.hxx>:包含了 TopoDS_Shape 及其相关类型的定义。
    • <TopoDS_Builder.hxx>:定义了 TopoDS_Builder 类,用于构建拓扑结构。
    • <TopoDS_Vertex.hxx><TopoDS_Edge.hxx><TopoDS_Face.hxx>:定义了分别用于顶点、边和面的 TopoDS 类型。
  2. 创建 TopoDS_Shape 对象

    • 使用 TopoDS_Builder builder; 创建一个 TopoDS_Builder 实例。
    • 使用 builder.MakeCompound(shape); 创建一个空的复合体 TopoDS_Shape 对象。
  3. 添加顶点、边和面

    • 使用 builder.MakeVertex(vertex, gp_Pnt(0.0, 0.0, 0.0)); 创建一个位于原点的顶点,并将其添加到复合体中。
    • 使用 builder.MakeEdge(edge, gp_Pnt(0.0, 0.0, 0.0), gp_Pnt(1.0, 0.0, 0.0)); 创建一条从原点到 (1, 0, 0) 的边,并将其添加到复合体中。
    • 使用 builder.MakeFace(face); 创建一个空的面,并将其添加到复合体中。
  4. 输出

    • 使用 shape.NbChildren() 获取复合体中包含的子元素数量,并输出结果。

示例的运行结果:

如果一切顺利,该示例将输出复合体中包含的元素数量,应该是 3(一个顶点、一条边和一个面)。

这个示例展示了如何使用 TopoDS_Builder 类来逐步构建复杂的拓扑结构。在实际应用中,可以根据需要添加更复杂的拓扑实体,并使用OpenCASCADE提供的各种工具和算法进行更高级的操作和分析。

参考

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Apache Doris + Iceberg 快速搭建指南|Lakehouse 使用手册(三)
  • Openwrt常用说明
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • 【Linux】:环境变量
  • 收银机打印机相关知识 windows7 查看打印机名称--未来之窗智慧经营收银系统百科
  • Linux OS:线程封装 | RAII封装锁 | 随机数运算任务封装
  • 华为校招机试 - 电影知识图谱和查询系统(20240605)
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • 开发框架DevExpress XAF v24.2产品路线图预览——增强跨平台性
  • 医院不良事件监测预警上报系统,PHP不良事件管理系统源码
  • 认识MySQL
  • C++的GUI(图形用户界面)设计工具
  • LeetCode Hot100 二叉搜索树中第K小的元素
  • 探秘企业孵化基地,聚焦国际数字影像产业园
  • Spring有5种自动装配方式,其中autodetect默认使用?
  • es6--symbol
  • Java-详解HashMap
  • markdown编辑器简评
  • mysql_config not found
  • PHP的类修饰符与访问修饰符
  • Rancher如何对接Ceph-RBD块存储
  • ViewService——一种保证客户端与服务端同步的方法
  • vue2.0项目引入element-ui
  • 从tcpdump抓包看TCP/IP协议
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 京东美团研发面经
  • 前嗅ForeSpider教程:创建模板
  • 实现简单的正则表达式引擎
  • 使用common-codec进行md5加密
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ‌JavaScript 数据类型转换
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (C#)一个最简单的链表类
  • (C++20) consteval立即函数
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (算法)区间调度问题
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Scala的“=”符号简介
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .ai域名是什么后缀?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 设计模式初探
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net6+aspose.words导出word并转pdf
  • .Net中间语言BeforeFieldInit
  • .project文件
  • .skip() 和 .only() 的使用
  • .考试倒计时43天!来提分啦!
  • /run/containerd/containerd.sock connect: connection refused
  • :not(:first-child)和:not(:last-child)的用法