OCCT使用指南:Modeling Algorithms

1、介绍

        本手册介绍了如何使用建模算法。它提供了有关建模算法的基本文档。建模算法模块汇集了建模中使用的各种拓扑算法。有了这些工具,你会发现他们称之为几何算法。

2、几何工具

        Open CASCADE Technology几何工具提供算法,用于:计算两条二维曲线、曲面或一条三维曲线与一个曲面的交点;将点投影到二维和三维曲线、点投影到曲面以及三维曲线投影到曲面;根据约束构造直线和圆;根据约束构造曲线和曲面;通过插值构建曲线和曲面。

2.1、交点

        “交点”组件用于计算二维或三维几何对象之间的交点:两条2D曲线之间的交点;2D曲线的自相交;3D曲线和表面之间的交叉点;两个表面之间的交叉点。

        Geom2dAPI_InterCurveCurve类允许对两条几何曲线(Geom2d_Curve)之间的交点(gp_Pnt2d)进行评估,以及对曲线自交点进行评估。

        在这两种情况下,算法都需要两个点之间混淆的公差值(Standard_Real)。所有构造函数中使用的默认公差值为1.0e-6。 

        该算法在相交的情况下返回一个点,在相切相交的情况中返回一个线段。 

        两条曲线的交点:Geom2dAPI_InterCurveCurve;曲线和曲面的交点:GeomAPI_IntCS;两个曲面的交点:GeomAPI_IntSS。

2.2、插值

        插值法组件提供了函数y=f(x)的定义。尤其是,它提供了以下定义:线性函数,S函数,以及用于值范围的插值函数。
        例如,这些函数可用于定义圆角沿形状边缘的演变规律。所构建函数的正确性从未被检查过:Law包不知道该函数将用于什么应用或什么目的。特别是,如果该函数用作圆角的演化规律,则该函数始终为正很重要。用户必须检查这一点。

        Geom2dAPI_Interpolate:此类用于插值通过点阵列的 BSplineCurve。如果在插值点不要求相切,则连续性为 C2。如果要求在点处相切,则连续性为 C1。如果要求周期性,则曲线将闭合,并且交点将是给定的第一个点,然后,曲线将只有 C1 的连续性。

        GeomAPI_Interpolate:Handle(Geom_BSplineCurve) C = GeomAPI_Interpolate(Points, Standard_False, 1.0e-7);这个是正确的。

2.3、约束中的直线和圆

约束类型:

        用于构建2D圆或线的算法可以用相对于其他曲线的数值或几何约束来描述。这些约束可以施加以下条件:圆的半径;一条直线与另一条直线之间的夹角;一条直线或圆相对于曲线的切线;
一条直线或圆经过某点;以某点或曲线为中心的圆。

        例如,这些算法可以轻松地构建一个以给定半径、以一直线为中心并与另一圆相切的圆。实现的算法比直接构建组件中用于构建2D圆或线的算法更复杂。

        切线问题的一般表达会产生几个结果,根据解的相对位置和表达切线约束的圆或直线的相对位置而定。例如,考虑以下情况:一个给定半径(小半径)的圆,它与两个割线C1和C2相切。

        这个图清楚地表明有8种可能的解决方案。为了限制解决方案的数量,我们可以尝试表达所需解决方案相对于切线圆的相对位置。例如,如果我们指定解决方案在圆C1内,在圆C2外,则图中只有两个解决方案(3和4)对所提出的问题做出了回应。

        这些定义很容易在圆上解释,因为很容易识别内、外侧。事实上,对于任何类型的曲线,内部被定义为相对于其方向的曲线的左侧。

        这种与切线曲线相关的解决方案的限定技术可用于通过几何约束构造圆或直线的所有算法。使用了四个限定符:Enclosing - 解决方案必须封闭参数;Enclosed ——解决方案必须由参数封闭;Outside ——解决方案和论点必须相互独立;Unqualified - 相对位置不合格,即所有解决方案都适用。

可用类型的直线和圆

        以下分析算法使用值处理实体来创建具有几何约束的2D线或圆是可用的:与三个元素(直线、圆、曲线、点)相切的圆,与两个元素相切并具有半径的圆,与两个元素相切并以第三个元素为中心的圆,与两个元素相切并以一点为中心的圆,与一个元素相切并以第二个元素为中心的圆,两点的平分线,两条线的平分线,两个圆的平分线,线和点的平分线,圆和点的平分线,直线和圆的平分线,与两个元素(点、圆、曲线)相切的直线,与一个元素相切并平行于一条线的线,与一个元素相切并垂直于一条线的线,与一个元素相切并与一条线成角度的线。

        外部/内部:定义圆的内部和外部并不难。如下图所示,外部是由副法线的感觉来指示的,也就是说,根据遍历圆的感觉来表示右侧。因此,左侧是内部(或“材料”)。

        根据延伸,直线或任何开放曲线的内部根据通过方向定义为左侧,如下图所示: 

        直线的方向:有时有必要提前定义沿着要创建的线的行进感。这种感觉将从第一个论点到第二个论点。下图显示了一条线,它首先与位于该线内部的圆C1相切,然后穿过点P1。

算法类型

        OCCT实现了几种类型的算法:解析算法,通过解析方程获得解,当处理的几何图形(相切参数、中心位置等)是点、线或圆时,使用此类算法;几何算法,其中解决方案通常通过计算由几何参数构建的平行或平分曲线的交点来获得;迭代算法,通过迭代过程获得解。

        对于受约束的直线或圆的每种几何构造,OCCT提供两种类型的访问:Geom2dGcc软件包中的算法会自动选择最适合该问题的算法,无论是在一般情况下还是在所有类型的特定情况下;使用的参数是Geom2d对象,而计算的解是gp对象;GccAna包中的算法解析地解决了问题,并且只能在要处理的几何图形是线或圆时使用;使用的参数和计算的解决方案都是gp对象。

        所提供的算法计算对应于所述几何问题的所有解,除非该解是通过迭代算法找到的。

        迭代算法只计算一个最接近初始位置的解。它们可用于以下情况:当一个论点比一条线或一个圆更复杂,并且半径未知或难以确定时,建立一个圆:这是与三个几何元素相切的圆的情况,或者与两个几何元素相切并以曲线为中心的圆的情况;当切线参数比直线或圆更复杂时,可以构建一条线。
        合格的曲线(用于切线参数)由以下方式提供:GccEnt软件包,供GccAna算法直接使用,或
Geom2dGcc软件包,供Geom2dGcc算法一般使用。GccEnt和Geom2dGcc包还提供了简单函数,以非常有效的方式构建合格曲线。

        GccAna包还提供了在圆、直线或点之间构造平分轨迹的算法。两个几何对象之间的平分轨迹是指它们的每个点与两个几何对象之间的距离都相等。它们通常是曲线,如圆、直线或二次曲线,用于GccAna算法。每个基本解都以基本平分轨迹对象(直线、圆、椭圆、双曲线、抛物线)的形式给出,由GccInt包描述。

        注意:GccAna算法用于定义要解决的几何问题的曲线是gp包中的二维直线或圆:它们没有明确参数化。然而,这些直线或圆保留了隐式参数化,对应于它们在等效Geom2d对象上诱导的参数化。这种诱导的参数化是在返回这些曲线的参数值时使用的,例如使用GccAna或Geom2dGcc包中的构造算法提供的函数Tangency1、Tangency2、Tangency3、Intersection2和CenterOn3。

2.4、约束中的曲线和曲面

        约束组件组的曲线和曲面将二维和三维几何中使用的功能组合在一起,用于:创建公平且变化最小的二维曲线;直纹曲面的构造;管道表面施工;表面填充;板材表面构造;三维曲线或曲面超出其原始边界的延伸。
        OCCT还提供了一种名为“散点曲面”的产品,该产品允许从散点构建曲面。该算法接受或构建初始B样条曲面,并寻找满足约束条件的变形(有限元方法)。使用优化的计算方法,该算法能够从超过50万个点构建曲面。

光顺和最小变化2D曲线:

        弹性梁曲线起源于造船中应用的传统建模方法,在这种方法中,一块细长的木头,一台车床,被迫穿过两组钉子之间,通过这种方式,以基于这两个点、施加在这些点上的力的方向以及木车床本身的特性的曲线的形式出现。

        保持这些约束需要对梁施加纵向和横向力,以补偿其内部弹性。纵向力可以是推动或拉动,梁可以在这些固定点上滑动,也可以不滑动。

板条曲线:

        FairCurve_Batten 类允许生成基于两个参考点中的每个参考点的一个或多个约束定义的平滑曲线。这些约束包括点、切线角度和曲率设置。以下约束顺序可用:0 曲线必须通过一个点,1曲线必须通过一个点并具有给定的切线2曲线必须通过一个点,具有给定的切线和曲率。仅使用0和1约束顺序。Curve函数将结果返回为二维BSpline曲线。

直纹曲面:

        通过沿两条曲线的长度划线来构建直纹曲面。

贝塞尔曲面的创建:

        GeomFill_BezierCurves 类允许从连续的 Bezier 曲线生成 Bezier 曲面。请注意,有理 Bezier 曲线可能会出现问题。

创建 B样条曲面:

        GeomFill_BSplineCurves 类允许从连续的 BSpline 曲线生成 BSpline 曲面。请注意,有理 BSpline 可能会出现问题。

管道表面:

        GeomFill_Pipe 类允许通过沿另一条曲线(路径)扫掠曲线(截面)来生成管道。结果是一个 BSpline 曲面。

        可提供以下类型的建筑:具有恒定半径的圆形截面的管道,具有恒定截面的管道,管段在两条给定曲线之间演变。

填充轮廓:

        从一些曲线创建曲面通常很方便,这些曲线将形成定义新曲面的边界。这是由类GeomFill_ConstrainedFilling完成的,该类允许填充由三条或四条曲线以及相切约束定义的轮廓。生成的曲面是一条B样条线。

        一个很好的例子是两个圆角在一个拐角处的交点。如果一条边上的圆角半径与另一条边的圆角半径不同,则无法将生成曲面的所有边缝合在一起。这会在正在构建的对象的整个曲面中留下一个间隙。

        这些算法允许您从两条、三条或四条曲线填补这一空白。这可以在有约束或没有约束的情况下完成,并且生成的曲面将是一系列填充样式中的Bezier曲面或BSpline曲面。

创建边界:

        GeomFill_SimpleBound 类允许您为要构造的曲面定义边界。

与邻接曲面创建边界:

        GeomFill_BoundWithSurf 类允许为要构造的曲面定义边界。该边界将已连接到另一个曲面。

 填充样式:

        枚举FillingStyle指定用于构建曲面的样式。其中包括:Stretch–补丁最平整的款式,Coons–圆形样式,深度小于Curve,曲线型_补丁最圆的款式。

板材表面:

        在CAD中,通常需要生成一个没有精确数学定义但由相应约束定义的曲面。这些可以是数学的、技术的或美学的顺序。

        从本质上讲,板表面是通过使表面变形以使其符合给定数量的曲线或点约束来构造的。在下图中,可以看到平面轮廓的四段和一个点,它们分别用作曲线约束和点约束。可以使用MakeApprovx函数将生成的曲面转换为B样条线曲面。

        曲面是使用变分样条算法构建的。它利用了薄板通过局部机械力变形的原理。如果输入中尚未给出,则会计算初始曲面。这对应于变形之前的板。然后,调用该算法来计算最终曲面。它寻找一个满足约束和最小化能量输入的解决方案。

        GeomPlate软件包提供以下服务,用于创建符合曲线和点约束的曲面:

        1、框架的定义:类BuildPlateSurface允许创建一个框架,根据曲线和点约束以及公差设置来构建曲面。结果随函数Surface返回。请注意,在构造时您不必指定初始曲面。可以在以后添加,或者如果没有加载任何曲面,则会自动计算曲面。

        2、曲线约束的定义:类CurveConstraint允许将曲线定义为要构建的曲面的约束。

        3、点约束的定义:PointConstraint 类允许将点定义为要构建的曲面的约束。

        4、将 Geom_Surface 应用于板材曲面:类 Surface 允许使用 Geom_Surface 的方法描述 BuildPlateSurface::Surface 返回的板表面对象的特征

        5、将板表面近似为样条曲线:类 MakeApprox 允许将 GeomPlate 曲面转换为 Geom_BSplineSurface。

2.5、投影

        投影用于计算以下内容:2D点在2D曲线上的投影,三维点在三维曲线或曲面上的投影,3D曲线在表面上的投影,从下面平面的3D到2D参数空间的平面曲线换位和v.s,2D gp对象在3D几何空间中的定位。

曲线上二维点的投影:

        Geom2dAPI_ProjectPointOnCurve允许计算从点(gp_Pnt2d)投影到几何曲线(Geom2d_curve)上的所有法线。该计算可以被限制在给定的域内。

        曲线不必是Geom2d_TrimedCurve。该算法将与继承Geom2d_Curve的任何类一起使用。 使用方法:投影数量、获取对应索引的坐标、获取对应索引的参数、获取对应索引距离、最近距离、获取最近投影点的参数、获取最近投影点的坐标、其他。

曲线上三维点的投影:

        GeomAPI_ProjectPointOnCurve使用方法:投影数量、获取对应索引的坐标、获取对应索引的参数、获取对应索引距离、最近距离、获取最近投影点的参数、获取最近投影点的坐标、

点在曲面上的投影:

        类GeomAPI_ProjectPointOnSurf允许计算从gp_Pnt的点投影到Geom_surface的几何曲面上的所有法线。

        请注意,曲面不必是Geom_RectanularTrimmedSurface类型。该算法将适用于继承Geom_Surface的任何类。 

        GeomAPI_ProjectPointOnSurface 使用方法:投影数量、获取对应索引的坐标、获取对应索引的参数、获取对应索引距离、最近距离、获取最近投影点的参数、获取最近投影点的坐标、其他。

从二维和三维曲线切换:

        To2d和To3d方法用于:;从gp_Pln平面上的三维Geom_curve构建二维曲线,从Geom2d_curve和gp_Pln平面构建三维曲线。

Handle(Geom2d_Curve) C2d = GeomAPI::To2d(C3d, Pln); 
Handle(Geom_Curve) C3d = GeomAPI::To3d(C2d, Pln); 

3、拓扑工具

        OCCT提供以下拓扑工具:从边创建导线;从导线创建面;计算形状相对其他形状的状态;确定容器中形状的方向;从现有形状创建新形状;在面上构建边的PC曲线;检查形状的有效性;直面要点;获取面的法线方向。

3.1、从线框模型创建面

        可以从随机位于3D空间中的任意一组平面边创建平面。例如,如果需要从线框模型中恢复形状,此功能可能很有用:

        要从边创建面,首先需要从给定的边创建平面导线,然后从每条导线创建平面。静态方法BOPAGo_Tools::EdgesToWires和BOPAGo_Tools::WiresToFaces可用。

        这些方法也可以单独使用:BOPAlgo_Tools::EdgesToWires允许从边创建平面线。输入边可能不共享,但输出线将共享重合的顶点和边。为此,执行边的交集。虽然可以通过传递相应的标志来跳过交集阶段(如果输入边已经共享),但输入边应该是平面的,此方法不会检查。因此,如果输入边不是平面的,则输出线也将不是平面的。一般来说,输出线是非流形的,可能包含自由顶点以及多重连接的顶点。

        BOPAlgo_Tools::WiresToFaces允许从平面线创建平面面。一般来说,输入线是非流形的,可能不闭合,但应该共享重合的部分。位于同一平面内并完全包含在其他线内的线将在由外线构建的面中创建孔:

