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

opencascade TopoDS_Shape源码学习【重中之重】

opencascade TopoDS_Shape
在这里插入图片描述

前言

描述了一个形状,它 引用了一个基础形状,该基础形状有可能被赋予一个位置和方向 为基础形状提供了一个位置,定义了它在本地坐标系中的位置为基础形状提供了一个方向,这是从几何学的角度(而不是相对于其他形状的方向)来定义的。注意:如果一个形状引用的基础形状的形状列表为空,则该形状被视为空。

1

创建一个不引用任何内容的空形状
TopoDS_Shape() : myOrient(TopAbs_EXTERNAL);

2

通用移动构造函数,也接受子类(TopoDS_Shape层次结构仅声明了没有额外字段的假子类)。
template
TopoDS_Shape(T2&& theOther, typename std::enable_if<opencascade::std::is_base_of<TopoDS_Shape, T2>::value>::type* = 0)
: myTShape(std::forward(theOther).myTShape),
myLocation(std::forward(theOther).myLocation),
myOrient(std::forward(theOther).myOrient) ;

3

通用移动赋值运算符。
template
typename std::enable_if<opencascade::std::is_base_of<TopoDS_Shape, T2>::value, TopoDS_Shape>::type&
operator=(T2&& theOther) ;

4

如果此形状为空,则返回true。换句话说,它不引用任何可能被赋予位置和方向的基础形状。
IsNull() ;

5

销毁存储在此形状中的对基础形状的引用。结果,此形状变为空。
void Nullify() ;

6

返回形状的局部坐标系。
const TopLoc_Location& Location() const { return myLocation; }

7

设置形状的局部坐标系。
void Location(const TopLoc_Location& theLoc, const Standard_Boolean theRaiseExc = Standard_True) ;

8

返回一个与相似但局部坐标系设置为的形状。
TopoDS_Shape Located(const TopLoc_Location& theLoc, const Standard_Boolean theRaiseExc = Standard_True) ;

9

返回形状的方向。
TopAbs_Orientation Orientation() const { return myOrient; }

10

设置形状的方向。
void Orientation(TopAbs_Orientation theOrient) { myOrient = theOrient; }

11

返回一个与相似但方向设置为的形状。
TopoDS_Shape Oriented(TopAbs_Orientation theOrient) const
{
TopoDS_Shape aShape(*this);
aShape.Orientation(theOrient);
return aShape;
}
#### 12
返回一个指向实际形状实现的句柄。
const Handle(TopoDS_TShape)& TShape() const { return myTShape; }
#### 13
返回与此形状对应的TopAbs_ShapeEnum枚举值,
例如VERTEX、EDGE等。 异常 如果此形状为空,则抛出Standard_NullObject异常。
TopAbs_ShapeEnum ShapeType() const { return myTShape->ShapeType(); }
#### 14
返回自由标志的值。
Standard_Boolean Free() const { return myTShape->Free(); }
#### 15
设置自由标志。
void Free(Standard_Boolean theIsFree) { myTShape->Free(theIsFree); }
#### 16
返回锁定标志的值。
Standard_Boolean Locked() const { return myTShape->Locked(); }
#### 17
设置锁定标志。
void Locked(Standard_Boolean theIsLocked) { myTShape->Locked(theIsLocked); }
#### 18
返回修改标志的值。
Standard_Boolean Modified() const { return myTShape->Modified(); }
#### 19
设置修改标志。
void Modified(Standard_Boolean theIsModified) { myTShape->Modified(theIsModified); }
####20
返回检查标志的值。
Standard_Boolean Checked() const { return myTShape->Checked(); }
#### 21
设置检查标志。
void Checked(Standard_Boolean theIsChecked) { myTShape->Checked(theIsChecked); }

22

返回可定向性标志的值。
Standard_Boolean Orientable() const { return myTShape->Orientable(); }

23

设置可定向性标志。
void Orientable(const Standard_Boolean theIsOrientable) { myTShape->Orientable(theIsOrientable); }

24

返回封闭性标志的值。
Standard_Boolean Closed() const { return myTShape->Closed(); }

25

设置封闭性标志。
void Closed(Standard_Boolean theIsClosed) { myTShape->Closed(theIsClosed); }

26

返回无穷性标志的值。
Standard_Boolean Infinite() const { return myTShape->Infinite(); }

27

设置无穷性标志。
void Infinite(Standard_Boolean theIsInfinite) { myTShape->Infinite(theIsInfinite); }

28

返回凸性标志的值。
Standard_Boolean Convex() const { return myTShape->Convex(); }

29

设置凸性标志。
void Convex(Standard_Boolean theIsConvex) { myTShape->Convex(theIsConvex); }

30

