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)几何数据,这个主要是对具有几何数据的对象:VertexEdgeFace而言的。也因此派生出了BRep_TVertexBRep_TEdgeBRep_TFace三个类,记录对应的几何数据。

这个对象,通常都需要通过TopoDS_Shape来创建,不能直接创建TopoDS_TShape派生的对象。