3.2、形状的分类

        以下方法允许将不同形状与其他形状进行相对分类:BOPTools_AlgoTools::ComputState方法的多样性将顶点/边/面相对分类为固体;BOPTools_AlgoTools::IsHole将线相对面分类;IntTools_Tools::ClassifyPointByFace 将点相对面进行分类。

3.3、容器中形状的方向

        以下方法允许重新定位容器中的形状:BOPTools_AlgoTools::OrientEdgesOnWire正确地确定线上的边缘方向;BOPTools_AlgoTools::OrientFacesOnShell 正确地确定壳上的面的方向。

3.4、创建新形状

        以下方法允许从现有形状创建新形状:BOPTools_AlgoTools::MakeNewVertex的多样性从其他顶点和边创建新顶点;BOPTools_AlgoTools::MakeSplitEdge根据给定参数分割边。

3.5、构建PC曲线

        以下方法允许在面上构建边缘的PCurves:BOPTools_AlgoTools::BuildPCurveForEdgeOnFace 计算面上的边的PCurve;BOPTools_AlgoTools::BuildPCurveForEdgeOnPlane和BOPTools_AlgoTools::BuildPCurveForEdgesOnPlane允许为平面上的边缘构建PCurves;BOPTools_AlgoTools::AttachExistingPCurve 从一条边上的面上获取 PCurve,并将该 PCurve 连接到与第一条边重合的其他边。

3.6、检查形状的有效性

        以下方法允许检查形状的有效性:BOPTools_AlgoTools::IsMicroEdge 检测小边;BOPTools_AlgoTools::ComputeTolerance计算面上的边缘的正确公差;BOPTools_AlgoTools::CorrectShapeTolerances和BOPTools_AlgoTools::CorrectTolerances允许校正子形状的公差。BRepLib::FindValidRange 查找未被顶点公差球体覆盖的边缘的三维曲线范围。

3.7、从面上取一点

        以下方法允许取位于面内部的点:BOPTools_AlgoTools3D::PointNearEdge 的变体允许获取位于边缘附近的内部点;BOPTools_AlgoTools3D::PointInFace 允许获取位于面内部的点。

3.8、获取平面法线

        以下方法允许获取面/曲面的法线方向:BOPTools_AlgoTools3D::GetNormalToSurface计算由UV参数定义的给定点中的曲面的法线方向;BOPTools_AlgoTools3D::GetNormalToFaceOnEdge 计算位于面边缘的点处的面的法线方向;BOPTools_AlgoTools3D::GetApproxNormalToFaceOnEdge 计算位于面边缘附近的点中的面的法线方向。

4、拓扑API

        OCCT的拓扑API包括以下六个包:BRepAlgoAPI、BRepBuilderAPI、BRepFilletAPI、BRepFeat、 BRepOffsetAPI、BRepPrimAPI。

        API提供的类具有以下功能:类的构造函数提供不同的构造方法;类保留了用于将对象构建为字段的不同工具;类提供了一个强制转换方法,通过类似函数的调用自动获得结果。

4.1、拓扑API中的错误处理

        在以下两种情况下,方法可以报告错误:

        方法的数据或参数不正确,即它们不符合方法在其规范中指定的限制。典型示例:从两个相同的点创建线性边缘可能会导致在计算直线方向时出现零除。意想不到的事情发生了。这种情况涵盖了第一类中未包含的所有错误。包括:中断、方法中的编程错误或第一个方法调用的另一个方法中的编程错误、参数的错误规范(即一组不应失败的参数)。
        第二种情况应该随着系统的调试而变得越来越特殊,并且由异常机制处理。使用异常可以避免在方法调用中处理错误状态:这是一种非常繁琐的编程风格。

        在第一种情况下,也应该引发异常,因为调用方法应该已经验证了参数,如果没有这样做,则存在错误。例如,如果在调用MakeEdge之前,您不确定这两个点是否不同,则必须测试这种情况。

        对参数进行有效性检查可能是乏味的编程,并且可能会令人沮丧,因为您可能已经正确地推测出该方法将执行两次测试。它不信任您。由于测试涉及大量的计算,执行两次测试也是耗时的。

        为了帮助用户,Topology API类仅引发异常StdFail_NotDone。任何其他异常都意味着在API的设计中发生了不可预见的事情。

        NotDone异常仅在用户尝试访问计算结果且原始数据已损坏时才会引发。在构造类实例时,如果算法无法完成,则设置内部标志NotDone。可以测试此标志,在某些情况下可以查询更完整的错误描述。如果用户忽略NotDone状态并尝试访问结果,则会引发异常。 

4.2、支持历史

        所有拓扑API算法都支持其参数的形状修改历史(或仅支持历史)。通常,历史可用于输入形状的以下类型的子形状:顶点、边、面。一些算法还支持Solid的历史。

        历史信息由以下信息组成:关于已删除形状的信息;关于修改形状的信息;有关生成形状的信息。
        历史记录基于操作结果填充。历史记录不能返回结果中未包含的任何形状。如果操作结果为空形状,则所有输入形状都将被视为“已删除”,并且没有形状将被视为“已修改”和“已生成”。

        历史信息可以通过API方法访问:Standard_Boolean IsDeleted(const TopoDS_Shape& theS) - 检查形状在操作过程中是否已被删除;const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS) - 从给定形状中获取修改后的形状;const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS) - 获取从给定形状生成的形状。

已删除的形状:

        如果满足以下所有条件,则操作过程中形状将被视为“已删除”:形状是操作参数形状的一部分;结果形状不包含形状本身;结果形状不包含形状的任何拆分。例如,在两个相交实体之间的切割操作中,位于工具实体完全内部的所有的顶点/边/面在操作过程中将被删除。

修改形状:

        如果结果形状包含形状的分割,而不是形状本身,则该形状在操作过程中被视为“修改”。形状只能修改为具有相同维度的形状。结果形状中包含的形状的分割被视为“修改”形状。修改后的形状是由输入形状的子形状创建的,通常会重复其几何形状。

        修改元素的列表将仅包含对操作结果有贡献的元素。如果列表为空,则形状未被修改,并且需要检查它是否已被删除。例如,在将形状沿任何方向平移后,其所有子形状都将被修改为平移后的副本。

生成的形状:

        如果结果形状中包含的形状是在操作过程中生成的,并且与创建它们的形状具有不同的维度,则认为它们是从输入形状生成的。

        生成的元素列表将仅包含操作结果中包含的那些元素。如果列表为空,则表示该形状没有生成新的形状。例如,在某个方向上挤压边缘将创建一个面。该面将从边缘生成。

BRepTools_History

        BRpTools_History是用于统一不同算法历史的通用历史工具。BRpTools_History可以通过任何支持标准历史方法*(IsDeleted()、Modified()*和Generated())的算法创建。

        BRepTools_History还允许合并历史记录。因此,如果您有两个或多个后续操作,您可以从这些操作的历史记录中获得一个最终历史记录。通过API算法合并历史和创建历史的可能性,可以为新算法提供简单的历史支持。

 DRAW历史支持:

        算法的DRAW历史支持由三个基本命令提供:删除;修改;生成。

5、标准拓扑对象

        可以创建以下标准拓扑对象:Vertices;Edges;Faces;Wires;Polygonal wires;Shells;Solids.

        它们的构造和修改有两个根类:延迟类BRpBuilderAPI_MakeShape是生成形状的所有BRpBuilder API类的根。它继承自类BRpBuilderAPI_Command,并提供一个字段来存储构造的形状。延迟类BRpBuilderAPI_ModifyShape用作形状修改的根。它继承了BRpBuilderAPI_MakeShape,并实现了用于跟踪所有子形状历史的方法。

5.1、Vertex

gp_Pnt P(0,0,10); 
TopoDS_Vertex V = BRepBuilderAPI_MakeVertex(P);

5.2、Edge

基础边构造方法

        使用BRepBuilderAPI_MakeEdge从曲线和顶点创建。基本方法是从一条曲线、两个顶点和两个参数构造一条边。

Handle(Geom_Curve) C = ...; // a curve 
TopoDS_Vertex V1 = ...,V2 = ...;// two Vertices 
Standard_Real p1 = ..., p2 = ..;// two parameters 
TopoDS_Edge E = BRepBuilderAPI_MakeEdge(C,V1,V2,p1,p2); 

        其中C是边的域;V1是面向“正向”的第一个顶点;V2是面向“反向”的第二个顶点;p1和p2是曲线上的顶点V1和V2的参数。默认公差与此边相关联。 

        以下规则适用于参数:

        曲线:不能是空句柄。如果曲线是修剪的曲线,则使用基础曲线。

        顶点:可以是空形状。当V1或V2为空时,边缘在相应方向上打开,相应的参数p1或p2必须为无限(即p1为RealFirst(),p2为RealLast())。如果具有不同的3d位置,则必须使用不同的顶点;如果具有相同的3d位置,则必须使用相同的顶点(当曲线闭合时使用相同的顶点)。

       参数:必须是增加的且在曲线范围内,即:C->FirstParameter() <= p1 < p2 <= C->LastParameter()如果参数是递减的,则切换顶点,即V2变为V1,V1变为V2。
在周期曲线上,通过增加或减去周期来调整参数p1和p2,以使p1在曲线范围内,p2在范围p1 < p2 <= p1+ Period内。因此,在参数曲线上,p2可以大于第二个参数,如图所示。参数可以是无限的,但相应的顶点必须是空的(见上文)。顶点的3d位置与在曲线上使用参数评估的点之间的距离必须低于默认精度。

         下图显示了两种特殊情况,半无限边缘和周期性曲线上的边。

补充边构造方法: 

        存在从基本方法衍生的补充边缘构造方法。BRepBuilderAPI_MakeEdge 类提供了方法,这些方法都是对前一个方法的简化调用:参数可以省略。它们是通过将顶点投影到曲线上来计算的。可以给出三维点(gp中的Pnt)来代替顶点。顶点是由点创建的。在创建连接的顶点时,给出顶点很有用。如果给出了参数,则可以省略顶点或点。这些点是通过在曲线上计算参数来计算的。可以省略顶点或点和参数。使用曲线的第一个和最后一个参数。

Handle(Geom_Curve) C = ...; // a curve 
TopoDS_Vertex V1 = ...,V2 = ...;// two Vertices 
Standard_Real p1 = ..., p2 = ..;// two parameters 
gp_Pnt P1 = ..., P2 = ...;// two points 
TopoDS_Edge E; 
// project the vertices on the curve 
E = BRepBuilderAPI_MakeEdge(C,V1,V2); 
// Make vertices from points 
E = BRepBuilderAPI_MakeEdge(C,P1,P2,p1,p2); 
// Make vertices from points and project them 
E = BRepBuilderAPI_MakeEdge(C,P1,P2); 
// Computes the points from the parameters 
E = BRepBuilderAPI_MakeEdge(C,p1,p2); 
// Make an edge from the whole curve 
E = BRepBuilderAPI_MakeEdge(C); 

        还为gp包中的曲线提供了六种方法(上述五种方法和基本方法),以代替Geom中的曲线。这些方法从Geom创建相应的曲线,并为以下类实现:

        gp_Lin创建Geom_Line gp_Circ创建Geom_Circle gp_Elips创建Geom_Ellipse gp_Hypr创建Geom_Hyperbola gp_Parab创建Geom_Arabola

        还有两种方法可以从两个顶点或两个点构造边。这些方法假定曲线是一条直线;顶点或点必须具有不同的位置。

TopoDS_Vertex V1 = ...,V2 = ...;// two Vertices 
gp_Pnt P1 = ..., P2 = ...;// two points 
TopoDS_Edge E; 
// linear edge from two vertices 
E = BRepBuilderAPI_MakeEdge(V1,V2); 
// linear edge from two points 
E = BRepBuilderAPI_MakeEdge(P1,P2); 

其他信息和错误状态: 

        BRepBuilderAPI_MakeEdge 类可以提供额外信息并返回错误状态。

        如果将 BRepBuilderAPI_MakeEdge 用作类,它可以提供两个顶点。当没有提供顶点作为参数时,这很有用,例如当边是由曲线和参数构造时。 Vertex1 和 Vertex2 这两个方法返回顶点。请注意,如果边在相应方向上打开,则返回的顶点可以为 null。

        Error 方法返回 BRepBuilderAPI_EdgeError 枚举中的一项。它可用于在 IsDone 方法返回 False 时分析错误。这些术语是:

        EdgeDone – 没有发生错误,IsDone 返回 True。
        PointProjectionFailed - 未给出参数,但曲线上的三维点投影失败。如果点到曲线的距离大于精度,则会发生这种情况。
        ParameterOutOfRange – 给定的参数不在 C->FirstParameter()、C->LastParameter() 范围内
        ClosedCurve – 两个顶点或点具有不同的位置,但它们是闭合曲线的末端。
        PointWithInfiniteParameter – 一个有限坐标点与一个无限参数相关联(有关无限值的定义,请参阅Precision包)。
        DifferentsPointAndParameter – 3D 点与曲线上的参数评估点的距离大于精度。
        LineThroughIdenticPoints——使用两个相同的点来定义一条线(构建一条没有曲线的边),gp::Resolution用于测试混淆。
        以下示例创建了一个以尺寸H,L的原点为中心的矩形,圆角半径为R。边和顶点存储在数组theEdges和theVertices中。我们使用类Array1OfShape(即不是边或顶点的数组)。请参阅下图。

5.3、Edge2D

        使用BRepBuilderAPI_MakeEdge2d类从二维曲线在工作平面上生成边缘。工作平面是BRepBuilderAPI包的默认值(请参阅Plane方法)。

        BRepBuilderAPI_MakeEdge2d 类与 BRepBuilderAPI_MakeEdge 非常相似,但它使用 gp 和 Geom2d 的二维几何图形,而不是三维几何图形。

5.4、Polygonal 

        BRepBuilderAPI_MakePolygon 类用于从顶点或点构建多边形线。与 BRepBuilderAPI_MakeEdge 一样,点会自动更改为顶点。

        BRepBuilderAPI_MakePolygon的基本用法是通过使用Add方法添加顶点或点来创建线。在任何时候,都可以提取当前的线。可以使用close方法关闭当前的线。在下面的示例中,从点阵列创建了闭合的线。

        为2个、3个或4个点或顶点提供了快捷方式。这些方法有一个布尔最后一个参数来判断多边形是否闭合。默认值为False。

