OpenCascade拓扑对象之:TopoDS_Shape对象及其子对象
@font-face { font-family: "Times New Roman" }
@font-face { font-family: "宋体" }
@font-face { font-family: "Wingdings" }
p.MsoNormal { mso-style-name: 正文; mso-style-parent: ""; margin: 0 0 0.0001pt; mso-pagination: none; text-align: justify; text-justify: inter-ideograph; font-family: "Times New Roman"; mso-fareast-font-family: 宋体; color: rgba(0, 0, 0, 1); font-size: 10.5pt; mso-font-kerning: 1.0000pt }
{ font-family: "Times New Roman" }
span.msoIns { mso-style-type: export-only; mso-style-name: ""; text-decoration: underline; text-underline: single; color: rgba(0, 0, 255, 1) }
span.msoDel { mso-style-type: export-only; mso-style-name: ""; text-decoration: line-through; color: rgba(255, 0, 0, 1) }
table.MsoNormalTable { mso-style-name: 普通表格; mso-style-parent: ""; mso-style-noshow: yes; mso-tstyle-rowband-size: 0; mso-tstyle-colband-size: 0; mso-padding-alt: 0.0000pt 5.4000pt 0.0000pt 5.4000pt; mso-para-margin: 0pt; mso-para-margin-bottom: .0001pt; mso-pagination: widow-orphan; font-family: "Times New Roman"; font-size: 10pt; mso-ansi-language: #0400; mso-fareast-language: #0400; mso-bidi-language: #0400 }
@page { mso-page-border-surround-header: no mso-page-border-surround-footer: no }
@page Section0 { margin-top: 72pt margin-bottom: 72pt margin-left: 90pt margin-right: 90pt size: 595.3000pt 841.9000pt layout-grid: 15.6000pt }
div.Section0 { page: Section0 }
TopoDS_Shape对象的子对象,作为一个链表保存在TopoDS_TShape对象中,如下:
class TopoDS_TShape : public Standard_Transient
{
...
private:
...
TopoDS_ListOfShape myShapes;
Standard_Integer myFlags;
};
这里,myShapes是一个TopoDS_Shape对象的列表。
首先,该列表放在BopoDS_TShape中,即放在共享对象中,是因为对一些共享对象的子对象,通常使用被共享的。例如:一个Face的Wire对象,如果Face是被共享,Wire对象也是随之共享的。
其次,使用TopoDS_Shape对象,而不是TopoDS_TShape对象,因为子对象也可以具有方向、位置等信息,或者说子对象也可以是被多处共享的对象。例如:Edge的Vertex对象,会把汇集到该Vertex的多条Edge共享,但对每个Edge来说,该Vertex的方向可能是不同的。
这里,父子关系是一个单向的关系,即每个对象记录了各自的子对象列表,非常简单。反过来的引用关系,没有记录,例如:wire所在的face是谁,没有记录。这个应当由如下原因:
A) 由于OCCT的对象共享基于局部机制,使用了基于引用技术的技术。如果记录了反向的信息,可能引起循环依赖。例如:Face记录了Edge的共享对象,而Edge又反向记录了Face对象,则会形成循环依赖,是对象自动释放时,可能两者都释放不了,这个是引用计数计数的一个问题。
B)出于共享的考虑。因为,可能一个Wire对象既可能是一个Face的外环,也可以是另一个Face的内环(例如:孔的情况)。特别是由于OCCT支持non-manifold情形,一个Wire可能被多个Face所共享,因此记录反向关系,管理起来会比较复杂,特别是模型频繁改变的情况下。
如此一来,要获取子对象所在的父对象,通常需要建表机制,通过遍历父对象的子对象,建立子对象和父对象对应关系的表,例如:遍历Face的Edge,建立Edge和face间的表,从而获得Edge邻接的Face对象列表。这个主要是TopExp包中的类TopExp提供了对应的建表方法,这个方法在OCCT的拓扑算法中是主要的方式,这个也导致OCCT的一些处理效率比较慢。
相对Parasolid中的简洁记录,例如:
struct LOOP_s // Loop
{
int node_id; // $d
union ATTRIB_GROUP_u attributes_groups; // $p
struct FIN_s *fin; // $p
struct FACE_s *face; // $p
struct LOOP_s *next; // $p
};
参见《Parasolid XT Format Reference》
Loop直接记录了所在的face,OCCT的方式显然是低效的。
OpenCascade拓扑对象之:TopoDS_Shape对象及其子对象的更多相关文章
- OpenCascade拓扑对象之:TopoDS_Shape的三要素
@font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...
- OpenCascade拓扑对象之:拓扑对象的层次结构
@font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...
- 利用window对象下内置的子对象实现网页的刷新
这里我们用到的window对象下内置的子对象有: 1.history对象:包含浏览器访问过的url.我们可以利用它的history.go(num);属性实现页面的刷新: h ...
- Envelope几何对象 Curve对象几何对象 Multipatch几何对象 Geometry集合接口 IGeometryCollection接口
Envelope是所有几何对象的外接矩形,用于表示几何对象的最小边框,所有的几何对象都有一个Envelope对象,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax, ...
- 传统对象池&AB对象池
前序: Q:为啥需要对象池? A: 游戏中大量出现或销毁对象时会反复的开堆和放堆,程序与内存之间交互过于频繁导致资源的大量浪费 Q: 对象池实现原理? A: 当子对象池没有物体的时候,它会和普通没加对 ...
- js高级---本地对象、内置对象、宿主对象
名词参考: 原生对象:也叫内部对象.本地对象.native object 内置对象:Build-in object 宿主对象:host object ECMA-262 定义: 原生对象:独立于宿主环境 ...
- BOM对象,math对象document对象的属性和操作和 事件的基本操作
Math对象 //该对象中的属性方法 和数学有关. abs(x) 返回数的绝对值. exp(x) 返回 e 的指数. floor(x) 对数进行下舍入. log(x) 返回数的自然对数(底为e). m ...
- JavaScript中的global对象,window对象以及document对象的区别和联系
JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...
- matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象
一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...
随机推荐
- Devops实战(一)Docker的部署安装以及Docker-Compose的使用
Docker的部署安装以及Docker-Compose的使用 1.docker和docker-Compose简介 Docker是一组平台即服务(PaaS)产品,它们使用操作系统级虚拟化以称为容器的软件 ...
- spark-4-文件读写
hdfs文件读写报错: AccessControlException: Permission denied: user=root, access=WRITE, inode="/user/ch ...
- 我竟在arm汇编除法算法里找到了leetcode某道题的解法
今天讲讲arm汇编中除法的底层实现.汇编代码本身比较长了,如需参考请直接拉到文末. 下面我直接把arm的除法算法的汇编代码转译成C语言的代码贴出来,并进行解析. 因为篇幅有限,所以在此只解析无符号整型 ...
- nessus 家庭版安装教程(windows)
1.根据系统选择安装包:https://www.tenable.com/products/nessus/select-your-operating-system 2.申请激活码,在我们安装的时候差不多 ...
- matlab中set设置图形属性
来源:https://ww2.mathworks.cn/help/matlab/ref/set.html?searchHighlight=set&s_tid=doc_srchtitle set ...
- shiro入门学习--授权(Authorization)|筑基初期
写在前面 经过前面的学习,我们了解了shiro中的认证流程,并且学会了如何通过自定义Realm实现应用程序的用户认证.在这篇文章当中,我们将学习shiro中的授权流程. 授权概述 这里的授权指的是授予 ...
- 一文带你定制unittest测试用例的名称
在之前的文章中,我在之前的文章中提到过,这里呢,考虑后,感觉之前的写法不够优雅,于是乎呢,我自己抽空去研究了下,主要是新写方法,这样呢,以后的要使用的时候,可以直接去使用,而不是每次换个环境就要修改环 ...
- 二进制K8S集群使用Bootstrap Token 方式增加Node
TLS Bootstraping:在kubernetes集群中,Node上组件kebelet和kube-proxy都需要与kube-apiserver进行通信,为了增加传输安全性,采用https方式, ...
- 第1天 | 12天搞定Python,告诉你有什么用?
掌握多一门编程语言,多一种选择,多一份机遇,更何况学的是人见人爱,花见花开的Python语言.它目前可占据编程语言排行榜的第3名,是名副其实的"探花郎",无论用它做什么(网络爬虫. ...
- redis 开启AOF
找到redis 安装目录 例如 cd /usr/local/redis 打开 redis.conf 修改以下参数: # vi /usr/local/redis/etc/redis.conf appe ...