深入理解BRep_Curve3d(转)
任何复杂的对象都是有三种基本图元 点 、线 、 面构成。本篇文章主要介绍OCCT中从拓扑边TopoDS_Edge到基本几何曲线Geom_Curve的存储结构。
TopoDS_Shape
- TopoDS_Shape类作为各中拓扑类型的基类存在
- 数据成员如下:
- Handle(TopoDS_TShape) myTShape;
- TopoLoc_Location myLocation;
- TopAbs_Orientation myOrient;
可知:每一个TopoDS_Shape都存储了一份它内部类型的指针myTShape。
TopoDS_TShape :Standard_Transient
- 其数据成员为:
- TopoDS_ListOfShape myShapes;//TopoDS_Shape的List集合
- Standard_Integer myFlags;
- 一个TopoDS_TShape包含了以下7个布尔标志位.按照Brep文件中存储顺序 依次为:
- Free : Free or Frozen
- Modified : Has been modified
- Checked : Has been checked
- Orientable : can been oriented
- Closed : is closed
(注:只有Wires和Shells才有可能是closed的)- Infinate : is infinite
- convex : is convex
可知:每一个TopoDS_TShape由一系列TopoDS_Shape组成
- 下面是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
- TopoDS_Edge继承于TopoDS_Shape。表示一个拓扑边
TopoDS_TEdge : TopoDS_TShape
- TopoDS_TEdge:继承于TopoDS_TShape
表示拓扑边TopoDS_Edge的内部类型。 - 拓扑边的边界是一组有方向的拓扑点a set of oriented Vertices。
BRep_TEdge : TopoDS_TEdge
- BRep_TEdge继承于TopoDS_TEdge。并存储了基本的几何数据geometric data。
- 其成员包括:
- Standard_Real myTolerance;//精度
- 三个标志位 :Same Parameter flag、 Same Range flag、Degenerated flag。都是Standand_Boolean类型。这三个标志位最终也会写入到Brep文件中
- Brep_ListOfCurveRepresentation myCurves; //一个Brep_CurveRepresentation的集合
可知,BRep_TEdge底层基本的几何曲线是存储在 myCurves中的!
- 下面是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
- BRep_CurveRepresentation为曲线描述属性curve representations的基类
- 包含一个location .类型TopLoc_Location
- 曲线的描述属性Representation包括。
- IsCurve3d() : 判断是否为3D曲线。
- IsCurveOnSurface():是否为suface参数空间上的曲线
- IsCurveOnClosedSurface():判断是否为闭合曲面上的曲线。
- IsPolygon3D()
- IsPolygonOnTrangulation()
- IsPolygonOnClosedTrangulation()
- IsPolygonOnSurface()
- IsPolygonOnClosedSurface()
- IsRegularity()
通过以上方法判断其基本类型后,就可以通过以下方法获取其基本类型
- Curve3D():如果是Curve3d则返回其基本几何对象Geom_Curve
- Surface(): 返回Geom_Surface
- Surface2(): 返回Geom_Surface
- PCurve():返回Geom2d_Curve
- PCurve2():返回Geom2d_Curve
- Polygon3D():返回 Poly_Polygon3D
- Polygon() :返回 Poly_Polygon2D
- Polygon2() :返回 Poly_Polygon2D
- Triangulation() :返回 Poly_Triangulation
- PolygonOnTriangulation() :返回 Poly_PolygonOnTriangulation
- PolygonOnTriangulation2() :返回 Poly_PolygonOnTriangulation
注:由于该类是基类,以上方法默认实现未处理,需要在派生类中重写
BRep_GCurve : BRep_CurveRepresentation
- BRep_GCurve是几何曲线描述属性(geometric curves representation)的基类。用于记录曲线的参数范围。
- 其数据成员为:
- Standard_Real myFirst;//起点参数
- Standard_Real myLast;//终点参数
- 函数成员为:
- SetRange():设置起点参数和终点参数
- First() :返回或设置起始参数
- Last() :返回或设置终点参数
- D0():计算给定参数为U时 曲线上的点
BRep_Curve3d : BRep_GCurve
- BRep_Curve3d 表示一条3D曲线的Representation。
- 其数据成员为Handle(Geom_Curve) myCurve.
- BRep_Curve3d 重写了基类BRep_CurveRepresentation的以下方法
- IsCurve3D():判断是否为3D曲线
- Curve3D():获取该3D曲线的基本类型Geom_Curve
- Copy() :拷贝BRep_Curve3d
- BRep_Curve3d 重写了基类BRep_GCurve的如下方法
- D0(cont Standard_Real U,gp_Pnt &P):计算曲线在参数U时的点
Geom的外部文件存储
- 使用工具类:GeomTools进行存储和读取
- 具体代码可以参考GeomTools_CurveSet中的方法。
- 对于Geom包中提供的对象如果不熟悉可以参考
分析Open CASCADE 中的Geom包
总结
- 通过深入理解对象的继承关系及结构层次,我们可以很方便根据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
}
}
}
- 依次类推,当再遇到Brep_CurveOnSurface、BRep_CurveOnClosedSurface等Brep_CurveXXXX系,相信大家也不会陌生了!
作者:yumxuanyi
链接:https://www.jianshu.com/p/b316972990d8
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。