TopoDS_Wire W = BRepBuilderAPI_MakePolygon(P1,P2,P3,P4); 
TopoDS_Wire W =  BRepBuilderAPI_MakePolygon(V1,V2,V3,Standard_True); //封闭

        BRpBuilderAPI_MakePolygon类维护当前导线。当前导线可以在任何时刻提取,并且施工可以进行到更长的导线。每次点插入后,类都会保留最后创建的边和顶点,这些边和顶点由方法edge、FirstVertex和LastVertex返回。
        如果添加的点或顶点与上一个点或顶点具有相同的位置,则不会将其添加到当前导线中,但最近创建的边将变为Null。Added方法可用于测试此条件。MakePolygon类从不引发错误。如果未添加顶点,则“导线”为Null。如果两个顶点位于同一位置,则不会创建边。

5.5、Face

        使用 BRepBuilderAPI_MakeFace 类从曲面和线创建面。基础曲面由曲面和可选参数值构成。线可以添加到曲面。平面曲面可以由线构成。面构造后可以返回错误状态。

基本面构造方法:

        一个面可以由一个曲面和四个参数构成,以确定UV空间的限制。这些参数是可选的,如果省略,则使用曲面的自然边界。最多可以使用一条线创建四个边和顶点。当参数为无限时,不会创建边。

Handle(Geom_Surface) S = ...; // a surface 
Standard_Real umin,umax,vmin,vmax; // parameters 
TopoDS_Face F =  BRepBuilderAPI_MakeFace(S,umin,umax,vmin,vmax); 

        要从曲面的自然边界创建面,不需要以下参数: 

Handle(Geom_Surface) S = ...; // a surface 
TopoDS_Face F = BRepBuilderAPI_MakeFace(S); 

        参数约束与 BRepBuilderAPI_MakeEdge 中的约束类似:umin、umax(vmin、vmax)必须在曲面的范围内,并且必须递增。在U(V)周期性曲面上,对umin和umax(vmin,vmax)进行调整。umin、umax、vmin、vmax可以为无穷大。在相应方向上将没有边缘。 

补充面构造方法

        两个基本构造(从曲面和从曲面和参数)用于所有gp封装曲面,这些曲面在Geom的相应曲面中转换。

         创建面后,可以使用Add方法添加导线。例如,以下代码将创建一个圆柱形曲面并添加导线。

gp_Cylinder C = ..; // a cylinder 
TopoDS_Wire W = ...;// a wire 
BRepBuilderAPI_MakeFace MF(C); 
MF.Add(W); 
TopoDS_Face F = MF; 

         可以将多条导线添加到一个面上,前提是这些导线彼此不交叉,并且它们只定义曲面上的一个区域。(请注意,未选中此项)。面上的边必须具有参数化曲线描述。

        如果面上的导线边没有参数化曲线,则通过投影进行计算。

        对于一条导线,提供了一个简单的语法来从曲面和导线构造面。以上几行可以写成:

TopoDS_Face F = BRepBuilderAPI_MakeFace(C,W); 

        如果导线定义了平面,则只能从导线创建平面。例如,要从一组点创建平面,可以使用BRpBuilderAPI_MakePolygon和BRpBuilder API_MakeFace。

        MakeFace的最后一个用途是复制现有面以添加新导线。例如,以下代码将新导线添加到面: 

TopoDS_Face F = ...; // a face 
TopoDS_Wire W = ...; // a wire 
F = BRepBuilderAPI_MakeFace(F,W); 

        要添加多条导线,可以创建BRepBuilderAPI_MakeFace类的实例,其中面和第一条导线以及使用add方法插入的新导线。 

错误状态:

        Error 方法返回一个错误状态,这是 BRepBuilderAPI_FaceError 枚举中的一个术语。FaceDone - 没有发生错误。NoFace - 未初始化算法;使用了空构造函数。NotPlanar - 没有给定曲面,线不是平面。CurveProjectionFailed - 在曲面的参数空间中没有找到曲线。ParametersOutOfRange - 参数 umin、umax、vmin、vmax 超出了曲面范围。 

5.6、Wire

        线是一种复合形状,不是由几何形状构建的,而是由边缘的装配构建的。BRepBuilderAPI_MakeWire类可以从一个或多个边缘构建线,或将新边缘连接到现有线。

TopoDS_Wire W = BRepBuilderAPI_MakeWire(E1,E2,E3,E4); 

         对于更多或未知数量的边,必须使用 Add 方法;例如,从形状(边)数组构建导线。

