@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对象及其子对象的更多相关文章

  1. OpenCascade拓扑对象之:TopoDS_Shape的三要素

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  2. OpenCascade拓扑对象之:拓扑对象的层次结构

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  3. 利用window对象下内置的子对象实现网页的刷新

    这里我们用到的window对象下内置的子对象有:     1.history对象:包含浏览器访问过的url.我们可以利用它的history.go(num);属性实现页面的刷新:           h ...

  4. Envelope几何对象 Curve对象几何对象 Multipatch几何对象 Geometry集合接口 IGeometryCollection接口

    Envelope是所有几何对象的外接矩形,用于表示几何对象的最小边框,所有的几何对象都有一个Envelope对象,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax, ...

  5. 传统对象池&AB对象池

    前序: Q:为啥需要对象池? A: 游戏中大量出现或销毁对象时会反复的开堆和放堆,程序与内存之间交互过于频繁导致资源的大量浪费 Q: 对象池实现原理? A: 当子对象池没有物体的时候,它会和普通没加对 ...

  6. js高级---本地对象、内置对象、宿主对象

    名词参考: 原生对象:也叫内部对象.本地对象.native object 内置对象:Build-in object 宿主对象:host object ECMA-262 定义: 原生对象:独立于宿主环境 ...

  7. BOM对象,math对象document对象的属性和操作和 事件的基本操作

    Math对象 //该对象中的属性方法 和数学有关. abs(x) 返回数的绝对值. exp(x) 返回 e 的指数. floor(x) 对数进行下舍入. log(x) 返回数的自然对数(底为e). m ...

  8. JavaScript中的global对象,window对象以及document对象的区别和联系

    JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...

  9. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

随机推荐

  1. Python练习题 003:完全平方数

    [Python练习题 003]一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? --------------------------------------- ...

  2. 使用gettid() 注意事项

    gettid()这个函数不可以在程序中直接使用,它是Linux本身的一个函数, 但是:仅包含#include <sys/types.h>,然后使用,编译时会报该函数未定义之类的错误! 解决 ...

  3. Arduino读取写入电压值

    读取写入方式分为数字和模拟 读取方式:(注意接地) 数字:digitalRead(pin); 模拟:analogRead(A1);float val=value*(5.0/1023.0);       ...

  4. c语言 static的用法

    static在c里面可以用来修饰变量,也可以用来修饰函数.先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混.int a ;int mai ...

  5. Apache账户密码加密方式介绍

    一.apache密码存储格式 apache的用户密码一般会生成保存在.htpasswd文件中,保存路径由用户创建时确定,根据使用加密算法有五种保存格式: [注]:如果用户指定了保存密码的文件名,视用户 ...

  6. npm包管理器报错-npm ERR! Response timeout while trying to fetch https://registry.npmjs.org/@XXX(over 30000ms)

    由于这两天买的新电脑在短期内频频蓝屏.卡机,不得不把自己其他的本本拿出来换上,但是程序员换电脑是真的痛苦,其他不说就说一个配环境 真的折腾哈 我是一名前端菜鸟,现在自己的本本上使用的是npm包管理工具 ...

  7. Linux系统编程—有名管道

    ▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...

  8. js日志输出还是只会console.log么,那你就out了

    几乎所有的javascript开发者最常使用的日志打印调试api都是console.log(),其实还有很多的选项供我们选择,笔者下面就为大家一一介绍. 一.console.table() conso ...

  9. 开始接触flex

    flex框架使用的是.mxml后缀的文件,可以在Eclipse导入flex开发的插件.代码写完之后需要进行编译成为.swf文件成功之后才可以正常运行.现在刚开始接触金融的项目,需求什么的还有很多不是理 ...

  10. mqtt网关

    MQTT网关 MQTT网关是可以是将普通的串口数据.Modbus RTU数据等转化为MQTT协议的从而方便与平台的对接,通过连接服务器.订阅和发布主题来实现传统设备和MQTT云端的联系.例如,笔记本和 ...