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

https://www.cnblogs.com/happytik/p/occt_shape_1.html

 

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。对Non-manifold模型来说,可能存在一些内部边,或者悬边,另外两个值分别对应这两种情况。

对Face来说,Face的法矢方向可能和对应曲面的法矢方向相同(TopAbs_FORWARD),也可能和对应曲面的法矢方向相反(TopAbs_REVERSED),此时使用该数据成员来表示这些情况。

 

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导入时,要读取对象的颜色、图层等信息,就相对复杂了。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值