TopTools_Array1OfShapes theEdges; 
BRepBuilderAPI_MakeWire MW; 
for (Standard_Integer i = theEdge.Lower(); 
i <= theEdges.Upper(); i++) 
MW.Add(TopoDS::Edge(theEdges(i)); 
TopoDS_Wire W = MW; 

         类可以用线构造。也可以添加线。在这种情况下,添加了所有线的边。例如合并两条线

#include <TopoDS_Wire.hxx> 
#include <BRepBuilderAPI_MakeWire.hxx> 
TopoDS_Wire MergeWires (const TopoDS_Wire& W1, 
const  TopoDS_Wire& W2) 
{ 
BRepBuilderAPI_MakeWire MW(W1); 
MW.Add(W2); 
return MW; 
} 

        BRepBuilderAPI_MakeWire 类将边连接到线。添加新边时,如果其顶点之一与线共享,则认为它已连接到线。如果没有共享顶点,则算法会搜索边的一个顶点和线的一个顶点,这两个顶点位于同一位置(使用顶点的公差来测试它们是否具有相同的位置)。如果找到这样的一对顶点,则将边与线的顶点一起复制,以替换原始顶点。边的所有顶点都可以与线的顶点交换。如果找不到连接,则认为线已断开连接。这是一个错误。

        BRepBuilderAPI_MakeWire 类可以返回添加到线上的最后一条边(Edge 方法)。如果复制了这条边,则它可能与原始边不同。

        Error 方法返回 BRepBuilderAPI_WireError 枚举中的一个术语:WireDone – 没有发生错误。EmptyWire – 未初始化算法,使用了空构造函数。DisconnectedWire – 最后添加的边未连接到线。NonManifoldWire – 具有某种奇异性的线。

5.7、Shell

        壳是一个复合形状,不是由几何形状构建的,而是由面组装而成的。使用BRepBuilderAPI_MakeShell类从一组面构建壳。重要的是每个面都应该具有所需的连续性。这就是为什么初始曲面被分解成面。

5.8、Solid

        实体不是由几何图形构建的,而是由壳的装配构建的。使用BRepBuilderAPI_MakeSolid类从一组壳中构建实体。它的使用类似于MakeWire类的使用:壳以与添加边缘到MakeWire中的线相同的方式添加到实体中

6、对象修改

6.1、移动

        BRpBuilderAPI_Transform类可用于将转换应用于形状(请参见类gp_Trsf)。只要变换允许,这些方法都有一个布尔参数来复制或共享原始形状(仅适用于直接等轴测变换)。默认情况下,原始形状是共享的。

        BRpBuilderAPI_Transform 是一个用于变换形状的函数,它接受一个形状和一个变换矩阵作为参数。通过应用变换矩阵,该函数会创建一个新的形状,它是原始形状经过变换后的结果。原始形状不会被修改或删除。

6.2、复制

        使用BRepBuilderAPI_Copy类可以复制形状。这样就形成了一个新的形状。

7、基本元素

        BRRepPrimAPI包提供了一个API(应用程序编程接口),用于构造基元,例如:Boxes;Cones;Cylinders;Prisms。

        可以创建部分实体,例如由经度限制的球体。在真实模型中,可以使用基本体轻松创建特定的子部分。

        沿轮廓扫掠的构造:线性的、旋转(通过旋转角度)。扫掠是通过沿路径扫掠轮廓而获得的物体。轮廓可以是任何拓扑,路径通常是曲线或线。轮廓根据以下规则生成物体:顶点生成边,
边生成面,线产生壳,面生成实体,壳体产生复合固体。
        不允许扫除固体和复合固体。沿复杂轮廓(如B样条曲线)扫掠的构造也可在BRepOffsetAPI包中使用。此API为最常见的操作提供简单的高级调用

7.1、制作基本形状

box

        BRepPrimAPI_MakeBox 类允许构建平行六面体。结果是一个壳或一个实体。构建一个盒子有四种方法:从三个维度dx、dy和dz。该框平行于轴,延伸为[0,dx] [0,dy] [0,dz]。从点和三维空间。与上面相同,但点是新的原点。从两个点来看,该框与坐标轴平行,并在由两个点的坐标定义的间隔上延伸。从轴gp_Ax2和三个维度系统。与第一种方式相同,但框平行于给定的轴系统。

TopoDS_Solid theBox = BRepPrimAPI_MakeBox(10.,20.,30.); 

Wedge

        BRepPrimAPI_MakeWedge 类允许构建一个楔形,即一个倾斜的盒子,即一个有角度的盒子。楔形的构造方式与盒子的构造方式基本相同,即从三个维度 dx、dy、dz 加上参数或从轴系、三个维度和参数构造。

        下图显示了构建楔子的两种方法。一种方法是添加维度ltx,它是dy处面的x长度。第二种方法是添加xmin、xmax、zmin和zmax来描述dy处的面。

        第一种方法是第二种方法的特例,其中xmin = 0,xmax = ltx,zmin = 0,zmax = dz。要制作一个中心金字塔,可以使用xmin = xmax = dx / 2,zmin = zmax = dz / 2。

Rotation object 

        BRepPrimAPI_MakeOneAxis是一个延迟类,用作构造旋转基元的所有类的根类。旋转基元是通过围绕轴旋转曲线创建的。它们包括圆柱体、圆锥体、球体、圆环和提供所有其他曲线的旋转。

        这些原语的特定构造被描述,但它们都有一些共同的参数,它们是:坐标系,其中Z轴为旋转轴。一个在[0,2*PI]范围内的角度。曲线上的 vmin、vmax 参数范围。
        OneAxis构造的结果是一个Solid、Shell或Face。Face是覆盖旋转表面的面。请记住,您不会直接使用OneAxis,而是使用提供改进构造的派生类之一。下图说明了OneAxis的参数。

Cylinder 

         BRepPrimAPI_MakeCylinder 类允许创建圆柱形图元。圆柱体可以在默认坐标系或给定坐标系 gp_Ax2 中创建。有两种构造:半径和高度,以构建一个完整的圆柱体。半径、高度和角度,以构建圆柱体的一部分。

Standard_Real X = 20, Y = 10, Z = 15, R = 10, DY = 30; 
// Make the system of coordinates 
gp_Ax2 axes = gp::ZOX(); 
axes.Translate(gp_Vec(X,Y,Z)); 
TopoDS_Face F = 
BRepPrimAPI_MakeCylinder(axes,R,DY,PI/2.); 

Cone 

        BRepPrimAPI_MakeCone 类允许创建圆锥基本体。与圆柱体一样,圆锥体可以在默认坐标系或给定坐标系 (gp_Ax2) 中创建。有两种构造:

        两个半径和高度,以构建一个完整的圆锥体。其中一个半径可以为零,以形成一个尖锥。
半径、高度和角度,以构建截头圆锥体。 

Standard_Real R1 = 30, R2 = 10, H = 15; 
TopoDS_Solid S = BRepPrimAPI_MakeCone(R1,R2,H); 

Sphere 

        BRepPrimAPI_MakeSphere 类允许创建球形图元。与圆柱体一样,球体可以在默认坐标系或给定坐标系 gp_Ax2 中创建。有四种构造:从半径开始 – 构建一个完整的球体。从半径和角度来看,它构成了一个月牙(二角形)。从半径和两个角度 - 在两个纬度之间构建一个环绕的球形部分。角度 a1 和 a2 必须遵循关系:PI/2 <= a1 < a2 <= PI/2 。从半径和三个角度——结合前两种方法,构建球面的一部分。

Standard_Real R = 30, ang = 
    PI/2, a1 = -PI/2.3,  a2 = PI/4; 
TopoDS_Solid S1 = BRepPrimAPI_MakeSphere(R); 
TopoDS_Solid S2 = BRepPrimAPI_MakeSphere(R,ang); 
TopoDS_Solid S3 = BRepPrimAPI_MakeSphere(R,a1,a2); 
TopoDS_Solid S4 = BRepPrimAPI_MakeSphere(R,a1,a2,ang); 

 Torus 

        BRepPrimAPI_MakeTorus 类允许创建环形基元。与其他基元一样,可以在默认坐标系或给定坐标系 gp_Ax2 中创建环形。有四种类似于球体构造的构造:两个半径 - 构建一个完整的圆环。两个半径和一个角度 - 构建一个有角度的圆环段。两个半径和两个角度 - 在两个径向平面之间构建一个环绕的圆环段。角度 a1、a2 必须遵循 0 < a2 - a1 < 2*PI 的关系。两个半径和三个角度——结合前面两种方法,可以构建出部分圆环段。

Standard_Real R1 = 30, R2 = 10, ang = PI, a1 = 0, 
    a2 = PI/2; 
TopoDS_Shell S1 = BRepPrimAPI_MakeTorus(R1,R2); 
TopoDS_Shell S2 = BRepPrimAPI_MakeTorus(R1,R2,ang); 
TopoDS_Shell S3 = BRepPrimAPI_MakeTorus(R1,R2,a1,a2); 
TopoDS_Shell S4 = 
    BRepPrimAPI_MakeTorus(R1,R2,a1,a2,ang); 

Revolution

        BRepPrimAPI_MakeRevolution 类允许从曲线构建单轴基元。与其他单轴基元一样,它可以在默认坐标系或给定坐标系中创建。

        该曲线可以是任何Geom_Curve,只要它是平面的,并且与局部坐标系的Z轴位于同一平面。有四种构造模式:从曲线开始,使用整条曲线并完整旋转。从曲线和旋转的角度来看。从一条曲线和两个参数来修剪曲线。这两个参数必须不断增长且在曲线范围内。从一条曲线、两个参数和一个角度开始。这两个参数必须增长,并且必须在曲线范围内。

7.2、扫掠、镜像、旋转和管道

扫掠:

        扫掠是通过沿路径扫掠轮廓而获得的对象。轮廓可以是任何拓扑。路径通常是曲线或线。轮廓根据以下规则生成对象:顶点生成边、边生成面、线产生壳、面生成实体、壳体产生复合固体。
禁止扫除固体和复合固体。

        BRepPrimAPI_MakeSweep 类是一个延迟类,用作以下扫掠类的根:RepPrimAPI_MakePrism – 生成线性扫掠、BRepPrimAPI_MakeRevol – 生成旋转扫掠、
BRepPrimAPI_MakePipe – 生成常规扫掠。

拉伸: 

        BRepPrimAPI_MakePrism 类允许从形状和向量或方向创建线性棱柱: 矢量允许创建有限棱柱;方向允许创建无限或半无限棱镜。半无限或无限棱镜由布尔参数切换。所有构造函数都有一个布尔参数,用于复制原始形状或共享它(默认情况下)。以下代码使用一个面、一个方向和一个长度创建了一个有限、无限和半无限实体。

TopoDS_Face F = ..; // The swept face 
gp_Dir direc(0,0,1); 
Standard_Real l = 10; 
// create a vector from the direction and the length 
gp_Vec v = direc; 
v *= l; 
TopoDS_Solid P1 = BRepPrimAPI_MakePrism(F,v); 
// finite 
TopoDS_Solid P2 = BRepPrimAPI_MakePrism(F,direc); 
// infinite 
TopoDS_Solid P3 =  BRepPrimAPI_MakePrism(F,direc,Standard_False); 
// semi-infinite 

        semi-infinite 是指只有半无限个元素,即该集合包含一个无穷大元素,但不超过两个无穷大元素。infinite 是指无限个元素,即该集合包含无穷多个元素。finite 是指有限个元素,即该集合包含有限个元素。

 旋转扫描

        BRepPrimAPI_MakeRevol 类允许从形状、轴 (gp_Ax1) 和角度创建旋转扫掠。角度的默认值为 2*PI,表示闭合旋转。

        BRepPrimAPI_MakeRevol构造函数有一个最后一个参数,用于复制或共享原始形状。以下代码使用一个面、一个轴和一个角度创建了一个完整旋转和一个部分旋转。

TopoDS_Face F = ...; // the profile 
gp_Ax1 axis(gp_Pnt(0,0,0),gp_Dir(0,0,1)); 
Standard_Real ang = PI/3; 
TopoDS_Solid R1 = BRepPrimAPI_MakeRevol(F,axis); 
// Full revol 
TopoDS_Solid R2 = BRepPrimAPI_MakeRevol(F,axis,ang); 

8、布尔操作

        布尔操作用于从两组形状的组合中创建新的形状。

OperationResult
Fuseall points in S1 or S2
Commonall points in S1 and S2
Cut S1 by S2all points in S1 and not in S2

        从拓扑的角度来看,这些是拓扑操作,然后是混合(将圆角放在拓扑操作后创建的边缘上)。

        拓扑操作是创建真实工业零件最方便的方法。由于大多数工业零件由几个简单的元素组成,如齿轮、臂、孔、肋、管和管道。通常很容易单独创建这些元素,然后在整个最终零件中通过布尔操作将它们组合在一起。

8.1、参数

        布尔运算具有以下类型的参数,并产生以下结果:

        对于具有相同形状类型的参数(例如SOLID / SOLID),结果的形状类型将是COMPOUND,包含这种类型的形状;

        对于具有不同形状类型(例如SHELL / SOLID)的参数,结果的形状类型将是COMPOUND,包含与参数的低类型相同的形状类型。 示例:对于SHELL/SOLID,结果是一个SHELL的COMPOUND。

        对于具有不同形状类型的参数,由于结果的非流形类型,某些布尔操作无法使用默认实现来完成。例如:SHELL和SOLID的FUSE操作无法完成,但CUT操作可以完成,其中SHELL是对象,SOLID是工具。

        可以对COMPOUND形状类型的参数执行布尔运算。在这种情况下,每个化合物不得是异质的,即它必须包含等维形状(EDGE或/和WIRE,FACE或/和SHELL,SOLID)。复合物内的SOLID不得相互接触(相交或接触)。SHELL或FACE、WIRE或EDGE也应遵守相同的条件。
不支持 COMPSOLID 类型形状的布尔运算。

8.2、实施

        BRepAlgoAPI_BooleanOperation 类是布尔操作是延迟初始化的类。

TopoDS_Shape A = ..., B = ...; 
TopoDS_Shape S = BRepAlgoAPI_Fuse(A,B); 
TopoDS_Shape A = ..., B = ...; 
TopoDS_Shape S = BRepAlgoAPI_Common(A,B); 
TopoDS_Shape A = ..., B = ...; 
TopoDS_Shape S = BRepAlgoAPI_Cut(A,B); 

        BRepAlgoAPI_Section 执行由 TopoDS_Edge 组成的 TopoDS_Compound 的部分。

9、圆角和倒角

9.1、形状上的圆角

        圆角是替换锐边的平滑面。BRepFilletAPI_MakeFillet 类允许对形状进行圆角处理。要生成圆角,必须在类构造时定义圆角形状,并使用 Add 方法添加圆角描述。圆角描述包含一条边和一个半径。该边必须由两个面共享。圆角会自动延伸到与原始边平滑连续的所有边。添加两次圆角不是错误,最后一个描述有效。


TopoDS_Shape FilletedBox(const Standard_Real a, 
                        const Standard_Real  b, 
                        const Standard_Real  c, 
                        const Standard_Real  r) 
{ 
    TopoDS_Solid Box =  BRepPrimAPI_MakeBox(a,b,c); 
    BRepFilletAPI_MakeFillet  MF(Box); 
    // add all the edges  to fillet 
    TopExp_Explorer  ex(Box,TopAbs_EDGE); 
    while (ex.More()) 
    { 
    MF.Add(r,TopoDS::Edge(ex.Current())); 
    ex.Next(); 
    } 
    return MF.Shape(); 
    } 

void CSampleTopologicalOperationsDoc::OnEvolvedblend1() 
{ 
    TopoDS_Shape theBox  = BRepPrimAPI_MakeBox(200,200,200); 
    BRepFilletAPI_MakeFillet  Rake(theBox); 
    ChFi3d_FilletShape  FSh = ChFi3d_Rational; 
    Rake.SetFilletShape(FSh); 
    TColgp_Array1OfPnt2d  ParAndRad(1, 6); 
    ParAndRad(1).SetCoord(0.,  10.); 
    ParAndRad(1).SetCoord(50.,  20.); 
    ParAndRad(1).SetCoord(70.,  20.); 
    ParAndRad(1).SetCoord(130.,  60.); 
    ParAndRad(1).SetCoord(160.,  30.); 
    ParAndRad(1).SetCoord(200.,  20.); 
    TopExp_Explorer  ex(theBox,TopAbs_EDGE); 
    Rake.Add(ParAndRad, TopoDS::Edge(ex.Current())); 
    TopoDS_Shape  evolvedBox = Rake.Shape(); 
} 

 9.2、倒角

        倒角是代替面尖顶的直线边缘。BRepFilletAPI_MakeChamfer 类与 BRepFilletAPI_MakeFillet 的使用类似,但有以下不同:创建的曲面是直纹的,而不是平滑的。选择边的“添加”语法需要一个或两个距离、一条边和一个面(与该边相邻)。

9.3、平面上的圆角

        BRepFilletAPI_MakeFillet2d 类允许在平面上构造圆角和倒角。要在平面上创建圆角:定义它,指示要删除的顶点,并通过 AddFillet 方法给出圆角半径。

        斜面可以通过 AddChamfer 方法计算。它可以用以下方式描述:两条边和两个距离、一个边、一个顶点、一个距离和一个角度。圆角和倒角在添加完成时计算。
        如果面F2是由面F1的2D圆角和倒角生成器创建的,则可以重建生成器(生成器恢复删除前的状态)。为此,请使用以下语法

BRepFilletAPI_MakeFillet2d builder; 
builder.Init(F1,F2); 

平面圆角 

TopoDS_Shape FilletFace(const Standard_Real a, 
                        const Standard_Real  b, 
                        const Standard_Real c, 
                        const Standard_Real  r) 
{ 
    TopoDS_Solid Box =  BRepPrimAPI_MakeBox (a,b,c); 
    TopExp_Explorer  ex1(Box,TopAbs_FACE); 
    const  TopoDS_Face& F = TopoDS::Face(ex1.Current()); 
    BRepFilletAPI_MakeFillet2d  MF(F); 
    TopExp_Explorer  ex2(F, TopAbs_VERTEX); 
    while (ex2.More()) 
    { 
    MF.AddFillet(TopoDS::Vertex(ex2.Current()),r); 
    ex2.Next(); 
    } 
    // while... 
    return MF.Shape(); 
} 

10、偏移、拔模斜度、管道和演变形状

        这些类提供以下服务:创建偏移形状及其变体,例如:空心化;外壳;放样;使用拔模角创建锥形;创建扫掠。

10.1、偏移

        可以使用 BRepOffsetAPI_MakeOffsetShape 执行偏移计算。此类为两种不同的偏移算法提供API:

        基于解析延拓计算的偏移算法。参数的含义可以在BRepOffsetAPI_MakeOffsetShape::PerformByJoin方法描述中找到。下面的列表演示了该算法的主要方案:

        第一步,计算偏移量。在此之后,为每个偏移计算解析连续性。根据原始拓扑信息(共享、邻居数量等)计算成对交集。组装偏置形状。

        第二种算法基于这样一个事实,即可以始终构建没有连续性的单个面部的偏移计算。下表显示了简单的偏移算法:

        每个曲面都映射到其几何偏移曲面。对于每条边,pcurves 被映射到偏移曲面上的相同 pcurves。对于每条边,通过在第一个偏移面上对pcurve进行重新近似来构造3d曲线。结果壳中每个顶点的位置被计算为共享该顶点的所有边缘末端的平均点。公差根据生成的几何图形进行更新。简单算法的可能缺点是,在一般情况下,会导致公差增加。公差必须增加,以覆盖输出中相邻面之间的间隙。应该指出的是,实际的公差增长取决于输入面之间的偏移距离和接合质量。无论如何,良好的输入壳(相邻面之间的平滑连接)将导致良好的结果。

BRepOffsetAPI_MakeOffsetShape OffsetMaker1;
OffsetMaker1.PerformByJoin(Shape, OffsetValue, Tolerance);
if (OffsetMaker1.IsDone())
  NewShape = OffsetMaker1.Shape();
BRepOffsetAPI_MakeOffsetShape OffsetMaker2;
OffsetMaker2.PerformBySimple(Shape, OffsetValue);
if (OffsetMaker2.IsDone())
  NewShape = OffsetMaker2.Shape();

10.2、带有厚度的壳

        壳用于将实体的给定面偏移特定值。它根据边的凸度沿边对相邻面进行圆角或相交。BRepOffsetAPI_MakeThickSolid的MakeThickSolidByJoin方法将实体、要删除的面列表和偏移值作为输入。

TopoDS_Solid SolidInitial = ...;
Standard_Real           Of      = ...;
TopTools_ListOfShape    LCF;
TopoDS_Shape            Result;
Standard_Real           Tol = Precision::Confusion();
for (Standard_Integer i = 1 ;i <= n; i++) {
    TopoDS_Face SF = ...; // a face from SolidInitial
    LCF.Append(SF);
}
BRepOffsetAPI_MakeThickSolid SolidMaker;
SolidMaker.MakeThickSolidByJoin(SolidInitial,
                                LCF,
                                Of,
                                Tol);
if (SolidMaker.IsDone())
  Result = SolidMaker.Shape();

        此外,还可以在壳和偏置壳之间创建实体。可以使用BRepOffsetAPI_MakeThickSolid::MakeThickSolidBySimple方法调用此功能。以下代码显示了使用示例 

BRepOffsetAPI_MakeThickSolid SolidMaker;
SolidMaker.MakeThickSolidBySimple(Shell, OffsetValue);
if (myDone.IsDone())
  Solid = SolidMaker.Shape();

10.3、拔模

        BRepOffsetAPI_DraftAngle 类允许通过对其平面、圆柱面和圆锥面应用拔模角度来修改形状。类是从形状创建或初始化的,然后添加要修改的面;对于每个面,使用三个参数:

        方向:测量拔模角度的方向;角度:角度值;中性平面:面与中性平面之间的交点是不变的。
        以下代码在形状的几个面上放置拔模斜度;每个面使用相同的方向、角度和中性平面

TopoDS_Shape myShape = ... 
TopTools_ListOfShape ListOfFace; 

gp_Dir Direc(0.,0.,1.); 

Standard_Real Angle = 5.*PI/180.; 

gp_Pln Neutral(gp_Pnt(0.,0.,5.), Direc); 

BRepOffsetAPI_DraftAngle theDraft(myShape); 
TopTools_ListIteratorOfListOfShape itl; 
for (itl.Initialize(ListOfFace); itl.More(); itl.Next())  { 
    theDraft.Add(TopoDS::Face(itl.Value()),Direc,Angle,Neutral); 
    if  (!theDraft.AddDone()) { 
        // An error has occurred. The faulty face is given by //  ProblematicShape 
        break; 
        } 
} 
if (!theDraft.AddDone()) { 
    // An error has  occurred 
    TopoDS_Face guilty =  theDraft.ProblematicShape(); 
    ... 
} 
theDraft.Build(); 
if (!theDraft.IsDone()) { 
    // Problem  encountered during reconstruction 
    ... 
} 
else { 
    TopoDS_Shape  myResult = theDraft.Shape(); 
    ... 
} 

10.4、管道构造

        BRepOffsetAPI_MakePipe 类允许从 Spine 创建管道,Spine 是一个 Wire 和一个 Profile,后者是一个 Shape。此实现仅限于具有平滑过渡的脊柱,锐利过渡由 BRepOffsetAPI_MakePipeShell 处理。更准确地说,连续性必须是 G1,这意味着切线必须在相邻边缘具有相同的方向,但不一定具有相同的幅度。

TopoDS_Wire Spine = ...; 
TopoDS_Shape Profile = ...; 
TopoDS_Shape Pipe =  BRepOffsetAPI_MakePipe(Spine,Profile); 

10.5、实体烟花

        BRepOffsetAPI_MakeEvolved 类允许从 Spine(平面或线)和轮廓(线)创建进化的实体。

        演化的实体是由脊椎和轮廓生成的未成环的扫掠。

        通过在脊柱上扫掠轮廓的参考轴来创建演化固体。轴的原点移动到脊柱,X轴和局部切线重合,Z轴垂直于面。

        轮廓的参考轴可按以下两种不同模式定义:轮廓的参考轴是原点轴。轮廓的参考轴计算如下:起点由脊椎上最接近轮廓的点给出;X轴由上述点处脊椎的切线给出;Z轴是包含脊柱的平面的法线。

TopoDS_Face Spine = ...; 
TopoDS_Wire Profile = ...; 
TopoDS_Shape Evol = 
BRepOffsetAPI_MakeEvolved(Spine,Profile); 

11、缝合

11.1、介绍

        缝合允许从一组单独的拓扑元素(面和边)创建连接的拓扑(壳和线)。例如,缝合可用于从单独面的复合体创建壳。

        区分缝制和其他修改几何形状的工序非常重要,例如填充孔或间隙、粘合、弯曲曲线和曲面等。

        缝合不会改变形状的几何表示。缝合适用于拓扑元素(面、边),这些元素没有连接,但可以通过几何重合进行连接:它增加了关于拓扑连接的信息。在流形缝合的情况下,已经连接的元素保持不变。

        让我们定义几个术语:浮动的边不属于任何面;自由边界仅属于一个面;共享边属于多个面(即流形拓扑中的两个面)。缝合面应具有彼此共享的边缘。缝合边应具有彼此共享的顶点。 

11.2、缝合算法

        缝合算法是用于形状处理的基本算法之一,因此其质量非常重要。缝合算法在类BRepBuilder_Sewing中实现。该类提供以下方法:为全局或局部缝制加载初始数据;设置定制参数,如特殊操作模式、公差和输出结果;应用可用于获取外部算法所需连接性数据的分析方法;对已装载的形状进行缝合。

        缝制支持大数值容差的工作模式。在平滑增加容差的同时,不需要重复缝制步骤。也可以将边缘缝到wire上,并从形状中局部缝出单独的面和边缘。缝合算法可以细分为几个独立的阶段,其中一些阶段可以使用布尔或其他标志打开或关闭。简而言之,该算法应为每个自由边界找到一组合并候选对象,根据特定标准对其进行筛选,最后合并所找到的候选对象并构建最终的缝合形状。

        算法的每个阶段或整个算法都可以用以下参数进行调整:

        工作公差定义了可以缝合的拓扑元素之间的最大距离。这些元素实际上是否会被缝合并不是最终决定,因为还有其他许多标准可以用来做出最终决定。

        最小公差定义了结果形状中最小元素(边缘)的大小。 声明在缝合后不会创建尺寸小于此值的边缘。 如果遇到这种情况,这种拓扑结构就会退化。

        非流形模式支持非流形拓扑的缝合。

BRepBuilderAPI_Sewing Sew;
Sew.Add(Face1); 
Sew.Add(Face2); 
...
Sew.Add(Facen); 
Sew.Perform();
TopoDS_Shape result= Sew.SewedShape();

11.3、公差管理

        为了生成闭合壳,Sewing允许指定工作公差的值,该值超过属于该形状的小面的大小。

        但是,如果我们产生一个开壳,如果工作公差的值太大(即超过位于开放边界上的面的大小),则可能会得到不正确的缝合结果。

        以下建议可用于调整缝制过程:

        尽量使用较小的工作公差。这将减少缝制时间,从而减少具有自由边界的壳体错误缝制边缘的数量。

        使用尽可能大的最小公差。这将减少形状中原始和切割后出现的小几何体的数量。如果期望通过缝合获得具有孔(自由边界)的壳,则工作公差应设置为不大于最小元素(边缘)尺寸或此类自由边界元素之间最小距离的值。否则,自由边界可能仅部分缝合。

        应该提到的是,缝合算法无法理解应该保留哪些小的(小于工作公差)自由边界,哪些应该被缝合。

11.4、分流和非分流缝合

        要从一组面创建一或多个壳,缝合会合并属于不同面或一个闭合面的边缘。

        面缝支持歧管和非歧管模式。歧管模式只能产生歧管外壳。应在非歧管模式下使用缝制来创建非歧管外壳。

        面部的流形缝合仅将属于不同面部的两个最近边缘或一个闭合的面部相互融合。非流形缝合将所有边缘的距离小于指定的公差。

        对于复杂的拓扑结构,建议首先应用流形缝合,然后以尽可能小的加工公差进行非流形缝合。但是,对于简单的拓扑结构,这不是必需的。

        对非流形缝合赋予较大的公差值会导致很多错误,因为所有附近的几何体都将被缝合。

11.5、本地缝合

        在缝合操作中,歧管模式和非歧管模式是两种基本模式。

        歧管模式通常用于创建一个或多个封闭的表面。它只能产生封闭的外壳,不能用于创建非封闭的表面。在歧管模式下,缝合操作会尽可能将两个或多个面融合在一起,以形成一个封闭的表面。

        非歧管模式则可以用于创建任意形状的表面,包括封闭的和非封闭的。在非歧管模式下,缝合操作会尽可能将所有相邻的面融合在一起,无论它们是否形成封闭的表面。

这两种模式在缝合操作中都有其特定的应用场景。例如,在处理一些需要封闭表面的情况时,歧管模式会非常有用。而在处理一些需要灵活性和自由度的情况时,非歧管模式可能更为合适。

        如果形状在缝合后仍有一些未缝合的面或边缘,则可以使用具有更大公差的局部缝合。

        局部缝制特别适合开口壳。它允许在形状的一部分中缝制不需要的孔,并在形状的另一部分中保留一个所需的小于局部缝制规定的工作公差的孔。局部缝制比在整个形状上缝制快得多。

        局部缝制后,整个形状的所有预先存在的连接都得以保留。

        例如,如果想要使用局部缝合来缝合两个具有重合自由边的开口壳,则必须从两个壳创建一个复合体,然后使用方法 BRepBuilderAPI_Sewing::Load() 加载整个复合体。之后,需要添加局部子形状,这些形状应该使用方法 BRepBuilderAPI_Sewing::Add() 进行缝合。缝合的结果可以使用方法 BRepBuilderAPI_Sewing::SewedShape() 获得。


TopoDS_Shape aS1, aS2;  // these shapes are expected to be well sewn shells
TopoDS_Shape aComp;
BRep_Builder aB;
aB.MakeCompound(aComp);
aB.Add(aComp, aS1);
aB.Add(aComp, aS2);

aSewing.Load(aComp);
aSewing.Add(aF1);
aSewing.Add(aF2);
aSewing.Perform();
TopoDS_Shape aRes = aSewing.SewedShape();

12、特征

        BRepFeat包中的这个库对于创建和操纵超越形状的经典边界表示的形状和机械特征是必要的。在这个意义上,BRepFeat是BRepBuilderAPI包的扩展。

12.1、成型特征

        形态特征为凹陷或凸起,包括以下类型:Cylinder; Draft Prism; Prism; Revolved feature; Pipe。

        根据您希望凹陷还是凸起,您可以选择去除材料(布尔运算:熔合等于0)或添加材料(布尔运算:熔合等于1)。形状特征创建的语义基于形状的构造:沿特定方向特定长度;直至极限面;从极限面高度;在平面之上和/或之下。

        定义特征构造的形状可以是支撑边缘或面的相关区域。

        在支撑边缘的情况下,可以通过绑定将该轮廓附加到基础形状的一个面上。当轮廓绑定到该面上时,相关类方法将获得轮廓将在该面上滑动的信息。在面的相关区域的情况下,例如,您可以将其剪切出来并在不同的高度上移动,这定义了凸起或凹陷的限制面。

        这种局部操作的拓扑定义使计算比全局操作更简单、更快。后者需要第二阶段去除不需要的物质以获得相同的结果。

        BRepFeat包中的Form是一个延迟类,用作表单功能的根。它继承了BRepBuilderAPI中的MakeShape,并提供方法实现来跟踪所有子形状。

角柱:

        BRepFeat_MakePrism 类用于构建与形状交互的棱柱。它由以下对象创建或初始化:形状(基本形状),棱柱的基座,一个面(草图的面,其上定义了基底,并用于确定基底是否在基本形状上定义),一个方向,指示基本形状上的操作类型(融合=凸起或切割=凹陷)的布尔值,另一个布尔值,指示是否必须找到自交点(并非在每种情况下都使用)。

        请注意,可以在执行方法之前使用添加方法,以指示由边生成的面滑到基础形状的一个面上。

        在以下序列中,执行凸出操作,即将形状的表面改为棱柱。

TopoDS_Shape Sbase = ...;  // an initial shape 
TopoDS_Face Fbase = ....; // a base of prism 
gp_Dir Extrusion (.,.,.); 
// An empty face is given as the sketch face 
BRepFeat_MakePrism thePrism(Sbase, Fbase, TopoDS_Face(),  Extrusion, Standard_True, Standard_True); 
thePrism, Perform(100.); 
if (thePrism.IsDone()) { 
    TopoDS_Shape  theResult = thePrism; 
    ... 
} 

带角度的角柱:

        BRepFeat_MakeDPrism 类用于构建与基础形状交互的拔模棱柱拓扑。这些可以是凹陷或凸起。类对象从以下对象创建或初始化:shape(基本形状),基座,face(草图的脸,其基础已被定义并用于确定基础是否已在基本形状上定义),一个角度,指示基本形状上的操作类型(融合=凸起或切割=凹陷)的布尔值,另一个布尔值,指示是否必须找到自交点(并非在每种情况下都使用)。

        显然,MakeDPrism的输入数据与MakePrism的输入数据相同,除了一个新的参数Angle和一个缺少的参数Direction:棱柱生成的方向被自动确定为棱柱底面的法线。草图棱柱特征创建的语义基于形状的构造:沿长度方向、直至到达极限面、从限制面到高度。

        拔模棱柱特征的形状定义结构可以是支撑边或面的相关区域。在支撑边缘的情况下,可以通过绑定将该轮廓附加到基础形状的一个面上。当轮廓绑定到该面上时,相关类方法可以获得轮廓将在该面上滑动的信息。在面的相关区域的情况下,可以将其剪切并移动到不同的高度,这将定义凸起或凹陷方向的限制面。

TopoDS_Shape S = BRepPrimAPI_MakeBox(400.,250.,300.); 
TopExp_Explorer Ex; 
Ex.Init(S,TopAbs_FACE); 
Ex.Next(); 
Ex.Next(); 
Ex.Next(); 
Ex.Next(); 
Ex.Next(); 
TopoDS_Face F = TopoDS::Face(Ex.Current()); 
Handle(Geom_Surface) surf = BRep_Tool::Surface(F); 
gp_Circ2d 
c(gp_Ax2d(gp_Pnt2d(200.,130.),gp_Dir2d(1.,0.)),50.); 
BRepBuilderAPI_MakeWire MW; 
Handle(Geom2d_Curve) aline = new Geom2d_Circle(c); 
MW.Add(BRepBuilderAPI_MakeEdge(aline,surf,0.,PI)); 
MW.Add(BRepBuilderAPI_MakeEdge(aline,surf,PI,2.*PI)); 
BRepBuilderAPI_MakeFace MKF; 
MKF.Init(surf,Standard_False); 
MKF.Add(MW.Wire()); 
TopoDS_Face FP = MKF.Face(); 
BRepLib::BuildCurves3d(FP); 
BRepFeat_MakeDPrism MKDP (S,FP,F,10*PI180,Standard_True, 
                            Standard_True); 
MKDP.Perform(200); 
TopoDS_Shape res1 = MKDP.Shape(); 

旋转:

        BRepFeat_MakeRevol 类用于构建与形状交互的旋转。 它从以下对象创建或初始化:shape(基本形状),旋转基础、一张Face(草图的脸,其基础已被定义并用于确定基础是否已在基本形状上定义),旋转轴线,指示基本形状上的操作类型(融合=凸起或切割=凹陷)的布尔值,
另一个布尔值,指示是否必须找到自交点(并非在每种情况下都使用)。

TopoDS_Shape Sbase = ...;  // an initial shape 
TopoDS_Face Frevol = ....; // a base of prism 
TopoDS_Face FUntil = ....; // face limiting the revol 
gp_Dir RevolDir (.,.,.); 
gp_Ax1 RevolAx(gp_Pnt(.,.,.), RevolDir); 
// An empty face is given as the sketch face 
BRepFeat_MakeRevol theRevol(Sbase, Frevol, TopoDS_Face(), RevolAx,  Standard_True, Standard_True); 
theRevol.Perform(FUntil); 
if (theRevol.IsDone()) { 
    TopoDS_Shape  theResult = theRevol; 
    ... 
} 

管道:

        BRepFeat_MakePipe 类构造具有管道特征的复合形状:凹陷或凸起。类对象从以下对象创建或初始化:形状(基本形状),基面(管道剖面),一个面(草图的一个面,在该面上定义了基面,并用于确定基面是否已定义在基本形状上),wire,指示在基本形状上的操作类型(融合=突出或切割=凹陷)的布尔值,另一个布尔值,指示是否必须找到自交点(并非在每种情况下都使用)。

TopoDS_Shape S = BRepPrimAPI_MakeBox(400.,250.,300.); 
TopExp_Explorer Ex; 
Ex.Init(S,TopAbs_FACE); 
Ex.Next(); 
Ex.Next(); 
TopoDS_Face F1 = TopoDS::Face(Ex.Current()); 
Handle(Geom_Surface) surf = BRep_Tool::Surface(F1); 
BRepBuilderAPI_MakeWire MW1; 
gp_Pnt2d p1,p2; 
p1 = gp_Pnt2d(100.,100.); 
p2 = gp_Pnt2d(200.,100.); 
Handle(Geom2d_Line) aline = GCE2d_MakeLine(p1,p2).Value(); 
MW1.Add(BRepBuilderAPI_MakeEdge(aline,surf,0.,p1.Distance(p2))); 
p1 = p2; 
p2 = gp_Pnt2d(150.,200.); 
aline = GCE2d_MakeLine(p1,p2).Value(); 
MW1.Add(BRepBuilderAPI_MakeEdge(aline,surf,0.,p1.Distance(p2))); 
p1 = p2; 
p2 = gp_Pnt2d(100.,100.); 
aline = GCE2d_MakeLine(p1,p2).Value(); 
MW1.Add(BRepBuilderAPI_MakeEdge(aline,surf,0.,p1.Distance(p2))); 
BRepBuilderAPI_MakeFace MKF1; 
MKF1.Init(surf,Standard_False); 
MKF1.Add(MW1.Wire()); 
TopoDS_Face FP = MKF1.Face(); 
BRepLib::BuildCurves3d(FP); 
TColgp_Array1OfPnt CurvePoles(1,3); 
gp_Pnt pt = gp_Pnt(150.,0.,150.); 
CurvePoles(1) = pt; 
pt = gp_Pnt(200.,100.,150.); 
CurvePoles(2) = pt; 
pt = gp_Pnt(150.,200.,150.); 
CurvePoles(3) = pt; 
Handle(Geom_BezierCurve) curve = new Geom_BezierCurve 
(CurvePoles); 
TopoDS_Edge E = BRepBuilderAPI_MakeEdge(curve); 
TopoDS_Wire W = BRepBuilderAPI_MakeWire(E); 
BRepFeat_MakePipe MKPipe (S,FP,F1,W,Standard_False, 
Standard_True); 
MKPipe.Perform(); 
TopoDS_Shape res1 = MKPipe.Shape(); 

12.3、机械特征

        机械特征包括肋、突起和凹槽(或狭槽)、沿平面(线性)表面或回转面的凹陷。

        机械特征的语义是围绕给轮廓加厚度而建立的。这种厚度可以是对称的——在轮廓的一侧——也可以是不对称的——在两侧。与形状特征的语义一样,厚度是由特定语境中的形状构造定义的。

        然而,在机械特征方面,开发背景有所不同。这里包括挤压:至基础形状的限制面;从限制平面进入或离开;高度。

        类对象从以下对象创建或初始化:shape(基本形状);wire(肋条或凹槽底部);face(钢丝平面);direction1(厚度增加的矢量);direction2(与前一个方向相反的矢量,厚度将沿着该方向增加,可能为空);指示基本形状上的操作类型(融合=肋或切割=凹槽)的布尔值;另一个布尔值,指示是否必须找到自交点(并非在每种情况下都使用)。

线性形式

BRepBuilderAPI_MakeWire mkw; 
gp_Pnt p1 = gp_Pnt(0.,0.,0.); 
gp_Pnt p2 = gp_Pnt(200.,0.,0.); 
mkw.Add(BRepBuilderAPI_MakeEdge(p1,p2)); 
p1 = p2; 
p2 = gp_Pnt(200.,0.,50.); 
mkw.Add(BRepBuilderAPI_MakeEdge(p1,p2)); 
p1 = p2; 
p2 = gp_Pnt(50.,0.,50.); 
mkw.Add(BRepBuilderAPI_MakeEdge(p1,p2)); 
p1 = p2; 
p2 = gp_Pnt(50.,0.,200.); 
mkw.Add(BRepBuilderAPI_MakeEdge(p1,p2)); 
p1 = p2; 
p2 = gp_Pnt(0.,0.,200.); 
mkw.Add(BRepBuilderAPI_MakeEdge(p1,p2)); 
p1 = p2; 
mkw.Add(BRepBuilderAPI_MakeEdge(p2,gp_Pnt(0.,0.,0.))); 
TopoDS_Shape S = BRepBuilderAPI_MakePrism(BRepBuilderAPI_MakeFace 
    (mkw.Wire()),gp_Vec(gp_Pnt(0.,0.,0.),gp_P 
     nt(0.,100.,0.))); 
TopoDS_Wire W = BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(gp_Pnt 
    (50.,45.,100.), 
gp_Pnt(100.,45.,50.))); 
Handle(Geom_Plane) aplane = 
    new Geom_Plane(gp_Pnt(0.,45.,0.),  gp_Vec(0.,1.,0.)); 
