OpenCascade拓扑对象之:拓扑对象的层次结构
OCCT中,拓扑对象有两个基类,并派生出各自的子类。一个是TopoDS_Shape类,一个是TopoDS_TShape类。
类继承关系如下:
这里,TopoDS_Shape类中记录了一个TopoDS_TShape对象的智能指针,如下:
Handle(TopoDS_TShape) myTShape;
注意到,从TopoDS_Shape派生的类,基本上没有什么数据成员,这些类主要是作为一种拓扑类型存在,提供更加准确的拓扑对象类型。
另一方面,TopoDS_Shape方便共享对象的一些处理。特别是,反向对象的生成。例如,如下常见的处理代码:
TopoDS_Wire ShapeAnalysis::OuterWire(const TopoDS_Face& face) { TopoDS_Face F = face; F.Orientation(TopAbs_FORWARD);或者:
TopoDS_Edge NewEdge = Edge1; NewEdge.EmptyCopy(); // Add the vertices BRep_Builder aBuilder; TopoDS_Shape anEdge = NewEdge.Oriented(TopAbs_FORWARD); aBuilder.Add(anEdge,V1.Oriented(TopAbs_FORWARD)); aBuilder.Add(anEdge,V2.Oriented(TopAbs_REVERSED));
后者,拷贝了Edge的几何数据(曲线等),然后生成一个共享TEdge对象的正向的Edge对象,然后添加上Vertex,构造一个新的Edge对象。
这里,当F=face时,face的三个数据成员都拷贝给了F对象,其中:TShape对象是共享指针赋值,方向是值拷贝,位置是使用位置类的赋值运算符进行拷贝。
这个操作在OCCT的内部处理中很普遍。当需要从一个拓扑对象基于共享对象生成一个新的对象(主要是方向不同)时,这种处理经常会发生。
对TopoDS_TShape对象来说,记录了如下主要数据:
A) 子对象列表,该拓扑对象包含的子对象都在myShapes的列表中
B)几何数据,这个主要是对具有几何数据的对象:Vertex、Edge和Face而言的。也因此派生出了BRep_TVertex、BRep_TEdge和BRep_TFace三个类,记录对应的几何数据。
这个对象,通常都需要通过TopoDS_Shape来创建,不能直接创建TopoDS_TShape派生的对象。