@font-face { font-family: "Times New Roman" }
@font-face { font-family: "宋体" }
@font-face { font-family: "Wingdings" }
@list l0:level1{
mso-level-number-format:decimal;
mso-level-suffix:none;
mso-level-text:"%1、";
mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:0.0000pt;
text-indent:0.0000pt;
font-family:'Times New Roman';}
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 }

OpenCascade使用TopoDS_Shape类表示一个拓扑对象,这个类记录了拓扑对象的三个主要数据:位置、方向和共享对象,具体由如下三个数据成员表示:

Handle(TopoDS_TShape) myTShape;

TopLoc_Location myLocation;

TopAbs_Orientation myOrient;

可以说,这三个数据成员,充分考虑的共享数据的需求。

1、myTShape字段

首先说,myTShape这个数据成员,是一个句柄指针(共享指针),记录了一个基于引用计数计数共享的TopoDS_TShape派生的对象。该对象记录了拓扑对象的具体数据,包括:拓扑数据和几何数据。例如:这个可能是一个BRep_TEdge对象,记录了一条共边的数据,包括:一条3D曲线、曲线的参数范围等等数据,或者可能是BRep_TFace对象,记录了一个曲面对象及其相关数据。另外,TopoDS_TShape记录了子对象的链表,等等。

这里,使用句柄指针,就是为了方便共享,例如:对拓扑对象中的两个有向边,通常公用一个共边,这里myTShape中就记录了共边对象及其数据。

2、myOrient字段

myOrient记录了拓扑对象的方向。由于OCCT支持non-manifold模型,因此定义了四种类型:

TopAbs_FORWARD,

TopAbs_REVERSED,

TopAbs_INTERNAL,

TopAbs_EXTERNAL

对manifold模型中,通常一个共边对应两个有向边,两个有向边,方向一正一反,对应一个是TopAbs_FORWARD,一个是TopAbs_REVERSED。

对于一些被多个Face共享的曲面对象,一些face的方向和曲面同向,一些face的方向和曲面反向,通过该字段来进行区分。

其他两种对应non-manifold模型中的一些情况。

3、myLocation字段

myLocation记录了一个对象的位置信息。考虑,一个球被阵列了10次,显然这里球的Face对象除了位置发生了改变,其他都是相同的。基于共享的考虑,那么会生成10个TopoDS_Shape对象,每个对象记录相同的BRep_TFace对象,方向可能相同,可能相反,而myLocation记录了如何从原始Face对象经过变换变换到最终对象。

这样,通过共享曲面对象等数据,大大减少了拓扑对象占用内存的大小,减小了模型的大小。同时,由于共享了对象,一些后续的操作也得以可行,或者得到简化。

对一个TopoDS_Shape对象,通过在定时器中不断改变位置信息,可以实现简单的动画效果,当然,这个的效率是不高的。

这三个字段构成了OCCT众多拓扑对象处理的基础,也在很多方面决定了一些处理机制。

例如:OCCT的拓扑对象没有回指指针,就是没法从Edge快速的得到Face对象,通过类似:edge->face的操作。通常的途径,是遍历Face中的Edge对象,创建一个Edge和关联face的表格,得到所邻接的Face对象,这个在很多处理中会影响到效率,增加编码实现的复杂性。

另外,TopoDS_Shape对象也没有办法记录一些属性信息,例如:拓扑对象的颜色信息,缺乏Parasolid类似的attrib列表机制。这个也导致一些处理上的复杂性,例如:step导入时,要读取对象的颜色、图层等信息,就相对复杂了。

最新文章

  1. 前端学HTTP之WEB服务器
  2. sql查询,不在某一范围问题的新思路
  3. tp5 中 model 的更新方法
  4. maven配置阿里云镜像
  5. Sybase 数据库新增用户,赋权
  6. Linux bash运维操作日志审计(单服务器)
  7. Python学习总结15:时间模块datetime & time & calendar (二)
  8. python 传入参数返回的时候好像有些时候会出现莫名其妙的循环
  9. 前端编辑器 之 sublime-text3
  10. 使用celery之怎么让celery跑起来
  11. 关于Mac设置alias别名访问服务器
  12. 【Spring源码分析】原型Bean实例化过程、byName与byType及FactoryBean获取Bean源码实现
  13. OAuth2.0学习(1-10)新浪开放平台微博认证-手机应用授权和refresh_token刷新access_token
  14. 微信小程序地图控件篇 ---自定义图标被地图覆盖的问题
  15. Ubuntu 18.04 LTS搭建GO语言开发环境
  16. iOS 推荐几篇关于Objective-c 动态语言的文章
  17. NOIP2011 D2T3 观光公交 做题笔记
  18. POJ 1986 Distance Queries(LCA Tarjan法)
  19. UVa839
  20. Gamma函数深入理解

热门文章

  1. Chrome使用video无法正常播放MP4视频的解决方案
  2. Python-判断变量类型和继承链-type isinstance
  3. FastReport.Mono添加了新的条形码ITF-14
  4. 三级菜单打怪升级,young -> plus -> pro
  5. 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字
  6. 9.13 考试 T2 区间
  7. 【学习笔记】Polya定理
  8. SpringBoot 完整学习笔记免费分享
  9. 云原生 go-zero 微服务框架
  10. 你想了解的《javaScript语言精粹》(三)