BRepFeat_MakeLinearForm aform(S, W, aplane, gp_Dir 
    (0.,5.,0.), gp_Dir(0.,-3.,0.),  1, Standard_True); 
aform.Perform(); 
TopoDS_Shape res = aform.Shape(); 

        MakeLinearForm类中实现了线性形式,该类沿平面创建肋或槽。有一个Perform()方法,该方法沿方向1和方向2从线执行棱柱,与基础形状Sbase相互作用。棱柱的高度为Magnitude(Direction1)+Magnitude(Direction2)。

胶合

        BRepFeat_Gluer 类允许沿面将两个实体粘合在一起。粘合形状的接触面不得有超出基本形状接触面的部分。完成时,算法会给出粘合形状,形状内面有切出的部分。

        类由两个形状创建或初始化:粘合形状和基本形状(其他形状粘合在其上)。使用两个 Bind 方法将粘合形状的一个面绑定到基本形状的一个面,并将粘合形状的一条边绑定到基本形状的一条边。

        请注意,每个面和边都必须有边界,如果两个粘合面的两条边重合,则它们必须明确地有边界。

TopoDS_Shape Sbase = ...; // the basic shape 
TopoDS_Shape Sglued = ...; // the glued shape 
TopTools_ListOfShape Lfbase; 
TopTools_ListOfShape Lfglued; 