将形状的位置乘以thePosition。
void Move(const TopLoc_Location& thePosition, const Standard_Boolean theRaiseExc = Standard_True) ;

31

返回一个与相似但位置乘以thePosition的形状。
TopoDS_Shape Moved(const TopLoc_Location& thePosition, const Standard_Boolean theRaiseExc = Standard_True) ;

32

使用TopAbs包中的Reverse方法反转方向。
void Reverse() { myOrient = TopAbs::Reverse(myOrient); }

33

返回一个与相似但方向使用TopAbs包中的Reverse方法反转的形状。
TopoDS_Shape Reversed() const ;

34

使用TopAbs包中的Complement方法补全方向。
void Complement() { myOrient = TopAbs::Complement(myOrient); }

35

返回一个与相似但方向使用TopAbs包中的Complement方法补全的形状。
TopoDS_Shape Complemented() const ;

36

使用TopAbs包中的Compose方法更新形状的方向,通过与theOrient组合。
void Compose(TopAbs_Orientation theOrient) ;

37

返回一个与相似但方向使用TopAbs包中的Compose方法与theOrient组合的形状。
TopoDS_Shape Composed(TopAbs_Orientation theOrient) const ;

38

返回直接子形状(子节点)的数量。
TopoDS_Iterator 用于访问子形状
Standard_Integer NbChildren() const { return myTShape.IsNull() ? 0 : myTShape->NbChildren(); }

39

//! 如果两个形状是伙伴,则返回True,即如果它们共享同一个TShape。
//! 位置和方向可能不同。
Standard_Boolean IsPartner(const TopoDS_Shape& theOther) const { return (myTShape == theOther.myTShape); }

40

//! 如果两个形状相同,则返回True,即如果它们共享同一个TShape和相同的位置。
//! 方向可能不同。
Standard_Boolean IsSame(const TopoDS_Shape& theOther) const
{
return myTShape == theOther.myTShape
&& myLocation == theOther.myLocation;
}

45

//! 如果两个形状相等,则返回True,即如果它们共享同一个TShape、相同的位置和方向。
Standard_Boolean IsEqual(const TopoDS_Shape& theOther) const
{
return myTShape == theOther.myTShape
&& myLocation == theOther.myLocation
&& myOrient == theOther.myOrient;
}

46

//! 返回一个表示的哈希值。该值在范围[1, theUpperBound]内。它是根据
//! TShape和Location计算得出的。Orientation(方向)未被使用。
//! @param theUpperBound 计算哈希码时必须位于的范围的上界
//! @return 一个计算出的哈希码,范围在[1, theUpperBound]内
Standard_EXPORT Standard_Integer HashCode(Standard_Integer theUpperBound) const;

47

//! 用一个新的Shape替换,该Shape具有相同的
//! Orientation(方向)和Location(位置),以及一个新的TShape,该TShape具有
//! 相同的几何形状但没有子形状。
void EmptyCopy() { myTShape = myTShape->EmptyCopy(); }

48

//! 返回一个新的Shape,该Shape具有相同的
//! Orientation(方向)和Location(位置),以及一个新的TShape,该TShape具有
//! 相同的几何形状但没有子形状。
TopoDS_Shape EmptyCopied() const
{
TopoDS_Shape aShape(*this);
aShape.EmptyCopy();
return aShape;
}

49

设置TShape
void TShape(const Handle(TopoDS_TShape)& theTShape) { myTShape = theTShape; }

50

将我的内容转储到流中
Standard_EXPORT void DumpJson(Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;

用法用例

TopoDS_Shape 是 OpenCASCADE 中表示拓扑形状的基类,它本身是一个抽象类,不能直接实例化。但是,它定义了一些方法和操作,可以通过其派生类(如 TopoDS_VertexTopoDS_EdgeTopoDS_FaceTopoDS_Solid 等)来操作和访问拓扑形状的属性和信息。

以下是一些示例,展示了如何使用 TopoDS_Shape 类中的方法及其派生类的操作:

1. 获取拓扑类型

通过 ShapeType() 方法可以获取拓扑形状的类型,它返回一个枚举值,表示形状的具体类型(顶点、边、面、实体等)。

#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Solid.hxx>
#include <TopExp.hxx>
#include <iostream>void PrintShapeType(const TopoDS_Shape& shape) {switch (shape.ShapeType()) {case TopAbs_VERTEX:std::cout << "Shape is a vertex." << std::endl;break;case TopAbs_EDGE:std::cout << "Shape is an edge." << std::endl;break;case TopAbs_FACE:std::cout << "Shape is a face." << std::endl;break;case TopAbs_SOLID:std::cout << "Shape is a solid." << std::endl;break;default:std::cout << "Unknown shape type." << std::endl;break;}
}int main() {// 示例:创建一个顶点TopoDS_Vertex vertex;// 在实际应用中,需要通过构造函数或者其他方法来创建顶点// 打印顶点的类型PrintShapeType(vertex);return 0;
}
2. 拓扑结构查询

