OpenCascade拓扑对象之:基于TopoDS_Shape的Map的理解


OpenCascade中,可以看到很多基于TopoDS_Shape的建表的处理,也因此可以看到OpenCascade封装了不少以TopoDS_Shape为键值的表或hash表。这些表,通常是为了获取模型中的共享对象,因此往往忽略了拓扑对象的方向。

我们拿其中一个分析一下:

typedef Collection_DataMap TopTools_DataMapOfShapeShape;

这里,定义了一个hash表,键值为TopoDS_Shape对象,在该定义中,使用了TopTools_ShapeMapHasher类来作为hash表中的对比类。该类将对两个TopoDS_Shape对象进行比较,并判断两个对象是否相同,主要使用了如下函数:

    
inline Standard_Boolean  TopTools_ShapeMapHasher::IsEqual

  (const TopoDS_Shape& S1, const TopoDS_Shape& S2)

{
      return S1.IsSame(S2);
}
  这里,比较两个Shape对象是否相等,使用的是IsSame函数进行比较,这个函数实现如下:

 

inline Standard_Boolean TopoDS_Shape::IsSame (const TopoDS_Shape& other) const
{
  return (myTShape == other.myTShape) &&
         (myLocation == other.myLocation);
}

 

因为对共享对象,例如:两个有向边共享一个共边的情况,两个有向边都使用一个TopoDS_TEdge对象,但方向通常是一正一反。类似的,其他拓扑对象的共享往往也可能除方向外其他都相同。因此,这里使用IsSame函数,获取所有的共享对象。

例如:对立方体而言,有24条有向边,而实际只有12条共边。当对边进行打断时,直接打断共边,生成两个新的TopoDS_TEdge对象,比对有向边进行处理更简洁和合理。因此,在OpenCascade中,会频繁通过建表,获取共享对象,基于共享对象进行处理。