BRepFeat_Gluer theGlue(Sglue, Sbase); 
TopTools_ListIteratorOfListOfShape itlb(Lfbase); 
TopTools_ListIteratorOfListOfShape itlg(Lfglued); 
for (; itlb.More(); itlb.Next(), itlg(Next()) { 
const TopoDS_Face& f1 = TopoDS::Face(itlg.Value()); 
const TopoDS_Face& f2 = TopoDS::Face(itlb.Value()); 
theGlue.Bind(f1,f2); 
LocOpe_FindEdge fined(f1,f2); 
for (fined.InitIterator(); fined.More(); fined.Next()) { 
theGlue.Bind(fined.EdgeFrom(),fined.EdgeTo()); 
} 
} 
theGlue.Build(); 
if (theGlue.IsDone() { 
TopoDS_Shape  theResult = theGlue; 

} 

形状拆分:

        BRepFeat_SplitShape 类用于将形状的面拆分为线或边。包含新实体的形状被重建,共享未修改的实体。

        类是从形状(基本形状)创建或初始化的。有三个 Add 方法可用:

        Add(Wire, Face)  - 在基本形状的面上添加新线。

        Add(Edge, Face) – 在基本形状的面上添加一条新边。

        Add(EdgeNew, EdgeOld) - 在现有边(旧边必须包含新边)上添加新边。
        注意:添加的导线和边必须在面上定义闭合的导线,或者位于两条现有边之间的导线。现有边不得相交。

TopoDS_Shape Sbase = ...; // basic shape 
TopoDS_Face Fsplit = ...; // face of Sbase 
TopoDS_Wire Wsplit = ...; // new wire contained in Fsplit 
BRepFeat_SplitShape Spls(Sbase); 
Spls.Add(Wsplit, Fsplit); 
TopoDS_Shape theResult = Spls; 
...

13、隐线消除

        为了提供工业设计所需的精度,图纸需要提供去除隐藏在给定投影中的线条的可能性。

        为此,隐藏线去除组件提供了两种算法:HLRBRep_Algo和HLRBRep_PolyAlgo。

        这些算法基于将待可视化形状的每个边与其每个面进行比较,并计算每个边的可见和隐藏部分的原理。请注意,这些不是用于生成着色的算法,这些算法通过将形状中的每个面与同一形状中的每个其他面进行比较,来计算待可视化形状中每个面的可见和隐藏部分。这些算法对形状进行操作,并删除或指示被面隐藏的边。对于给定的投影,它们计算一组表示被表示对象的特征的线。它们也与提取工具结合使用,这些工具从计算结果的选择中重建一个新的简化形状。这个新形状由边缘组成,代表投影中可视化的形状。

        HLRBRep_Algo允许使用形状本身,而HLRBRep_PolyAlgo则使用形状的多面体简化。使用HLRBRep_Algo时,可以获得精确的结果,而使用HLRBRep_PolyAlgo时,可以减少计算时间,但会获得多边形段。

        不提供平滑算法。因此,多面体将被视为多面体,算法将以符合多面体数学定义的形式给出线段结果。HLRBRep_PolyAlgo总是这样。

        HLRBRep_Algo和HLRBRep_PolyAlgo可以处理任何类型的对象,例如体积、曲面和直线的组合,只要其中没有未完成的对象或点。

        然而,HLR的使用有一些限制:积分不处理;无限个面或线将不会被处理。

         以下服务与隐藏线删除相关: 

        加载形状:要将 TopoDS_Shape 传递给 HLRBRep_Algo 对象,请使用 HLRBRep_Algo::Add。对于 HLRBRep_PolyAlgo 对象,请使用 HLRBRep_PolyAlgo::Load。如果要添加多个形状,请根据需要尽可能多地使用 Add 或 Load。

        设置视图参数HLRBRep_Algo::Projector 和 HLRBRep_PolyAlgo::Projector 设置了投影仪对象,该对象定义了视图的参数。该对象是一个 HLRAlgo_Projector。

        计算投影HLRBRep_PolyAlgo::Update 启动 HLRBRep_PolyAlgo 框架可视化形状轮廓的计算。

        在 HLRBRep_Algo 的情况下,使用 HLRBRep_Algo::Update。使用此算法,您还必须调用 HLRBRep_Algo::Hide 方法来计算要可视化的形状的可见和隐藏线。使用 HLRBRep_PolyAlgo 对象,可见和隐藏线由 HLRBRep_PolyHLRToShape 计算。

        提取边缘:HLRBRep_HLRToShape 和 HLRBRep_PolyHLRToShape 类分别为 HLRBRep_Algo 对象和 HLRBRep_PolyAlgo 对象提供了一系列提取过滤器。它们突出了算法在形状上计算的结果中的边缘类型。使用这两个提取类,您可以突出显示以下类型的输出:

        可见/隐藏的锐边;
        可见/隐藏平滑边缘;
        可见/隐藏缝边;
        可见/隐藏轮廓边缘。
        要对 HLRBRep_PolyHLRToShape 对象执行提取,请使用 HLRBRep_PolyHLRToShape::Update 函数。

        对于从HLRBRepAlgo对象构建的HLRBRep_HLRToShape对象,您还可以突出显示:可见等参线、隐藏的等参参数。

myAlgo = new HLRBRep_Algo(); 
TopTools_ListIteratorOfListOfShape anIterator(myListOfShape); 
for (;anIterator.More();anIterator.Next()) 
myAlgo-Add(anIterator.Value(),myNbIsos); 
myAlgo-Projector(myProjector); 
myAlgo->Update(); 
myAlgo->Hide(); 


HLRBRep_HLRToShape aHLRToShape(myAlgo); 
TopoDS_Shape VCompound           = aHLRToShape.VCompound(); 
TopoDS_Shape Rg1LineVCompound                            = 
aHLRToShape.Rg1LineVCompound(); 
TopoDS_Shape RgNLineVCompound                            = 
aHLRToShape.RgNLineVCompound(); 
TopoDS_Shape OutLineVCompound                            = 
aHLRToShape.OutLineVCompound(); 
TopoDS_Shape IsoLineVCompound                            = 
aHLRToShape.IsoLineVCompound(); 
TopoDS_Shape HCompound           = aHLRToShape.HCompound(); 
TopoDS_Shape Rg1LineHCompound                            = 
aHLRToShape.Rg1LineHCompound(); 
TopoDS_Shape RgNLineHCompound                            = 
aHLRToShape.RgNLineHCompound(); 
TopoDS_Shape OutLineHCompound                            = 
aHLRToShape.OutLineHCompound(); 
TopoDS_Shape IsoLineHCompound                            = 
aHLRToShape.IsoLineHCompound(); 

14、网格

14.1、网格演示

        除了支持3D对象的精确几何表示外,Open CASCADE Technology还提供了以网格形式处理对象镶嵌表示的功能。

        OCCT技术网格功能提供:用于存储与形状相关的表面网格数据的数据结构,以及处理这些数据的一些基本算法;数据结构和算法,用于从BRep对象(形状)构建表面三角网格。通过显示网格以及相关的预处理器和后处理器数据来扩展Open CASCADE技术的3D可视化功能。

        Open CASCADE技术包括两个网格转换器:VRML转换器将Open CASCADE形状转换为VRML 1.0文件(虚拟现实建模语言)。Open CASCADE形状可以以两种表示形式进行转换:着色或线框。着色表示将形状表示为由网格算法计算的三角形集,而线框表示将形状表示为曲线集。
STL转换器将Open CASCADE形状转换为STL文件。STL(立体光刻)格式广泛用于快速原型制作。

        Open CASCADE SAS还提供高级网格产品:Open CASCADE Mesh Framework (OMF)、Express Mesh。

        此外,我们可以在曲面和体网格算法、网格优化算法等领域为您提供有效帮助。如果您需要有关网格算法的合格建议,请随时利用我们团队在该领域的专业知识。

14.2、网格算法

        形状三角化的算法由 BRepMesh_IncrementalMesh 类提供,该类将形状的三角化添加到其拓扑数据结构中。该三角化用于以着色模式可视化形状。

#include <IMeshData_Status.hxx>
#include <IMeshTools_Parameters.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
Standard_Boolean meshing_explicit_parameters()
{
  const Standard_Real aRadius = 10.0; 
  const Standard_Real aHeight = 25.0; 
  BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight); 
  TopoDS_Shape aShape = aCylinder.Shape();
  const Standard_Real aLinearDeflection   = 0.01;
  const Standard_Real anAngularDeflection = 0.5;
  BRepMesh_IncrementalMesh aMesher (aShape, aLinearDeflection, Standard_False, anAngularDeflection, Standard_True);
  const Standard_Integer aStatus = aMesher.GetStatusFlags();
  return !aStatus;
}
Standard_Boolean meshing_imeshtools_parameters()
{
  const Standard_Real aRadius = 10.0; 
  const Standard_Real aHeight = 25.0; 
  BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight); 
  TopoDS_Shape aShape = aCylinder.Shape();
  IMeshTools_Parameters aMeshParams;
  aMeshParams.Deflection               = 0.01;
  aMeshParams.Angle                    = 0.5;
  aMeshParams.Relative                 = Standard_False;
  aMeshParams.InParallel               = Standard_True;
  aMeshParams.MinSize                  = Precision::Confusion();
  aMeshParams.InternalVerticesMode     = Standard_True;
  aMeshParams.ControlSurfaceDeflection = Standard_True;
  BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams);
  const Standard_Integer aStatus = aMesher.GetStatusFlags();
  return !aStatus;
}

        默认网格算法 BRepMesh_IncrementalMesh 有两个主要选项来定义三角剖分 – 线性偏转和角度偏转。

        第一步,根据指定的参数对面的所有边进行离散化。

        在第二步中,对面进行细分。线性偏转限制了曲线与其细分之间的距离,而角度偏转限制了折线中后续线段之间的角度。 

        还有其他选项可以控制面内部网格的行为:DeflectionInterior和AngleInterior。 DeflectionInterior限制三角形与面内部之间的距离。 AngleInterior(仅用于B样条面的细分)限制三角形每个链接节点中法线(图中N1、N2和N3)之间的角度。沿面边界边缘的链接除外,“角偏转”在边缘离散化期间用于它们。

        请注意,如果给定的线性变形值小于形状公差,则算法将跳过该值,并考虑形状公差。

        应用程序应提供偏转参数来计算令人满意的网格。角度偏转相对简单,允许使用默认值(12-20度)。线性偏转具有绝对意义,应用程序应为模型提供正确的值。给定较小的值可能会导致网格过大(消耗大量内存,导致计算时间长和渲染速度慢),而较大的值会导致网格难看。

        对于在预先已知的维度中工作的应用程序,对所有模型使用绝对线性偏转是合理的。这根据应用程序中使用的度量和精度提供网格(例如,如果已知模型将以米为单位存储,则0.004米对于大多数任务来说已经足够了)。

        然而,导入在其他应用程序中创建的模型的应用程序可能不会对所有模型使用相同的偏转。请注意,这实际上是一种异常情况,该应用程序可能只是一个CAD模型的查看器,其尺寸会因数量级而变化。通过引入相对线性偏转的概念和某些LOD(细节级别),可以解决这个问题。细节级别是绝对偏转的缩放因子,应用于模型尺寸。

        网格化是指使用三角形网格覆盖一个形状。除了隐藏线去除,您还可以使用网格化将形状转移到另一个工具:制造工具、着色算法、有限元算法或碰撞算法。

        您可以通过首先探索它来获取有关形状的信息。要稍后访问形状中面的三角剖分,请使用BRepTool::Triangulation。要访问多边形(这是面边缘的近似值),请使用BRepTool::PolygonOnTriangulation。 

14.3、BRepMesh 结构

目标

        所选架构的主要目标是:消除数据结构、辅助工具和算法之间的紧密联系,以创建易于维护和改进的可扩展解决方案;为了简化调试和可读性,将代码分为几个负责特定操作的功能单元;引入新的数据结构,使操作特定实体(边、线、面)的离散模型成为可能,以便在本地执行计算,而不是处理整个模型;
        实现一个新的三角化算法,取代现有的功能,现有的功能包含需要转移到更高层的过于复杂的解决方案。此外,提供根据表面类型更改算法的可能性(最初是为了加快平面的网格划分)。

常规工作流程

 一般而言,该组件的工作流程可以分为六个部分:

        创建模型数据结构:传递给算法的源TopoDS_Shape被分析和分解成面和边。每个拓扑实体的相应镜像在数据模型中创建。请注意,底层算法使用数据模型作为输入,并通过公共接口访问它,该接口允许创建具有特定实体之间必要依赖关系的自定义数据模型(请参阅“数据模型接口”段落)。

        离散化3D和2D曲线边缘:为了创建一个一致的骨架,作为面网格化过程的基础,3D曲线以及每个模型边缘的相关2D曲线都被离散化。如果源形状的边缘已经包含符合指定参数的多边形数据,则从形状中提取并存储在模型中。每个边缘单独处理,不考虑邻接关系。

        修复离散模型:源TopoDS_Shape可能包含在设计、交换或修改模型的期间引入的问题,例如开放线路或自交点。此外,一些问题,如自交点,可能是由大致离散化的边缘引入的。这个阶段负责对离散模型进行分析,以检测和修复问题,或在无法解决问题的情况下拒绝进一步处理模型部分。

        预处理离散模型:定义在面网格化之前要执行的具体方法。默认情况下,此操作遍历模型面,检查现有三角剖分的的一致性,并在不一致的情况下清除拓扑面和相邻边缘的多边形数据,或标记离散模型的面为不需要计算。

        离散化面:这是执行特定面网格生成的核心部分。此操作缓存与面边缘相关联的多边形数据。

        后处理离散模型:定义在对面进行网格划分后要执行的实现方法的特定操作。默认情况下,此操作将上一阶段获得的多边形数据存储到源模型的 TopoDS_Edge 对象中。