通过 TopExp 类提供的方法可以进行更复杂的拓扑结构查询,如查找顶点、边、面之间的关系和连接。

#include <TopoDS_Shape.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopExp.hxx>
#include <iostream>void PrintConnectedEdges(const TopoDS_Vertex& vertex) {// 查找连接到顶点的边TopTools_IndexedMapOfShape edgeMap;TopExp::MapShapes(vertex, TopAbs_EDGE, edgeMap);for (int i = 1; i <= edgeMap.Extent(); ++i) {const TopoDS_Edge& edge = TopoDS::Edge(edgeMap(i));std::cout << "Connected edge with orientation: " << (edge.Orientation() == TopAbs_FORWARD ? "Forward" : "Reversed") << std::endl;}
}int main() {// 示例:创建一个顶点和一条边TopoDS_Vertex vertex;// 在实际应用中,需要通过构造函数或者其他方法来创建顶点TopoDS_Edge edge;// 在实际应用中,需要通过构造函数或者其他方法来创建边// 打印顶点连接的边PrintConnectedEdges(vertex);return 0;
}
3. 拓扑属性访问

通过 TopoDS_Shape 类及其派生类可以访问拓扑形状的特定属性,如边的起点和终点、面的法向量等。

#include <TopoDS_Shape.hxx>
#include <TopoDS_Edge.hxx>
#include <BRep_Tool.hxx>
#include <gp_Pnt.hxx>
#include <iostream>void PrintEdgeVertices(const TopoDS_Edge& edge) {// 获取边的起点和终点坐标const TopoDS_Vertex& startVertex = TopExp::FirstVertex(edge);const TopoDS_Vertex& endVertex = TopExp::LastVertex(edge);gp_Pnt startPoint = BRep_Tool::Pnt(startVertex);gp_Pnt endPoint = BRep_Tool::Pnt(endVertex);std::cout << "Edge start point: (" << startPoint.X() << ", " << startPoint.Y() << ", " << startPoint.Z() << ")" << std::endl;std::cout << "Edge end point: (" << endPoint.X() << ", " << endPoint.Y() << ", " << endPoint.Z() << ")" << std::endl;
}int main() {// 示例:创建一条边TopoDS_Edge edge;// 在实际应用中,需要通过构造函数或者其他方法来创建边// 打印边的起点和终点坐标PrintEdgeVertices(edge);return 0;
}

这些示例展示了如何利用 TopoDS_Shape 及其派生类的方法来操作和查询拓扑形状的信息。在实际应用中,根据具体的需求和场景,可以进一步组合和扩展这些方法,以实现更复杂的几何建模和拓扑操作。
参考

相关文章:

opencascade TopoDS_Shape源码学习【重中之重】

opencascade TopoDS_Shape 前言 描述了一个形状&#xff0c;它 引用了一个基础形状&#xff0c;该基础形状有可能被赋予一个位置和方向 为基础形状提供了一个位置&#xff0c;定义了它在本地坐标系中的位置为基础形状提供了一个方向&#xff0c;这是从几何学的角度&#xff…...

Self-study Python Fish-C Note15 P52to53

函数 (part 5) 本节主要讲函数文档、类型注释、内省、高阶函数 函数文档、类型注释、内省 (P52) 函数文档 函数是一种代码封装的方法&#xff0c;对于一个程序来说&#xff0c;函数就是一个结构组件。在函数的外部是不需要关心函数内部的执行细节的&#xff0c;更需要关注的…...

Java小白入门到实战应用教程-异常处理

Java小白入门到实战应用教程-异常处理 前言 我们这一章节进入到异常处理知识点的学习。异常是指程序在运行时遇到的一种特殊情况&#xff0c;它能打断了正常的程序执行流程。 而异常处理是一项至关重要的技术&#xff0c;它使得程序能够优雅地处理运行时错误&#xff0c;避免…...

使用Anaconda安装多个版本的Python并与Pycharm进行对接

1、参考链接 Anaconda安装使用教程解决多Python版本问题_anaconda安装多个python版本-CSDN博客 基于上面的一篇博客的提示&#xff0c;我做了尝试。并在Pycharm的对接上做了拓展。 2、首先安装Anaconda 这个比较简单&#xff0c;直接安装即可&#xff1a; 3、设置conda.exe的…...

android系统中data下的xml乱码无法查看问题剖析及解决方法

背景&#xff1a; Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型&#xff0c;根本没办法看xml的内容具体如下&#xff1a; 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的&#xff0c;这些syste…...

​MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引

若想在一个已经存在的表上创建索引&#xff0c;可以使用 CREATE INDEX.语句&#xff0c;CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中&#xff0c;UNIQUE、FULLTEXT 和…...

html+css 实现hover选择按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目…...

Python数据可视化利器:Matplotlib详解

目录 Matplotlib简介安装MatplotlibMatplotlib基本用法 简单绘图子图和布局图形定制 常见图表类型 折线图柱状图散点图直方图饼图 高级图表和功能 3D绘图热图极坐标图 交互和动画与其他库的集成 与Pandas集成与Seaborn集成 常见问题与解决方案总结 Matplotlib简介 Matplotli…...

2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)

2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac) 1 创建Python环境 首先需要安装Miniconda&#xff1a; 大家可以根据自己的网络情况从下面的地址下载&#xff1a; miniconda官网地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地…...

介绍rabbitMQ

RabbitMQ是一个开源的消息代理软件&#xff0c;实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;主要用于在不同的应用程序之间进行异步通信。以下是关于RabbitMQ的详细介绍&#xff1a; 一、基本概念 消息中间件&#xff1a;RabbitMQ是一个消息中间件&#x…...

AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视

关键词&#xff1a;深度学习、近视预测、早期干预、屈光数据 儿童近视已经成为一个全球性的重大健康议题。其发病率持续攀升&#xff0c;且有可能演变成严重且不可逆转的状况&#xff0c;这不仅对家庭幸福构成威胁&#xff0c;还带来巨大的经济负担。当前的研究着重指出&#x…...

VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发

在VB.NET中&#xff0c;利用Windows Presentation Foundation (WPF) 进行图形界面开发是一个强大的选择&#xff0c;因为它提供了丰富的UI元素、动画、数据绑定以及样式和模板等高级功能。以下是在VB.NET项目中使用WPF进行图形界面开发的基本步骤&#xff1a; 1. 创建一个新的…...

Go语言标准库中的双向链表的基本用法

什么是二分查找区间&#xff1f; 什么是链表&#xff1f; 链表节点的代码实现&#xff1a; 链表的遍历&#xff1a; 链表如何插入元素&#xff1f; go语言标准库的链表&#xff1a; 练习代码&#xff1a; package mainimport ("container/list""fm…...

手机游戏录屏软件哪个好,3款软件搞定游戏录屏

在智能手机普及的今天&#xff0c;越来越多的人喜欢在手机上玩游戏&#xff0c;并希望能够录制游戏过程或者分享游戏技巧。然而&#xff0c;面对市面上众多的手机游戏录屏软件&#xff0c;很多人可能会陷入选择困难。究竟手机游戏录屏软件哪个好&#xff1f;在这篇文章中&#…...

【力扣】4.寻找两个正序数组的中位数

题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.0…...

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类&#xff0c;我们可以类中定义成员变量和成员函数&#xff0c;实现模块化封装&#xff0c;从而构建更加抽象和复杂的工程。 &…...

知识图谱学习总结

1 知识图谱的介绍 知识图谱&#xff0c;是结构化的语义知识库&#xff0c;用于迅速描述物理世界中的概念及其相互关系&#xff0c;通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识&#xff0c;使信息资源更易于计算、理解以及评价&#xff0c;并能实现知识的快速响…...

2021-10-23 51单片机LED1-8按秒递增闪烁

缘由51单片机&#xff0c;八个LED灯按LED1亮1s灭1s,LED1亮2s 灭2s以此类推的方式亮灭-编程语言-CSDN问答 #include "REG52.h" sbit K1 P1^0; sbit K2 P1^1; sbit K3 P1^2; sbit K4 P1^3; sbit P1_0P2^0; sbit P1_1P2^1; sbit P1_2P2^2; sbit P1_3P2^3; sbit P1_…...

在Linux中宏观的看待线程

线程一旦被创建&#xff0c;几乎所有的资源都是被所有的线程共享的。线程也一定要有自己私有的资源&#xff0c;什么样的资源应该是线程私有的&#xff1f; 1.PCB属性私有 2.要有一定的私有上下文结构 3.每个线程都要有独立的栈结构 ps -aL ##1. Linux线程概念 ###什么是线程…...

提示libfakeroot.so或libfakeroot-sysv.so出错处理方法

在RK3588 Buildroot SDK里面&#xff0c;uboot和kernel使用的是prebuild目录下的交叉编译链&#xff0c;而buildroot和APP编译则使用Buildroot生成的交叉编译链来编译&#xff08;如&#xff1a;位于buildroot/output/rockchip_rk3588/host目录为交叉编译工具链目录&#xff09…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...