深入理解BRep_Curve3d(转)

任何复杂的对象都是有三种基本图元 点 、线 、 面构成。本篇文章主要介绍OCCT中从拓扑边TopoDS_Edge到基本几何曲线Geom_Curve的存储结构。

TopoDS_Shape

  1. TopoDS_Shape类作为各中拓扑类型的基类存在
  2. 数据成员如下:
  1. Handle(TopoDS_TShape) myTShape;
  2. TopoLoc_Location myLocation;
  3. TopAbs_Orientation myOrient;

可知:每一个TopoDS_Shape都存储了一份它内部类型的指针myTShape。

TopoDS_TShape :Standard_Transient

  1. 其数据成员为:
  1. TopoDS_ListOfShape myShapes;//TopoDS_Shape的List集合
  2. Standard_Integer myFlags;
  1. 一个TopoDS_TShape包含了以下7个布尔标志位.按照Brep文件中存储顺序 依次为:
  1. Free : Free or Frozen
  2. Modified : Has been modified
  3. Checked : Has been checked
  4. Orientable : can been oriented
  5. Closed : is closed
    (注:只有Wires和Shells才有可能是closed的)
  6. Infinate : is infinite
  7. convex : is convex

可知:每一个TopoDS_TShape由一系列TopoDS_Shape组成

  1. 下面是BRep文件中存储的TShape的标志位,事例代码。
TopoDS_Shape shape= ...;//获取或生成一个TopoDS_Shape  
Handle(TopoDS_TShape) hTShape = edge.TShape();
Standard_Boolean f1=hTShape ->Free();
Standard_Boolean f2=hTShape ->Modified();
Standard_Boolean f3=hTShape ->Checked();
Standard_Boolean f4=hTShape ->Orientable();
Standard_Boolean f5=hTShape ->Closed();
Standard_Boolean f6=hTShape ->Infinite();
Standard_Boolean f7=hTShape ->Convex();

TopoDS_Edge : TopoDS_Shape

  1. TopoDS_Edge继承于TopoDS_Shape。表示一个拓扑边

TopoDS_TEdge : TopoDS_TShape

  1. TopoDS_TEdge:继承于TopoDS_TShape
    表示拓扑边TopoDS_Edge的内部类型。
  2. 拓扑边的边界是一组有方向的拓扑点a set of oriented Vertices。

BRep_TEdge : TopoDS_TEdge

  1. BRep_TEdge继承于TopoDS_TEdge。并存储了基本的几何数据geometric data。
  2. 其成员包括:
    1. Standard_Real myTolerance;//精度
    2. 三个标志位 :Same Parameter flag、 Same Range flag、Degenerated flag。都是Standand_Boolean类型。这三个标志位最终也会写入到Brep文件中
    3. Brep_ListOfCurveRepresentation myCurves; //一个Brep_CurveRepresentation的集合

可知,BRep_TEdge底层基本的几何曲线是存储在 myCurves中的!

  1. 下面是BRep文件中存储的TEdge的标志位,事例代码。
TopoDS_Edge edge= ...;//获取或生成一个TopoDS_Edge   
Handle(TopoDS_TEdge) hTEdge = Handle(TopoDS_TEdge)::DownCast(edge.TShape());
Handle(BRep_TEdge) hBTEdge = Handle(BRep_TEdge)::DownCast(hTEdge);
Standard_Boolean sameParmeter=hBTEdge->SameParameter();
Standard_Boolean sameRange=hBTEdge->SameRange();
Standard_Boolean degenerated=hBTEdge->Degenerated();

BRep_CurveRepresentation :Standard_Transient

  1. BRep_CurveRepresentation为曲线描述属性curve representations的基类
  2. 包含一个location .类型TopLoc_Location
  3. 曲线的描述属性Representation包括。
  1. IsCurve3d() : 判断是否为3D曲线。
  2. IsCurveOnSurface():是否为suface参数空间上的曲线
  3. IsCurveOnClosedSurface():判断是否为闭合曲面上的曲线。
  4. IsPolygon3D()
  5. IsPolygonOnTrangulation()
  6. IsPolygonOnClosedTrangulation()
  7. IsPolygonOnSurface()
  8. IsPolygonOnClosedSurface()
  9. IsRegularity()