通用接口

        组件结构包含两个单元:IMeshData(参见数据模型接口)和IMeshTools,分别定义了数据模型和算法工具的公共接口。

        IMeshTools_Context 类表示这些单元之间的连接器。上下文类缓存数据模型以及与上述工作流六个阶段中每个阶段相对应的工具,并提供安全调用相应工具的方法(与IntTools_Context类似设计,以保持与OCCT核心工具的一致性)。除了第一个阶段,所有阶段都使用数据模型作为输入,并对整个结构执行特定的操作。因此,定义了API类IMeshTools_ModelAlgo,以统一操作数据模型的工具的接口。每个处理数据模型的工具都应该继承这个接口,以便在上下文中缓存它。与其他人不同,由于阶段的含义不同,模型构建器界面由另一个类IMeshTools_ModelBuilder定义。启动整个工作流的入口点由IMeshTools_MeshBuilder表示。

        IMeshTools_Context 的默认实现是在 BRepMesh_Context 类中给出的,该类通过默认算法工具的实例初始化上下文。

        工厂接口IMeshTools_MeshAlgoFactory提供了更改特定曲面三角化算法的可能性。工厂根据作为参数传递的曲面类型,通过IMeshTools_MeshAlgo接口返回三角化算法的实例。它应该在面离散化阶段使用。

        BRepMesh_MeshAlgoFactory给出了AlgoFactory的默认实现,该实现根据传递的曲面类型返回不同复杂度的算法。反过来,它被用作BRepMesh_FaceDiscret算法的初始化器,该算法表示面离散阶段的启动器。

         其余界面描述辅助工具:

        IMeshTools_CurveTessellator:为负责在3D和2D曲线上创建离散多边形的算法提供了一个通用接口,以及从TopoDS_Edge提取现有多边形的工具,允许获取曲线上的离散点和相应参数,而不管实现细节如何(参见BRepMesh_EdgeDiscret中派生类BRepMesh_CurveTessellator、BRepMesh_EdgeTessellationExtractor的使用示例);
        IMeshTools_ShapeExplorer:后两个接口代表访问者设计模式,旨在将拓扑形状元素(边和面)的迭代与对特定元素执行的操作分开;
        IMeshTools_ShapeVisitor:为对目标拓扑形状的边缘和面的操作提供了一个通用接口。它可以与IMeshTools_ShapeExplorer配合使用。BRepMesh_ShapeVisitor中的默认实现可以初始化数据模型。这种方法的优点是,IMeshTools_ShapeVisitor的实现可以根据特定的数据模型进行更改,而形状资源管理器实现保持不变。

创建模型数据结构

        旨在保持底层算法所需的离散和临时数据的数据结构是在网格划分过程的第一阶段创建的。通常,该模型表示适合于目标任务的源拓扑形状的实体之间的依赖关系。

        数据模型接口:

        单元IMeshData提供了通用接口,指定在整个工作流的不同阶段使用的数据模型API。下图给出了设计接口的依赖关系和引用。具体的接口实现取决于目标应用程序,它允许开发人员实现不同的模型并使用自定义的低级数据结构,例如不同的集合,无论是NCollection还是STL。IMeshData_Shape被用作所有数据结构和工具的基类,用于保持拓扑形状,以避免可能的复制粘贴。

        接口的默认实现是在 BRepMeshData 单元中给出的。默认数据模型的主要目的是提供以并行模式执行边缘离散化的功能。因此,曲线、pcurve 和其他类都是基于 STL 容器和智能指针的,只要 NCollection 在某些情况下不提供线程安全(例如 NCollection_Sequence)。此外,它紧密反映了源形状的拓扑结构,即数据模型中的边缘数量等于源模型中的边缘数量;每条边缘包含一组与其相邻面相关的 pcurves,这允许在单独的线程中为所有 pcurves 或特定边缘的 3D 曲线创建离散多边形。

        优点:在必要时,数据模型(可能带有用于其处理的算法)可以很容易地被支持元素之间另一种依赖关系的另一种实现所替代。

        另一个不同数据模型的例子是,不需要创建在相邻面之间同步的离散多边形网格的情况,即,在需要加速创建仅用于可视化或快速计算的粗糙的每面镶嵌的情况下(XDEDRAW_Props中使用的办法)。

        收集数据模型:

        在此阶段,数据模型由实体根据源形状的拓扑结构填充。BRepMeshData单元中给出了数据模型的默认实现,并将模型表示为两组:一组边和一组面。每个面由一条或多条线组成,第一条线总是代表外线,而其他线是内线。反过来,每条线都描绘了定向边的有序序列。每条边都由一条3D曲线和零条(如果是自由边)或多条与该边相邻的面相关的2D曲线表示。3D和2D曲线分别表示在参考面的3D和2D空间中定义的一组点参数对。曲线和p曲线之间的另一个区别是,后者引用它所定义的面。

        模型填充算法由 BRepMesh_ShapeVisitor 类表示,该类在 BRepMesh_ShapeExplorer 的帮助下将模型创建为拓扑形状的反映,对目标形状的边和面进行迭代。请注意,该算法在数据模型的公共接口上运行,并创建了一个结构,而无需了解实现细节和底层数据结构。收集功能的入口点是 BRepMesh_ModelBuilder 类。

离散化边三维和二维曲线

        在此阶段,仅考虑数据模型的边缘。每个边缘单独处理(可以在多个线程中运行处理)。检查边缘是否存在现有的多边形数据。如果至少存在一个表示并适合网格参数,则对其进行恢复,并用作整个pcurves集以及分配给边缘的3D曲线的细分参考数据(参见BRepMesh_EdgeTessellationExtractor)。否则,创建一个新的细分算法,用于生成初始多边形(参见BRepMesh_CurveTessellator),并将边缘标记为过时。此外,通过偏转更新模型边缘,并重新计算相同范围、相同参数和退化参数。有关实现细节,请参见BRepMesh_EdgeDiscret。

        IMeshData单元定义接口IMeshData_ParametersListArrayAdaptor,用于将任意数据结构适配到NCollection_Array1容器API。此解决方案旨在将 NCollection_Array1 和 IMeshData_Curve 作为 BRepMesh_EdgeParameterProvider 工具的源,该工具旨在生成一致的参数化,同时考虑到相同的参数属性。

修复离散模型

        一般来说,这个阶段代表对整个离散模型执行的一组操作,以解决由于设计、转换或粗略离散化引起的问题而导致的不一致。根据目标三角剖分算法,可以执行不同的操作序列,例如,有不同的方法来处理自交点——通过降低目标精度来放大边缘离散化,或在交点处拆分链接。在这个阶段,整个边缘集被视为一个整体,它们的邻接性也被考虑在内。BRepMesh_ModelHealer中给出了模型修复器的默认实现,它执行以下操作:

        遍历模型面并检查它们的线是否一致,即线是否闭合且不包含自交点。数据结构的设计没有冲突,因此可以在并行模式下运行处理;
        强制连接参数空间中相邻边的端点,闭合可能断开部分之间的间隙。此操作的目标是创建相对于目标面的参数空间定义的正确离散模型,同时考虑3D空间的连通性和公差。这意味着没有进行特定的计算来确定U和V公差;
        在形成面形状的边缘上注册交叉点。为了解决自交问题,有两种解决方案:

        减少特定边缘的偏转并更新其离散模型。之后,将“相交检查-放大”工作流程重复5次。结果,目标边缘包含更精细的镶嵌,网格化继续进行,或者该面被IMeshData_SelfIntersectingWire状态标记并拒绝进一步处理;
        通过交点分割目标边缘,并将更新的多边形与曲线和与每条边缘关联的剩余pcurve同步。与具有保证结果的放大过程相比,此操作提供了一种更稳健的解决方案,但从同步功能的角度来看,实现起来更困难。

预处理离散模型

        此阶段执行在面网格化之前要执行的操作。根据目标目标,可以更改或省略。默认情况下,BRepMesh_ModelPreProcessor实现检查拓扑面以检查现有三角剖分的一致性的功能,即:与目标偏转参数的一致性;三角形引用的节点索引不超过三角剖分中存储的节点数。如果面未通过某些检查,则将其从三角剖分中清除,其相邻边从现有多边形中清除。这不会影响离散模型,也不需要任何重新计算,因为模型保持了整个边集的细分,尽管它们的多边形是一致的。

离散面

        面离散是网格划分算法的一般部分。在此阶段,使用在先前步骤中获得和处理过的边缘细分数据来形成目标面的轮廓,并将其作为输入传递给三角剖分算法。默认实现由BRepMesh_FaceDiscret类提供,该类表示三角剖分算法的启动器。它迭代数据模型中可用的面,通过IMeshTools_MeshAlgoFactory根据与每个面关联的曲面类型创建三角剖分算法的实例,并执行它。每个面都是单独处理的,因此可以并行处理面。

        一般来说,面网格化算法具有以下结构:

        BRepMesh_BaseMeshAlgo实现了IMeshTools_MeshAlgo接口和继承算法的基本功能。该类的主要目标是初始化BRepMesh_DataStructureOfDelaun的实例以及适用于使用作为输入参数传递的面模型数据的嵌套算法的辅助数据结构。尽管实现了三角剖分算法,但该结构目前被认为是OCCT的通用结构。但是,用户可以自由实现自定义算法和支持数据结构,可通过IMeshTools_MeshAlgo接口访问,例如连接不支持拓扑数据集形状的第三方网格工具。为此,这种结构提供了以插件形式将连接器分配给各种算法的可能性;

        BRepMesh_DelaunayBaseMeshAlgo 和 BRepMesh_SweepLineMeshAlgo 类实现了直接在 BRepMesh_DataStructureOfDelaun 实例上操作的核心网格功能。这些算法代表了网格生成工具,从数据结构向最终网格添加新点;

        BRepMesh_NodeInsertionMeshAlgo类表示一个旨在扩展从BRepMesh_BaseMeshAlgo继承的算法的包装器,以启用生成曲面节点并将其插入结构的功能。在这个级别上,创建了一个分类工具的实例,可用于接受或拒绝内部节点。此外,还执行了相对于相应方向指定范围缩放点UV坐标所需的计算。只要三角剖分算法在结构提供的静态数据上工作,就在初始化阶段添加新节点。曲面节点由称为范围分割器的辅助工具生成,并作为模板参数传递(参见范围分割器);        

        BRepMesh_DelaunayNodeInsertionMeshAlgo和BRepMesh_SweepLineNodeInsertionMeshAlgo类实现了与添加内部节点相关的特定算法功能,补充了BRepMesh_NodeInsertionMeshAlgo提供的功能;

        BRepMesh_DelaunayDeflectionControlMeshAlgo通过附加程序控制生成的三角形的偏转,扩展了BRepMesh_DelaunayNodeInsertionMeshAlgo的功能。

        范围分割器工具提供的功能是生成使用离散模型数据计算的范围内定义的内部曲面节点。基本功能由BRepMesh_DefaultRangeSplitter提供,在平面曲面的情况下,可以不经修改即可使用。默认分割器不生成任何内部节点。

        BRepMesh_ConeRangeSplitter、BRepMesh_CylinderRangeSplitter 和 BRepMesh_SphereRangeSplitter 是默认拆分器的特例,用于快速生成相应类型分析曲面的内部节点。

        BRepMesh_UVParamRangeSplitter 实现了基本功能,在节点生成时考虑了面边界的离散点。它的后继者 BRepMesh_TorusRangeSplitter 和 BRepMesh_NURBSRangeSplitter 相应地扩展了环形曲面和 NURBS 曲面的基本功能。

后处理离散模型

        此阶段执行在面网格化后要执行的操作。根据目标,可以更改或省略。默认情况下,BRepMesh_ModelPostProcessor会将数据模型中存储的多边形数据提交到TopoDS_Edge。

15、3D模型简化

        OCCT Defatting算法旨在从模型中删除不需要的部分或特征。这些部分可以是孔、凸起、间隙、倒角、圆角等。

        不执行特征检测,所有要删除的特征应由用户定义。在去特征化过程中不修改输入形状,新形状在结果中构建。

        在API级别上,Defaturing算法在BRepAlgoAPI_Defitting类中实现。在输入时,算法接受要删除的特征的形状以及要从形状中删除的特征(一个或多个)。目前,输入形状应为固体、复合固体或固体复合体。要删除的特征由形成它们的面集定义。特征面是如何给出的并不重要:作为单独的面或它们的集合。这些面应该属于初始形状,否则它们将被忽略。

        实际特征移除由低级BOPAlgo_RemoveFeatures算法执行。在API级别,所有输入都被传递到工具中,并调用BOPAlgo_RemoveFeatures::Perform()方法。

        在删除特征之前,将从形状中删除的所有面分类为连接块-每个块代表一个要删除的特征。特征被逐个从形状中删除,即使在删除它们时遇到一些问题(例如由于输入数据不正确),也可以删除所有可能的特征。

        删除的特征由与其相邻的面的延伸填充。一般来说,从形状中删除单个特征的算法如下:找到与特征相邻的面;延伸相邻面以覆盖特征;将延伸面修剪到原始面的边界(与特征共有的边界除外),使其仅覆盖特征;使用重建的相邻面重建实体,避免特征面。如果单个特征移除成功,则结果形状将被新形状覆盖,否则结果将不被保留,并给出警告。无论哪种方式,该过程都将继续下一个特征。

        Defeaturing算法具有以下选项:历史支持;以及基类提供的选项(BOPAlgo_Options):错误/警告报告系统;并行处理模式。请注意,此处不支持基类的其他选项,并且不会产生任何影响。

        历史支持允许根据 Modified、IsDeleted 和 Generated 跟踪输入形状的修改。默认情况下,会收集历史,但可以使用 SetToFillHistory(false) 方法禁用它。在低级别上,历史信息由历史工具 BRepTools_History 收集,可以通过 BOPAlgo_RemoveFeatures::History() 方法访问。

        错误/警告报告系统允许获取操作过程中发生的错误/警告的扩展概述。一旦出现任何错误,算法就会停止工作。警告允许继续作业并通知用户出现了问题。算法返回以下错误/警告:

        BOPAlgo_AlertUnsupportedType - 如果输入形状不包含任何实体,则将发出错误警报,如果输入形状不仅包含实体,还包含其他形状,则发出警告警报;
        BOPAlgo_AlertNoFacesToRemove - 如果没有要从形状中删除的面,则给出错误警报(无操作);
        BOPAlgo_AlertUnableToRemoveTheFeature - 发出警告提醒,通知用户无法删除该功能。算法仍将尝试删除其他功能;
        BOPAlgo_AlertRemoveFeaturesFailed - 如果操作因未知原因中止,则给出错误警报。

        有关错误/警告报告系统的更多信息,请参阅《布尔运算用户指南》的“错误和警告报告系统”一章。并行处理模式-允许以并行模式运行算法,从而更快地获得结果。

        该算法存在一定的局限性:与特征相邻的连接面的表面交集不应为空。这意味着,这些面不应相互相切。如果相邻面的交集为空,算法将无法正确修剪面,并且很可能会删除特征。该算法不处理实体的内部部分,它们在重建过程中被简单地移除。请注意,为了成功删除特征,与特征相邻的延伸面应完全覆盖特征,否则实体将无法重建。请看下面图像上的简单形状

        将间隙的三个面全部移除是行不通的,因为将没有面来填充台阶的横向部分。尽管如此,仅移除两个面,保留其中一个横向面,将用保留的面填充间隙: 

 15.1、使用

