首页 OCC类基础

OCC类基础

举报
开通vip

OCC类基础一直在用OCC作项目,但这方面的中文资料很少,看来OCC在中国还不是十分普及;后来,项目中使用OCC和DirectX结合使用,取得了很好的效果;随着OCC6.3版本的推出,OpenCASCADE在速度方面已有了很大的改变。以下为一些OCC的基础知识,愿与各位OCC爱好者共同学习;一:OCC中的基础类:gp_Pnt在OCC中,gp_Pnt表示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。比如:gp_PntP1(0,0,0);gp_PntP2(5,0,0);gp_VecV1(P1,P2);向量有一个...

OCC类基础
一直在用OCC作项目,但这方面的中文资料很少,看来OCC在中国还不是十分普及;后来,项目中使用OCC和DirectX结合使用,取得了很好的效果;随着OCC6.3版本的推出,OpenCASCADE在速度方面已有了很大的改变。以下为一些OCC的基础知识,愿与各位OCC爱好者共同学习;一:OCC中的基础类:gp_Pnt在OCC中,gp_Pnt 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。比如:gp_PntP1(0,0,0);gp_PntP2(5,0,0);gp_VecV1(P1,P2);向量有一个 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 .IsOpposite(),可以用来测试两个向量的方向是相对还是平行;比如:gp_PntP3(-5,0,2);gp_VecV2(P1,P3);Standard_Booleanresult=V1.IsOpposite(V2,Precision::Angular());另外向量还有一些重要方法:--Standard_RealMagnitude()const;计算向量的大小;--Standard_RealSquareMagnitude()const;计算向量的平方;--向量的加减乘除操作;--向量的单位化;--通过一个点,线,面得出其镜像的向量;--向量的旋转,平移,缩放;具体的函数名称可以看OCC的头文件说明;有时需要决定一组空间点是位于一个点;一条直线,或一个平面,或一个空间:OCC中提供了相应的算法;比如:TColgp_Array1OfPntarray(1,5);//sizingarrayarray.SetValue(1,gp_Pnt(0,0,1));array.SetValue(2,gp_Pnt(1,2,2));array.SetValue(3,gp_Pnt(2,3,3));array.SetValue(4,gp_Pnt(4,4,4));array.SetValue(5,gp_Pnt(5,5,5));GProp_PEquationPE(array,1.5);if(PE.IsPoint()){}//是否是同一个点gp_LinL;if(PE.IsLinear()){L=PE.Line();}//是否位于一条直线上;if(PE.IsPlanar()){}//是否在一个平面内;if(PE.IsSpace()){}gp_Dir类:此类用来描述3D空间中的一个单位向量;常用方法:(1):IsEqual(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量是否相等;(2):IsNormal(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量的夹角是否是PI/2;(3):IsOpposite(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量是否方向相反;(4):IsParallel(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量夹角O或PI;(5):Angle(constgp_Dir&Other)const;求两个向量之间的夹角;(6):voidCrossCross(constgp_Dir&V1,constgp_Dir&V2);计算三个向量之间的叉积;(7):Standard_RealDot(constgp_Dir&Other)const;计算点积;(8):Standard_RealDotCross(constgp_Dir&V1,constgp_Dir&V2)const;计算叉积再点积;(9):gp_DirReversed()const;得到反方向,在OCC中用gp_Lin2d类,来生成一个二维空间的直线,有它的原点和单位向量;gp_Ax2d类:通过原点和X方向单位和Y方向单位建立一个二维坐标系;利用sense参数可以决定是右手系还是左手系;可以利用平移、旋转、缩放、镜像来更改坐标系;类似地,gp_Ax3类:用来描述一个3D空间的坐标系。而gp_Ax2类用来表示一个二维空间坐标系;可以为右手系,也可以是左手系;二、曲线类GeomAPI和GeomConvert包:GeomAPI开发包提供了一个几何体的可编程应用程序接口;比如:求点P和曲线C的距离D:D=GeomAPI_ProjectPointOnCurve(P,C);或者GeomAPI_ProjectPointOnCurvePonC(P,C);D=PonC.LowerDistance();GeomConvert包提供了一些全局函数,可以用来实现转化一个Geom曲线为BSpline曲线等;比如:Handle(Geom_BSplineSurface)aPipeSurface=Handle(Geom_BSplineSurface)::DownCast(aPipe.Surface());Handle(Geom_BSplineSurface)anotherBSplineSurface=GeomConvert::SplitBSplineSurface(aPipeSurface,1,2,3,6);OCC中三维几何曲线的类型有:--线--园--椭圆--二次曲线--抛物线--Bezier曲线--BSpline曲线可以将一个二维的几何曲线转化为某个平面内的一个三维曲线:比如:Standard_Realradius=5;gp_Ax2dax2d(gp_Pnt2d(2,3),gp_Dir2d(1,0));//生成一个二维园Handle(Geom2d_Circle)circ2d=newGeom2d_Circle(ax2d,radius);gp_Ax2dcirc2dXAxis=circ2d->XAxis();//然后,在这个平面里转化为三维曲线;Handle(Geom_Curve)C3D=GeomAPI::To3d(circ2d,gp_Pln(gp_Ax3(gp::XOY())));Handle(Geom_Circle)C3DCircle=Handle(Geom_Circle)::DownCast(C3D);gp_Ax1C3DCircleXAxis=C3DCircle->XAxis();另外,可以以将一个三维曲线,投影到一个平面内,从而生成一个二维曲线gp_PlnProjectionPlane(gp_Pnt(1,1,0),gp_Dir(1,1,1));Handle(Geom2d_Curve)C2D=GeomAPI::To2d(C3D,ProjectionPlane);Handle(Geom2d_Circle)C2DCircle=Handle(Geom2d_Circle)::DownCast(C2D);gp_Ax2dC2DCircleXAxis=C2DCircle->XAxis();将一个基本几何图形进行空间变换可以使用它自带的函数:比如:Handle(Geom_Geometry)aRotatedEntity=circle->Rotated(gp::OZ(),PI/4);如果想获取图形的类型名称:Standard_CStringaRotatedEntityTypeName=aRotatedEntity->DynamicType()->Name();gp_Parab2d类:描述一个平面内的抛物线;示例:gp_Pnt2dP(2,3);gp_Dir2dD(4,5);gp_Ax22dA(P,D);gp_Parab2dPara(A,6);GCE2d_MakeParabola类:生成一个抛物线图形;Geom2d_BSplineCurve类:描述样条曲线;Geom2dAPI_Interpolate类:通过一组点来修改一个样条曲线;FairCurve_Batten类:用一个常量或线性增加的值来构造曲线;可以用来 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 木纹或塑料板条;图形为二维的,可以模拟物理样条或板条.Geom2d_TrimmedCurve类:此类通过两个值,定义曲线的一部分,--可以用来计算曲线的参数值和点坐标;--可以得到曲线的一般特征,比如连续的等级,封闭特点,周期性,边界参数;--当用一个矩阵应用于曲线或原始曲线转化后进行相应参数的改变;所有的曲线必须几何连续,曲线至少一阶可导。一般来说,在生成一个曲线时,要先检查一下所应用的参数是否可以生成一个光滑曲线;否则会出现错误;另外注意一点:不可以构造空长度的曲线或自相交的曲线;此类的基类是Geom2d_BoundedCurve类:它是一个抽象类;描述二维空间中的边界曲线的一般行为;除了Geom2d_TrimmedCurve是它的一个派生类外,它还有二个派生类:-Geom2d_BezierCurve-Geom2d_BSplineCurveGeom2d_BoundedCurve类的基类是Geom2d_Curve类:Geom2d_Curve:抽象类;此抽象类描述了2D空间的曲线的一般特征;派生出的类有多个:包括直线,园,二次曲线,Bizier,BSpline曲线等;这些曲线的特点是可以参数化;Geom2d_Curve类的基类是Geom2d_Geometry类;此抽象类主要定义了曲线的变换,平移,旋转,缩放及拷贝等方法;Geom2d_Geometry类的基类是MMgt_TShared类;此抽象类为管理对象的基类,可以引用计数,及删除方法;Standard_Transient:此抽象类为所有类共同的基类;Geom2dAPI_InterCurveCurve类:此类用来实现二维曲线的相交;一种情况是曲线与曲线的相交,另外一种情况是曲线自身的相交;主要方法有:--Standard_IntegerNbPoints()const;相交点数;--Standard_IntegerNbSegments()const;切线相交数;--voidSegment(constStandard_IntegerIndex,Handle(Geom2d_Curve)&Curve1,Handle(Geom2d_Curve)&Curve2)const;返回其中一个线段;下面的示例是两个曲线相交的例子:首先,生成第一个曲线,在这里,应用点数组来生成一个曲线;--定义数组Handle(TColgp_HArray1OfPnt2d)harray=newTColgp_HArray1OfPnt2d(1,5);//sizingharray--输入点数组的值harray->SetValue(1,gp_Pnt2d(0,0));harray->SetValue(2,gp_Pnt2d(-3,1));harray->SetValue(3,gp_Pnt2d(-2,5));harray->SetValue(4,gp_Pnt2d(2,9));harray->SetValue(5,gp_Pnt2d(-4,14));--检测一下点与点之间是否为同一点;0.01为公差值,依实际需要可以更改此参数;Geom2dAPI_InterpolateanInterpolation(harray,Standard_False,0.01);--生成曲线anInterpolation.Perform();Handle(Geom2d_BSplineCurve)SPL=anInterpolation.Curve();--第二个曲线用两点来生成gp_Pnt2dP1(-1,-2);gp_Pnt2dP2(0,15);gp_Dir2dV1=gp::DY2d();Handle(Geom2d_TrimmedCurve)TC1=GCE2d_MakeSegment(P1,V1,P2);--下面进行曲线的求交Standard_Realtolerance=Precision::Confusion();Geom2dAPI_InterCurveCurveICC(SPL,TC1,tolerance);--得到交点Standard_IntegerNbPoints=ICC.NbPoints();gp_Pnt2dPK;for(Standard_Integerk=1;k<=NbPoints;k++){PK=ICC.Point(k);//针对每个交点,进行相应处理;}Geom2d_OffsetCurve类:此类用来实现偏移曲线;比如:--生成一个曲线TColgp_Array1OfPnt2darray(1,5);//sizingarrayarray.SetValue(1,gp_Pnt2d(-4,0));array.SetValue(2,gp_Pnt2d(-7,2));array.SetValue(3,gp_Pnt2d(-6,3));array.SetValue(4,gp_Pnt2d(-4,3));array.SetValue(5,gp_Pnt2d(-3,5));Handle(Geom2d_BSplineCurve)SPL1=Geom2dAPI_PointsToBSpline(array);--生成一个偏移曲线Standard_Realdist=1;Handle(Geom2d_OffsetCurve)OC=newGeom2d_OffsetCurve(SPL1,dist);Standard_Booleanresult=OC->IsCN(2);GccAna_Pnt2dBisec类此类实现两点之间的等分线.示例:gp_Pnt2dP1(1,2);gp_Pnt2dP2(4,5);gp_Lin2dL;GccAna_Pnt2dBisecB(P1,P2);if(B.IsDone()){L=B.ThisSolution();}因为所生成的为直线,所以显示时要转化为线段:if(B.IsDone()){Handle(Geom2d_TrimmedCurve)aLine=GCE2d_MakeSegment(L,-8,8);Handle(ISession2D_Curve)aCurve=newISession2D_Curve(aLine);aDoc->GetISessionContext()->Display(aCurve,Standard_False);}gce_MakeCirc2d类用来创建园:创建园的方法很多,主要构造方法有:--园心和通过的一点;--通过一个园和一个距离值,创建一个同心园;--三点决定一个园;--园心和半径;gp_Elips2d类:可以生成一个椭园,也可以生成椭园上的一段园弧;比如:Standard_Realmajor=12;Standard_Realminor=4;gp_Ax2daxis=gp::OX2d();gp_Elips2dEE(axis,major,minor);;Handle(Geom2d_TrimmedCurve)arc=GCE2d_MakeArcOfEllipse(EE,0.0,PI/4);上面是利用长短轴的方法构造椭圆,也可以用二次方程的方式来构造椭园;其中椭园类中方法可以求出焦点1和焦点2的位置,两焦点之间的位置,离心率;旋转,平移,缩放等操作.三、关于面的类gp_Pln类:定义一个平面,构造的方法可以是点法式,或通过ABCD系数;另外,还提供了一些常用的方法,比如:--求点到平面,线到平面,平面与平面的距离及平方距离;--点是否在平面内,线是否在平面内;--通过一个点,一个轴的镜像平面;--平面的旋转,缩放与平移;Geom_ElementarySurface类:此类用来描述一个表面,此类的派生类有:平面;园柱面;锥面;球面;园环面;它的基类是Geom_Surface,是一个抽象类;Geom_Surface类的基类是Geom_Geometry类;Geom_RectangularTrimmedSurface类:用来生成一个有边界的平面;比如:Handle(Geom_Plane)aProjectionPlane=GC_MakePlane(ProjectionPlane).Value();Handle(Geom_RectangularTrimmedSurface)aProjectionPlaneSurface=newGeom_RectangularTrimmedSurface(aProjectionPlane,-8.,8.,-12.,12.);DisplaySurface(aDoc,aProjectionPlaneSurface);此类的基类是Geom_BoundedSurface类;此类的兄弟类还有-Geom_BezierSurface,-Geom_BSplineSurfaceConicalSurface类:用来创建一个园锥表面;构造表面的方法有:--已知一个园锥表面,和空间一点,过此点的平行于已知园锥表面;--已知一个园锥表面,和一个距离,创建一个平行于已知园锥表面的园锥表面;--通过四个点构造一个园锥表面;--通过一个轴和两个点;--通过两个点和两个半径;GeomAPI_IntCS类:此类用来计算一个园弧和和一个表面的交点或相交线段;GeomFill_BSplineCurves类:此类用来构造一个可以填充的BSpline表面,构造它可以用两个三个或四个BSpline曲线作为边界;填充类型有三种:enumGeomFill_FillingStyle{GeomFill_StretchStyle,GeomFill_CoonsStyle,GeomFill_CurvedStyle};以下示例为用两个样条曲线生成一个表面:GeomFill_FillingStyleType=GeomFill_StretchStyle;GeomFill_BSplineCurvesaGeomFill1(SPL1,SPL2,Type);Handle(Geom_BSplineSurface)aBSplineSurface1=aGeomFill1.Surface();GeomFill_Pipe类:此类用来构造一个pipe,沿着一个路径sweep一个截面,这两个都是曲线类型;一般来说,结果是一个BSpline表面;常见的有几种方法:--给定一个路径和一个半径,截面是个园,位置是路径的第一个点,比如:GeomFill_PipeaPipe(SPL1,1);aPipe.Perform();Handle(Geom_Surface)aSurface=aPipe.Surface();Standard_CStringaSurfaceEntityTypeName="NotComputed";if(!aSurface.IsNull())aSurfaceEntityTypeName=aSurface->DynamicType()->Name();--给定一个路径和一个截面。比如:Handle(Geom_Ellipse)E=GC_MakeEllipse(gp::XOY(),3,1).Value();GeomFill_PipeaPipe2(SPL1,E);aPipe2.Perform();Handle(Geom_Surface)aSurface2=aPipe2.Surface();Standard_CStringaSurfaceEntityTypeName2="NotComputed";if(!aSurface2.IsNull()){aSurfaceEntityTypeName2=aSurface2->DynamicType()->Name();aSurface2->Translate(gp_Vec(5,0,0));}--给定一个路径和两个截面,中间截面为过度线;示例:Handle(Geom_TrimmedCurve)TC1=GC_MakeSegment(gp_Pnt(1,1,1),gp_Pnt(5,5,5));Handle(Geom_TrimmedCurve)TC2=GC_MakeSegment(gp_Pnt(1,1,0),gp_Pnt(4,5,6));GeomFill_PipeaPipe3(SPL1,TC1,TC2);aPipe3.Perform();Handle(Geom_Surface)aSurface3=aPipe3.Surface();Standard_CStringaSurfaceEntityTypeName3="NotComputed";if(!aSurface3.IsNull()){aSurfaceEntityTypeName3=aSurface3->DynamicType()->Name();aSurface3->Translate(gp_Vec(10,0,0));}--给定一个路径和N个截面,中间为过渡线;一般情况下,所生结果为:NURBS,但是,在一些特殊的情况下,可以生成平面,园柱,球,园锥等;参数,U,沿着截面的方向,V沿着路径方向;Geom_BezierSurface类:生成一个Bezier表面;Geom_OffsetSurface类:用来偏移一个表面;比如:Standard_Realoffset=1;Handle(Geom_OffsetSurface)GOS=newGeom_OffsetSurface(aGeomSurface,offset);Geom_SweptSurface类:有两个派生类,分别用来生成一个回转体表面和一个延展体表面;Geom_SurfaceOfLinearExtrusion:用来描述一个线性延展表面;它的基类是:Geom_Surface类比如:Handle(Geom_BSplineCurve)aCurve=GeomAPI_PointsToBSpline(array).Curve();gp_DiraDir(1,2,3);Handle(Geom_SurfaceOfLinearExtrusion)SOLE=newGeom_SurfaceOfLinearExtrusion(aCurve,aDir);Handle(Geom_RectangularTrimmedSurface)aTrimmedSurface=newGeom_RectangularTrimmedSurface(SOLE,-10,10,false);Geom_SurfaceOfRevolution类,表示一个回转体表面;比如:Handle(Geom_BSplineCurve)aCurve=GeomAPI_PointsToBSpline(array).Curve();Handle(Geom_SurfaceOfRevolution)SOR=newGeom_SurfaceOfRevolution(aCurve,gp::OX());1:利用一个二维数组来生成曲面的方法:TColgp_Array2OfPntarray3(1,5,1,5);array3.SetValue(1,1,gp_Pnt(-4,-4,5));...array3.SetValue(2,1,gp_Pnt(-2,-4,4));...Handle(Geom_BSplineSurface)aSurf2=GeomAPI_PointsToBSplineSurface(array3).Surface();2:GeomAPI_ExtremaSurfaceSurface类:计算两个表面之间的极值点;主要方法:(1):Quantity_LengthLowerDistance()const;计算两个表面的最短距离;(2):Standard_EXPORTvoidLowerDistanceParameters(Quantity_Parameter&U1,Quantity_Parameter&V1,Quantity_Parameter&U2,Quantity_Parameter&V2)const;得到第一个表面上的极值点的UV参数和第二个表面上的极值点的UV参数;(3):voidNearestPoints(gp_Pnt&P1,gp_Pnt&P2)const;得到第一个表面上的极值点和第二个表面上的极值点;(4):Quantity_LengthDistance(constStandard_IntegerIndex)const;得到第N个极值点的距离;(5):Standard_IntegerNbExtrema()const;极值的数目;......示例:GeomAPI_ExtremaSurfaceSurfaceESS(aSurf1,aSurf2);Quantity_Lengthdist=ESS.LowerDistance();gp_PntP1,P2;ESS.NearestPoints(P1,P2);gp_PntP3,P4;Handle(Geom_Curve)aCurve;Standard_IntegerNbExtrema=ESS.NbExtrema();for(Standard_Integerk=1;k<=NbExtrema;k++){ESS.Points(k,P3,P4);aCurve=GC_MakeSegment(P3,P4).Value();DisplayCurve(aDoc,aCurve,Quantity_NOC_YELLOW3,false);}一些OCC的基础知识,愿与各位OCC爱好者共同学习;mail:tongabcd@yeah.net一:关于体的类BRepBuilderAPI_MakeVertex类创建点;BRepBuilderAPI_MakeEdge类此类用来创建边;比如,由直线生成边:gp_Linline(gp_Ax1(gp_Pnt(10,10,10),gp_Dir(1,0,0)));WhiteEdge=BRepBuilderAPI_MakeEdge(line,-20,10);下面为生成四分之一园边:gp_ElipsElips(gp_Ax2(gp_Pnt(10,0,0),gp_Dir(1,1,1)),60,30);RedEdge=BRepBuilderAPI_MakeEdge(Elips,0,PI/2);下面是由曲线生成边:Handle(Geom_BezierCurve)curve=newGeom_BezierCurve(array);BRepBuilderAPI_MakeEdgeME(curve);GreenEdge=ME;V3=ME.Vertex1();V4=ME.Vertex2();BRepBuilderAPI_MakeWire类用来创建一个Wire类;用一个Wire和一个边来生成一个新的Wire:ExistingWire=BRepBuilderAPI_MakeWire(Edge2);Edge3=BRepBuilderAPI_MakeEdge(gp_Pnt(-300,0,-80),gp_Pnt(-90,20,-30));BRepBuilderAPI_MakeWireMW1(ExistingWire,Edge3);if(MW1.IsDone()){YellowWire=MW1;}用一个Wire和添加边的方法来生成Wire:BRepBuilderAPI_MakeWireMW;MW.Add(ExistingWire2);MW.Add(Edge5);MW.Add(Edge6);MW.Add(Edge7);if(MW.IsDone()){WhiteWire=MW.Wire();LastEdge=MW.Edge();LastVertex=MW.Vertex();}BRepBuilderAPI_MakeFace类生成一个面;有多种生成面的方法;--通过一个封闭曲线生成面:BRepBuilderAPI_MakeFace(curve);--通过一个Wire生成面:BrownFace=BRepBuilderAPI_MakeFace(YellowWire);Bnd_Box2d类:定义一个二维空间的边界盒,可以得出边界盒各个点的值,有时,在某个方向是无限大,这种情况下,称为在此方向上是开放的;示例:Bnd_Box2daCBox;Geom2dAdaptor_CurveGACC(C);BndLib_Add2dCurve::Add(GACC,Precision::Approximation(),aCBox);Bnd_Box类:定义一个三维空间的边界盒,可以扩大或缩小边界盒,也可以合并两个轴对齐边界盒;BRepPrimAPI_MakeBox类用来生成一个立方体;构造一个立方体可以是两个对角点,一个角点及三个方向长度,可以是非轴对称的:TopoDS_ShapeB2=BRepPrimAPI_MakeBox(gp_Ax2(gp_Pnt(-200.,-80.,-70.),gp_Dir(1.,2.,1.)),80.,90.,120.);使用方法TopoDS_Face&BottomFace();.可以得到立方体的底面;同样,用其它类似的方法可以获得顶面等;方法TopoDS_Solid&Solid();可以将box转化为一个Solid;方法TopoDS_Shell&Shell();可以将box转化为一个shell;BRepPrimAPI_MakeCylinder类用来生成一个园柱体或园柱体的一部分;比如:TopoDS_ShapeC2=BRepPrimAPI_MakeCylinder(gp_Ax2(gp_Pnt(200.,0.,200.),gp_Dir(0.,1.,0.)),40.,110.,210.*PI180);BRepPrimAPI_MakeCone类生成一个园锥或园锥的一部分;BRepPrimAPI_MakeSphere类生成球体或球体的一部分,可以是U方向切一部分或V方向切一部分;BRepPrimAPI_MakeTorus类生成环或环的一部分;BRepPrimAPI_MakeWedge类生成一个楔块或楔块的一部分;BRepPrimAPI_MakePrism类生成一个线性的swept,称为Prisms;它的基类是BRepPrimAPI_MakeSweep类;BRepPrimAPI_MakeSweep类的基类是BRepBuilderAPI_MakeShape类注意,原始基本图形不可以包含任何实体:应用此类时:--顶点“推移”成边:TopoDS_VertexV1=BRepBuilderAPI_MakeVertex(gp_Pnt(-200.,-200.,0.));Handle(AIS_Shape)ais1=newAIS_Shape(V1);TopoDS_ShapeS1=BRepPrimAPI_MakePrism(V1,gp_Vec(0.,0.,100.));Handle(AIS_Shape)ais2=newAIS_Shape(S1);--边“推移”成面:.TopoDS_EdgeE=BRepBuilderAPI_MakeEdge(gp_Pnt(-150.,-150,0.),gp_Pnt(-50.,-50,0.));Handle(AIS_Shape)ais3=newAIS_Shape(E);myAISContext->Display(ais3,Standard_False);TopoDS_ShapeS2=BRepPrimAPI_MakePrism(E,gp_Vec(0.,0.,100.));--Wires“推移”成Shells.TopoDS_EdgeE1=BRepBuilderAPI_MakeEdge(gp_Pnt(0.,0.,0.),gp_Pnt(50.,0.,0.));TopoDS_EdgeE2=BRepBuilderAPI_MakeEdge(gp_Pnt(50.,0.,0.),gp_Pnt(50.,50.,0.));TopoDS_EdgeE3=BRepBuilderAPI_MakeEdge(gp_Pnt(50.,50.,0.),gp_Pnt(0.,0.,0.));TopoDS_WireW=BRepBuilderAPI_MakeWire(E1,E2,E3);TopoDS_ShapeS3=BRepPrimAPI_MakePrism(W,gp_Vec(0.,0.,100.));--Faces“推移”成Solids.TopoDS_FaceF=BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY()),Wc);Handle(AIS_Shape)ais7=newAIS_Shape(F);myAISContext->Display(ais7,Standard_False);TopoDS_ShapeS4=BRepPrimAPI_MakePrism(F,gp_Vec(0.,0.,100.));--Shells“推移”成复合实体BRepPrimAPI_MakeRevol类一个回转sweep体;类继承关系和前面类似:BRepBuilderAPI_MakeShape--〉BRepPrimAPI_MakeSweep-->BRepPrimAPI_MakeRevol,对于角度而言,范围是[0,2PI],默认值是2PI,生成 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf :-Vertex->Edge.-Edge->Face.-Wire->Shell.-Face->Solid.-Shell->CompSolid.BRepOffsetAPI_MakePipe类可以生成一个管道类继承关系是:BRepBuilderAPI_MakeShape--〉BRepPrimAPI_MakeSweep-->BRepOffsetAPI_MakePipe以下为生成一个管道的示例过程:--利用生成一个WIRE,作为管道的路径:Handle(Geom_BezierCurve)curve=newGeom_BezierCurve(CurvePoles);TopoDS_EdgeE=BRepBuilderAPI_MakeEdge(curve);TopoDS_WireW=BRepBuilderAPI_MakeWire(E);--生成一个面,作为生成管道的截面:gp_Circc=gp_Circ(gp_Ax2(gp_Pnt(0.,0.,0.),gp_Dir(0.,1.,0.)),10.);TopoDS_EdgeEc=BRepBuilderAPI_MakeEdge(c);TopoDS_WireWc=BRepBuilderAPI_MakeWire(Ec);TopoDS_FaceF=BRepBuilderAPI_MakeFace(gp_Pln(gp::ZOX()),Wc);--利用前两步生成的路径和截面来生成pipe:TopoDS_ShapeS=BRepOffsetAPI_MakePipe(W,F);Handle(AIS_Shape)ais2=newAIS_Shape(S);BRepOffsetAPI_ThruSections类此类继承自BRepBuilderAPI_MakeShape:创建一个loft,通过一组给定的sections,生成一个shell或一个solid;通常,section是wire;但是第一个和最后一个section可以是vertices;比如:BRepOffsetAPI_ThruSectionsgenerator(Standard_False,Standard_True);generator.AddWire(W1);generator.AddWire(W2);generator.AddWire(W3);generator.AddWire(W4);generator.Build();TopoDS_ShapeS1=generator.Shape();Handle(AIS_Shape)ais1=newAIS_Shape(S1);BRepBuilderAPI_MakePolygon类创建一个polygonalwires,可以通过一组点或向量生成,也可以先生成一个空的对象,再添加点。示例1:BRepBuilderAPI_MakePolygonP;P.Add(gp_Pnt(0.,0.,0.));P.Add(gp_Pnt(200.,0.,0.));P.Add(gp_Pnt(200.,200.,0.));P.Add(gp_Pnt(0.,200.,0.));P.Add(gp_Pnt(0.,0.,0.));TopoDS_WireW=P.Wire();示例2:TopoDS_Wirewprof=BRepBuilderAPI_MakePolygon(gp_Pnt(0.,0.,0.),gp_Pnt(-60.,-60.,-200.));BRepOffsetAPI_MakeEvolved类创建一个可展图形,它是通过一个planarspine(faceorwire)和一个rofile(wire)来生成的,它是一个非循环的sweep(pipe),用profile沿着spline;自相交点将被移除;比如:--沿着一个spline,sweep一个profile;Standard_EXPORTBRepOffsetAPI_MakeEvolved(constTopoDS_Face&Spine,constTopoDS_Wire&Profil,constGeomAbs_JoinTypeJoin=GeomAbs_Arc,constStandard_BooleanAxeProf=Standard_True,constStandard_BooleanSolid=Standard_False,constStandard_BooleanProfOnSpine=Standard_False,constStandard_RealTol=0.0000001);AxeProf参数如果为true,R是0,X,Y,Z;如果solid为真,结果为一个solid或复合的solids;示例:TopoDS_ShapeS=BRepOffsetAPI_MakeEvolved(W,wprof,GeomAbs_Arc,Standard_True,Standard_False,Standard_True,0.0001);BRepBuilderAPI_ModifyShape类当使用BRepTools来创建一个修改类,主要有以下派生类:--BRepBuilderAPI_Copy:处理一个图形的拷贝;--BRepBuilderAPI_Transform和BRepBuilderAPI_GTransform:用来对一个图形应用几何变形;--BRepBuilderAPI_NurbsConvert:用来将一个图形转化为NURBS几何体;--BRepOffsetAPI_DraftAngle:创建一个tapered图形;BRepOffsetAPI_DraftAngle类创建一个tapered图形;一般过程是:--初始化构造算法;--输入要taper的特征面;--实现算法;--生成结果;示例:TopoDS_ShapeS=BRepPrimAPI_MakeBox(200.,300.,150.);BRepOffsetAPI_DraftAngleadraft(S);TopExp_ExplorerEx;for(Ex.Init(S,TopAbs_FACE);Ex.More();Ex.Next()){TopoDS_FaceF=TopoDS::Face(Ex.Current());Handle(Geom_Plane)surf=Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(F));gp_Plnapln=surf->Pln();gp_DirdirF=apln.Axis().Direction();if(dirF.IsNormal(gp_Dir(0.,0.,1.),Precision::Angular()))adraft.Add(F,gp_Dir(0.,0.,1.),15.*PI180,gp_Pln(gp::XOY()));}ais1->Set(adraft.Shape());二:关于布尔等实体修改操作相关BRepAlgoAPI_BooleanOperation类此类的基类是BRepBuilderAPI_MakeShape类,它是一个抽象类;可以应用的操作有:BOP_SECTION、BOP_COMMON、BOP_FUSE、BOP_CUT、BOP_CUT21有时会产生错误,无法达到想要的结果,根据返回值,可以得到错误信息,含义是:0:OK1:对象创建完成,但结果为空;2:源图形为空;3:参数类型检查错误;4:不能为DSFiller分配内存;5:此种类型参数的Builder无法工作;6:不允许的操作;7:不能为Builder分配内存;>100参见Builder错误信息;相关的方法介绍:--TopTools_ListOfShape&SectionEdges()方法:返回一组截面的边,它们在布尔操作过程中生成;--Standard_BooleanHasDeleted()方法:如果至少一个图形对象被删除了,返回为真;--Standard_BooleanHasGenerated()方法:如果至少生成了一个图形,返回为真;--Standard_BooleanHasModified()方法:如果至少一个图形被修改了,返回为真;--TopTools_ListOfShape&Generated(constTopoDS_Shape&S)方法:返回生成以后的图形的集合;--TopTools_ListOfShape&Modified2(constTopoDS_Shape&aS)方法:返回修改后的图形的集合;--Standard_BooleanIsDeleted(constTopoDS_Shape&aS)方法:如果图形S已经被删除,返回为真,即结果图形中不包括图形S;-BOP_OperationOperation()方法:返回布尔操作的类型;布尔操作类包括有BRepAlgoAPI_Cut类,BRepAlgoAPI_Fuse类,BRepAlgoAPI_Common类:布尔交集;BRepAlgoAPI_Section类计算两个图形或几何体的截面,几何对象可以是平面的表面,转化为face.示例:给定两个图形S1和S2,计算在S1和S2上的边,在新曲线上生成近似值,结果在第一部分上而不在第二部分上:Standard_BooleanPerformNow=Standard_False;BRepBoolAPI_SectionS(S1,S2,PerformNow);S.ComputePCurveOn1(Standard_True);S.Approximation(Standard_True);S.Build();TopoDS_ShapeR=S.Shape();如果结果为空,调用NotDone();常见方法:--BRepAlgoAPI_Section(constHandle(Geom_Surface)&Sf1,constHandle(Geom_Surface)&Sf2,constStandard_BooleanPerformNow=Standard_True);用来生成线:--两个图形SH1和SH2;--图形SH和平面P1;--表面SF和图形SH;--两个表面SF1和SF2;参数PerformNow如果为真,将直接计算结果,如果为假,表示后面将通过Build()这个函数来计算结果;生成后的图形是由方法Shape()得出的;这些相交的边是独立的,不在一个链表上,也不在一个wire上,如果不存在一个相交边,返回结果为空;示例:--计算相交的基本边--利用这些基本边创建一个相交线--决定相交线在两个图形的哪个图形的参数空间;TopoDS_ShapeS1=...,S2=...;Standard_BooleanPerformNow=Standard_False;BRepAlgoAPI_SectionS(S1,S2,PerformNow);S.ComputePCurveOn1(Standard_True);S.Approximation(Standard_True);S.Build();TopoDS_ShapeR=S.Shape();BRepFilletAPI_LocalOperation类基类是BRepBuilderAPI_MakeShape;构造在一个shell的边的园角;常用方法有--voidAdd(constTopoDS_Edge&E)=0;在builder上添加一个轮廓线;--voidResetContour(constStandard_IntegerIC)=0;重置索引为IC的轮廓线;--Standard_IntegerNbContours()const=0;返回轮廓线的数目;--Standard_IntegerContour(constTopoDS_Edge&E)const=0;返回边E的轮廓线的索引,如果边E不在轮廓线内,返回为O;--Standard_IntegerNbEdges(constStandard_IntegerI)const=0;返回在轮廓线I中的边数;--voidRemove(constTopoDS_Edge&E)=0;移除一个边;--Standard_RealLength(constStandard_IntegerIC)const=0;得到某个轮廓线的长度;--TopoDS_VertexFirstVertex(constStandard_IntegerIC)const=0;返回某个轮廓线的第一个顶点;LastVertex方法返回最后一个顶点;--Abscissa方法,返回某个顶点的横坐标;--Standard_BooleanClosedAndTangent(constStandard_IntegerIC)const如果某个轮廓线是封闭切线,返回为真;--Standard_BooleanClosed(constStandard_IntegerIC)const=0;如果某个轮廓线是封闭,返回为真;--Reset()=0;重置所有;BRepFilletAPI_MakeFillet类创建一个园角;示例一:对一个BOX园角:BRepFilletAPI_MakeFilletfillet(Box);for(TopExp_Explorerex(Box,TopAbs_EDGE);ex.More();ex.Next()){TopoDS_EdgeEdge=TopoDS::Edge(ex.Current());fillet.Add(20,Edge);}示例二:两个BOX,合并后园角;TopoDS_ShapefusedShape=BRepAlgoAPI_Fuse(S1,S2);BRepFilletAPI_MakeFilletfill(fusedShape);for(TopExp_Explorerex1(fusedShape,TopAbs_EDGE);ex1.More();ex1.Next()){TopoDS_EdgeE=TopoDS::Edge(ex1.Current());fill.Add(E);}for(Standard_Integeri=1;i<=fill.NbContours();i++){Standard_Reallongueur(fill.Length(i));Standard_RealRad(0.15*longueur);fill.SetRadius(Rad,i,1);}TopoDS_ShapeblendedFusedSolids=fill.Shape();Handle(AIS_Shape)aBlend=newAIS_Shape(blendedFusedSolids);示例三:只园角其中一条边:BRepFilletAPI_MakeFilletRake(theBox);TopExp_Explorerex(theBox,TopAbs_EDGE);ex.Next();ex.Next();ex.Next();ex.Next();Rake.Add(8,50,TopoDS::Edge(ex.Current()));Rake.Build();if(Rake.IsDone()){TopoDS_ShapeevolvedBox=Rake.Shape();ais1->Set(evolv
本文档为【OCC类基础】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
天山书童
暂无简介~
格式:pdf
大小:284KB
软件:PDF阅读器
页数:43
分类:
上传时间:2022-04-09
浏览量:59