通过以上方法判断其基本类型后,就可以通过以下方法获取其基本类型

  1. Curve3D():如果是Curve3d则返回其基本几何对象Geom_Curve
  2. Surface(): 返回Geom_Surface
  3. Surface2(): 返回Geom_Surface
  4. PCurve():返回Geom2d_Curve
  5. PCurve2():返回Geom2d_Curve
  6. Polygon3D():返回 Poly_Polygon3D
  7. Polygon() :返回 Poly_Polygon2D
  8. Polygon2() :返回 Poly_Polygon2D
  9. Triangulation() :返回 Poly_Triangulation
  10. PolygonOnTriangulation() :返回 Poly_PolygonOnTriangulation
  11. PolygonOnTriangulation2() :返回 Poly_PolygonOnTriangulation

注:由于该类是基类,以上方法默认实现未处理,需要在派生类中重写

BRep_GCurve : BRep_CurveRepresentation

  1. BRep_GCurve是几何曲线描述属性(geometric curves representation)的基类。用于记录曲线的参数范围。
  2. 其数据成员为:
  1. Standard_Real myFirst;//起点参数
  2. Standard_Real myLast;//终点参数
  1. 函数成员为:
  1. SetRange():设置起点参数和终点参数
  2. First() :返回或设置起始参数
  3. Last() :返回或设置终点参数
  4. D0():计算给定参数为U时 曲线上的点

BRep_Curve3d : BRep_GCurve

  1. BRep_Curve3d 表示一条3D曲线的Representation。
  2. 其数据成员为Handle(Geom_Curve) myCurve.
  3. BRep_Curve3d 重写了基类BRep_CurveRepresentation的以下方法
  1. IsCurve3D():判断是否为3D曲线
  2. Curve3D():获取该3D曲线的基本类型Geom_Curve
  3. Copy() :拷贝BRep_Curve3d
  1. BRep_Curve3d 重写了基类BRep_GCurve的如下方法
  1. D0(cont Standard_Real U,gp_Pnt &P):计算曲线在参数U时的点

Geom的外部文件存储

  1. 使用工具类:GeomTools进行存储和读取
  2. 具体代码可以参考GeomTools_CurveSet中的方法。
  3. 对于Geom包中提供的对象如果不熟悉可以参考
    分析Open CASCADE 中的Geom包

总结

  1. 通过深入理解对象的继承关系及结构层次,我们可以很方便根据TopoDS_Shape来获取其基本的几何对象。事例代码如下:
  TopoDS_Edge myEdge = ...;//方法生成TopoDS_Edge
  Handle(TopoDS_TShape) hTShape = myEdge.TShape();
  Handle(BRep_TEdge) hTEdge = Handle(BRep_TEdge)::DownCast(hTShape);//获取BRep_TEdge
  Brep_ListOfCurveRepresentation curveRep = hTEdge->Curves();
  BRep_ListIteratorOfListOfCurveRepresentation liter;
  {
    for(liter.Init(curveRep);liter.More();liter.Next())
    {
        Handle(BRep_CurveRepresentation) hbcr = liter.Value();
       if( hbcr ->IsCurve3D())//判断是否为3DCurve
      {
            const BRep_Curve3D *pBrepCurve = static_cast<const BRep_Curve3D*>(hbcr.get());
            Handle(Geom_Curve) curve = pBrepCurve->Curve3D(); //获取到Geom_Curve
      }
    }
  }
  1. 依次类推,当再遇到Brep_CurveOnSurface、BRep_CurveOnClosedSurface等Brep_CurveXXXX系,相信大家也不会陌生了!


作者:yumxuanyi
链接:https://www.jianshu.com/p/b316972990d8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-05-09 21:46  格美格美  阅读(376)  评论(0编辑  收藏  举报