TopoDS_Shape aSolid = ...;               // Input shape to remove the features from
TopTools_ListOfShape aFeatures = ...;    // Features to remove from the shape
Standard_Boolean bRunParallel = ...;     // Parallel processing mode
Standard_Boolean isHistoryNeeded = ...;  // History support
BRepAlgoAPI_Defeaturing aDF;             // Defeaturing algorithm
aDF.SetShape(aSolid);                    // Set the shape
aDF.AddFacesToRemove(aFaces);            // Add faces to remove
aDF.SetRunParallel(bRunParallel);        // Define the processing mode (parallel or single)
aDF.SetToFillHistory(isHistoryNeeded);   // Define whether to track the shapes modifications
aDF.Build();                             // Perform the operation
if (!aDF.IsDone())                       // Check for the errors
{
  // error treatment
  Standard_SStream aSStream;
  aDF.DumpErrors(aSStream);
  return;
}
if (aDF.HasWarnings())                   // Check for the warnings
{
  // warnings treatment
  Standard_SStream aSStream;
  aDF.DumpWarnings(aSStream);
}
const TopoDS_Shape& aResult = aDF.Shape(); // Result shape

        命令“removefeatures”允许在绘图级别上使用“Defeaturing”算法。标准历史命令可用于跟踪折弯过程中形状修改的历史。

  16、三维模型周期性

        Open CASCADE技术提供了在指定方向上在3D空间中制作任意3D模型(或仅是形状)周期性的工具。

        形状的周期性意味着形状可以在任何周期方向上重复任意次数,而不会创建新的几何形状或分裂。该算法的思想是使形状在相反侧或在周期方向的周期边界上看起来相似。这并不意味着形状的相反侧将镜像。它只是意味着形状的相反侧应该相互分裂,并在相反侧获得相同的几何形状。这种方法将允许重复形状,即在周期上平移形状的副本,而不会创建新的几何形状,因为不会有不同维度的重合部分。

        使该形状在X、Y和Z方向上具有周期性,并且周期与形状的延伸相匹配,应使形状的负X和Z边分裂。Y方向两侧的形状已经相似,因此预计不会出现新的拆分。以下是使其具有周期性后的形状: 

16.1、如何使形状具有周期性

        为了使形状在某个方向上具有周期性,该算法执行以下步骤:1、创建形状的副本,并将其在周期内移动到所请求方向的负侧;2、通过移动的副本将形状的负侧分开,确保将几何图形从正侧复制到负侧;3、创建形状的副本(具有已分割的负侧),并将其在周期内移动到所请求方向的正面;4、通过移动的副本将形状的正侧分开,确保将几何图形从负侧复制到正侧。5、几何形状的重复复制可确保周期性形状的拐角边缘在所有周期性方向的两侧具有相同的几何形状。

        因此,在周期性形状中,形状正面的几何形状总是被复制到周期方向的背面。

16.2、关联相反形状

        该算法还将位于周期形状对侧的相同(或孪生)形状相关联。通过构造,孪生形状应始终具有相同的几何形状,并在周期内彼此隔开。形状可能没有任何孪生形状。这意味着重复该形状时不会触及形状的对侧。在形状的周期大于其扩展的示例中,子形状没有孪生形状。

16.3、周期性形状重复

        该算法还提供了在周期方向上重复周期形状的方法。为了重复形状,该算法制作了所需数量的形状副本,并在时间*周期值上逐一平移。在制作并平移所有副本后,它们被粘合在一起以形成有效的形状。后续重复是在重复的形状上进行的,因此,例如在任何周期方向上重复形状两次将产生包含三个形状的结果(原始形状加上两个副本)。在任何方向上的单个后续重复将产生6个形状。重复可以清除并重新开始。

16.4、历史支持

        该算法支持形状修改的历史记录,因此可以跟踪形状是如何改变的,使其具有周期性,以及在重复过程中创建了哪些新形状。这里提供分割历史和周期性形状重复历史。请注意,所有重复的形状都作为生成历史存储。BRepTools_History用于历史支持

16.5、错误和警告

        该算法支持错误/警告报告系统,该系统允许获取操作过程中出现的错误和警告的扩展概述。一旦出现任何错误,该算法就会停止工作。警告允许继续作业,通知用户出现了问题。该算法返回以下警报:

        BOPAlgo_AlertNoPeriodicityRequired——如果在任何方向上都没有请求周期性,则给出错误警报;
        BOPAlgo_AlertUnableToTrim - 如果将形状修剪成请求的时段失败,则会发出错误警报;
        BOPAlgo_AlertUnableToMakeIdentical——如果形状通过其移动副本进行分割失败,则会发出错误警报;
        BOPAlgo_AlertUnableToRepeat - 如果重复形状的粘合失败,则会发出警告警报。

16.6、使用

        该算法在类BOPAlgo_MakePeriodic中实现。下面是它在API级别上的使用示例

TopoDS_Shape aShape = ...;                 // The shape to make periodic
Standard_Boolean bMakeXPeriodic = ...;     // Flag for making or not the shape periodic in X direction
Standard_Real aXPeriod = ...;              // X period for the shape
Standard_Boolean isXTrimmed = ...;         // Flag defining whether it is necessary to trimming
                                           // the shape to fit to X period
Standard_Real aXFirst = ...;               // Start of the X period
                                           // (really necessary only if the trimming is requested)
Standard_Boolean bRunParallel = ...;       // Parallel processing mode or single
BOPAlgo_MakePeriodic aPeriodicityMaker;                   // Periodicity maker
aPeriodicityMaker.SetShape(aShape);                       // Set the shape
aPeriodicityMaker.MakeXPeriodic(bMakePeriodic, aXPeriod); // Making the shape periodic in X direction
aPeriodicityMaker.SetTrimmed(isXTrimmed, aXFirst);        // Trim the shape to fit X period
aPeriodicityMaker.SetRunParallel(bRunParallel);           // Set the parallel processing mode
aPeriodicityMaker.Perform();                              // Performing the operation
if (aPeriodicityMaker.HasErrors())                        // Check for the errors
{
  // errors treatment
  Standard_SStream aSStream;
  aPeriodicityMaker.DumpErrors(aSStream);
  return;
}
if (aPeriodicityMaker.HasWarnings())                      // Check for the warnings
{
  // warnings treatment
  Standard_SStream aSStream;
  aPeriodicityMaker.DumpWarnings(aSStream);
}
const TopoDS_Shape& aPeriodicShape = aPeriodicityMaker.Shape(); // Result periodic shape
aPeriodicityMaker.XRepeat(2);                                    // Making repetitions
const TopoDS_Shape& aRepeat = aPeriodicityMaker.RepeatedShape(); // Getting the repeated shape
aPeriodicityMaker.ClearRepetitions();                            // Clearing the repetitions

        请注意,该类基于选项类 BOPAlgo_Options,该类为算法提供了以下选项:错误/警告报告系统;并行处理模式。此处不支持基类的其他选项,并且这些选项将不起作用。

        对于在Draw级别上使用MakePeriodic算法,已经实现了以下命令:使周期性、重复形状、周期双胞胎、清除重复项。

        要跟踪 MakePeriodic 操作期间形状修改的历史记录,可以使用标准历史记录命令。

        要访问操作的错误/警告形状,请在运行算法之前使用bdrawwarnshapes命令。

16.7、范例

        想象一下,你需要在板上进行相同距离的钻孔。为了对这个过程进行建模,有必要制作许多圆柱体(模拟钻头),并从板上切割这些圆柱体。使用周期性工具,过程看起来非常简单:

# create plate 100 x 100
box plate -50 -50 0 100 100 1
# create a single drill with radius 1
pcylinder drill 1 1
# locate the drill in the left corner
ttranslate drill -48 -48 0
# make the drill periodic with 4 as X and Y periods, so the distance between drills will be 2
makeperiodic drill drill -x 4 -trim -50 -y 4 -trim -50
# repeat the drill to fill the plate, in result we get net of 25 x 25 drills
repeatshape drills -x 24 -y 24
# cut the drills from the plate
bcut result plate drills

17、连接触摸形状

        Open CASCADE技术提供了用于连接(或粘合)相同尺寸的触摸形状的工具,即用于在形状之间拓扑共享重合的几何形状。为了使形状连接,它们通过General Fuse算法粘合。使用选项BOPAlgo_GlueShift,因此如果输入形状干扰了算法,则算法将无法识别。

        将形状组连接起来可能会有用,例如在将组网格化之前。这将使生成的网格共形。

        用于使形状连接的算法在类BOPAlgo_MakeConnected中实现。

17.1、链接材料

        在此工具的框架中,输入形状称为材质,每个输入形状都有唯一的材质。

        在将形状连接起来之后,输入形状的边框元素与它们所属的形状相关联。此时,形状中边框元素的方向也被考虑在内。关联类型如下:对于输入固体,生成的表面与输入固体相关联;对于输入面孔,产生的边缘与输入面孔相关联;对于输入EDGES,生成的VERTICES与输入边缘相关联。关联过程称为材料关联。它允许找到相反输入形状的重合元素。这些元素将与至少两种材料相关联(一种在形状的正面上,另一种在形状的负面上)。

        为了获得材料信息,应使用以下方法:MaterialsOnPositiveSide() - 返回位于给定形状正面的原始形状(材料)(即具有 FORWARD 方向);MaterialsOnNegativeSide() - 返回位于给定形状的负侧(即方向相反)的原始形状(材质);


const TopTools_ListOfShape& BOPAlgo_MakeConnected::MaterialsOnPositiveSide(const TopoDS_Shape& theS)

const TopTools_ListOfShape& BOPAlgo_MakeConnected::MaterialsOnNegativeSide(const TopoDS_Shape& theS)

17.2、使连接形状具有周期性

        该工具提供了使连接形状周期化的可能性。由于通过使形状周期化,可以确保相对侧的重合形状的几何形状相同,因此可以重复使用形状的网格作为其周期性孪生。

        在使形状周期化之后,材料关联会更新以对应于结果形状的实际状态。从这里开始,也可以重复周期形状。材料关联不会丢失。

17.3、历史记录支持

        该算法支持操作过程中形状修改的历史记录。除了BRepTools_history提供的标准历史记录方法并在此处用作历史记录工具外,该算法还提供了跟踪反向连接的方法-从生成的形状到输入的形状。该方法被称为GetOrigins():

const TopTools_ListOfShape& BOPAlgo_MakeConnected::GetOrigins(const TopoDS_Shape& theS);

        这里可以查看胶合历史和制作形状周期和周期形状重复的历史。请注意,所有重复的形状都作为生成的历史存储。 

17.4、错误/警告

        该算法支持错误/警告报告系统,该系统允许获取操作过程中出现的错误和警告的扩展概述。一旦出现任何错误,该算法就会停止工作。警告允许继续作业,通知用户出现了问题。该算法返回以下警报:

        BOPAlgo_AlertTooFewArguments - 在尝试运行没有参数的算法时,会发出错误警报;
        BOPAlgo_AlertMultiDimensionalArguments - 在尝试对多维参数运行算法时发出错误警报;
        BOPAlgo_AlertUnableToGlue - 如果胶水算法无法粘合给定的参数,则给出错误警报;
        BOPAlgo_AlertUnableToMakePeriodic - 如果周期生成器无法使连接的形状具有给定的周期性选项,则发出警告警报;
        BOPAlgo_AlertShapeIsNotPeriodic - 在尝试将形状变为周期性之前,发出警告提醒。

17.5、用法

        以下是BOPAlgo_MakePeriodic算法在API级别使用的示例:

TopTools_ListOfShape anArguments = ...;  // Shapes to make connected
Standard_Boolean bRunParallel = ...;     // Parallel processing mode
BOPAlgo_MakeConnected aMC;               // Tool for making the shapes connected
aMC.SetArguments(anArguments);           // Set the shapes
aMC.SetRunParallel(bRunParallel);        // Set parallel processing mode
aMC.Perform();                           // Perform the operation
if (aMC.HasErrors())                     // Check for the errors
{
  // errors treatment
  Standard_SStream aSStream;
  aMC.DumpErrors(aSStream);
  return;
}
if (aMC.HasWarnings())                   // Check for the warnings
{
  // warnings treatment
  Standard_SStream aSStream;
  aMC.DumpWarnings(aSStream);
}
const TopoDS_Shape& aGluedShape = aMC.Shape(); // Connected shape
// Checking material associations
TopAbs_ShapeEnum anElemType = ...;       // Type of border element
TopExp_Explorer anExp(anArguments.First(), anElemType);
for (; anExp.More(); anExp.Next())
{
  const TopoDS_Shape& anElement = anExp.Current();
  const TopTools_ListOfShape& aNegativeM = aMC.MaterialsOnNegativeSide(anElement);
  const TopTools_ListOfShape& aPositiveM = aMC.MaterialsOnPositiveSide(anElement);
}
// Making the connected shape periodic
BOPAlgo_MakePeriodic::PeriodicityParams aParams = ...; // Options for periodicity of the connected shape
aMC.MakePeriodic(aParams);
// Shape repetition after making it periodic
// Check if the shape has been made periodic successfully
if (aMC.PeriodicityTool().HasErrors())
{
  // Periodicity maker error treatment
}
// Shape repetition in periodic directions
aMC.RepeatShape(0, 2);
const TopoDS_Shape& aShape = aMC.PeriodicShape(); // Periodic and repeated shape

        请注意,该类基于选项类 BOPAlgo_Options,该类为算法提供了以下选项:错误/警告报告系统;并行处理模式。此处不支持基类的其他选项,并且将不起作用。在操作期间获得的所有历史信息都存储在 BRepTools_History 对象中,并且可以通过 History() 方法进行访问

         对于在Draw级别上使用MakeConnected算法,已经实现了以下命令:makeconnected、cmaterialson、cmakeperiodic、 crepeatshape、 cperiodictwins 、cclearrepetitions。
        有关连接命令的更多详细信息,请参阅《Draw test harness》用户指南中的 MakeConnected 命令。要跟踪MakeConnected操作期间形状修改的历史记录,可以使用标准历史命令。要访问操作的错误/警告形状,请在运行算法之前使用bdrawwarnshapes命令

Open CASCADE Technology: Modeling Algorithms

  • 58
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值