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_Vertex
、TopoDS_Edge
、TopoDS_Face
、TopoDS_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 前言 描述了一个形状,它 引用了一个基础形状,该基础形状有可能被赋予一个位置和方向 为基础形状提供了一个位置,定义了它在本地坐标系中的位置为基础形状提供了一个方向,这是从几何学的角度ÿ…...
Self-study Python Fish-C Note15 P52to53
函数 (part 5) 本节主要讲函数文档、类型注释、内省、高阶函数 函数文档、类型注释、内省 (P52) 函数文档 函数是一种代码封装的方法,对于一个程序来说,函数就是一个结构组件。在函数的外部是不需要关心函数内部的执行细节的,更需要关注的…...

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

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

android系统中data下的xml乱码无法查看问题剖析及解决方法
背景: Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型,根本没办法看xml的内容具体如下: 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的,这些syste…...
MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引
若想在一个已经存在的表上创建索引,可以使用 CREATE INDEX.语句,CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中,UNIQUE、FULLTEXT 和…...

html+css 实现hover选择按钮
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...
Python数据可视化利器:Matplotlib详解
目录 Matplotlib简介安装MatplotlibMatplotlib基本用法 简单绘图子图和布局图形定制 常见图表类型 折线图柱状图散点图直方图饼图 高级图表和功能 3D绘图热图极坐标图 交互和动画与其他库的集成 与Pandas集成与Seaborn集成 常见问题与解决方案总结 Matplotlib简介 Matplotli…...

2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)
2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac) 1 创建Python环境 首先需要安装Miniconda: 大家可以根据自己的网络情况从下面的地址下载: miniconda官网地址:https://docs.conda.io/en/latest/miniconda.html 清华大学镜像地…...
介绍rabbitMQ
RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP),主要用于在不同的应用程序之间进行异步通信。以下是关于RabbitMQ的详细介绍: 一、基本概念 消息中间件:RabbitMQ是一个消息中间件&#x…...

AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视
关键词:深度学习、近视预测、早期干预、屈光数据 儿童近视已经成为一个全球性的重大健康议题。其发病率持续攀升,且有可能演变成严重且不可逆转的状况,这不仅对家庭幸福构成威胁,还带来巨大的经济负担。当前的研究着重指出&#x…...
VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发
在VB.NET中,利用Windows Presentation Foundation (WPF) 进行图形界面开发是一个强大的选择,因为它提供了丰富的UI元素、动画、数据绑定以及样式和模板等高级功能。以下是在VB.NET项目中使用WPF进行图形界面开发的基本步骤: 1. 创建一个新的…...

Go语言标准库中的双向链表的基本用法
什么是二分查找区间? 什么是链表? 链表节点的代码实现: 链表的遍历: 链表如何插入元素? go语言标准库的链表: 练习代码: package mainimport ("container/list""fm…...

手机游戏录屏软件哪个好,3款软件搞定游戏录屏
在智能手机普及的今天,越来越多的人喜欢在手机上玩游戏,并希望能够录制游戏过程或者分享游戏技巧。然而,面对市面上众多的手机游戏录屏软件,很多人可能会陷入选择困难。究竟手机游戏录屏软件哪个好?在这篇文章中&#…...
【力扣】4.寻找两个正序数组的中位数
题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.0…...

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

知识图谱学习总结
1 知识图谱的介绍 知识图谱,是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系,通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识,使信息资源更易于计算、理解以及评价,并能实现知识的快速响…...
2021-10-23 51单片机LED1-8按秒递增闪烁
缘由51单片机,八个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中宏观的看待线程
线程一旦被创建,几乎所有的资源都是被所有的线程共享的。线程也一定要有自己私有的资源,什么样的资源应该是线程私有的? 1.PCB属性私有 2.要有一定的私有上下文结构 3.每个线程都要有独立的栈结构 ps -aL ##1. Linux线程概念 ###什么是线程…...
提示libfakeroot.so或libfakeroot-sysv.so出错处理方法
在RK3588 Buildroot SDK里面,uboot和kernel使用的是prebuild目录下的交叉编译链,而buildroot和APP编译则使用Buildroot生成的交叉编译链来编译(如:位于buildroot/output/rockchip_rk3588/host目录为交叉编译工具链目录)…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...